YJIT: Rest and block_arg support (#7557)

* YJIT: Rest and block_arg support

* Update bootstraptest/test_yjit.rb

---------

Co-authored-by: Maxime Chevalier-Boisvert <maximechevalierb@gmail.com>
This commit is contained in:
Jimmy Miller 2023-03-17 16:11:30 -04:00 коммит произвёл GitHub
Родитель 2d97f87407
Коммит 5d0a1ffafa
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 24 добавлений и 9 удалений

Просмотреть файл

@ -3662,3 +3662,24 @@ assert_equal '[1, 2, 3]', %q{
end
send(:bar, 1, 2, 3)
}
# Rest with block
# Simplified code from railsbench
assert_equal '[{"/a"=>"b", :as=>:c, :via=>:post}, [], nil]', %q{
def match(path, *rest, &block)
[path, rest, block]
end
def map_method(method, args, &block)
options = args.last
args.pop
options[:via] = method
match(*args, options, &block)
end
def post(*args, &block)
map_method(:post, args, &block)
end
post "/a" => "b", as: :c
}

Просмотреть файл

@ -5180,9 +5180,9 @@ fn move_rest_args_to_stack(array: Opnd, num_args: u32, ctx: &mut Context, asm: &
let array_len_opnd = get_array_len(asm, array);
asm.comment("Side exit if length doesn't not equal remaining args");
asm.comment("Side exit if length is less than required");
asm.cmp(array_len_opnd, num_args.into());
asm.jbe(counted_exit!(ocb, side_exit, send_splatarray_length_not_equal));
asm.jl(counted_exit!(ocb, side_exit, send_iseq_has_rest_and_splat_not_equal));
asm.comment("Push arguments from array");
@ -5412,11 +5412,6 @@ fn gen_send_iseq(
return CantCompile;
}
if iseq_has_rest && unsafe { get_iseq_flags_has_block(iseq) } {
gen_counter_incr!(asm, send_iseq_has_rest_and_block);
return CantCompile;
}
if iseq_has_rest && unsafe { get_iseq_flags_has_kw(iseq) } {
gen_counter_incr!(asm, send_iseq_has_rest_and_kw);
return CantCompile;

Просмотреть файл

@ -253,11 +253,10 @@ make_counters! {
send_send_getter,
send_send_builtin,
send_iseq_has_rest_and_captured,
send_iseq_has_rest_and_splat_fewer,
send_iseq_has_rest_and_send,
send_iseq_has_rest_and_block,
send_iseq_has_rest_and_kw,
send_iseq_has_rest_and_optional,
send_iseq_has_rest_and_splat_not_equal,
send_is_a_class_mismatch,
send_instance_of_class_mismatch,