[macruby-changes] [3954] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 21 18:54:08 PDT 2010


Revision: 3954
          http://trac.macosforge.org/projects/ruby/changeset/3954
Author:   lsansonetti at apple.com
Date:     2010-04-21 18:54:06 -0700 (Wed, 21 Apr 2010)
Log Message:
-----------
remove the ugly & evil code that was automatically inserting special objective-c primitive methods when subclassing NSArray/String/Dictionary from ruby, with the new architecture it's unlikely to happen anymore

Modified Paths:
--------------
    MacRuby/trunk/NSArray.m
    MacRuby/trunk/NSDictionary.m
    MacRuby/trunk/array.c
    MacRuby/trunk/class.c
    MacRuby/trunk/hash.c
    MacRuby/trunk/include/ruby/intern.h
    MacRuby/trunk/object.c
    MacRuby/trunk/spec/macruby/core/array_spec.rb
    MacRuby/trunk/spec/macruby/core/hash_spec.rb
    MacRuby/trunk/spec/macruby/core/string_spec.rb
    MacRuby/trunk/spec/macruby/tags/macruby/core/hash_tags.txt
    MacRuby/trunk/spec/macruby/tags/macruby/core/string_tags.txt
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/NSArray.m
===================================================================
--- MacRuby/trunk/NSArray.m	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/NSArray.m	2010-04-22 01:54:06 UTC (rev 3954)
@@ -17,7 +17,6 @@
 VALUE rb_cArray;
 VALUE rb_cNSArray;
 VALUE rb_cNSMutableArray;
-static VALUE rb_cCFArray;
 
 static id
 nsary_dup(id rcv, SEL sel)
@@ -939,12 +938,6 @@
 void
 Init_NSArray(void)
 {
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
-    rb_cCFArray = (VALUE)objc_getClass("NSCFArray");
-#else
-    rb_cCFArray = (VALUE)objc_getClass("__NSCFArray");
-#endif
-    assert(rb_cCFArray != 0);
     rb_cNSArray = (VALUE)objc_getClass("NSArray");
     assert(rb_cNSArray != 0);
     rb_cArray = rb_cNSArray;
@@ -1036,113 +1029,6 @@
     rb_objc_define_method(rb_cArray, "sample", rary_sample, -1);
 }
 
