зеркало из https://github.com/github/ruby.git
Fix Regexp#to_s for GC compaction
The test fails when RGENGC_CHECK_MODE is turned on: TestRegexp#test_to_s_under_gc_compact_stress = 13.46 s 1) Failure: TestRegexp#test_to_s_under_gc_compact_stress [test/ruby/test_regexp.rb:81]: <"(?-mix:abcd\u3042)"> expected but was <"(?-mix:\u5C78\u3030\u5C78\u3030\u5C78\u3030\u5C78\u3030\u5C78\u3030)">.
This commit is contained in:
Родитель
688a1314e6
Коммит
fadda88903
9
re.c
9
re.c
|
@ -565,8 +565,6 @@ rb_reg_str_with_term(VALUE re, int term)
|
||||||
{
|
{
|
||||||
int options, opt;
|
int options, opt;
|
||||||
const int embeddable = ONIG_OPTION_MULTILINE|ONIG_OPTION_IGNORECASE|ONIG_OPTION_EXTEND;
|
const int embeddable = ONIG_OPTION_MULTILINE|ONIG_OPTION_IGNORECASE|ONIG_OPTION_EXTEND;
|
||||||
long len;
|
|
||||||
const UChar* ptr;
|
|
||||||
VALUE str = rb_str_buf_new2("(?");
|
VALUE str = rb_str_buf_new2("(?");
|
||||||
char optbuf[OPTBUF_SIZE + 1]; /* for '-' */
|
char optbuf[OPTBUF_SIZE + 1]; /* for '-' */
|
||||||
rb_encoding *enc = rb_enc_get(re);
|
rb_encoding *enc = rb_enc_get(re);
|
||||||
|
@ -575,8 +573,9 @@ rb_reg_str_with_term(VALUE re, int term)
|
||||||
|
|
||||||
rb_enc_copy(str, re);
|
rb_enc_copy(str, re);
|
||||||
options = RREGEXP_PTR(re)->options;
|
options = RREGEXP_PTR(re)->options;
|
||||||
ptr = (UChar*)RREGEXP_SRC_PTR(re);
|
VALUE src_str = RREGEXP_SRC(re);
|
||||||
len = RREGEXP_SRC_LEN(re);
|
const UChar *ptr = (UChar *)RSTRING_PTR(src_str);
|
||||||
|
long len = RSTRING_LEN(src_str);
|
||||||
again:
|
again:
|
||||||
if (len >= 4 && ptr[0] == '(' && ptr[1] == '?') {
|
if (len >= 4 && ptr[0] == '(' && ptr[1] == '?') {
|
||||||
int err = 1;
|
int err = 1;
|
||||||
|
@ -666,6 +665,8 @@ rb_reg_str_with_term(VALUE re, int term)
|
||||||
}
|
}
|
||||||
rb_enc_copy(str, re);
|
rb_enc_copy(str, re);
|
||||||
|
|
||||||
|
RB_GC_GUARD(src_str);
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,18 @@ class TestRegexp < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_to_s_under_gc_compact_stress
|
||||||
|
EnvUtil.under_gc_compact_stress do
|
||||||
|
str = "abcd\u3042"
|
||||||
|
[:UTF_16BE, :UTF_16LE, :UTF_32BE, :UTF_32LE].each do |es|
|
||||||
|
enc = Encoding.const_get(es)
|
||||||
|
rs = Regexp.new(str.encode(enc)).to_s
|
||||||
|
assert_equal("(?-mix:abcd\u3042)".encode(enc), rs)
|
||||||
|
assert_equal(enc, rs.encoding)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_to_s_extended_subexp
|
def test_to_s_extended_subexp
|
||||||
re = /#\g#{"\n"}/x
|
re = /#\g#{"\n"}/x
|
||||||
re = /#{re}/
|
re = /#{re}/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче