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:
parent
b4b012c529
commit
0f0d7805cb
3 changed files with 20 additions and 22 deletions
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
34
vm_args.c
34
vm_args.c
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue