[macruby-changes] [3328] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat Jan 23 18:32:41 PST 2010


Revision: 3328
          http://trac.macosforge.org/projects/ruby/changeset/3328
Author:   lsansonetti at apple.com
Date:     2010-01-23 18:32:38 -0800 (Sat, 23 Jan 2010)
Log Message:
-----------
Array is no longer a shortcut but RubyArray, all arrays and dictionaries return Array and Hash as their class, misc cleanup

Modified Paths:
--------------
    MacRuby/trunk/array.c
    MacRuby/trunk/class.c
    MacRuby/trunk/dispatcher.cpp
    MacRuby/trunk/hash.c
    MacRuby/trunk/include/ruby/ruby.h
    MacRuby/trunk/marshal.c
    MacRuby/trunk/objc.m
    MacRuby/trunk/object.c
    MacRuby/trunk/spec/macruby/core/array_spec.rb
    MacRuby/trunk/spec/macruby/core/hash_spec.rb

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/array.c	2010-01-24 02:32:38 UTC (rev 3328)
@@ -19,9 +19,6 @@
 
 VALUE rb_cArray;
 VALUE rb_cCFArray;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-VALUE rb_cNSArray0;
-#endif
 VALUE rb_cNSArray;
 VALUE rb_cNSMutableArray;
 VALUE rb_cRubyArray;
@@ -268,6 +265,8 @@
     }
 }
 
