aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--insns.def4
-rw-r--r--tool/ruby_vm/views/_mjit_compile_send.erb4
-rw-r--r--vm_args.c34
3 files changed, 20 insertions, 22 deletions
diff --git a/insns.def b/insns.def
index 1903da2068..897da9d0c5 100644
--- a/insns.def
+++ b/insns.def
@@ -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");
diff --git a/vm_args.c b/vm_args.c
index ef5193b77f..12e6e70cf5 100644
--- a/vm_args.c
+++ b/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;
+ }
}
}