-#define PREPARE_RCV(x) \
-    Class old = *(Class *)x; \
-    *(Class *)x = (Class)rb_cCFArray;
-
-#define RESTORE_RCV(x) \
-    *(Class *)x = old;
-
-static long
-imp_rb_array_count(id rcv, SEL sel)
-{
-    PREPARE_RCV(rcv);
-    const long count = [rcv count];
-    RESTORE_RCV(rcv);
-    return count;
-}
-
-static id
-imp_rb_array_objectAtIndex(id rcv, SEL sel, long idx)
-{
-    PREPARE_RCV(rcv);
-    id obj = [rcv objectAtIndex:idx];
-    RESTORE_RCV(rcv);
-    return obj;
-}
-
-static void
-imp_rb_array_insertObjectAtIndex(id rcv, SEL sel, id obj, long idx)
-{
-    PREPARE_RCV(rcv);
-    [rcv insertObject:obj atIndex:idx];
-    RESTORE_RCV(rcv);
-}
-
-static void
-imp_rb_array_removeObjectAtIndex(id rcv, SEL sel, long idx)
-{
-    PREPARE_RCV(rcv);
-    [rcv removeObjectAtIndex:idx];
-    RESTORE_RCV(rcv);
-}
-
-static void
-imp_rb_array_replaceObjectAtIndexWithObject(id rcv, SEL sel, long idx, id obj)
-{
-    PREPARE_RCV(rcv);
-    [rcv replaceObjectAtIndex:idx withObject:obj];
-    RESTORE_RCV(rcv);
-}
-
-static void
-imp_rb_array_addObject(id rcv, SEL sel, id obj)
-{
-    PREPARE_RCV(rcv);
-    [rcv addObject:obj];
-    RESTORE_RCV(rcv);
-}
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
-// This is to work around a bug where CF will try to call an non-existing
-// method.
-static CFIndex
-imp_rb_array_cfindexOfObjectInRange(void *rcv, SEL sel, void *obj, 
-    CFRange range)
-{
-    CFIndex i;
-    PREPARE_RCV(rcv);
-    i = CFArrayGetFirstIndexOfValue((CFArrayRef)rcv, range, obj);
-    RESTORE_RCV(rcv);
-    return i;
-}
-#endif
-
-void
-rb_objc_install_array_primitives(Class klass)
-{
-    rb_objc_install_method2(klass, "count", (IMP)imp_rb_array_count);
-    rb_objc_install_method2(klass, "objectAtIndex:",
-	    (IMP)imp_rb_array_objectAtIndex);
-
-    const bool is_mutable = class_getSuperclass(klass)
-	== (Class)rb_cNSMutableArray;
-
-    if (is_mutable) {
-	rb_objc_install_method2(klass, "insertObject:atIndex:",
-		(IMP)imp_rb_array_insertObjectAtIndex);
-	rb_objc_install_method2(klass, "removeObjectAtIndex:",
-		(IMP)imp_rb_array_removeObjectAtIndex);
-	rb_objc_install_method2(klass, "replaceObjectAtIndex:withObject:", 
-		(IMP)imp_rb_array_replaceObjectAtIndexWithObject);
-	rb_objc_install_method2(klass, "addObject:",
-		(IMP)imp_rb_array_addObject);
-    }
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
-    // This is to work around a bug where CF will try to call an non-existing 
-    // method. 
-    rb_objc_install_method2(klass, "_cfindexOfObject:range:",
-	    (IMP)imp_rb_array_cfindexOfObjectInRange);
-    Method m = class_getInstanceMethod(klass, 
-	    sel_registerName("_cfindexOfObject:range:"));
-    class_addMethod(klass, sel_registerName("_cfindexOfObject:inRange:"), 
-	    method_getImplementation(m), method_getTypeEncoding(m));
-#endif
-
-    //rb_objc_define_method(*(VALUE *)klass, "alloc", ary_alloc, 0);
-}
-
 // MRI compatibility API.
 
 VALUE

Modified: MacRuby/trunk/NSDictionary.m
===================================================================
--- MacRuby/trunk/NSDictionary.m	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/NSDictionary.m	2010-04-22 01:54:06 UTC (rev 3954)
@@ -17,7 +17,6 @@
 VALUE rb_cHash;
 VALUE rb_cNSHash;
 VALUE rb_cNSMutableHash;
-static VALUE rb_cCFHash;
 
 static id
 to_hash(id hash)
@@ -436,12 +435,6 @@
 void
 Init_NSDictionary(void)
 {
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
-    rb_cCFHash = (VALUE)objc_getClass("NSCFDictionary");
-#else
-    rb_cCFHash = (VALUE)objc_getClass("__NSCFDictionary");
-#endif
-    assert(rb_cCFHash != 0);
     rb_cNSHash = (VALUE)objc_getClass("NSDictionary");
     assert(rb_cNSHash != 0);
     rb_cHash = rb_cNSHash;
@@ -506,121 +499,6 @@
 	    nshash_compare_by_id_p, 0);
 }
 
