diff options
author | Aaron Patterson <[email protected]> | 2025-04-29 10:02:00 -0700 |
---|---|---|
committer | Aaron Patterson <[email protected]> | 2025-04-29 13:33:23 -0700 |
commit | 203614080f2e944abb190a130b07685b0373da03 (patch) | |
tree | 3b40d718a2fb6dc0470c444e5326f5d2db33e4fd | |
parent | e6974be5458907d4e809a84d775c3e6b7f4fcea9 (diff) |
opt_new needs to happen after safe navigation
If safe navigation instructions happen first, we get a stack
inconsistency error.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13205
-rw-r--r-- | prism_compile.c | 4 | ||||
-rw-r--r-- | test/ruby/test_optimization.rb | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c index 71361e9aa9..e655688401 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3621,8 +3621,6 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c const pm_node_location_t location = PM_LOCATION_START_LOCATION(scope_node->parser, message_loc, call_node->base.node_id); - LINK_ELEMENT *opt_new_prelude = LAST_ELEMENT(ret); - LABEL *else_label = NEW_LABEL(location.line); LABEL *end_label = NEW_LABEL(location.line); LABEL *retry_end_l = NEW_LABEL(location.line); @@ -3661,6 +3659,8 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c add_trace_branch_coverage(iseq, ret, &code_location, node_id, 0, "then", branches); } + LINK_ELEMENT *opt_new_prelude = LAST_ELEMENT(ret); + int flags = 0; struct rb_callinfo_kwarg *kw_arg = NULL; diff --git a/test/ruby/test_optimization.rb b/test/ruby/test_optimization.rb index d1cf765247..e39eafa5e5 100644 --- a/test/ruby/test_optimization.rb +++ b/test/ruby/test_optimization.rb @@ -1216,6 +1216,11 @@ class TestRubyOptimization < Test::Unit::TestCase RUBY end + def test_opt_new_with_safe_navigation + payload = nil + assert_nil payload&.new + end + def test_opt_new pos_initialize = " def initialize a, b |