diff options
author | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-11 03:50:42 +0000 |
---|---|---|
committer | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-11 03:50:42 +0000 |
commit | 0f0d7805cb7e7f6f545176e3ef1a107051d413cb (patch) | |
tree | 95328629b9af48c2f95ff8d0ff9b56419348f2db | |
parent | b4b012c529d4c5ca71e6bcd3e543652001ab6903 (diff) |
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
-rw-r--r-- | insns.def | 4 | ||||
-rw-r--r-- | tool/ruby_vm/views/_mjit_compile_send.erb | 4 | ||||
-rw-r--r-- | vm_args.c | 34 |
3 files changed, 20 insertions, 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); diff --git a/tool/ruby_vm/views/_mjit_compile_send.erb b/tool/ruby_vm/views/_mjit_compile_send.erb index 1da6eddf08..08fb8a9b10 100644 --- a/tool/ruby_vm/views/_mjit_compile_send.erb +++ b/tool/ruby_vm/views/_mjit_compile_send.erb @@ -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"); @@ -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; + } } } |