-// NSDictionary + NSMutableDictionary primitives. These are added automatically
-// on singleton classes of pure NSDictionaries. Our implementation just calls
-// the original methods, by tricking the receiver's class.
-
-#define PREPARE_RCV(x) \
-    Class __old = *(Class *)x; \
-    *(Class *)x = (Class)rb_cCFHash;
-
-#define RESTORE_RCV(x) \
-    *(Class *)x = __old;
-
-static unsigned
-nshash_count(id rcv, SEL sel) 
-{
-    PREPARE_RCV(rcv);
-    const unsigned count = [rcv count];
-    RESTORE_RCV(rcv);
-    return count; 
-}
-
-static id
-nshash_keyEnumerator(id rcv, SEL sel)
-{
-    PREPARE_RCV(rcv);
-    id keys = [rcv allKeys]; 
-    RESTORE_RCV(rcv);
-    return [keys objectEnumerator];
-}
-
-static id
-nshash_objectForKey(id rcv, SEL sel, id key)
-{
-    PREPARE_RCV(rcv);
-    id value = [rcv objectForKey:key];
-    RESTORE_RCV(rcv);
-    return value;
-}
-
-static void 
-nshash_setObjectForKey(id rcv, SEL sel, id value, id key) 
-{
-    PREPARE_RCV(rcv);
-    [rcv setObject:value forKey:key];
-    RESTORE_RCV(rcv);
-} 
-
-static void
-nshash_getObjectsAndKeys(id rcv, SEL sel, id *objs, id *keys)
-{
-    PREPARE_RCV(rcv);
-    [rcv getObjects:objs andKeys:keys];
-    RESTORE_RCV(rcv);
-}
-
-static void
-nshash_removeObjectForKey(id rcv, SEL sel, id key)
-{
-    PREPARE_RCV(rcv);
-    [rcv removeObjectForKey:key];
-    RESTORE_RCV(rcv);
-}
-
-static void
-nshash_removeAllObjects(id rcv, SEL sel)
-{
-    PREPARE_RCV(rcv);
-    [rcv removeAllObjects];
-    RESTORE_RCV(rcv);
-}
-
-static bool
-nshash_isEqual(id rcv, SEL sel, id other)
-{
-    PREPARE_RCV(rcv);
-    const bool res = [rcv isEqualToDictionary:other];
-    RESTORE_RCV(rcv);
-    return res;
-}
-
-static bool
-nshash_containsObject(id rcv, SEL sel, id value)
-{
-    PREPARE_RCV(rcv);
-    const bool res = [[rcv allKeysForObject:value] count] > 0;
-    RESTORE_RCV(rcv);
-    return res;
-}
-
-void
-rb_objc_install_hash_primitives(Class klass)
-{
-    rb_objc_install_method2(klass, "count", (IMP)nshash_count);
-    rb_objc_install_method2(klass, "keyEnumerator", (IMP)nshash_keyEnumerator);
-    rb_objc_install_method2(klass, "objectForKey:", (IMP)nshash_objectForKey);
-    rb_objc_install_method2(klass, "getObjects:andKeys:",
-	    (IMP)nshash_getObjectsAndKeys);
-    rb_objc_install_method2(klass, "isEqual:", (IMP)nshash_isEqual);
-    rb_objc_install_method2(klass, "containsObject:",
-	    (IMP)nshash_containsObject);
-
-    const bool mutable =
-	class_getSuperclass(klass) == (Class)rb_cNSMutableHash; 
-
-    if (mutable) {
-	rb_objc_install_method2(klass, "setObject:forKey:",
-		(IMP)nshash_setObjectForKey);
-	rb_objc_install_method2(klass, "removeObjectForKey:",
-		(IMP)nshash_removeObjectForKey);
-	rb_objc_install_method2(klass, "removeAllObjects",
-		(IMP)nshash_removeAllObjects);
-    }
-
-    //rb_objc_define_method(*(VALUE *)klass, "alloc", hash_alloc, 0);
-}
-
 // MRI compatibility API.
 
 VALUE

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/array.c	2010-04-22 01:54:06 UTC (rev 3954)
@@ -3484,6 +3484,8 @@
     Init_NSArray();
 
     rb_cRubyArray = rb_define_class("Array", rb_cNSMutableArray);
+    RCLASS_SET_VERSION_FLAG(rb_cRubyArray, RCLASS_IS_ARRAY_SUBCLASS);
+
     rb_objc_define_method(*(VALUE *)rb_cRubyArray, "new",
 	    rb_class_new_instance_imp, -1);
     rb_objc_define_method(*(VALUE *)rb_cRubyArray, "alloc", rary_alloc, 0);

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/class.c	2010-04-22 01:54:06 UTC (rev 3954)
@@ -20,44 +20,35 @@
 
 extern st_table *rb_class_tbl;
 
