summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-02-14 23:44:44 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2023-03-05 23:28:59 -0800
commit4271927d619469faa7f82e8899b8c185961137f3 (patch)
treebc4461a5ad3926a6e64c8f00ca61ef5897b3b7b5
parent4d97f9319c23dc051ac9cdc8fa3279265da304da (diff)
Side-exit on cfunc with -2 argc
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7448
-rw-r--r--lib/ruby_vm/mjit/insn_compiler.rb4
-rw-r--r--mjit_c.h1
-rw-r--r--mjit_c.rb1
3 files changed, 6 insertions, 0 deletions
diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb
index dabc0b385c..04f1a349c7 100644
--- a/lib/ruby_vm/mjit/insn_compiler.rb
+++ b/lib/ruby_vm/mjit/insn_compiler.rb
@@ -1731,6 +1731,10 @@ module RubyVM::MJIT
asm.incr_counter(:send_arity)
return CantCompile
end
+ if cfunc.argc == -2
+ asm.incr_counter(:send_cfunc_ruby_array_varg)
+ return CantCompile
+ end
# Check interrupts before SP motion to safely side-exit with the original SP.
jit_check_ints(jit, ctx, asm)
diff --git a/mjit_c.h b/mjit_c.h
index 668920e3fb..c07b7bc6ec 100644
--- a/mjit_c.h
+++ b/mjit_c.h
@@ -135,6 +135,7 @@ MJIT_RUNTIME_COUNTERS(
send_cfunc_variadic,
send_cfunc_too_many_args,
+ send_cfunc_ruby_array_varg,
send_ivar,
send_ivar_splat,
diff --git a/mjit_c.rb b/mjit_c.rb
index 1de0887aa3..a5c4878779 100644
--- a/mjit_c.rb
+++ b/mjit_c.rb
@@ -1061,6 +1061,7 @@ module RubyVM::MJIT # :nodoc: all
send_iseq_kw_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_iseq_kw_splat)")],
send_cfunc_variadic: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_cfunc_variadic)")],
send_cfunc_too_many_args: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_cfunc_too_many_args)")],
+ send_cfunc_ruby_array_varg: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_cfunc_ruby_array_varg)")],
send_ivar: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_ivar)")],
send_ivar_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_ivar_splat)")],
send_ivar_opt_send: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_ivar_opt_send)")],