[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