[macruby-changes] [2990] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Nov 10 21:46:38 PST 2009


Revision: 2990
          http://trac.macosforge.org/projects/ruby/changeset/2990
Author:   lsansonetti at apple.com
Date:     2009-11-10 21:46:34 -0800 (Tue, 10 Nov 2009)
Log Message:
-----------
do not install special methods on singleton classes

Modified Paths:
--------------
    MacRuby/trunk/class.c
    MacRuby/trunk/object.c

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2009-11-10 06:49:11 UTC (rev 2989)
+++ MacRuby/trunk/class.c	2009-11-11 05:46:34 UTC (rev 2990)
@@ -127,11 +127,13 @@
 	    rb_class_new_instance_imp, -1);
     rb_objc_define_method(klass, "dup", rb_obj_dup, 0);
     rb_objc_define_private_method(klass, "initialize", rb_objc_init, 0);
-    rb_objc_define_private_method(klass, "initialize_copy", rb_obj_init_copy, 1);
+    rb_objc_define_private_method(klass, "initialize_copy",
+	    rb_obj_init_copy, 1);
 
     rb_objc_install_method(*(Class *)klass, selAllocWithZone,
 	    (IMP)rb_obj_imp_allocWithZone);
-    rb_objc_install_method((Class)klass, selIsEqual, (IMP)rb_obj_imp_isEqual);
+    rb_objc_install_method((Class)klass, selIsEqual,
+	    (IMP)rb_obj_imp_isEqual);
     rb_objc_install_method((Class)klass, selInit, (IMP)rb_obj_imp_init);
     rb_objc_install_method((Class)klass, selDescription,
 	    (IMP)rb_obj_imp_description);
@@ -186,8 +188,6 @@
 
     RCLASS_SET_VERSION(ocklass, version_flag);
 
-    DLOG("DEFC", "%s < %s (version=%d)", ocname, class_getName(class_getSuperclass((Class)ocklass)), version_flag);
-
     objc_registerClassPair(ocklass);
 
     if (klass != 0) {
@@ -214,10 +214,7 @@
 
     klass = rb_objc_alloc_class(name, super, T_CLASS, rb_cClass);
    
-    if (super == rb_cNSObject) {
-	rb_define_object_special_methods(klass);
-    }
-    else if (super != 0
+    if (super != rb_cNSObject && super != 0
 	    && ((RCLASS_VERSION(*(VALUE *)super) & RCLASS_HAS_ROBJECT_ALLOC)
 		== RCLASS_HAS_ROBJECT_ALLOC)) {
 	RCLASS_SET_VERSION(*(VALUE *)klass,
@@ -231,10 +228,20 @@
     return klass;
 }
 
+static VALUE
+rb_class_boot2(VALUE super, const char *name)
+{
+    VALUE klass = rb_objc_create_class(name, super);
+    if (super == rb_cNSObject) {
+	rb_define_object_special_methods(klass);
+    }
+    return klass;
+}
+
 VALUE
 rb_class_boot(VALUE super)
 {
-    return rb_objc_create_class(NULL, super);
+    return rb_class_boot2(super, NULL);
 }
 
 void
@@ -389,7 +396,7 @@
 VALUE
 rb_make_singleton_class(VALUE super)
 {
-    VALUE klass = rb_class_boot(super);
+    VALUE klass = rb_objc_create_class(NULL, super);
     long v = RCLASS_VERSION(klass);
     if (super == rb_cNSObject) {
 	v ^= RCLASS_IS_OBJECT_SUBCLASS;
@@ -423,7 +430,7 @@
     if (super == 0) {
 	super = rb_cObject;
     }
-    return rb_objc_create_class(rb_id2name(id), super);
+    return rb_class_boot2(super, rb_id2name(id));
 }
 
 VALUE
@@ -508,10 +515,9 @@
 VALUE
 rb_define_module_id(ID id)
 {
-    VALUE mdl;
+    VALUE mdl = rb_objc_alloc_class(id == 0 ? NULL : rb_id2name(id),
+	    rb_cObject, T_MODULE, rb_cModule);
 
-    mdl = rb_objc_alloc_class(id == 0 ? NULL : rb_id2name(id), rb_cObject, T_MODULE, rb_cModule);
-
     if ((rb_mKernel != 0) && (id == 0)) {
 	/* because Module#initialize can accept a block */
 	rb_objc_define_method(*(VALUE *)mdl, "initialize", rb_mod_initialize, 0);

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2009-11-10 06:49:11 UTC (rev 2989)
+++ MacRuby/trunk/object.c	2009-11-11 05:46:34 UTC (rev 2990)
@@ -354,12 +354,6 @@
 }
 
 static VALUE
-rb_nsobj_dup(VALUE obj, VALUE sel)
-{
-    return (VALUE)objc_msgSend((id)obj, selCopy); 
-}
-
-static VALUE
 rb_obj_type(VALUE obj)
 {
     return LONG2FIX(TYPE(obj));
@@ -380,6 +374,19 @@
     return obj;
 }
 
+static VALUE
+rb_nsobj_dup(VALUE obj, VALUE sel)
+{
+    VALUE klass = rb_class_real(CLASS_OF(obj));
+    if (class_respondsToSelector((Class)klass, selCopyWithZone)) {
+	return (VALUE)objc_msgSend((id)obj, selCopy); 
+    }
+
+    VALUE copy = rb_robject_allocate_instance(klass);
+    rb_obj_init_copy(copy, 0, (VALUE)obj);
+    return copy;
+}
+
 /*
  *  call-seq:
  *     obj.to_s    => string
@@ -2882,6 +2889,7 @@
     rb_cBasicObject = (VALUE)objc_duplicateClass((Class)rb_cObject, "BasicObject", 0);
     rb_const_set(rb_cObject, rb_intern("BasicObject"), rb_cBasicObject);
     rb_cModule = boot_defclass("Module", rb_cNSObject);
+    rb_define_object_special_methods(rb_cModule);
     rb_cClass =  boot_defclass("Class",  rb_cModule);
 
     allocCache = rb_vm_get_call_cache(selAlloc);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091110/8ae4e28e/attachment.html>


More information about the macruby-changes mailing list