-void rb_objc_install_array_primitives(Class);
-void rb_objc_install_hash_primitives(Class);
-void rb_objc_install_string_primitives(Class);
-void rb_objc_install_set_primitives(Class);
-
-bool
-rb_objc_install_primitives(Class ocklass, Class ocsuper)
+void
+rb_objc_class_sync_version(Class ocklass, Class ocsuper)
 {
-    if (rb_cRubyArray != 0 && rb_cRubyHash != 0 && rb_cString != 0) {
-	do {
-	    if (ocsuper == (Class)rb_cRubyArray) {
-		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_ARRAY_SUBCLASS);
-		return false;
-	    }
-	    if (ocsuper == (Class)rb_cArray) {
-		rb_objc_install_array_primitives(ocklass);
-		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_ARRAY_SUBCLASS);
-		return true;
-	    }
-	    if (ocsuper == (Class)rb_cRubyHash) {
-		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_HASH_SUBCLASS);
-		return false;
-	    }
-	    if (ocsuper == (Class)rb_cHash) {
-		rb_objc_install_hash_primitives(ocklass);
-		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_HASH_SUBCLASS);
-		return true;
-	    }
-	    if (ocsuper == (Class)rb_cString) {
-		rb_objc_install_string_primitives(ocklass);
-		RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_STRING_SUBCLASS);
-		return true;
-	    }
-	    ocsuper = class_getSuperclass(ocsuper);
-	}
-	while (ocsuper != NULL);
+    const long super_version = RCLASS_VERSION(ocsuper);
+    long klass_version = RCLASS_VERSION(ocklass);
+
+    if ((super_version & RCLASS_NO_IV_SLOTS) == RCLASS_NO_IV_SLOTS) {
+	klass_version |= RCLASS_NO_IV_SLOTS;
     }
-    return false;
+
+    if (ocsuper == (Class)rb_cObject
+	|| (super_version & RCLASS_IS_OBJECT_SUBCLASS)
+	    == RCLASS_IS_OBJECT_SUBCLASS) {
+	klass_version |= RCLASS_IS_OBJECT_SUBCLASS;
+    }
+    if ((super_version & RCLASS_IS_ARRAY_SUBCLASS)
+	    == RCLASS_IS_ARRAY_SUBCLASS) {
+	klass_version |= RCLASS_IS_ARRAY_SUBCLASS;
+    }
+    if ((super_version & RCLASS_IS_HASH_SUBCLASS)
+	    == RCLASS_IS_HASH_SUBCLASS) {
+	klass_version |= RCLASS_IS_HASH_SUBCLASS;
+    }
+    if ((super_version & RCLASS_IS_STRING_SUBCLASS)
+	    == RCLASS_IS_STRING_SUBCLASS) {
+	klass_version |= RCLASS_IS_STRING_SUBCLASS;
+    }
+
+    RCLASS_SET_VERSION(ocklass, klass_version);
 }
 
 static void *
@@ -193,22 +184,12 @@
     if (flags == T_MODULE) {
 	version_flag |= RCLASS_IS_MODULE;
     }
-    const long super_version = RCLASS_VERSION(super);
-    if (super == rb_cObject
-	|| (super_version & RCLASS_IS_OBJECT_SUBCLASS)
-	    == RCLASS_IS_OBJECT_SUBCLASS) {
-	version_flag |= RCLASS_IS_OBJECT_SUBCLASS;
-    }
-    if ((super_version & RCLASS_NO_IV_SLOTS) == RCLASS_NO_IV_SLOTS) {
-	version_flag |= RCLASS_NO_IV_SLOTS;
-    }	
-
     RCLASS_SET_VERSION(ocklass, version_flag);
 
     objc_registerClassPair(ocklass);
 
     if (klass != 0) {
-	rb_objc_install_primitives(ocklass, (Class)super);
+	rb_objc_class_sync_version(ocklass, (Class)super);
     }
 
     return (VALUE)ocklass;
@@ -348,7 +329,7 @@
 	rb_raise(rb_eTypeError, "can't copy singleton class");
     }
     clone =  rb_mod_init_copy(clone, 0, orig);
