[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