+bool _CFArrayIsMutable(void *);
+
 static inline void
 __rb_ary_modify(VALUE ary)
 {
@@ -277,7 +276,7 @@
     }
     else {
 	mask = rb_objc_flag_get_mask((void *)ary);
-	if (RARRAY_IMMUTABLE(ary)) {
+	if (!_CFArrayIsMutable((void *)ary)) {
 	    mask |= FL_FREEZE;
 	}
     }
@@ -343,11 +342,10 @@
 static inline VALUE
 ary_alloc(VALUE klass)
 {
-    if ((klass == 0 || klass == rb_cRubyArray || klass == rb_cNSMutableArray)
-	    && rb_cRubyArray != 0) {
+    if (rb_cRubyArray != 0 && (klass == 0 || __is_rary(klass))) {
 	NEWOBJ(ary, rb_ary_t);
 	ary->basic.flags = 0;
-	ary->basic.klass = rb_cRubyArray;
+	ary->basic.klass = klass == 0 ? rb_cRubyArray : klass;
         ary->beg = ary->len = ary->cap = 0;
 	ary->elements = NULL;
 	return (VALUE)ary;
@@ -632,7 +630,7 @@
 static VALUE
 rb_ary_initialize(VALUE ary, SEL sel, int argc, VALUE *argv)
 {
-    ary = (VALUE)objc_msgSend((id)ary, selInit);
+    //ary = (VALUE)objc_msgSend((id)ary, selInit);
 
     if (argc ==  0) {
 	if (rb_block_given_p()) {
@@ -1625,17 +1623,16 @@
 {
     VALUE dup;
 
-    if (rb_obj_is_kind_of(ary, rb_cRubyArray)) {
+    if (IS_RARY(ary)) {
 	dup = rb_ary_new();
 	rary_concat(RARY(dup), RARY(ary), 0, RARY(ary)->len);
+	*(VALUE *)dup = *(VALUE *)ary;
     }
     else {
 	dup = (VALUE)CFArrayCreateMutableCopy(NULL, 0, (CFArrayRef)ary);
 	CFMakeCollectable((CFMutableArrayRef)dup);
     }
 
-    *(VALUE *)dup = *(VALUE *)ary;
-
     if (OBJ_TAINTED(ary)) {
 	OBJ_TAINT(dup);
     }
@@ -4283,14 +4280,9 @@
 {
     rb_cCFArray = (VALUE)objc_getClass(NSCFARRAY_CNAME);
     assert(rb_cCFArray != 0);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-    rb_cNSArray0 = (VALUE)objc_getClass("__NSArray0");
-#endif
     rb_const_set(rb_cObject, rb_intern("NSCFArray"), rb_cCFArray);
     rb_cArray = rb_cNSArray = (VALUE)objc_getClass("NSArray");
     rb_cNSMutableArray = (VALUE)objc_getClass("NSMutableArray");
-    rb_set_class_path(rb_cNSMutableArray, rb_cObject, "NSMutableArray");
-    rb_const_set(rb_cObject, rb_intern("Array"), rb_cNSMutableArray);
 
     rb_include_module(rb_cArray, rb_mEnumerable);
 
@@ -4397,7 +4389,9 @@
     rb_objc_define_method(rb_cArray, "dup", rb_ary_dup_imp, 0);
     rb_objc_define_method(rb_cArray, "clone", rb_ary_clone, 0);
 
-    rb_cRubyArray = rb_define_class("RubyArray", rb_cNSMutableArray);
+    rb_cRubyArray = rb_define_class("Array", rb_cNSMutableArray);
+    rb_objc_define_method(*(VALUE *)rb_cRubyArray, "new",
+	    rb_class_new_instance_imp, -1);
     rb_objc_define_method(*(VALUE *)rb_cRubyArray, "alloc", ary_alloc, 0);
     rb_objc_install_method2((Class)rb_cRubyArray, "count", (IMP)imp_rary_count);
     rb_objc_install_method2((Class)rb_cRubyArray, "objectAtIndex:",

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/class.c	2010-01-24 02:32:38 UTC (rev 3328)
@@ -215,12 +215,17 @@
     if (super == rb_cCFString) {
 	super = rb_cNSMutableString;
     }
-    else if (super == rb_cCFArray) {
-	super = rb_cNSMutableArray;
+    else {
+	if (!RCLASS_RUBY(super)) {
+	    const long v = RCLASS_VERSION(super);
+	    if (v & RCLASS_IS_HASH_SUBCLASS) {
+		super = rb_cNSMutableHash;
+	    }
+	    else if (v & RCLASS_IS_ARRAY_SUBCLASS) {
+		super = rb_cNSMutableArray;
+	    }
+	}
     }
-    else if (super == rb_cCFHash) {
-	super = rb_cNSMutableHash;
-    }
 
     klass = rb_objc_alloc_class(name, super, T_CLASS, rb_cClass);
    
@@ -286,9 +291,7 @@
 	VALUE super;
 	int version_flag;
 
-	if (orig == rb_cNSMutableString
-	    || orig == rb_cNSMutableArray
-	    || orig == rb_cNSMutableHash) {
+	if (!RCLASS_RUBY(orig)) {
 	    super = orig;
 	    rb_warn("cloning class `%s' is not supported, creating a " \
 		    "subclass instead", rb_class2name(orig));

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/dispatcher.cpp	2010-01-24 02:32:38 UTC (rev 3328)
@@ -825,17 +825,7 @@
 		return RSTRING_IMMUTABLE(self)
 		    ? rb_cNSString : rb_cNSMutableString;
 	    }
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-	    if (klass == (Class)rb_cCFArray || klass == (Class)rb_cNSArray0) {
-#else
-	    if (klass == (Class)rb_cCFArray) {
-#endif
-		return RARRAY_IMMUTABLE(self)
-		    ? rb_cNSArray : rb_cNSMutableArray;
-	    }
-	    if (klass == (Class)rb_cRubyArray) {
-		return rb_cNSMutableArray;
-	    }
+	    return rb_class_real((VALUE)klass);
 	}
 
 #if ROXOR_VM_DEBUG

Modified: MacRuby/trunk/hash.c
===================================================================
--- MacRuby/trunk/hash.c	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/hash.c	2010-01-24 02:32:38 UTC (rev 3328)
@@ -30,9 +30,6 @@
 
 VALUE rb_cHash;
 VALUE rb_cCFHash;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-VALUE rb_cNSHash0;
-#endif
 VALUE rb_cNSHash;
 VALUE rb_cNSMutableHash;
 VALUE rb_cRubyHash;
@@ -311,6 +308,8 @@
     return hash;
 }
 
+bool _CFDictionaryIsMutable(void *);
+
 static inline void
 rb_hash_modify_check(VALUE hash)
 {
@@ -320,7 +319,7 @@
     }
     else {
 	mask = rb_objc_flag_get_mask((const void *)hash);
-	if (RHASH_IMMUTABLE(hash)) {
+	if (!_CFDictionaryIsMutable((void *)hash)) {
 	    mask |= FL_FREEZE;
 	}
     }
@@ -2850,13 +2849,8 @@
 
     rb_cCFHash = (VALUE)objc_getClass(NSCFDICTIONARY_CNAME);
     assert(rb_cCFHash != 0);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-    rb_cNSHash0 = (VALUE)objc_getClass("__NSDictionary0");
-#endif
-    rb_const_set(rb_cObject, rb_intern("NSCFDictionary"), rb_cCFHash);
     rb_cHash = rb_cNSHash = (VALUE)objc_getClass("NSDictionary");
     rb_cNSMutableHash = (VALUE)objc_getClass("NSMutableDictionary");
-    rb_set_class_path(rb_cNSMutableHash, rb_cObject, "NSMutableDictionary");
 
     rb_include_module(rb_cHash, rb_mEnumerable);
 

Modified: MacRuby/trunk/include/ruby/ruby.h
===================================================================
--- MacRuby/trunk/include/ruby/ruby.h	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/include/ruby/ruby.h	2010-01-24 02:32:38 UTC (rev 3328)
@@ -1134,55 +1134,22 @@
 RUBY_EXTERN VALUE rb_cNSString;
 RUBY_EXTERN VALUE rb_cNSMutableString;
 RUBY_EXTERN VALUE rb_cCFArray;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-RUBY_EXTERN VALUE rb_cNSArray0; 
-#endif
 RUBY_EXTERN VALUE rb_cNSArray;
 RUBY_EXTERN VALUE rb_cNSMutableArray;
 RUBY_EXTERN VALUE rb_cRubyArray;
 RUBY_EXTERN VALUE rb_cCFHash;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-RUBY_EXTERN VALUE rb_cNSHash0; 
-#endif
 RUBY_EXTERN VALUE rb_cNSHash;
 RUBY_EXTERN VALUE rb_cNSMutableHash;
 RUBY_EXTERN VALUE rb_cRubyHash;
-RUBY_EXTERN VALUE rb_cCFSet;
-RUBY_EXTERN VALUE rb_cNSSet;
-RUBY_EXTERN VALUE rb_cNSMutableSet;
 RUBY_EXTERN VALUE rb_cCFNumber;
 RUBY_EXTERN VALUE rb_cBoxed;
 RUBY_EXTERN VALUE rb_cPointer;
 RUBY_EXTERN VALUE rb_cTopLevel;
 
-bool _CFArrayIsMutable(void *);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-# define RARRAY_IMMUTABLE(o) \
-    (*(VALUE *)o == rb_cCFArray \
-	? !_CFArrayIsMutable((void *)o) : *(VALUE *)o == rb_cNSArray0)
-#else
-# define RARRAY_IMMUTABLE(o) \
-    (*(VALUE *)o == rb_cCFArray ? !_CFArrayIsMutable((void *)o) : false)
-#endif
-
-bool _CFDictionaryIsMutable(void *);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-# define RHASH_IMMUTABLE(o) \
-    (*(VALUE *)o == rb_cCFHash \
-	? !_CFDictionaryIsMutable((void *)o) : *(VALUE *)o == rb_cNSHash0)
-#else
-# define RHASH_IMMUTABLE(o) \
-    (*(VALUE *)o == rb_cCFHash ? !_CFDictionaryIsMutable((void *)o) : false)
-#endif
-
 bool __CFStringIsMutable(void *);
 #define RSTRING_IMMUTABLE(o) \
     (*(VALUE *)o == rb_cCFString ? !__CFStringIsMutable((void *)o) : false)
 
-bool _CFSetIsMutable(void *);
-#define RSET_IMMUTABLE(o) \
-    (*(VALUE *)o == rb_cCFSet ? !_CFSetIsMutable((void *)o) : false)
-
 #endif
 
 RUBY_EXTERN VALUE rb_eException;
@@ -1355,14 +1322,10 @@
 	if (k == (Class)rb_cCFString) {
 	    return T_STRING;
 	}
-	if (k == (Class)rb_cCFArray || k == (Class)rb_cRubyArray
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
-	    || k == (Class)rb_cNSArray0
-#endif
-	   ) {
+	if (k == (Class)rb_cRubyArray) {
 	    return T_ARRAY;
 	}
-	if (k == (Class)rb_cCFHash || k == (Class)rb_cRubyHash) {
+	if (k == (Class)rb_cRubyHash) {
 	    return T_HASH;
 	}
 	if (RCLASS_META(k)) {

Modified: MacRuby/trunk/marshal.c
===================================================================
--- MacRuby/trunk/marshal.c	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/marshal.c	2010-01-24 02:32:38 UTC (rev 3328)
@@ -181,12 +181,6 @@
     else if (klass == rb_cNSMutableString) {
 	path = rb_str_new2("String");
     }
-    else if (klass == rb_cNSMutableArray) {
-	path = rb_str_new2("Array");
-    }
-    else if (klass == rb_cNSMutableHash) {
-	path = rb_str_new2("Hash");
-    }
     else {
 	path = rb_class_path(klass);
     }

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/objc.m	2010-01-24 02:32:38 UTC (rev 3328)
@@ -261,6 +261,25 @@
     for (i = 0; i < count; i++) {
 	Class k = buf[i];
 	if (!RCLASS_RUBY(k)) {
+	    long v = RCLASS_VERSION(k);
+	    if (!(v & RCLASS_IS_HASH_SUBCLASS)
+		    && !(v & RCLASS_IS_ARRAY_SUBCLASS)) {
+		Class k2 = k;
+		while (k2 != NULL) {
+		    if (k2 == (Class)rb_cNSHash) {
+			v |= RCLASS_IS_HASH_SUBCLASS;
+			RCLASS_SET_VERSION(k, v);
+			break;
+		    }
+		    else if (k2 == (Class)rb_cNSArray) {
+			v |= RCLASS_IS_ARRAY_SUBCLASS;
+			RCLASS_SET_VERSION(k, v);
+			break;
+		    }
+		    k2 = class_getSuperclass(k2);
+		}
+	    }
+
 	    const char *name = class_getName(k);
 	    if (name[0] != '_') {
 		ID name_id = rb_intern(name);
@@ -613,6 +632,8 @@
     placeholder_String = objc_getClass("NSPlaceholderMutableString");
     placeholder_Dictionary = objc_getClass("__NSPlaceholderDictionary");
     placeholder_Array = objc_getClass("__NSPlaceholderArray");
+
+    reload_class_constants();
 }
 
 @interface Protocol

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/object.c	2010-01-24 02:32:38 UTC (rev 3328)
@@ -154,7 +154,8 @@
         return 0;
     }
     if (RCLASS_META(cl)) {
-	return rb_cClass;
+//	return rb_cClass;
+	return RCLASS_MODULE(cl) ? rb_cModule : rb_cClass;
     }
     while (RCLASS_SINGLETON(cl)) {
 	cl = RCLASS_SUPER(cl);
@@ -162,8 +163,14 @@
     if (cl == rb_cCFString) {
 	return rb_cNSMutableString;
     }
-    if (cl == rb_cCFArray || cl == rb_cRubyArray) {
-	return rb_cNSMutableArray;
+    if (!RCLASS_RUBY(cl)) {
+	const long v = RCLASS_VERSION(cl);
+	if (v & RCLASS_IS_HASH_SUBCLASS) {
+	    return rb_cRubyHash;
+	}
+	if (v & RCLASS_IS_ARRAY_SUBCLASS) {
+	    return rb_cRubyArray;
+	}
     }
     return cl;
 }
@@ -516,7 +523,9 @@
 	rb_raise(rb_eTypeError, "class or module required");
     }
 
-    if (rb_obj_class(obj) == c) return Qtrue;
+    if (rb_obj_class(obj) == c) {
+	return Qtrue;
+    }
     return Qfalse;
 }
 
@@ -570,11 +579,19 @@
 	  rb_raise(rb_eTypeError, "class or module required");
     }
 
+    const long v = RCLASS_VERSION(cl);
+    if (c == rb_cRubyArray && (v & RCLASS_IS_ARRAY_SUBCLASS)) {
+	return Qtrue;
+    }
+    if (c == rb_cRubyHash && (v & RCLASS_IS_HASH_SUBCLASS)) {
+	return Qtrue;
+    }
+
     if (RCLASS_META(cl)) {
 	is_module = true;
     }
 
-    while (cl) {
+    while (cl != 0) {
 	if (cl == c) {
 	    return Qtrue;
 	}
@@ -1935,13 +1952,6 @@
 static inline VALUE
 rb_class_new_instance0(int argc, VALUE *argv, VALUE klass)
 {
-    if (klass == rb_cNSMutableArray) {
-	klass = rb_cRubyArray;
-    }
-    else if (klass == rb_cNSMutableHash) {
-	klass = rb_cRubyHash;
-    }
-
     VALUE obj = rb_obj_alloc0(klass);
 
     /* Because we cannot override +[NSObject initialize] */

Modified: MacRuby/trunk/spec/macruby/core/array_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/array_spec.rb	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/spec/macruby/core/array_spec.rb	2010-01-24 02:32:38 UTC (rev 3328)
@@ -1,8 +1,9 @@
 require File.dirname(__FILE__) + "/../spec_helper"
 
 describe "The Array class" do
-  it "is an alias to NSMutableArray" do
-    Array.should == NSMutableArray
+  it "is a direct subclass of NSMutableArray" do
+    Array.class.should == Class
+    Array.superclass.should == NSMutableArray
   end
 
   it "can be subclassed and later instantiated" do
@@ -57,11 +58,13 @@
 end
 
 describe "An NSArray object" do
-  it "is an instance of the NSArray class" do
+  it "is an instance of the Array class" do
     a = NSArray.array
-    a.class.should == NSArray
+    a.class.should == Array
+    a.is_a?(Array).should == true
     a = NSArray.arrayWithObject(42)
-    a.class.should == NSArray
+    a.class.should == Array
+    a.is_a?(Array).should == true
   end
 
   it "is immutable" do

Modified: MacRuby/trunk/spec/macruby/core/hash_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/hash_spec.rb	2010-01-23 06:35:34 UTC (rev 3327)
+++ MacRuby/trunk/spec/macruby/core/hash_spec.rb	2010-01-24 02:32:38 UTC (rev 3328)
@@ -27,7 +27,7 @@
 end
 
 describe "An Hash object" do
-  it "is an instance of the Hash/NSMutableDictionary class" do
+  it "is an instance of the Hash class" do
     {}.class.should == Hash
     {}.kind_of?(Hash).should == true
     {}.instance_of?(Hash).should == true
@@ -58,11 +58,13 @@
 end
 
 describe "An NSDictionary object" do
-  it "is an instance of the NSDictionary class" do
+  it "is an instance of the Hash class" do
     a = NSDictionary.dictionary
-    a.is_a?(NSDictionary).should == true
+    a.is_a?(Hash).should == true
+    a.class.should == Hash
     a = NSDictionary.dictionaryWithObject(42, forKey:42)
-    a.is_a?(NSDictionary).should == true
+    a.is_a?(Hash).should == true
+    a.class.should == Hash
   end
 
   it "is immutable" do
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100123/08c7d322/attachment-0001.html>


More information about the macruby-changes mailing list