aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bootstraptest/test_yjit.rb21
-rw-r--r--yjit/src/codegen.rs9
-rw-r--r--yjit/src/stats.rs3
3 files changed, 9 insertions, 24 deletions
diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb
index f29f0ce876..8902cd6cde 100644
--- a/bootstraptest/test_yjit.rb
+++ b/bootstraptest/test_yjit.rb
@@ -3662,24 +3662,3 @@ 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
-}
diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs
index 6b840ee475..d0fd439264 100644
--- a/yjit/src/codegen.rs
+++ b/yjit/src/codegen.rs
@@ -5181,9 +5181,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 is less than required");
+ asm.comment("Side exit if length doesn't not equal remaining args");
asm.cmp(array_len_opnd, num_args.into());
- asm.jl(counted_exit!(ocb, side_exit, send_iseq_has_rest_and_splat_not_equal));
+ asm.jbe(counted_exit!(ocb, side_exit, send_splatarray_length_not_equal));
asm.comment("Push arguments from array");
@@ -5413,6 +5413,11 @@ 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;
diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs
index b096e28e07..5f8f841ffc 100644
--- a/yjit/src/stats.rs
+++ b/yjit/src/stats.rs
@@ -253,10 +253,11 @@ 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,