summaryrefslogtreecommitdiff
path: root/rjit_c.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2023-03-19 13:46:09 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2023-03-19 14:04:58 -0700
commit83ad1cac811b144b0016fdbfc9d83c11fd190349 (patch)
tree5f2bf602a351d7160041381383372f74f324bb57 /rjit_c.rb
parent95c4ced39eb0d25925724456b222a56206b633db (diff)
downloadruby-83ad1cac811b144b0016fdbfc9d83c11fd190349.tar.gz
RJIT: Optimize Kernel#respond_to?
Diffstat (limited to 'rjit_c.rb')
-rw-r--r--rjit_c.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/rjit_c.rb b/rjit_c.rb
index 0c6cfd3944..a9522b7454 100644
--- a/rjit_c.rb
+++ b/rjit_c.rb
@@ -310,6 +310,25 @@ module RubyVM::RJIT # :nodoc: all
def rb_obj_class(obj)
Primitive.cexpr! 'rb_obj_class(obj)'
end
+
+ def rb_sym2id(sym)
+ Primitive.cexpr! 'SIZET2NUM((size_t)rb_sym2id(sym))'
+ end
+
+ def rb_callable_method_entry_or_negative(klass, mid)
+ cme_addr = Primitive.cexpr! 'SIZET2NUM((size_t)rb_callable_method_entry_or_negative(klass, (ID)NUM2SIZET(mid)))'
+ return nil if cme_addr == 0
+ rb_callable_method_entry_t.new(cme_addr)
+ end
+
+ def rb_method_basic_definition_p(klass, mid)
+ Primitive.cexpr! 'RBOOL(rb_method_basic_definition_p(klass, (ID)NUM2SIZET(mid)))'
+ end
+
+ def UNDEFINED_METHOD_ENTRY_P(cme)
+ _cme_addr = cme.to_i
+ Primitive.cexpr! 'RBOOL(UNDEFINED_METHOD_ENTRY_P((const rb_callable_method_entry_t *)NUM2SIZET(_cme_addr)))'
+ end
end
#
@@ -352,6 +371,7 @@ module RubyVM::RJIT # :nodoc: all
C::METHOD_VISI_PRIVATE = Primitive.cexpr! %q{ SIZET2NUM(METHOD_VISI_PRIVATE) }
C::METHOD_VISI_PROTECTED = Primitive.cexpr! %q{ SIZET2NUM(METHOD_VISI_PROTECTED) }
C::METHOD_VISI_PUBLIC = Primitive.cexpr! %q{ SIZET2NUM(METHOD_VISI_PUBLIC) }
+ C::METHOD_VISI_UNDEF = Primitive.cexpr! %q{ SIZET2NUM(METHOD_VISI_UNDEF) }
C::OBJ_TOO_COMPLEX_SHAPE_ID = Primitive.cexpr! %q{ SIZET2NUM(OBJ_TOO_COMPLEX_SHAPE_ID) }
C::OPTIMIZED_METHOD_TYPE_BLOCK_CALL = Primitive.cexpr! %q{ SIZET2NUM(OPTIMIZED_METHOD_TYPE_BLOCK_CALL) }
C::OPTIMIZED_METHOD_TYPE_CALL = Primitive.cexpr! %q{ SIZET2NUM(OPTIMIZED_METHOD_TYPE_CALL) }
@@ -433,6 +453,10 @@ module RubyVM::RJIT # :nodoc: all
Primitive.cexpr! %q{ SIZET2NUM(block_type_iseq) }
end
+ def C.idRespond_to_missing
+ Primitive.cexpr! %q{ SIZET2NUM(idRespond_to_missing) }
+ end
+
def C.imemo_iseq
Primitive.cexpr! %q{ SIZET2NUM(imemo_iseq) }
end