aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-24 17:17:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-24 17:17:35 +0000
commit42eeb2c1b1788c5975d2a383c9b0c3ff2c90b6b8 (patch)
treef7ec1977a708ccfede53c8367c748ce2c88642e4
parent4b265d3e7bbb508bd0f846491b64ca06970bae60 (diff)
downloadruby-42eeb2c1b1788c5975d2a383c9b0c3ff2c90b6b8.tar.gz
* string.c (rb_str_delete_bang): should recalculate coderange.
[ruby-talk:329267] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22606 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--string.c12
-rw-r--r--test/ruby/test_string.rb5
3 files changed, 20 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 3cd60e0f0e..426b1d8dfc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Feb 25 02:17:30 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_delete_bang): should recalculate coderange.
+ [ruby-talk:329267]
+
Wed Feb 25 00:41:21 2009 Akinori MUSHA <knu@iDaemons.org>
* class.c (rb_scan_args): Allow specifying the number of trailing
diff --git a/string.c b/string.c
index 8460b8e5a0..7da6a0e955 100644
--- a/string.c
+++ b/string.c
@@ -1255,7 +1255,12 @@ rb_string_value(volatile VALUE *ptr)
{
VALUE s = *ptr;
if (TYPE(s) != T_STRING) {
- s = rb_str_to_str(s);
+ if (SYMBOL_P(s)) {
+ s = rb_sym_to_s(s);
+ }
+ else {
+ s = rb_str_to_str(s);
+ }
*ptr = s;
}
return s;
@@ -5070,7 +5075,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
char *s, *send, *t;
VALUE del = 0, nodel = 0;
int modify = 0;
- int i, ascompat;
+ int i, ascompat, cr;
if (RSTRING_LEN(str) == 0 || !RSTRING_PTR(str)) return Qnil;
if (argc < 1) {
@@ -5088,6 +5093,7 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
ascompat = rb_enc_asciicompat(enc);
s = t = RSTRING_PTR(str);
send = RSTRING_END(str);
+ cr = ascompat ? ENC_CODERANGE_7BIT : ENC_CODERANGE_VALID;
while (s < send) {
unsigned int c;
int clen;
@@ -5112,12 +5118,14 @@ rb_str_delete_bang(int argc, VALUE *argv, VALUE str)
else {
if (t != s) rb_enc_mbcput(c, t, enc);
t += clen;
+ if (cr == ENC_CODERANGE_7BIT) cr = ENC_CODERANGE_VALID;
}
s += clen;
}
}
*t = '\0';
STR_SET_LEN(str, t - RSTRING_PTR(str));
+ ENC_CODERANGE_SET(str, cr);
if (modify) return str;
return Qnil;
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index d4b6ff2081..a995087bbc 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -474,6 +474,11 @@ class TestString < Test::Unit::TestCase
assert_equal(S("he"), S("hello").delete(S("lo")))
assert_equal(S("hell"), S("hello").delete(S("aeiou"), S("^e")))
assert_equal(S("ho"), S("hello").delete(S("ej-m")))
+
+ assert_equal("a".hash, "a\u0101".delete("\u0101").hash, '[ruby-talk:329267]')
+ assert_equal(true, "a\u0101".delete("\u0101").ascii_only?)
+ assert_equal(true, "a\u3041".delete("\u3041").ascii_only?)
+ assert_equal(false, "a\u3041\u3042".tr("\u3041", "a").ascii_only?)
end
def test_delete!