summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c77
-rw-r--r--insns.def10
-rw-r--r--mini_builtin.c5
-rw-r--r--vm_insnhelper.c14
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);
}