diff options
-rw-r--r-- | compile.c | 77 | ||||
-rw-r--r-- | insns.def | 10 | ||||
-rw-r--r-- | mini_builtin.c | 5 | ||||
-rw-r--r-- | vm_insnhelper.c | 14 |
4 files changed, 73 insertions, 33 deletions
@@ -6762,39 +6762,65 @@ iseq_builtin_function_name(ID mid) } static int -delegate_call_p(const rb_iseq_t *iseq, unsigned int argc, const LINK_ANCHOR *args) { if (argc == 0) { return TRUE; } - else if (argc == iseq->body->param.size) { - const LINK_ELEMENT *elem = FIRST_ELEMENT(args); - - for (unsigned int i=0; i<argc; i++) { - if (elem->type == ISEQ_ELEMENT_INSN && - INSN_OF(elem) == BIN(getlocal)) { - int local_index = FIX2INT(OPERAND_AT(elem, 0)); - int local_level = FIX2INT(OPERAND_AT(elem, 1)); - if (local_level == 0) { - unsigned int index = iseq->body->local_table_size - (local_index - VM_ENV_DATA_SIZE + 1); -#if 0 - ID param_id = iseq->body->local_table[i]; - fprintf(stderr, "param_id:%s (%d), id:%s (%d) local_index:%d, local_size:%d\n", - rb_id2name(param_id), i, - rb_id2name(iseq->body->local_table[index]), index, - local_index, (int)iseq->body->local_table_size); -#endif - if (i == index) { - elem = elem->next; - continue; /* for */ } } } - return FALSE; } return TRUE; } - return FALSE; } static int @@ -6924,8 +6950,9 @@ compile_call(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, in return COMPILE_NG; } - if (delegate_call_p(iseq, FIX2INT(argc), args)) { - ADD_INSN1(ret, line, opt_invokebuiltin_delegate, bf); } else { ADD_SEQ(ret, args); @@ -1492,26 +1492,26 @@ invokebuiltin /* call specific function with args (same parameters) */ DEFINE_INSN opt_invokebuiltin_delegate -(RB_BUILTIN bf) () (VALUE ret) // attr bool leaf = false; /* anything can happen inside */ { - ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf); } /* call specific function with args (same parameters) and leave */ DEFINE_INSN opt_invokebuiltin_delegate_leave -(RB_BUILTIN bf) () (VALUE val) // attr bool leaf = false; /* anything can happen inside */ { - val = vm_invoke_builtin_delegate(ec, reg_cfp, bf); /* leave fastpath */ - /* TracePoint/return should fallback this insn to invokecfuncwparam */ if (vm_pop_frame(ec, GET_CFP(), GET_EP())) { #if OPT_CALL_THREADED_CODE rb_ec_thread_ptr(ec)->retval = val; @@ -21,6 +21,11 @@ rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin rb_ast_dispose(ast); // register (loaded iseq will not be freed) st_insert(loaded_builtin_table, (st_data_t)feature_name, (st_data_t)iseq); rb_gc_register_mark_object((VALUE)iseq); @@ -4989,10 +4989,18 @@ vm_invoke_builtin(rb_execution_context_t *ec, rb_control_frame_t *cfp, const str } static VALUE -vm_invoke_builtin_delegate(rb_execution_context_t *ec, rb_control_frame_t *cfp, const struct rb_builtin_function *bf) { - const VALUE *argv = cfp->ep - cfp->iseq->body->local_table_size - VM_ENV_DATA_SIZE + 1; - // fprintf(stderr, "%s %s(%d):%p\n", __func__, bf->name, bf->argc, bf->func_ptr); return invoke_bf(ec, cfp, bf, argv); } |