[前][次][番号順一覧][スレッド一覧]

ruby-changes:26313

From: charliesome <ko1@a...>
Date: Thu, 13 Dec 2012 23:11:11 +0900 (JST)
Subject: [ruby-changes:26313] charliesome:r38364 (trunk): * object.c (Init_Object): use rb_mod_init_copy for Class#initialize_copy

charliesome	2012-12-13 23:11:01 +0900 (Thu, 13 Dec 2012)

  New Revision: 38364

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=38364

  Log:
    * object.c (Init_Object): use rb_mod_init_copy for Class#initialize_copy
    * class.c (rb_class_init_copy): rename to class_init_copy_check, performs type
      checks on arguments to prevent reinitialization of initialized class
      [ruby-core:50869] [Bug #7557]
    * class.c (rb_mod_init_copy): use class_init_copy_check if receiver is T_CLASS
    * test/ruby/test_class.rb (class TestClass): related test

  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/object.c
    trunk/test/ruby/test_class.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38363)
+++ ChangeLog	(revision 38364)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Dec 13 23:10:52  Charlie Somerville  <charlie@c...>
+	* object.c (Init_Object): use rb_mod_init_copy for Class#initialize_copy
+	* class.c (rb_class_init_copy): rename to class_init_copy_check, performs type
+	  checks on arguments to prevent reinitialization of initialized class
+	  [ruby-core:50869] [Bug #7557]
+	* class.c (rb_mod_init_copy): use class_init_copy_check if receiver is T_CLASS
+	* test/ruby/test_class.rb (class TestClass): related test
+
 Thu Dec 13 16:53:10 2012  Eric Hodel  <drbrain@s...>
 
 	* lib/rdoc/class_module.rb:  Fixed duplicate comments for classes and
Index: object.c
===================================================================
--- object.c	(revision 38363)
+++ object.c	(revision 38364)
@@ -3101,7 +3101,7 @@ Init_Object(void) https://github.com/ruby/ruby/blob/trunk/object.c#L3101
     rb_define_method(rb_cClass, "allocate", rb_obj_alloc, 0);
     rb_define_method(rb_cClass, "new", rb_class_new_instance, -1);
     rb_define_method(rb_cClass, "initialize", rb_class_initialize, -1);
-    rb_define_method(rb_cClass, "initialize_copy", rb_class_init_copy, 1); /* in class.c */
+    rb_define_method(rb_cClass, "initialize_copy", rb_mod_init_copy, 1); /* in class.c */
     rb_define_method(rb_cClass, "superclass", rb_class_superclass, 0);
     rb_define_alloc_func(rb_cClass, rb_class_s_alloc);
     rb_undef_method(rb_cClass, "extend_object");
Index: class.c
===================================================================
--- class.c	(revision 38363)
+++ class.c	(revision 38364)
@@ -159,10 +159,27 @@ clone_const_i(st_data_t key, st_data_t v https://github.com/ruby/ruby/blob/trunk/class.c#L159
     return clone_const((ID)key, (const rb_const_entry_t *)value, (st_table *)data);
 }
 
+static void
+class_init_copy_check(VALUE clone, VALUE orig)
+{
+    if (orig == rb_cBasicObject) {
+	rb_raise(rb_eTypeError, "can't copy the root class");
+    }
+    if (RCLASS_SUPER(clone) != 0 || clone == rb_cBasicObject) {
+	rb_raise(rb_eTypeError, "already initialized class");
+    }
+    if (FL_TEST(orig, FL_SINGLETON)) {
+	rb_raise(rb_eTypeError, "can't copy singleton class");
+    }
+}
+
 /* :nodoc: */
 VALUE
 rb_mod_init_copy(VALUE clone, VALUE orig)
 {
+    if(RB_TYPE_P(clone, T_CLASS)) {
+	class_init_copy_check(clone, orig);
+    }
     rb_obj_init_copy(clone, orig);
     if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
 	RBASIC(clone)->klass = rb_singleton_class_clone(orig);
@@ -202,22 +219,6 @@ rb_mod_init_copy(VALUE clone, VALUE orig https://github.com/ruby/ruby/blob/trunk/class.c#L219
     return clone;
 }
 
-/* :nodoc: */
-VALUE
-rb_class_init_copy(VALUE clone, VALUE orig)
-{
-    if (orig == rb_cBasicObject) {
-	rb_raise(rb_eTypeError, "can't copy the root class");
-    }
-    if (RCLASS_SUPER(clone) != 0 || clone == rb_cBasicObject) {
-	rb_raise(rb_eTypeError, "already initialized class");
-    }
-    if (FL_TEST(orig, FL_SINGLETON)) {
-	rb_raise(rb_eTypeError, "can't copy singleton class");
-    }
-    return rb_mod_init_copy(clone, orig);
-}
-
 VALUE
 rb_singleton_class_clone(VALUE obj)
 {
Index: test/ruby/test_class.rb
===================================================================
--- test/ruby/test_class.rb	(revision 38363)
+++ test/ruby/test_class.rb	(revision 38364)
@@ -270,4 +270,19 @@ class TestClass < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_class.rb#L270
     bug5274 = StrClone.new("[ruby-dev:44460]")
     assert_equal(bug5274, Marshal.load(Marshal.dump(bug5274)))
   end
+
+  def test_cannot_reinitialize_class_with_initialize_copy # [ruby-core:50869]
+    assert_in_out_err([], <<-RUBY, ["Object"], [])
+      class Class
+        def initialize_copy(*); super; end
+      end
+
+      class A; end
+      class B; end
+
+      A.send(:initialize_copy, Class.new(B)) rescue nil
+
+      p A.superclass
+    RUBY
+  end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]