Skip to content
3 changes: 2 additions & 1 deletion ext/openssl/ossl_x509store.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@ ossl_x509store_set_vfy_cb(VALUE self, VALUE cb)

GetX509Store(self, store);
rb_iv_set(self, "@verify_callback", cb);
// We don't need to trigger a write barrier because `rb_iv_set` did it.
X509_STORE_set_ex_data(store, store_ex_verify_cb_idx, (void *)cb);
RB_OBJ_WRITTEN(self, Qundef, cb);

return cb;
}
Expand Down Expand Up @@ -611,6 +611,7 @@ ossl_x509stctx_verify(VALUE self)
GetX509StCtx(self, ctx);
VALUE cb = rb_iv_get(self, "@verify_callback");
X509_STORE_CTX_set_ex_data(ctx, stctx_ex_verify_cb_idx, (void *)cb);
RB_OBJ_WRITTEN(self, Qundef, cb);

switch (X509_verify_cert(ctx)) {
case 1:
Expand Down
5 changes: 5 additions & 0 deletions internal/re.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,9 @@ int rb_match_count(VALUE match);
VALUE rb_reg_new_ary(VALUE ary, int options);
VALUE rb_reg_last_defined(VALUE match);

#define ARG_REG_OPTION_MASK \
(ONIG_OPTION_IGNORECASE|ONIG_OPTION_MULTILINE|ONIG_OPTION_EXTEND)
#define ARG_ENCODING_FIXED 16
#define ARG_ENCODING_NONE 32

#endif /* INTERNAL_RE_H */
5 changes: 0 additions & 5 deletions re.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,11 +290,6 @@ rb_memsearch(const void *x0, long m, const void *y0, long n, rb_encoding *enc)

#define KCODE_FIXED FL_USER4

#define ARG_REG_OPTION_MASK \
(ONIG_OPTION_IGNORECASE|ONIG_OPTION_MULTILINE|ONIG_OPTION_EXTEND)
#define ARG_ENCODING_FIXED 16
#define ARG_ENCODING_NONE 32

static int
char_to_option(int c)
{
Expand Down
17 changes: 8 additions & 9 deletions test/ruby/test_hash.rb
Original file line number Diff line number Diff line change
Expand Up @@ -880,21 +880,20 @@ def test_inspect
assert_equal(quote1, eval(quote1).inspect)
assert_equal(quote2, eval(quote2).inspect)
assert_equal(quote3, eval(quote3).inspect)
begin
verbose_bak, $VERBOSE = $VERBOSE, nil
enc = Encoding.default_external
Encoding.default_external = Encoding::ASCII

EnvUtil.with_default_external(Encoding::ASCII) do
utf8_ascii_hash = '{"\\u3042": 1}'
assert_equal(eval(utf8_ascii_hash).inspect, utf8_ascii_hash)
Encoding.default_external = Encoding::UTF_8
end

EnvUtil.with_default_external(Encoding::UTF_8) do
utf8_hash = "{\u3042: 1}"
assert_equal(eval(utf8_hash).inspect, utf8_hash)
Encoding.default_external = Encoding::Windows_31J
end

EnvUtil.with_default_external(Encoding::Windows_31J) do
sjis_hash = "{\x87]: 1}".force_encoding('sjis')
assert_equal(eval(sjis_hash).inspect, sjis_hash)
ensure
Encoding.default_external = enc
$VERBOSE = verbose_bak
end
end

Expand Down
118 changes: 52 additions & 66 deletions test/ruby/test_m17n.rb
Original file line number Diff line number Diff line change
Expand Up @@ -186,33 +186,35 @@ def test_string_inspect_invalid
end

def test_string_inspect_encoding
EnvUtil.suppress_warning do
begin
orig_int = Encoding.default_internal
orig_ext = Encoding.default_external
Encoding.default_internal = nil
[Encoding::UTF_8, Encoding::EUC_JP, Encoding::Windows_31J, Encoding::GB18030].
each do |e|
Encoding.default_external = e
str = "\x81\x30\x81\x30".force_encoding('GB18030')
assert_equal(Encoding::GB18030 == e ? %{"#{str}"} : '"\x{81308130}"', str.inspect)
str = e("\xa1\x8f\xa1\xa1")
expected = "\"\\xA1\x8F\xA1\xA1\"".force_encoding("EUC-JP")
assert_equal(Encoding::EUC_JP == e ? expected : "\"\\xA1\\x{8FA1A1}\"", str.inspect)
str = s("\x81@")
assert_equal(Encoding::Windows_31J == e ? %{"#{str}"} : '"\x{8140}"', str.inspect)
str = "\u3042\u{10FFFD}"
assert_equal(Encoding::UTF_8 == e ? %{"#{str}"} : '"\u3042\u{10FFFD}"', str.inspect)
end
Encoding.default_external = Encoding::UTF_8
[Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE,
Encoding::UTF8_SOFTBANK].each do |e|
str = "abc".encode(e)
assert_equal('"abc"', str.inspect)
end
ensure
Encoding.default_internal = orig_int
Encoding.default_external = orig_ext
[
Encoding::UTF_8,
Encoding::EUC_JP,
Encoding::Windows_31J,
Encoding::GB18030,
].each do |e|
EnvUtil.with_default_external(e) do
str = "\x81\x30\x81\x30".force_encoding('GB18030')
assert_equal(Encoding::GB18030 == e ? %{"#{str}"} : '"\x{81308130}"', str.inspect)
str = e("\xa1\x8f\xa1\xa1")
expected = "\"\\xA1\x8F\xA1\xA1\"".force_encoding("EUC-JP")
assert_equal(Encoding::EUC_JP == e ? expected : "\"\\xA1\\x{8FA1A1}\"", str.inspect)
str = s("\x81@")
assert_equal(Encoding::Windows_31J == e ? %{"#{str}"} : '"\x{8140}"', str.inspect)
str = "\u3042\u{10FFFD}"
assert_equal(Encoding::UTF_8 == e ? %{"#{str}"} : '"\u3042\u{10FFFD}"', str.inspect)
end
end

EnvUtil.with_default_external(Encoding::UTF_8) do
[
Encoding::UTF_16BE,
Encoding::UTF_16LE,
Encoding::UTF_32BE,
Encoding::UTF_32LE,
Encoding::UTF8_SOFTBANK
].each do |e|
str = "abc".encode(e)
assert_equal('"abc"', str.inspect)
end
end
end
Expand Down Expand Up @@ -246,59 +248,43 @@ def test_utf_without_bom_valid
end

def test_object_utf16_32_inspect
EnvUtil.suppress_warning do
begin
orig_int = Encoding.default_internal
orig_ext = Encoding.default_external
Encoding.default_internal = nil
Encoding.default_external = Encoding::UTF_8
o = Object.new
[Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].each do |e|
o.instance_eval "undef inspect;def inspect;'abc'.encode('#{e}');end"
assert_equal '[abc]', [o].inspect
end
ensure
Encoding.default_internal = orig_int
Encoding.default_external = orig_ext
EnvUtil.with_default_external(Encoding::UTF_8) do
o = Object.new
[Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].each do |e|
o.instance_eval "undef inspect;def inspect;'abc'.encode('#{e}');end"
assert_equal '[abc]', [o].inspect
end
end
end

def test_object_inspect_external
orig_v, $VERBOSE = $VERBOSE, false
orig_int, Encoding.default_internal = Encoding.default_internal, nil
orig_ext = Encoding.default_external

omit "https://bugs.ruby-lang.org/issues/18338"

o = Object.new

Encoding.default_external = Encoding::UTF_16BE
def o.inspect
"abc"
end
assert_nothing_raised(Encoding::CompatibilityError) { [o].inspect }
EnvUtil.with_default_external(Encoding::UTF_16BE) do
def o.inspect
"abc"
end
assert_nothing_raised(Encoding::CompatibilityError) { [o].inspect }

def o.inspect
"abc".encode(Encoding.default_external)
def o.inspect
"abc".encode(Encoding.default_external)
end
assert_equal '[abc]', [o].inspect
end

assert_equal '[abc]', [o].inspect

Encoding.default_external = Encoding::US_ASCII
def o.inspect
"\u3042"
end
assert_equal '[\u3042]', [o].inspect
EnvUtil.with_default_external(Encoding::US_ASCII) do
def o.inspect
"\u3042"
end
assert_equal '[\u3042]', [o].inspect

def o.inspect
"\x82\xa0".force_encoding(Encoding::Windows_31J)
def o.inspect
"\x82\xa0".force_encoding(Encoding::Windows_31J)
end
assert_equal '[\x{82A0}]', [o].inspect
end
assert_equal '[\x{82A0}]', [o].inspect
ensure
Encoding.default_internal = orig_int
Encoding.default_external = orig_ext
$VERBOSE = orig_v
end

def test_str_dump
Expand Down
14 changes: 4 additions & 10 deletions test/ruby/test_string.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3251,18 +3251,12 @@ def test_ascii_incomat_inspect
assert_equal('"\\u3042\\u3044\\u3046"', S("\u3042\u3044\u3046".encode(e)).inspect)
assert_equal('"ab\\"c"', S("ab\"c".encode(e)).inspect, bug4081)
end
begin
verbose, $VERBOSE = $VERBOSE, nil
ext = Encoding.default_external
Encoding.default_external = "us-ascii"
$VERBOSE = verbose

EnvUtil.with_default_external(Encoding::US_ASCII) do
i = S("abc\"\\".force_encoding("utf-8")).inspect
ensure
$VERBOSE = nil
Encoding.default_external = ext
$VERBOSE = verbose

assert_equal('"abc\\"\\\\"', i, bug4081)
end
assert_equal('"abc\\"\\\\"', i, bug4081)
end

def test_dummy_inspect
Expand Down
8 changes: 8 additions & 0 deletions test/ruby/test_zjit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1847,6 +1847,14 @@ def test = "#{}"
}, insns: [:concatstrings]
end

def test_regexp_interpolation
assert_compiles '/123/', %q{
def test = /#{1}#{2}#{3}/

test
}, insns: [:toregexp]
end

private

# Assert that every method call in `test_script` can be compiled by ZJIT
Expand Down
7 changes: 7 additions & 0 deletions zjit/bindgen/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,13 @@ fn main() {

// From internal/re.h
.allowlist_function("rb_reg_new_ary")
.allowlist_var("ARG_ENCODING_FIXED")
.allowlist_var("ARG_ENCODING_NONE")

// From include/ruby/onigmo.h
.allowlist_var("ONIG_OPTION_IGNORECASE")
.allowlist_var("ONIG_OPTION_EXTEND")
.allowlist_var("ONIG_OPTION_MULTILINE")

// `ruby_value_type` is a C enum and this stops it from
// prefixing all the members with the name of the type
Expand Down
Loading