-    rb_objc_install_primitives((Class)clone, (Class)orig);
+    rb_objc_class_sync_version((Class)clone, (Class)orig);
     return clone;
 }
 

Modified: MacRuby/trunk/hash.c
===================================================================
--- MacRuby/trunk/hash.c	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/hash.c	2010-04-22 01:54:06 UTC (rev 3954)
@@ -1774,6 +1774,8 @@
     id_yield = rb_intern("yield");
 
     rb_cRubyHash = rb_define_class("Hash", rb_cNSMutableHash);
+    RCLASS_SET_VERSION_FLAG(rb_cRubyHash, RCLASS_IS_HASH_SUBCLASS);
+
     rb_objc_define_method(*(VALUE *)rb_cRubyHash, "new",
 	    rb_class_new_instance_imp, -1);
     rb_objc_define_method(*(VALUE *)rb_cRubyHash, "alloc", rhash_alloc, 0);

Modified: MacRuby/trunk/include/ruby/intern.h
===================================================================
--- MacRuby/trunk/include/ruby/intern.h	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/include/ruby/intern.h	2010-04-22 01:54:06 UTC (rev 3954)
@@ -150,7 +150,7 @@
 /* class.c */
 #if WITH_OBJC
 VALUE rb_objc_create_class(const char *name, VALUE super);
-bool rb_objc_install_primitives(Class ocklass, Class ocsuper);
+void rb_objc_class_sync_version(Class klass, Class super_class);
 void rb_define_object_special_methods(VALUE klass);
 VALUE rb_class_new_instance_imp(VALUE, SEL, int, VALUE *);
 VALUE rb_make_singleton_class(VALUE super);

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/object.c	2010-04-22 01:54:06 UTC (rev 3954)
@@ -1898,12 +1898,7 @@
 	super = rb_cRubyObject;
     }
     RCLASS_SET_SUPER(klass, super);
-    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);
+    rb_objc_class_sync_version((Class)klass, (Class)super);
 
     rb_class_inherited(super, klass);
     rb_mod_initialize(klass, 0);

Modified: MacRuby/trunk/spec/macruby/core/array_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/array_spec.rb	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/spec/macruby/core/array_spec.rb	2010-04-22 01:54:06 UTC (rev 3954)
@@ -15,17 +15,6 @@
   end
 end
 
-describe "The NSArray class" do
-  it "can be subclassed and later instantiated" do
-    k = Class.new(NSArray)
-    a = k.new
-    a.class.should == k
-    a.size.should == 0
-    # TODO
-    #lambda { a << 42 }.should raise_error(RuntimeError)
-  end
-end
-
 describe "An Array object" do
   it "is an instance of the Array/NSMutableArray class" do
     [].class.should == Array
@@ -72,13 +61,4 @@
     a.size.should == 0
     lambda { a << 123 }.should raise_error(RuntimeError)
   end
-
-=begin
-  it "can have a singleton class" do
-    a = NSArray.array
-    def a.foo; 42; end
-    a.foo.should == 42
-    lambda { a << 123 }.should raise_error(RuntimeError)
-  end
-=end
 end

Modified: MacRuby/trunk/spec/macruby/core/hash_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/hash_spec.rb	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/spec/macruby/core/hash_spec.rb	2010-04-22 01:54:06 UTC (rev 3954)
@@ -15,17 +15,6 @@
   end
 end
 
-describe "The NSDictionary class" do
-  it "can be subclassed and later instantiated" do
-    k = Class.new(NSDictionary)
-    a = k.new
-    a.class.should == k
-    a.size.should == 0
-    # TODO
-    #lambda { a[42] = 123 }.should raise_error(RuntimeError)
-  end
-end
-
 describe "An Hash object" do
   it "is an instance of the Hash class" do
     {}.class.should == Hash
@@ -72,11 +61,4 @@
     a.size.should == 0
     lambda { a[42] = 123 }.should raise_error(RuntimeError)
   end
