mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
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/trunk@59763 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
faa26f5570
commit
bd10ce165c
2 changed files with 36 additions and 9 deletions
18
string.c
18
string.c
|
@ -9553,6 +9553,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
|
||||
|
@ -9561,13 +9563,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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue