Revision: 3378 http://trac.macosforge.org/projects/ruby/changeset/3378 Author: lsansonetti@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);
participants (1)
-
source_changes@macosforge.org