[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