summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <[email protected]>2025-04-29 10:02:00 -0700
committerAaron Patterson <[email protected]>2025-04-29 13:33:23 -0700
commit203614080f2e944abb190a130b07685b0373da03 (patch)
tree3b40d718a2fb6dc0470c444e5326f5d2db33e4fd
parente6974be5458907d4e809a84d775c3e6b7f4fcea9 (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.c4
-rw-r--r--test/ruby/test_optimization.rb5
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