diff --git a/benchmark/mjit_class.yml b/benchmark/mjit_class.yml new file mode 100644 index 0000000000..22f95c2d4d --- /dev/null +++ b/benchmark/mjit_class.yml @@ -0,0 +1,11 @@ +type: lib/benchmark_driver/runner/mjit +prelude: | + def mjit_class(obj) + obj.class + end + +benchmark: + - mjit_class(self) + - mjit_class(1) + +loop_count: 40000000 diff --git a/benchmark/mjit_send_cfunc.yml b/benchmark/mjit_send_cfunc.yml deleted file mode 100644 index 8caa62ce81..0000000000 --- a/benchmark/mjit_send_cfunc.yml +++ /dev/null @@ -1,7 +0,0 @@ -type: lib/benchmark_driver/runner/mjit -prelude: | - def mjit_send_cfunc - self.class - end -benchmark: mjit_send_cfunc -loop_count: 100000000 diff --git a/common.mk b/common.mk index 6f829c9a4d..8438089272 100644 --- a/common.mk +++ b/common.mk @@ -8514,6 +8514,7 @@ mjit_compile.$(OBJEXT): $(top_srcdir)/internal/compilers.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/gc.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/hash.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/imemo.h +mjit_compile.$(OBJEXT): $(top_srcdir)/internal/object.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/serial.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/static_assert.h mjit_compile.$(OBJEXT): $(top_srcdir)/internal/variable.h @@ -9266,6 +9267,7 @@ object.$(OBJEXT): {$(VPATH)}internal/value_type.h object.$(OBJEXT): {$(VPATH)}internal/variable.h object.$(OBJEXT): {$(VPATH)}internal/warning_push.h object.$(OBJEXT): {$(VPATH)}internal/xmalloc.h +object.$(OBJEXT): {$(VPATH)}kernel.rb object.$(OBJEXT): {$(VPATH)}kernel.rbinc object.$(OBJEXT): {$(VPATH)}missing.h object.$(OBJEXT): {$(VPATH)}object.c diff --git a/kernel.rb b/kernel.rb index e7d955fe45..d00ba3a809 100644 --- a/kernel.rb +++ b/kernel.rb @@ -1,4 +1,25 @@ module Kernel + # + # call-seq: + # obj.class -> class + # + # Returns the class of obj. This method must always be called + # with an explicit receiver, as #class is also a reserved word in + # Ruby. + # + # 1.class #=> Integer + # self.class #=> Object + #-- + # Equivalent to \c Object\#class in Ruby. + # + # Returns the class of \c obj, skipping singleton classes or module inclusions. + #++ + # + def class + Primitive.attr! 'inline' + Primitive.cexpr! 'rb_obj_class(self)' + end + # # call-seq: # obj.clone(freeze: nil) -> an_object diff --git a/object.c b/object.c index dafbcd0531..03cc51a473 100644 --- a/object.c +++ b/object.c @@ -291,22 +291,6 @@ rb_class_real(VALUE cl) return cl; } -/** - * call-seq: - * obj.class -> class - * - * Returns the class of obj. This method must always be called - * with an explicit receiver, as #class is also a reserved word in - * Ruby. - * - * 1.class #=> Integer - * self.class #=> Object - *-- - * Equivalent to \c Object\#class in Ruby. - * - * Returns the class of \c obj, skipping singleton classes or module inclusions. - *++ - */ VALUE rb_obj_class(VALUE obj) { @@ -4606,7 +4590,6 @@ InitVM_Object(void) rb_define_method(rb_mKernel, "hash", rb_obj_hash, 0); /* in hash.c */ rb_define_method(rb_mKernel, "<=>", rb_obj_cmp, 1); - rb_define_method(rb_mKernel, "class", rb_obj_class, 0); rb_define_method(rb_mKernel, "singleton_class", rb_obj_singleton_class, 0); rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0); rb_define_method(rb_mKernel, "itself", rb_obj_itself, 0);