* string.c: use uintptr_t instead of VALUE because they are not ruby
object. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cbab67a1ac
commit
fb1b9a78b7
@ -1,3 +1,8 @@
|
|||||||
|
Fri Apr 18 15:40:05 2014 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c: use uintptr_t instead of VALUE because they are not ruby
|
||||||
|
object.
|
||||||
|
|
||||||
Fri Apr 18 14:51:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
|
Fri Apr 18 14:51:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* string.c: check str_strlen's argument, and add comment or
|
* string.c: check str_strlen's argument, and add comment or
|
||||||
|
46
string.c
46
string.c
@ -259,22 +259,22 @@ VALUE rb_fs;
|
|||||||
static inline const char *
|
static inline const char *
|
||||||
search_nonascii(const char *p, const char *e)
|
search_nonascii(const char *p, const char *e)
|
||||||
{
|
{
|
||||||
#if SIZEOF_VALUE == 8
|
#if SIZEOF_VOIDP == 8
|
||||||
# define NONASCII_MASK 0x8080808080808080ULL
|
# define NONASCII_MASK 0x8080808080808080ULL
|
||||||
#elif SIZEOF_VALUE == 4
|
#elif SIZEOF_VOIDP == 4
|
||||||
# define NONASCII_MASK 0x80808080UL
|
# define NONASCII_MASK 0x80808080UL
|
||||||
#endif
|
#endif
|
||||||
#ifdef NONASCII_MASK
|
#ifdef NONASCII_MASK
|
||||||
if ((int)sizeof(VALUE) * 2 < e - p) {
|
if ((int)SIZEOF_VOIDP * 2 < e - p) {
|
||||||
const VALUE *s, *t;
|
const uintptr_t *s, *t;
|
||||||
const VALUE lowbits = sizeof(VALUE) - 1;
|
const uintptr_t lowbits = SIZEOF_VOIDP - 1;
|
||||||
s = (const VALUE*)(~lowbits & ((VALUE)p + lowbits));
|
s = (const uintptr_t*)(~lowbits & ((uintptr_t)p + lowbits));
|
||||||
while (p < (const char *)s) {
|
while (p < (const char *)s) {
|
||||||
if (!ISASCII(*p))
|
if (!ISASCII(*p))
|
||||||
return p;
|
return p;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
t = (const VALUE*)(~lowbits & (VALUE)e);
|
t = (const uintptr_t*)(~lowbits & (uintptr_t)e);
|
||||||
while (s < t) {
|
while (s < t) {
|
||||||
if (*s & NONASCII_MASK) {
|
if (*s & NONASCII_MASK) {
|
||||||
t = s;
|
t = s;
|
||||||
@ -1090,10 +1090,10 @@ rb_str_init(int argc, VALUE *argv, VALUE str)
|
|||||||
* This function calculate every bytes in the argument word `s'
|
* This function calculate every bytes in the argument word `s'
|
||||||
* using the above logic concurrently. and gather every bytes result.
|
* using the above logic concurrently. and gather every bytes result.
|
||||||
*/
|
*/
|
||||||
static inline VALUE
|
static inline uintptr_t
|
||||||
count_utf8_lead_bytes_with_word(const VALUE *s)
|
count_utf8_lead_bytes_with_word(const uintptr_t *s)
|
||||||
{
|
{
|
||||||
VALUE d = *s;
|
uintptr_t d = *s;
|
||||||
|
|
||||||
/* Transform into bit0 represent UTF-8 leading or not. */
|
/* Transform into bit0 represent UTF-8 leading or not. */
|
||||||
d |= ~(d>>1);
|
d |= ~(d>>1);
|
||||||
@ -1103,7 +1103,7 @@ count_utf8_lead_bytes_with_word(const VALUE *s)
|
|||||||
/* Gather every bytes. */
|
/* Gather every bytes. */
|
||||||
d += (d>>8);
|
d += (d>>8);
|
||||||
d += (d>>16);
|
d += (d>>16);
|
||||||
#if SIZEOF_VALUE == 8
|
#if SIZEOF_VOIDP == 8
|
||||||
d += (d>>32);
|
d += (d>>32);
|
||||||
#endif
|
#endif
|
||||||
return (d&0xF);
|
return (d&0xF);
|
||||||
@ -1121,12 +1121,12 @@ enc_strlen(const char *p, const char *e, rb_encoding *enc, int cr)
|
|||||||
}
|
}
|
||||||
#ifdef NONASCII_MASK
|
#ifdef NONASCII_MASK
|
||||||
else if (cr == ENC_CODERANGE_VALID && enc == rb_utf8_encoding()) {
|
else if (cr == ENC_CODERANGE_VALID && enc == rb_utf8_encoding()) {
|
||||||
VALUE len = 0;
|
uintptr_t len = 0;
|
||||||
if ((int)sizeof(VALUE) * 2 < e - p) {
|
if ((int)sizeof(uintptr_t) * 2 < e - p) {
|
||||||
const VALUE *s, *t;
|
const uintptr_t *s, *t;
|
||||||
const VALUE lowbits = sizeof(VALUE) - 1;
|
const uintptr_t lowbits = sizeof(uintptr_t) - 1;
|
||||||
s = (const VALUE*)(~lowbits & ((VALUE)p + lowbits));
|
s = (const uintptr_t*)(~lowbits & ((uintptr_t)p + lowbits));
|
||||||
t = (const VALUE*)(~lowbits & (VALUE)e);
|
t = (const uintptr_t*)(~lowbits & (uintptr_t)e);
|
||||||
while (p < (const char *)s) {
|
while (p < (const char *)s) {
|
||||||
if (is_utf8_lead_byte(*p)) len++;
|
if (is_utf8_lead_byte(*p)) len++;
|
||||||
p++;
|
p++;
|
||||||
@ -1738,11 +1738,11 @@ static char *
|
|||||||
str_utf8_nth(const char *p, const char *e, long *nthp)
|
str_utf8_nth(const char *p, const char *e, long *nthp)
|
||||||
{
|
{
|
||||||
long nth = *nthp;
|
long nth = *nthp;
|
||||||
if ((int)SIZEOF_VALUE * 2 < e - p && (int)SIZEOF_VALUE * 2 < nth) {
|
if ((int)SIZEOF_VOIDP * 2 < e - p && (int)SIZEOF_VOIDP * 2 < nth) {
|
||||||
const VALUE *s, *t;
|
const uintptr_t *s, *t;
|
||||||
const VALUE lowbits = sizeof(VALUE) - 1;
|
const uintptr_t lowbits = SIZEOF_VOIDP - 1;
|
||||||
s = (const VALUE*)(~lowbits & ((VALUE)p + lowbits));
|
s = (const uintptr_t*)(~lowbits & ((uintptr_t)p + lowbits));
|
||||||
t = (const VALUE*)(~lowbits & (VALUE)e);
|
t = (const uintptr_t*)(~lowbits & (uintptr_t)e);
|
||||||
while (p < (const char *)s) {
|
while (p < (const char *)s) {
|
||||||
if (is_utf8_lead_byte(*p)) nth--;
|
if (is_utf8_lead_byte(*p)) nth--;
|
||||||
p++;
|
p++;
|
||||||
@ -1750,7 +1750,7 @@ str_utf8_nth(const char *p, const char *e, long *nthp)
|
|||||||
do {
|
do {
|
||||||
nth -= count_utf8_lead_bytes_with_word(s);
|
nth -= count_utf8_lead_bytes_with_word(s);
|
||||||
s++;
|
s++;
|
||||||
} while (s < t && (int)sizeof(VALUE) <= nth);
|
} while (s < t && (int)SIZEOF_VOIDP <= nth);
|
||||||
p = (char *)s;
|
p = (char *)s;
|
||||||
}
|
}
|
||||||
while (p < e) {
|
while (p < e) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user