diff options
author | Takashi Kokubun <[email protected]> | 2024-09-02 03:10:19 -0700 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2024-09-02 03:10:19 -0700 |
commit | d83b5633b16f4ddcece4ff924f21c5a5851470cf (patch) | |
tree | bad0ccf9803c0ee2fc85752d5404793cc0e7dbc4 | |
parent | b210c86a0201f6a97c4da8266908260746f53ae0 (diff) |
merge revision(s) 992596fb7af18a7f472589a607d0eb3fbb03b49a: [Backport #20344]
Fix next inside block argument stack underflow
[Bug #20344]
Fix compile_next adding removable adjust label
-rw-r--r-- | compile.c | 4 | ||||
-rw-r--r-- | test/ruby/test_iseq.rb | 21 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 23 insertions, 4 deletions
@@ -2991,8 +2991,7 @@ remove_unreachable_chunk(rb_iseq_t *iseq, LINK_ELEMENT *i) /* do nothing */ } else if (IS_ADJUST(i)) { - LABEL *dest = ((ADJUST *)i)->label; - if (dest && dest->unremovable) return 0; + return 0; } end = i; } while ((i = i->next) != 0); @@ -7892,7 +7891,6 @@ compile_next(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, in add_ensure_iseq(ret, iseq, 0); ADD_INSNL(ret, line_node, jump, ISEQ_COMPILE_DATA(iseq)->end_label); ADD_ADJUST_RESTORE(ret, splabel); - splabel->unremovable = FALSE; if (!popped) { ADD_INSN(ret, line_node, putnil); diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb index dc9ef17ffe..27bb12c8d7 100644 --- a/test/ruby/test_iseq.rb +++ b/test/ruby/test_iseq.rb @@ -795,6 +795,27 @@ class TestISeq < Test::Unit::TestCase end; end + def test_unreachable_next_in_block + bug20344 = '[ruby-core:117210] [Bug #20344]' + assert_nothing_raised(SyntaxError, bug20344) do + compile(<<~RUBY) + proc do + next + + case nil + when "a" + next + when "b" + when "c" + proc {} + end + + next + end + RUBY + end + end + def test_loading_kwargs_memory_leak assert_no_memory_leak([], "#{<<~"begin;"}", "#{<<~'end;'}", rss: true) a = RubyVM::InstructionSequence.compile("foo(bar: :baz)").to_binary @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 4 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 97 +#define RUBY_PATCHLEVEL 98 #include "ruby/version.h" #include "ruby/internal/abi.h" |