mirror of
https://github.com/ruby/ruby.git
synced 2025-08-16 05:59:00 +02:00
[ruby/stringio] Fix ascii_only? flag in strio_write
(https://github.com/ruby/stringio/pull/77) Followup of #79 `rb_str_resize()` was changed byb0b9f7201a
. ```c rb_str_resize(string, shorter) // clear ENC_CODERANGE in some case rb_str_resize(string, longer) // does not clear ENC_CODERANGE anymore ``` ```c // rb_str_resize in string.c if (slen > len && ENC_CODERANGE(str) != ENC_CODERANGE_7BIT) { ENC_CODERANGE_CLEAR(str); } ``` I think this change is based on an assumption that appending null bytes will not change flag `ascii_only?`. `strio_extend()` will make the string longer if needed, and update the flags correctly for appending null bytes. Before `memmove()`, we need to `rb_str_modify()` because updated flags are not updated for `memmove()`.b31a538576
This commit is contained in:
parent
4095191f2c
commit
fd1bafc11f
2 changed files with 7 additions and 9 deletions
|
@ -915,9 +915,6 @@ strio_extend(struct StringIO *ptr, long pos, long len)
|
||||||
if (pos > olen)
|
if (pos > olen)
|
||||||
MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen);
|
MEMZERO(RSTRING_PTR(ptr->string) + olen, char, pos - olen);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
rb_str_modify(ptr->string);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1464,14 +1461,9 @@ strio_write(VALUE self, VALUE str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int cr0 = ENC_CODERANGE(ptr->string);
|
|
||||||
int cr = ENC_CODERANGE_UNKNOWN;
|
|
||||||
if (rb_enc_asciicompat(enc) && rb_enc_asciicompat(enc2)) {
|
|
||||||
cr = ENC_CODERANGE_AND(cr0, ENC_CODERANGE(str));
|
|
||||||
}
|
|
||||||
strio_extend(ptr, ptr->pos, len);
|
strio_extend(ptr, ptr->pos, len);
|
||||||
|
rb_str_modify(ptr->string);
|
||||||
memmove(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_PTR(str), len);
|
memmove(RSTRING_PTR(ptr->string)+ptr->pos, RSTRING_PTR(str), len);
|
||||||
if (cr != cr0) ENC_CODERANGE_SET(ptr->string, cr);
|
|
||||||
}
|
}
|
||||||
RB_GC_GUARD(str);
|
RB_GC_GUARD(str);
|
||||||
ptr->pos += len;
|
ptr->pos += len;
|
||||||
|
|
|
@ -961,6 +961,12 @@ class TestStringIO < Test::Unit::TestCase
|
||||||
assert_predicate(s.string, :ascii_only?)
|
assert_predicate(s.string, :ascii_only?)
|
||||||
s.write "\u{431 43e 433 443 441}"
|
s.write "\u{431 43e 433 443 441}"
|
||||||
assert_not_predicate(s.string, :ascii_only?)
|
assert_not_predicate(s.string, :ascii_only?)
|
||||||
|
|
||||||
|
s = StringIO.new("\u{3042}")
|
||||||
|
s.rewind
|
||||||
|
assert_not_predicate(s.string, :ascii_only?)
|
||||||
|
s.write('aaaa')
|
||||||
|
assert_predicate(s.string, :ascii_only?)
|
||||||
end
|
end
|
||||||
|
|
||||||
def assert_string(content, encoding, str, mesg = nil)
|
def assert_string(content, encoding, str, mesg = nil)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue