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