diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-14 04:31:25 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-09-14 04:31:25 +0000 |
commit | 04667398c938a408e7602fc6992f594290baff6f (patch) | |
tree | f747512a1a03cb4b4cc063691d17fe3704317aa3 /string.c | |
parent | fdeb8dc28dc7b9f2546e21ee36d909f16fd55aac (diff) |
merge revision(s) 59763: [Backport #13874]
string.c: fix false coderange
* string.c (rb_enc_str_scrub): enc can differ from the actual
encoding of the string, the cached coderange is useless then.
[ruby-core:82674] [Bug #13874]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@59883 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -8723,6 +8723,8 @@ str_compat_and_valid(VALUE str, rb_encoding *enc) return str; } +static VALUE enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl, int cr); + /** * @param str the string to be scrubbed * @param repl the replacement character @@ -8731,13 +8733,25 @@ str_compat_and_valid(VALUE str, rb_encoding *enc) VALUE rb_str_scrub(VALUE str, VALUE repl) { - return rb_enc_str_scrub(STR_ENC_GET(str), str, repl); + rb_encoding *enc = STR_ENC_GET(str); + return enc_str_scrub(enc, str, repl, ENC_CODERANGE(str)); } VALUE rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl) { - int cr = ENC_CODERANGE(str); + int cr = ENC_CODERANGE_UNKNOWN; + if (enc == STR_ENC_GET(str)) { + /* cached coderange makes sense only when enc equals the + * actual encoding of str */ + cr = ENC_CODERANGE(str); + } + return enc_str_scrub(enc, str, repl, cr); +} + +static VALUE +enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl, int cr) +{ int encidx; VALUE buf = Qnil; const char *rep; |