diff --git a/include/ruby/intern.h b/include/ruby/intern.h index f985853..4957c3c 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -573,6 +573,7 @@ VALUE rb_obj_is_kind_of(VALUE, VALUE); VALUE rb_obj_alloc(VALUE); VALUE rb_obj_clone(VALUE); VALUE rb_obj_dup(VALUE); +VALUE rb_obj_itself(VALUE); VALUE rb_obj_init_copy(VALUE,VALUE); VALUE rb_obj_taint(VALUE); VALUE rb_obj_tainted(VALUE); diff --git a/object.c b/object.c index 21772de..663f86f 100644 --- a/object.c +++ b/object.c @@ -402,6 +402,22 @@ rb_obj_dup(VALUE obj) return dup; } +/* + * call-seq: + * obj.itself -> an_object + * + * Returns obj. + * + * string = 'my string' #=> "my string" + * string.itself.object_id == string.object_id #=> true + * + */ +VALUE +rb_obj_itself(VALUE obj) +{ + return obj; +} + /* :nodoc: */ VALUE rb_obj_init_copy(VALUE obj, VALUE orig) @@ -3302,6 +3318,7 @@ Init_Object(void) rb_define_method(rb_mKernel, "singleton_class", rb_obj_singleton_class, 0); rb_define_method(rb_mKernel, "clone", rb_obj_clone, 0); rb_define_method(rb_mKernel, "dup", rb_obj_dup, 0); + rb_define_method(rb_mKernel, "itself", rb_obj_itself, 0); rb_define_method(rb_mKernel, "initialize_copy", rb_obj_init_copy, 1); rb_define_method(rb_mKernel, "initialize_dup", rb_obj_init_dup_clone, 1); rb_define_method(rb_mKernel, "initialize_clone", rb_obj_init_dup_clone, 1); diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb index f305cc7..51a0c0c 100644 --- a/test/ruby/test_object.rb +++ b/test/ruby/test_object.rb @@ -12,6 +12,12 @@ class TestObject < Test::Unit::TestCase $VERBOSE = @verbose end + def test_itself + object = Object.new + assert_equal object, object.itself + assert_equal object.object_id, object.itself.object_id + end + def test_dup assert_raise(TypeError) { 1.dup } assert_raise(TypeError) { true.dup }