Skip to content

Commit

Permalink
fix YJIT calls
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Apr 24, 2024
1 parent 7146e52 commit 46ef870
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 20 deletions.
16 changes: 16 additions & 0 deletions bootstraptest/test_yjit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4766,6 +4766,22 @@ def delegator(...)
delegator
}

assert_equal 'ok', %q{
def ok
:ok
end
def delegator(...)
ok(...)
end
def caller
send(:delegator)
end
caller
}

assert_equal '[:ok, :ok, :ok]', %q{
def identity(x) = x
def foo(x, _) = x
Expand Down
44 changes: 24 additions & 20 deletions yjit/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6991,6 +6991,10 @@ fn gen_send_iseq(
}
exit_if_doing_kw_and_opts_missing(asm, doing_kw_call, opts_missing)?;
exit_if_has_rest_and_optional_and_block(asm, iseq_has_rest, opt_num, iseq, block_arg)?;
if forwarding_call && flags & VM_CALL_OPT_SEND != 0 {
gen_counter_incr(asm, Counter::send_iseq_send_forwarding);
return None;
}
let block_arg_type = exit_if_unsupported_block_arg_type(jit, asm, block_arg)?;

// Bail if we can't drop extra arguments for a yield by just popping them
Expand Down Expand Up @@ -7500,33 +7504,33 @@ fn gen_send_iseq(
}

if !forwarding_call {
// Nil-initialize missing optional parameters
nil_fill(
"nil-initialize missing optionals",
{
let begin = -argc + required_num + opts_filled;
let end = -argc + required_num + opt_num;

begin..end
},
asm
);
// Nil-initialize the block parameter. It's the last parameter local
if iseq_has_block_param {
let block_param = asm.ctx.sp_opnd(-argc + num_params - 1);
asm.store(block_param, Qnil.into());
}
// Nil-initialize non-parameter locals
nil_fill(
"nil-initialize locals",
// Nil-initialize missing optional parameters
nil_fill(
"nil-initialize missing optionals",
{
let begin = -argc + required_num + opts_filled;
let end = -argc + required_num + opt_num;

begin..end
},
asm
);
// Nil-initialize the block parameter. It's the last parameter local
if iseq_has_block_param {
let block_param = asm.ctx.sp_opnd(-argc + num_params - 1);
asm.store(block_param, Qnil.into());
}
// Nil-initialize non-parameter locals
nil_fill(
"nil-initialize locals",
{
let begin = -argc + num_params;
let end = -argc + num_locals;

begin..end
},
asm
);
);
}

if forwarding_call {
Expand Down
1 change: 1 addition & 0 deletions yjit/src/stats.rs
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ make_counters! {
send_iseq_has_no_kw,
send_iseq_accepts_no_kwarg,
send_iseq_materialized_block,
send_iseq_send_forwarding,
send_iseq_splat_not_array,
send_iseq_splat_with_kw,
send_iseq_missing_optional_kw,
Expand Down

0 comments on commit 46ef870

Please sign in to comment.