1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

vm_args.c: stop requiring calling in vm_caller_setup_arg_block

_mjit_compile_send.erb: simplify code using the change

insns.def: adapt to the interface change

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64281 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
k0kubun 2018-08-11 03:50:42 +00:00
parent b4b012c529
commit 0f0d7805cb
3 changed files with 20 additions and 22 deletions

View file

@ -715,7 +715,7 @@ send
{
struct rb_calling_info calling;
vm_caller_setup_arg_block(ec, reg_cfp, &calling, ci, blockiseq, FALSE);
calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, ci, blockiseq, FALSE);
calling.recv = TOPN(calling.argc = ci->orig_argc);
vm_search_method(ci, cc, calling.recv);
CALL_METHOD(&calling, ci, cc);
@ -785,7 +785,7 @@ invokesuper
{
struct rb_calling_info calling;
vm_caller_setup_arg_block(ec, reg_cfp, &calling, ci, blockiseq, TRUE);
calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, ci, blockiseq, TRUE);
calling.recv = TOPN(calling.argc = ci->orig_argc);
vm_search_super_method(ec, GET_CFP(), &calling, ci, cc);
CALL_METHOD(&calling, ci, cc);

View file

@ -39,9 +39,7 @@
fprintf(f, " {\n");
fprintf(f, " VALUE block_handler = VM_BLOCK_HANDLER_NONE;\n");
% if insn.name == 'send'
fprintf(f, " struct rb_calling_info calling;\n");
fprintf(f, " vm_caller_setup_arg_block(ec, reg_cfp, &calling, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", operands[0], operands[2]);
fprintf(f, " block_handler = calling.block_handler;\n");
fprintf(f, " block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", operands[0], operands[2]);
% end
% # JIT: Special CALL_METHOD. Inline vm_call_iseq_setup_normal for vm_call_iseq_setup_func FASTPATH.
fprintf(f, " {\n");

View file

@ -853,19 +853,19 @@ refine_sym_proc_call(RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg))
return rb_vm_call0(ec, obj, mid, argc, argv, me);
}
static void
static VALUE
vm_caller_setup_arg_block(const rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
struct rb_calling_info *calling, const struct rb_call_info *ci, rb_iseq_t *blockiseq, const int is_super)
const struct rb_call_info *ci, rb_iseq_t *blockiseq, const int is_super)
{
if (ci->flag & VM_CALL_ARGS_BLOCKARG) {
VALUE block_code = *(--reg_cfp->sp);
if (NIL_P(block_code)) {
calling->block_handler = VM_BLOCK_HANDLER_NONE;
}
return VM_BLOCK_HANDLER_NONE;
}
else if (block_code == rb_block_param_proxy) {
calling->block_handler = VM_CF_BLOCK_HANDLER(reg_cfp);
}
return VM_CF_BLOCK_HANDLER(reg_cfp);
}
else if (SYMBOL_P(block_code) && rb_method_basic_definition_p(rb_cSymbol, idTo_proc)) {
const rb_cref_t *cref = vm_env_cref(reg_cfp->ep);
if (cref && !NIL_P(cref->refinements)) {
@ -878,23 +878,23 @@ vm_caller_setup_arg_block(const rb_execution_context_t *ec, rb_control_frame_t *
}
block_code = func;
}
calling->block_handler = block_code;
}
else {
calling->block_handler = vm_to_proc(block_code);
}
return block_code;
}
else {
return vm_to_proc(block_code);
}
}
else if (blockiseq != NULL) { /* likely */
struct rb_captured_block *captured = VM_CFP_TO_CAPTURED_BLOCK(reg_cfp);
captured->code.iseq = blockiseq;
calling->block_handler = VM_BH_FROM_ISEQ_BLOCK(captured);
return VM_BH_FROM_ISEQ_BLOCK(captured);
}
else {
if (is_super) {
calling->block_handler = GET_BLOCK_HANDLER();
}
else {
calling->block_handler = VM_BLOCK_HANDLER_NONE;
}
return GET_BLOCK_HANDLER();
}
else {
return VM_BLOCK_HANDLER_NONE;
}
}
}