compile.c: Handle anonymous variables in outer_variable_cmp

[Bug #21370]
This commit is contained in:
Jean Boussier 2025-05-24 10:02:35 +02:00
parent 9a29252830
commit ff222ac27a
Notes: git 2025-06-02 11:41:41 +00:00
2 changed files with 26 additions and 0 deletions

View File

@ -13378,6 +13378,13 @@ outer_variable_cmp(const void *a, const void *b, void *arg)
{
const struct outer_variable_pair *ap = (const struct outer_variable_pair *)a;
const struct outer_variable_pair *bp = (const struct outer_variable_pair *)b;
if (!ap->name) {
return -1;
} else if (!bp->name) {
return 1;
}
return rb_str_cmp(ap->name, bp->name);
}

View File

@ -859,6 +859,25 @@ class TestISeq < Test::Unit::TestCase
end
end
def test_serialize_anonymous_outer_variables
iseq = RubyVM::InstructionSequence.compile(<<~'RUBY')
obj = Object.new
def obj.test
[1].each do
raise "Oops"
rescue
return it
end
end
obj
RUBY
binary = iseq.to_binary # [Bug # 21370]
roundtripped_iseq = RubyVM::InstructionSequence.load_from_binary(binary)
object = roundtripped_iseq.eval
assert_equal 1, object.test
end
def test_loading_kwargs_memory_leak
assert_no_memory_leak([], "#{<<~"begin;"}", "#{<<~'end;'}", rss: true)
a = iseq_to_binary(RubyVM::InstructionSequence.compile("foo(bar: :baz)"))