Don't support blockarg in opt_new
We don't calculate the correct argc so the bookkeeping slot is something else (unexpected) instead of Qnil (expected).
This commit is contained in:
parent
6052b12de4
commit
b42c8398ba
Notes:
git
2025-04-29 16:13:40 +00:00
@ -916,11 +916,13 @@ opt_new
|
||||
VALUE argc = vm_ci_argc(cd->ci);
|
||||
VALUE val = TOPN(argc);
|
||||
|
||||
// The bookkeeping slot should be empty.
|
||||
RUBY_ASSERT(TOPN(argc + 1) == Qnil);
|
||||
|
||||
if (vm_method_cfunc_is(GET_ISEQ(), cd, val, rb_class_new_instance_pass_kw) && !(ruby_vm_event_flags & ISEQ_TRACE_EVENTS)) {
|
||||
RB_DEBUG_COUNTER_INC(opt_new_hit);
|
||||
val = rb_obj_alloc(val);
|
||||
TOPN(argc) = val;
|
||||
RUBY_ASSERT(TOPN(argc + 1) == Qnil);
|
||||
TOPN(argc + 1) = val;
|
||||
}
|
||||
else {
|
||||
|
@ -3722,7 +3722,8 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
||||
|
||||
bool inline_new = ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction &&
|
||||
method_id == rb_intern("new") &&
|
||||
call_node->block == NULL;
|
||||
call_node->block == NULL &&
|
||||
(flags & VM_CALL_ARGS_BLOCKARG) == 0;
|
||||
|
||||
if (inline_new) {
|
||||
if (LAST_ELEMENT(ret) == opt_new_prelude) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user