summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ruby_vm/mjit/insn_compiler.rb29
-rw-r--r--mjit_c.h10
-rw-r--r--mjit_c.rb38
-rwxr-xr-xtool/mjit/bindgen.rb7
4 files changed, 81 insertions, 3 deletions
diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb
index 8f1586efef..2606f84c6c 100644
--- a/lib/ruby_vm/mjit/insn_compiler.rb
+++ b/lib/ruby_vm/mjit/insn_compiler.rb
@@ -992,8 +992,35 @@ module RubyVM::MJIT
case cme.def.type
when C.VM_METHOD_TYPE_ISEQ
jit_call_iseq_setup(jit, ctx, asm, ci, cme, flags, argc)
+ # when C.VM_METHOD_TYPE_NOTIMPLEMENTED
+ when C.VM_METHOD_TYPE_CFUNC
+ asm.incr_counter(:send_cfunc)
+ return CantCompile
+ when C.VM_METHOD_TYPE_ATTRSET
+ asm.incr_counter(:send_attrset)
+ return CantCompile
+ when C.VM_METHOD_TYPE_IVAR
+ asm.incr_counter(:send_ivar)
+ return CantCompile
+ # when C.VM_METHOD_TYPE_MISSING
+ when C.VM_METHOD_TYPE_BMETHOD
+ asm.incr_counter(:send_bmethod)
+ return CantCompile
+ when C.VM_METHOD_TYPE_ALIAS
+ asm.incr_counter(:send_alias)
+ return CantCompile
+ when C.VM_METHOD_TYPE_OPTIMIZED
+ asm.incr_counter(:send_optimized)
+ return CantCompile
+ # when C.VM_METHOD_TYPE_UNDEF
+ when C.VM_METHOD_TYPE_ZSUPER
+ asm.incr_counter(:send_zsuper)
+ return CantCompile
+ when C.VM_METHOD_TYPE_REFINED
+ asm.incr_counter(:send_refined)
+ return CantCompile
else
- asm.incr_counter(:send_not_iseq)
+ asm.incr_counter(:send_not_implemented_type)
return CantCompile
end
end
diff --git a/mjit_c.h b/mjit_c.h
index 4ce846009a..20f4c0bf90 100644
--- a/mjit_c.h
+++ b/mjit_c.h
@@ -114,10 +114,18 @@ MJIT_RUNTIME_COUNTERS(
send_kw_splat,
send_kwarg,
send_missing_cme,
- send_not_iseq,
send_private,
send_protected,
send_tailcall,
+ send_not_implemented_type,
+ send_cfunc,
+ send_ivar,
+ send_attrset,
+ send_bmethod,
+ send_alias,
+ send_optimized,
+ send_zsuper,
+ send_refined,
send_guard_nil,
send_guard_true,
diff --git a/mjit_c.rb b/mjit_c.rb
index d6704e762c..c5220561ee 100644
--- a/mjit_c.rb
+++ b/mjit_c.rb
@@ -411,6 +411,18 @@ module RubyVM::MJIT # :nodoc: all
Primitive.cexpr! %q{ UINT2NUM(VM_FRAME_MAGIC_METHOD) }
end
+ def C.VM_METHOD_TYPE_ALIAS
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_ALIAS) }
+ end
+
+ def C.VM_METHOD_TYPE_ATTRSET
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_ATTRSET) }
+ end
+
+ def C.VM_METHOD_TYPE_BMETHOD
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_BMETHOD) }
+ end
+
def C.VM_METHOD_TYPE_CFUNC
Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_CFUNC) }
end
@@ -419,6 +431,22 @@ module RubyVM::MJIT # :nodoc: all
Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_ISEQ) }
end
+ def C.VM_METHOD_TYPE_IVAR
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_IVAR) }
+ end
+
+ def C.VM_METHOD_TYPE_OPTIMIZED
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_OPTIMIZED) }
+ end
+
+ def C.VM_METHOD_TYPE_REFINED
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_REFINED) }
+ end
+
+ def C.VM_METHOD_TYPE_ZSUPER
+ Primitive.cexpr! %q{ UINT2NUM(VM_METHOD_TYPE_ZSUPER) }
+ end
+
def C.INVALID_SHAPE_ID
Primitive.cexpr! %q{ ULONG2NUM(INVALID_SHAPE_ID) }
end
@@ -884,10 +912,18 @@ module RubyVM::MJIT # :nodoc: all
send_kw_splat: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_kw_splat)")],
send_kwarg: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_kwarg)")],
send_missing_cme: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_missing_cme)")],
- send_not_iseq: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_not_iseq)")],
send_private: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_private)")],
send_protected: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_protected)")],
send_tailcall: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_tailcall)")],
+ send_not_implemented_type: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_not_implemented_type)")],
+ send_cfunc: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_cfunc)")],
+ send_ivar: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_ivar)")],
+ send_attrset: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_attrset)")],
+ send_bmethod: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_bmethod)")],
+ send_alias: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_alias)")],
+ send_optimized: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_optimized)")],
+ send_zsuper: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_zsuper)")],
+ send_refined: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_refined)")],
send_guard_nil: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_guard_nil)")],
send_guard_true: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_guard_true)")],
send_guard_false: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_mjit_runtime_counters *)NULL)), send_guard_false)")],
diff --git a/tool/mjit/bindgen.rb b/tool/mjit/bindgen.rb
index 5cee397cb3..2c4fef82d9 100755
--- a/tool/mjit/bindgen.rb
+++ b/tool/mjit/bindgen.rb
@@ -380,6 +380,13 @@ generator = BindingGenerator.new(
VM_FRAME_MAGIC_METHOD
VM_METHOD_TYPE_CFUNC
VM_METHOD_TYPE_ISEQ
+ VM_METHOD_TYPE_IVAR
+ VM_METHOD_TYPE_ATTRSET
+ VM_METHOD_TYPE_BMETHOD
+ VM_METHOD_TYPE_ALIAS
+ VM_METHOD_TYPE_OPTIMIZED
+ VM_METHOD_TYPE_ZSUPER
+ VM_METHOD_TYPE_REFINED
],
ULONG: %w[
INVALID_SHAPE_ID