[macruby-changes] [3378] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Jan 30 19:20:35 PST 2010


Revision: 3378
          http://trac.macosforge.org/projects/ruby/changeset/3378
Author:   lsansonetti at apple.com
Date:     2010-01-30 19:20:35 -0800 (Sat, 30 Jan 2010)
Log Message:
-----------
introduce RubyObject, a hidden class used as the basic class of all ruby-created classes

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

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2010-01-31 03:18:54 UTC (rev 3377)
+++ MacRuby/trunk/class.c	2010-01-31 03:20:35 UTC (rev 3378)
@@ -117,6 +117,16 @@
     return rcv;
 }
 
+static VALUE
+rb_obj_superclass(VALUE klass, SEL sel)
+{
+    VALUE cl = RCLASS_SUPER(klass);
+    while (RCLASS_SINGLETON(cl)) {
+	cl = RCLASS_SUPER(cl);
+    }
+    return rb_class_real(cl);
+}
+
 void
 rb_define_object_special_methods(VALUE klass)
 {
@@ -125,8 +135,6 @@
 
     rb_objc_define_method(*(VALUE *)klass, "new",
 	    rb_class_new_instance_imp, -1);
-    rb_objc_define_method(*(VALUE *)klass, "__new__",
-	    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",
@@ -134,6 +142,7 @@
     rb_objc_define_method(klass, "hash", rb_obj_id, 0);
 
     // To make sure singleton classes will be filtered.
+    rb_objc_define_method(*(VALUE *)klass, "superclass", rb_obj_superclass, 0);
     rb_objc_define_method(klass, "class", rb_obj_class, 0);
 
     rb_objc_install_method(*(Class *)klass, selAllocWithZone,
@@ -153,6 +162,8 @@
 	    (IMP)rb_obj_imp_copyWithZone, method_getTypeEncoding(m));
 }
 
+extern VALUE rb_cRubyObject;
+
 static VALUE
 rb_objc_alloc_class(const char *name, VALUE super, VALUE flags, VALUE klass)
 {
@@ -246,11 +257,10 @@
 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;
+    if (super == rb_cObject && rb_cRubyObject != 0) {
+	super = rb_cRubyObject;
+    }	
+    return rb_objc_create_class(name, super);
 }
 
 VALUE
@@ -435,7 +445,6 @@
 	}
 	RBASIC(obj)->klass = klass;
 	rb_singleton_class_attached(klass, obj);
-
 	return klass;
     }
 }

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2010-01-31 03:18:54 UTC (rev 3377)
+++ MacRuby/trunk/object.c	2010-01-31 03:20:35 UTC (rev 3378)
@@ -26,6 +26,7 @@
 VALUE rb_mKernel;
 VALUE rb_cNSObject;
 VALUE rb_cObject;
+VALUE rb_cRubyObject;
 VALUE rb_cModule;
 VALUE rb_cClass;
 VALUE rb_cData;
@@ -1874,15 +1875,16 @@
 	rb_scan_args(argc, argv, "01", &super);
 	rb_check_inheritable(super);
     }
+    if (super == rb_cObject) {
+	super = rb_cRubyObject;
+    }
     RCLASS_SET_SUPER(klass, super);
-    if ((RCLASS_VERSION(super) & RCLASS_IS_OBJECT_SUBCLASS) != RCLASS_IS_OBJECT_SUBCLASS) {
+    if ((RCLASS_VERSION(super) & RCLASS_IS_OBJECT_SUBCLASS)
+	    != RCLASS_IS_OBJECT_SUBCLASS) {
 	long v = RCLASS_VERSION(klass) ^ RCLASS_IS_OBJECT_SUBCLASS;
 	RCLASS_SET_VERSION(klass, v);
     }
     rb_objc_install_primitives((Class)klass, (Class)super);
-    if (super == rb_cObject) {
-	rb_define_object_special_methods(klass);
-    }
 
     rb_class_inherited(super, klass);
     rb_mod_initialize(klass, 0);
@@ -2927,13 +2929,18 @@
     rb_cObject = rb_cNSObject = (VALUE)objc_getClass("NSObject");
     rb_const_set(rb_cObject, rb_intern("Object"), rb_cNSObject);
     rb_set_class_path(rb_cObject, rb_cObject, "NSObject");
-    rb_cBasicObject = (VALUE)objc_duplicateClass((Class)rb_cObject, "BasicObject", 0);
+    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);
     RCLASS_SET_VERSION_FLAG(rb_cModule, RCLASS_NO_IV_SLOTS);
     rb_define_object_special_methods(rb_cModule);
     rb_cClass =  boot_defclass("Class",  rb_cModule);
     RCLASS_SET_VERSION_FLAG(rb_cClass, RCLASS_NO_IV_SLOTS);
+    rb_cRubyObject = boot_defclass("RubyObject", rb_cObject);
+    RCLASS_SET_VERSION_FLAG(rb_cRubyObject, RCLASS_IS_SINGLETON);
+    RCLASS_SET_VERSION_FLAG(rb_cRubyObject, RCLASS_IS_OBJECT_SUBCLASS);
+    rb_define_object_special_methods(rb_cRubyObject);
 
     allocCache = rb_vm_get_call_cache(selAlloc);
     initializeCache = rb_vm_get_call_cache(selInitialize);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100130/3165c833/attachment.html>


More information about the macruby-changes mailing list