-
-  it "can have a singleton class" do
-    a = NSDictionary.dictionary
-    def a.foo; 42; end
-    a.foo.should == 42
-    lambda { a[42] = 123 }.should raise_error(RuntimeError)
-  end
 end

Modified: MacRuby/trunk/spec/macruby/core/string_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/core/string_spec.rb	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/spec/macruby/core/string_spec.rb	2010-04-22 01:54:06 UTC (rev 3954)
@@ -15,17 +15,6 @@
   end
 end
 
-describe "The NSString class" do
-  it "can be subclassed and later instantiated" do
-    k = Class.new(NSString)
-    a = k.new
-    a.class.should == k
-    a.size.should == 0
-    # TODO
-    #lambda { a << 'foo' }.should raise_error(RuntimeError)
-  end
-end
-
 describe "A String object" do
   it "is an instance of the String/NSMutableString class" do
     ''.class.should == String
@@ -55,17 +44,14 @@
     a.foo = 42
     a.foo.should == 42
   end
-
-  it "can match() a Regex" do
-    a = 'aaba'
-    a.should match(/a+b./)
-  end
 end
 
 describe "An NSString object" do
-  it "is an instance of the NSString class" do
+  it "is an instance of the String class" do
     a = NSString.string
-    a.class.should == NSString
+    a.class.should == String
+    a = NSString.stringWithString('OMG')
+    a.class.should == String
   end
 
   it "is immutable" do
@@ -74,14 +60,6 @@
     lambda { a << 'foo' }.should raise_error(RuntimeError)
   end
 
-  it "can have a singleton class" do
-    a = NSString.string
-    def a.foo; 42; end
-    a.foo.should == 42
-    # TODO
-    #lambda { a << 'foo' }.should raise_error(RuntimeError)
-  end
-
   it "forwards the block when calling a ruby method" do
     NSString.stringWithString("ybuRcaM").sub(/.+/) { |s| s.reverse }.should == "MacRuby"
   end

Modified: MacRuby/trunk/spec/macruby/tags/macruby/core/hash_tags.txt
===================================================================
--- MacRuby/trunk/spec/macruby/tags/macruby/core/hash_tags.txt	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/spec/macruby/tags/macruby/core/hash_tags.txt	2010-04-22 01:54:06 UTC (rev 3954)
@@ -1,3 +1 @@
-critical:The NSDictionary class can be subclassed and later instantiated
-critical:An NSDictionary object can have a singleton class
 critical:An NSDictionary object is immutable

Modified: MacRuby/trunk/spec/macruby/tags/macruby/core/string_tags.txt
===================================================================
--- MacRuby/trunk/spec/macruby/tags/macruby/core/string_tags.txt	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/spec/macruby/tags/macruby/core/string_tags.txt	2010-04-22 01:54:06 UTC (rev 3954)
@@ -1,5 +1 @@
-critical:The NSString class can be subclassed and later instantiated
-critical:An NSString object can have a singleton class
 critical:An NSString object is immutable
-fails:An NSString object is an instance of the NSString class
-fails:A String object can match() a Regex

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2010-04-21 21:34:24 UTC (rev 3953)
+++ MacRuby/trunk/string.c	2010-04-22 01:54:06 UTC (rev 3954)
@@ -5422,6 +5422,7 @@
     Init_NSString();
 
     // rb_cRubyString is defined earlier in Init_PreVM().
+    RCLASS_SET_VERSION_FLAG(rb_cRubyString, RCLASS_IS_STRING_SUBCLASS);
     rb_set_class_path(rb_cRubyString, rb_cObject, "String");
     rb_const_set(rb_cObject, rb_intern("String"), rb_cRubyString);
 
@@ -5583,12 +5584,6 @@
     return true;
 }
 
-void
-rb_objc_install_string_primitives(Class klass)
-{
-    // TODO
-}
-
 // ByteString emulation.
 
 #define IS_BSTR(obj) (IS_RSTR(obj) && !str_is_stored_in_uchars(RSTR(obj)))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100421/ee236331/attachment-0001.html>


More information about the macruby-changes mailing list