summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ruby_vm/rjit/insn_compiler.rb8
-rw-r--r--rjit_c.h1
-rw-r--r--rjit_c.rb1
3 files changed, 9 insertions, 1 deletions
diff --git a/lib/ruby_vm/rjit/insn_compiler.rb b/lib/ruby_vm/rjit/insn_compiler.rb
index 163395ecf4..2dfe52713b 100644
--- a/lib/ruby_vm/rjit/insn_compiler.rb
+++ b/lib/ruby_vm/rjit/insn_compiler.rb
@@ -4152,7 +4152,7 @@ module RubyVM::RJIT
def jit_call_cfunc_with_frame(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
cfunc = cme.def.body.cfunc
- if argc + 1 > 6
+ if argc + 1 > C_ARGS.size
asm.incr_counter(:send_cfunc_too_many_args)
return CantCompile
end
@@ -4191,6 +4191,12 @@ module RubyVM::RJIT
# Push splat args, which was skipped in jit_caller_setup_arg.
if flags & C::VM_CALL_ARGS_SPLAT != 0
+ # We aren't handling a vararg cfuncs with splat currently.
+ if cfunc.argc == -1
+ asm.incr_counter(:send_args_splat_cfunc_var_args)
+ return CantCompile
+ end
+
required_args = cfunc.argc - (argc - 1)
# + 1 for self
if required_args + 1 >= C_ARGS.size
diff --git a/rjit_c.h b/rjit_c.h
index 5ab902ba55..d6e7cc01d6 100644
--- a/rjit_c.h
+++ b/rjit_c.h
@@ -24,6 +24,7 @@ RJIT_RUNTIME_COUNTERS(
send_args_splat,
send_args_splat_not_array,
send_args_splat_length_not_equal,
+ send_args_splat_cfunc_var_args,
send_args_splat_arity_error,
send_args_splat_ruby2_hash,
send_kw_splat,
diff --git a/rjit_c.rb b/rjit_c.rb
index d89453b934..aa2ca3fa2b 100644
--- a/rjit_c.rb
+++ b/rjit_c.rb
@@ -1278,6 +1278,7 @@ module RubyVM::RJIT # :nodoc: all
send_args_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat)")],
send_args_splat_not_array: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_not_array)")],
send_args_splat_length_not_equal: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_length_not_equal)")],
+ send_args_splat_cfunc_var_args: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_cfunc_var_args)")],
send_args_splat_arity_error: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_arity_error)")],
send_args_splat_ruby2_hash: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_args_splat_ruby2_hash)")],
send_kw_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_kw_splat)")],