aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--string.c4
2 files changed, 8 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 766b9e8320..5c18ad9809 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Nov 18 10:17:09 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_utf8_nth): no count_utf8_lead_bytes_with_word
+ optimization for short string. [ruby-core:26787]
+
+ * string.c (str_utf8_offset): str_utf8_nth never return NULL.
+
Wed Nov 18 10:12:34 2009 Shugo Maeda <shugo@ruby-lang.org>
* vm_method.c (rb_undef): should raise TypeError if klass is nil.
diff --git a/string.c b/string.c
index f923b5f168..381c8528ac 100644
--- a/string.c
+++ b/string.c
@@ -1468,7 +1468,7 @@ rb_str_offset(VALUE str, long pos)
static char *
str_utf8_nth(const char *p, const char *e, long nth)
{
- if ((int)SIZEOF_VALUE * 2 < nth) {
+ if ((int)SIZEOF_VALUE < e - p && (int)SIZEOF_VALUE * 2 < nth) {
const VALUE *s, *t;
const VALUE lowbits = sizeof(VALUE) - 1;
s = (const VALUE*)(~lowbits & ((VALUE)p + lowbits));
@@ -1483,7 +1483,6 @@ str_utf8_nth(const char *p, const char *e, long nth)
} while (s < t && (int)sizeof(VALUE) <= nth);
p = (char *)s;
}
- if (p > e) return 0;
while (p < e) {
if (is_utf8_lead_byte(*p)) {
if (nth == 0) break;
@@ -1498,7 +1497,6 @@ static long
str_utf8_offset(const char *p, const char *e, long nth)
{
const char *pp = str_utf8_nth(p, e, nth);
- if (!pp) return e - p;
return pp - p;
}
#endif