[macruby-changes] [121] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 28 15:38:12 PDT 2008


Revision: 121
          http://trac.macosforge.org/projects/ruby/changeset/121
Author:   lsansonetti at apple.com
Date:     2008-03-28 15:38:12 -0700 (Fri, 28 Mar 2008)

Log Message:
-----------
fixing more regressions

Modified Paths:
--------------
    MacRuby/trunk/array.c
    MacRuby/trunk/class.c
    MacRuby/trunk/ext/dbm/dbm.c
    MacRuby/trunk/ext/dl/cfunc.c
    MacRuby/trunk/ext/iconv/iconv.c
    MacRuby/trunk/ext/json/ext/generator/generator.c
    MacRuby/trunk/ext/openssl/ossl_ocsp.c
    MacRuby/trunk/ext/openssl/ossl_ssl.c
    MacRuby/trunk/ext/openssl/ossl_x509cert.c
    MacRuby/trunk/ext/openssl/ossl_x509crl.c
    MacRuby/trunk/ext/openssl/ossl_x509req.c
    MacRuby/trunk/ext/openssl/ossl_x509revoked.c
    MacRuby/trunk/ext/racc/cparse/cparse.c
    MacRuby/trunk/ext/readline/readline.c
    MacRuby/trunk/ext/sdbm/init.c
    MacRuby/trunk/ext/socket/socket.c
    MacRuby/trunk/ext/syck/rubyext.c
    MacRuby/trunk/ext/tk/tcltklib.c
    MacRuby/trunk/ext/tk/tkutil/tkutil.c
    MacRuby/trunk/hash.c
    MacRuby/trunk/object.c
    MacRuby/trunk/proc.c

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/array.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -44,6 +44,7 @@
 struct rb_objc_ary_struct {
     bool frozen;
     bool named_args;
+    void *cptr;
 };
 
 /* This variable will always stay NULL, we only use its address. */
@@ -184,9 +185,10 @@
     memset(&cb, 0, sizeof(CFArrayCallBacks));
     cb.retain = rb_cfarray_retain_cb;
     cb.release = rb_cfarray_release_cb;
+    cb.equal = rb_cfarray_equal_cb;
 
     ary = (VALUE)CFArrayCreateMutable(NULL, 0, &cb);
-    if (klass != 0)
+    if (klass != 0 && klass != rb_cArray && klass != rb_cArrayRuby)
         *(Class *)ary = RCLASS_OCID(klass);
 
     return ary;
@@ -227,7 +229,7 @@
 rb_ary_new2(long len)
 {
 #if WITH_OBJC
-    return ary_new(rb_cArrayRuby, len);
+    return ary_new(0, len);
 #else
     return ary_new(rb_cArray, len);
 #endif
@@ -871,6 +873,8 @@
     values = (const VALUE *)xmalloc(sizeof(VALUE) * len);
     CFArrayGetValues((CFArrayRef)ary, CFRangeMake(0, len), 
 	(const void **)values);
+    GC_WB(&rb_objc_ary_get_struct2(ary)->cptr, values);
+
     return values;
 #else
     return RARRAY_PTR(ary);
@@ -2210,16 +2214,20 @@
     n = RARRAY_LEN(ary);
     for (i1 = i2 = 0; i1 < n; i1++) {
 	VALUE v = RARRAY_AT(ary, i1);
-	if (RTEST(rb_yield(v))) continue;
 #if WITH_OBJC
+	if (!RTEST(rb_yield(v))) {
+	    i2++;
+	    continue;
+	}
 	CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, i1);
 	i1--;
 #else
+	if (RTEST(rb_yield(v))) continue;
 	if (i1 != i2) {
 	    rb_ary_store(ary, i2, v);
 	}
+	i2++;
 #endif
-	i2++;
     }
 
     if (n == i2) return Qnil;
@@ -3099,8 +3107,8 @@
 	while ((idx = CFArrayGetFirstIndexOfValue((CFArrayRef)ary, 
 	    r, (const void *)e)) != -1) {
 	    CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, idx);
-	    r.location = i;
-	    r.length = --n - i;
+	    r.location = idx;
+	    r.length = --n - idx;
 	}
     }
 #else
@@ -3840,6 +3848,16 @@
 	imp_rb_array_replaceObjectAtIndexWithObject);
     INSTALL_METHOD("addObject:", imp_rb_array_addObject);
 
+    /* This is to work around a bug where CF will try to call an non-existing 
+     * method. 
+     */
+    if (true) {
+	Method m = class_getInstanceMethod(klass, 
+	    sel_registerName("_cfindexOfObject:range:"));
+	class_addMethod(klass, sel_registerName("_cfindexOfObject:inRange:"), 
+	    method_getImplementation(m), method_getTypeEncoding(m));
+    }
+
 #undef INSTALL_METHOD
 }
 #endif
@@ -3856,8 +3874,10 @@
 {
 #if WITH_OBJC
     rb_cArray = rb_objc_import_class((Class)objc_getClass("NSArray"));
-    rb_const_set(rb_cObject, rb_intern("Array"), 
-	rb_objc_import_class((Class)objc_getClass("NSMutableArray")));
+    rb_cArrayRuby = 
+	rb_objc_import_class((Class)objc_getClass("NSMutableArray"));
+    FL_UNSET(rb_cArrayRuby, RCLASS_OBJC_IMPORTED);
+    rb_const_set(rb_cObject, rb_intern("Array"), rb_cArrayRuby);
     rb_define_method(rb_cArray, "freeze", rb_ary_freeze, 0);
 #else
     rb_cArray  = rb_define_class("Array", rb_cObject);

Modified: MacRuby/trunk/class.c
===================================================================
--- MacRuby/trunk/class.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/class.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -405,7 +405,15 @@
 VALUE
 rb_make_metaclass(VALUE obj, VALUE super)
 {
-    if (BUILTIN_TYPE(obj) == T_CLASS && FL_TEST(obj, FL_SINGLETON)) {
+    bool pure;
+
+#if WITH_OBJC
+    pure = rb_objc_is_non_native(obj);
+#else
+    pure = false;
+#endif
+
+    if (!pure && BUILTIN_TYPE(obj) == T_CLASS && FL_TEST(obj, FL_SINGLETON)) {
 	return RBASIC(obj)->klass = rb_cClass;
     }
     else {
@@ -413,7 +421,7 @@
 	VALUE klass;
 
 #if WITH_OBJC
-	if (BUILTIN_TYPE(obj) == T_CLASS) {
+	if (!pure && BUILTIN_TYPE(obj) == T_CLASS) {
 	    NEWOBJ(obj2, struct RClass); 
 	    OBJSETUP(obj2, rb_cClass, T_CLASS); 
 	    klass = (VALUE)obj2; 
@@ -423,18 +431,19 @@
 	    RCLASS_SUPER(klass) = super; 
 	    RCLASS_M_TBL(klass) = st_init_numtable(); 
 	    RCLASS(klass)->ocklass = RBASIC(super)->isa; 
+	    RBASIC(obj)->klass = klass;
 	}
 	else {
 	    klass = rb_class_boot(super);
 	    *(Class *)obj = RCLASS_OCID(klass);
-	    if (!rb_objc_is_non_native(obj))
+	    if (!pure)
 		RBASIC(obj)->klass = klass;
 	}
 #else
 	klass = rb_class_boot(super);
+	RBASIC(obj)->klass = klass;
 #endif
 	FL_SET(klass, FL_SINGLETON);
-	RBASIC(obj)->klass = klass;
 
 	rb_singleton_class_attached(klass, obj);
 
@@ -1079,8 +1088,19 @@
 	if (class_isMetaClass(ocklass))
 	    return klass;
 
-	if (!FL_TEST(klass, FL_SINGLETON))
+	if (!FL_TEST(klass, FL_SINGLETON)) {
 	    klass = rb_make_metaclass(obj, klass);
+#if 0
+	    Class newocklass;
+
+	    newocklass = objc_allocateClassPair(ocklass, "MetaClassFoo", 0);
+	    assert(newocklass != NULL);
+	    objc_registerClassPair(newocklass);
+	    rb_objc_install_array_primitives(newocklass);
+	    *(Class *)obj = newocklass;
+	    klass = rb_objc_import_class(newocklass);
+#endif
+	}
 	return klass;
     }
 #endif

Modified: MacRuby/trunk/ext/dbm/dbm.c
===================================================================
--- MacRuby/trunk/ext/dbm/dbm.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/dbm/dbm.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -345,7 +345,7 @@
     }
 
     for (i = 0; i < RARRAY_LEN(ary); i++) {
-	keystr = RARRAY_PTR(ary)[i];
+	keystr = RARRAY_AT(ary, i);
 	StringValue(keystr);
 	key.dptr = RSTRING_PTR(keystr);
 	key.dsize = RSTRING_LEN(keystr);
@@ -407,7 +407,7 @@
     if (RARRAY_LEN(pair) < 2) {
 	rb_raise(rb_eArgError, "pair must be [key, value]");
     }
-    fdbm_store(dbm, RARRAY_PTR(pair)[0], RARRAY_PTR(pair)[1]);
+    fdbm_store(dbm, RARRAY_AT(pair, 0), RARRAY_AT(pair, 1));
     return Qnil;
 }
 

Modified: MacRuby/trunk/ext/dl/cfunc.c
===================================================================
--- MacRuby/trunk/ext/dl/cfunc.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/dl/cfunc.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -260,7 +260,7 @@
 	if( i >= DLSTACK_SIZE ){
 	    rb_raise(rb_eDLError, "too many arguments (stack overflow)");
 	}
-	stack[i] = NUM2LONG(RARRAY_PTR(ary)[i]);
+	stack[i] = NUM2LONG(RARRAY_AT(ary, i));
     }
     
     /* calltype == CFUNC_CDECL */

Modified: MacRuby/trunk/ext/iconv/iconv.c
===================================================================
--- MacRuby/trunk/ext/iconv/iconv.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/iconv/iconv.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -144,9 +144,9 @@
     if (RHASH_SIZE(charset_map)) {
 	VALUE key = rb_funcall2(val, rb_intern("downcase"), 0, 0);
 	StringValuePtr(key);
-	if (st_lookup(RHASH_TBL(charset_map), key, &val)) {
+	val = rb_hash_aref(charset_map, key);
+	if (val != Qnil)
 	    *code = val;
-	}
     }
     return StringValuePtr(*code);
 }
@@ -353,7 +353,7 @@
 	    unsigned int i;
 	    rescue = iconv_fail(error, Qnil, Qnil, env, 0);
 	    if (TYPE(rescue) == T_ARRAY) {
-		str = RARRAY_LEN(rescue) > 0 ? RARRAY_PTR(rescue)[0] : Qnil;
+		str = RARRAY_LEN(rescue) > 0 ? RARRAY_AT(rescue, 0) : Qnil;
 	    }
 	    if (FIXNUM_P(str) && (i = FIX2INT(str)) <= 0xff) {
 		char c = i;
@@ -446,8 +446,8 @@
 	    rescue = iconv_fail(error, ret, str, env, errmsg);
 	    if (TYPE(rescue) == T_ARRAY) {
 		if ((len = RARRAY_LEN(rescue)) > 0)
-		    rb_str_concat(ret, RARRAY_PTR(rescue)[0]);
-		if (len > 1 && !NIL_P(str = RARRAY_PTR(rescue)[1])) {
+		    rb_str_concat(ret, RARRAY_AT(rescue, 0));
+		if (len > 1 && !NIL_P(str = RARRAY_AT(rescue, 1))) {
 		    StringValue(str);
 		    inlen = length = RSTRING_LEN(str);
 		    instart = inptr = RSTRING_PTR(str);
@@ -760,7 +760,7 @@
     if (!rb_block_given_p())
 	return ary;
     for (i = 0; i < RARRAY_LEN(ary); i++) {
-	rb_yield(RARRAY_PTR(ary)[i]);
+	rb_yield(RARRAY_AT(ary, i));
     }
 #else
     rb_notimplement();

Modified: MacRuby/trunk/ext/json/ext/generator/generator.c
===================================================================
--- MacRuby/trunk/ext/json/ext/generator/generator.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/json/ext/generator/generator.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -188,7 +188,7 @@
         OBJ_INFECT(result, self);
         rb_str_buf_append(result, state->array_nl);
         for (i = 0;  i < len; i++) {
-            VALUE element = RARRAY_PTR(self)[i];
+            VALUE element = RARRAY_AT(self, i);
             if (RTEST(rb_hash_aref(state->seen, rb_obj_id(element)))) {
                 rb_raise(eCircularDatastructure,
                         "circular data structures not supported!");
@@ -215,7 +215,7 @@
         rb_str_buf_cat2(result, "[");
         rb_str_buf_append(result, state->array_nl);
         for (i = 0;  i < len; i++) {
-            VALUE element = RARRAY_PTR(self)[i];
+            VALUE element = RARRAY_AT(self, i);
             OBJ_INFECT(result, element);
             if (i > 0) rb_str_buf_append(result, delim);
             rb_str_buf_append(result, shift);
@@ -251,7 +251,7 @@
         rb_str_buf_cat2(result, "[");
         OBJ_INFECT(result, self);
         for (i = 0;  i < len; i++) {
-            VALUE element = RARRAY_PTR(self)[i];
+            VALUE element = RARRAY_AT(self, i);
             OBJ_INFECT(result, element);
             if (i > 0) rb_str_buf_cat2(result, ",");
             element = rb_funcall(element, i_to_json, 0);

Modified: MacRuby/trunk/ext/openssl/ossl_ocsp.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_ocsp.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_ocsp.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -462,7 +462,7 @@
 	/* All ary's members should be X509Extension */
 	Check_Type(ext, T_ARRAY);
 	for (i = 0; i < RARRAY_LEN(ext); i++)
-	    OSSL_Check_Kind(RARRAY_PTR(ext)[i], cX509Ext);
+	    OSSL_Check_Kind(RARRAY_AT(ext, i), cX509Ext);
     }
 
     error = 0;
@@ -491,7 +491,7 @@
 	sk_X509_EXTENSION_pop_free(single->singleExtensions, X509_EXTENSION_free);
 	single->singleExtensions = NULL;
 	for(i = 0; i < RARRAY_LEN(ext); i++){
-	    x509ext = DupX509ExtPtr(RARRAY_PTR(ext)[i]);
+	    x509ext = DupX509ExtPtr(RARRAY_AT(ext, i));
 	    if(!OCSP_SINGLERESP_add_ext(single, x509ext, -1)){
 		X509_EXTENSION_free(x509ext);
 		error = 1;

Modified: MacRuby/trunk/ext/openssl/ossl_ssl.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_ssl.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_ssl.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -511,7 +511,7 @@
     if(!NIL_P(val)){
 	if(TYPE(val) == T_ARRAY){
 	    for(i = 0; i < RARRAY_LEN(val); i++){
-		client_ca = GetX509CertPtr(RARRAY_PTR(val)[i]);
+		client_ca = GetX509CertPtr(RARRAY_AT(val, i));
         	if (!SSL_CTX_add_client_CA(ctx, client_ca)){
 		    /* Copies X509_NAME => FREE it. */
         	    ossl_raise(eSSLError, "SSL_CTX_add_client_CA");

Modified: MacRuby/trunk/ext/openssl/ossl_x509cert.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_x509cert.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_x509cert.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -647,13 +647,13 @@
     Check_Type(ary, T_ARRAY);
     /* All ary's members should be X509Extension */
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	OSSL_Check_Kind(RARRAY_PTR(ary)[i], cX509Ext);
+	OSSL_Check_Kind(RARRAY_AT(ary, i), cX509Ext);
     }
     GetX509(self, x509);
     sk_X509_EXTENSION_pop_free(x509->cert_info->extensions, X509_EXTENSION_free);
     x509->cert_info->extensions = NULL;
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	ext = DupX509ExtPtr(RARRAY_PTR(ary)[i]);
+	ext = DupX509ExtPtr(RARRAY_AT(ary, i));
 	
 	if (!X509_add_ext(x509, ext, -1)) { /* DUPs ext - FREE it */
 	    X509_EXTENSION_free(ext);

Modified: MacRuby/trunk/ext/openssl/ossl_x509crl.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_x509crl.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_x509crl.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -288,13 +288,13 @@
     Check_Type(ary, T_ARRAY);
     /* All ary members should be X509 Revoked */
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	OSSL_Check_Kind(RARRAY_PTR(ary)[i], cX509Rev);
+	OSSL_Check_Kind(RARRAY_AT(ary, i), cX509Rev);
     }
     GetX509CRL(self, crl);
     sk_X509_REVOKED_pop_free(crl->crl->revoked, X509_REVOKED_free);
     crl->crl->revoked = NULL;
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	rev = DupX509RevokedPtr(RARRAY_PTR(ary)[i]);
+	rev = DupX509RevokedPtr(RARRAY_AT(ary, i));
 	if (!X509_CRL_add0_revoked(crl, rev)) { /* NO DUP - don't free! */
 	    ossl_raise(eX509CRLError, NULL);
 	}
@@ -462,13 +462,13 @@
     Check_Type(ary, T_ARRAY);
     /* All ary members should be X509 Extensions */
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	OSSL_Check_Kind(RARRAY_PTR(ary)[i], cX509Ext);
+	OSSL_Check_Kind(RARRAY_AT(ary, i), cX509Ext);
     }
     GetX509CRL(self, crl);
     sk_X509_EXTENSION_pop_free(crl->crl->extensions, X509_EXTENSION_free);
     crl->crl->extensions = NULL;
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	ext = DupX509ExtPtr(RARRAY_PTR(ary)[i]);
+	ext = DupX509ExtPtr(RARRAY_AT(ary, i));
 	if(!X509_CRL_add_ext(crl, ext, -1)) { /* DUPs ext - FREE it */
 	    X509_EXTENSION_free(ext);
 	    ossl_raise(eX509CRLError, NULL);

Modified: MacRuby/trunk/ext/openssl/ossl_x509req.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_x509req.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_x509req.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -404,13 +404,13 @@
 
     Check_Type(ary, T_ARRAY);
     for (i=0;i<RARRAY_LEN(ary); i++) {
-	OSSL_Check_Kind(RARRAY_PTR(ary)[i], cX509Attr);
+	OSSL_Check_Kind(RARRAY_AT(ary, i), cX509Attr);
     }
     GetX509Req(self, req);
     sk_X509_ATTRIBUTE_pop_free(req->req_info->attributes, X509_ATTRIBUTE_free);
     req->req_info->attributes = NULL;
     for (i=0;i<RARRAY_LEN(ary); i++) {
-	item = RARRAY_PTR(ary)[i];
+	item = RARRAY_AT(ary, i);
 	attr = DupX509AttrPtr(item);
 	if (!X509_REQ_add1_attr(req, attr)) {
 	    ossl_raise(eX509ReqError, NULL);

Modified: MacRuby/trunk/ext/openssl/ossl_x509revoked.c
===================================================================
--- MacRuby/trunk/ext/openssl/ossl_x509revoked.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/openssl/ossl_x509revoked.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -176,13 +176,13 @@
 
     Check_Type(ary, T_ARRAY);
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	OSSL_Check_Kind(RARRAY_PTR(ary)[i], cX509Ext);
+	OSSL_Check_Kind(RARRAY_AT(ary, i), cX509Ext);
     }
     GetX509Rev(self, rev);
     sk_X509_EXTENSION_pop_free(rev->extensions, X509_EXTENSION_free);
     rev->extensions = NULL;
     for (i=0; i<RARRAY_LEN(ary); i++) {
-	item = RARRAY_PTR(ary)[i];
+	item = RARRAY_AT(ary, i);
 	ext = DupX509ExtPtr(item);
 	if(!X509_REVOKED_add_ext(rev, ext, -1)) {
 	    ossl_raise(eX509RevError, NULL);

Modified: MacRuby/trunk/ext/racc/cparse/cparse.c
===================================================================
--- MacRuby/trunk/ext/racc/cparse/cparse.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/racc/cparse/cparse.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -84,7 +84,7 @@
 }
 
 #define AREF(s, idx) \
-    ((0 <= idx && idx < RARRAY_LEN(s)) ? RARRAY_PTR(s)[idx] : Qnil)
+    ((0 <= idx && idx < RARRAY_LEN(s)) ? RARRAY_AT(s, idx) : Qnil)
 
 /* -----------------------------------------------------------------------
                         Parser Stack Interfaces
@@ -98,7 +98,7 @@
 {
     if (len < 0) return Qnil;  /* system error */
     if (len > RARRAY_LEN(stack)) len = RARRAY_LEN(stack);
-    return rb_ary_new4(len, RARRAY_PTR(stack) + RARRAY_LEN(stack) - len);
+    return rb_ary_new4(len, RARRAY_AT(stack, RARRAY_LEN(stack) - len));
 }
 
 static void
@@ -115,7 +115,7 @@
 #define PUSH(s, i) rb_ary_store(s, RARRAY_LEN(s), i)
 #define POP(s) rb_ary_pop(s)
 #define LAST_I(s) \
-    ((RARRAY_LEN(s) > 0) ? RARRAY_PTR(s)[RARRAY_LEN(s) - 1] : Qnil)
+    ((RARRAY_LEN(s) > 0) ? RARRAY_AT(s, RARRAY_LEN(s) - 1) : Qnil)
 #define GET_TAIL(s, len) get_stack_tail(s, len)
 #define CUT_TAIL(s, len) cut_stack_tail(s, len)
 
@@ -327,21 +327,21 @@
     Check_Type(arg, T_ARRAY);
     if (!(13 <= RARRAY_LEN(arg) && RARRAY_LEN(arg) <= 14))
         rb_raise(RaccBug, "[Racc Bug] wrong arg.size %ld", RARRAY_LEN(arg));
-    v->action_table   = assert_array  (RARRAY_PTR(arg)[ 0]);
-    v->action_check   = assert_array  (RARRAY_PTR(arg)[ 1]);
-    v->action_default = assert_array  (RARRAY_PTR(arg)[ 2]);
-    v->action_pointer = assert_array  (RARRAY_PTR(arg)[ 3]);
-    v->goto_table     = assert_array  (RARRAY_PTR(arg)[ 4]);
-    v->goto_check     = assert_array  (RARRAY_PTR(arg)[ 5]);
-    v->goto_default   = assert_array  (RARRAY_PTR(arg)[ 6]);
-    v->goto_pointer   = assert_array  (RARRAY_PTR(arg)[ 7]);
-    v->nt_base        = assert_integer(RARRAY_PTR(arg)[ 8]);
-    v->reduce_table   = assert_array  (RARRAY_PTR(arg)[ 9]);
-    v->token_table    = assert_hash   (RARRAY_PTR(arg)[10]);
-    v->shift_n        = assert_integer(RARRAY_PTR(arg)[11]);
-    v->reduce_n       = assert_integer(RARRAY_PTR(arg)[12]);
+    v->action_table   = assert_array  (RARRAY_AT(arg, 0));
+    v->action_check   = assert_array  (RARRAY_AT(arg, 1));
+    v->action_default = assert_array  (RARRAY_AT(arg, 2));
+    v->action_pointer = assert_array  (RARRAY_AT(arg, 3));
+    v->goto_table     = assert_array  (RARRAY_AT(arg, 4));
+    v->goto_check     = assert_array  (RARRAY_AT(arg, 5));
+    v->goto_default   = assert_array  (RARRAY_AT(arg, 6));
+    v->goto_pointer   = assert_array  (RARRAY_AT(arg, 7));
+    v->nt_base        = assert_integer(RARRAY_AT(arg, 8));
+    v->reduce_table   = assert_array  (RARRAY_AT(arg, 9));
+    v->token_table    = assert_hash   (RARRAY_AT(arg,10));
+    v->shift_n        = assert_integer(RARRAY_AT(arg,11));
+    v->reduce_n       = assert_integer(RARRAY_AT(arg,12));
     if (RARRAY_LEN(arg) > 13) {
-        v->use_result_var = RTEST(RARRAY_PTR(arg)[13]);
+        v->use_result_var = RTEST(RARRAY_AT(arg, 13));
     }
     else {
         v->use_result_var = Qtrue;
@@ -557,7 +557,7 @@
 
   accept:
     if (v->debug) rb_funcall(v->parser, id_d_accept, 0);
-    v->retval = RARRAY_PTR(v->vstack)[0];
+    v->retval = RARRAY_AT(v->vstack, 0);
     v->fin = CP_FIN_ACCEPT;
     return;
 
@@ -686,9 +686,9 @@
     VALUE goto_state;
 
     Data_Get_Struct(data, struct cparse_params, v);
-    reduce_len = RARRAY_PTR(v->reduce_table)[v->ruleno];
-    reduce_to  = RARRAY_PTR(v->reduce_table)[v->ruleno+1];
-    method_id  = RARRAY_PTR(v->reduce_table)[v->ruleno+2];
+    reduce_len = RARRAY_AT(v->reduce_table, v->ruleno);
+    reduce_to  = RARRAY_AT(v->reduce_table, v->ruleno+1);
+    method_id  = RARRAY_AT(v->reduce_table, v->ruleno+2);
     len = NUM2LONG(reduce_len);
     mid = value_to_id(method_id);
 
@@ -703,10 +703,10 @@
     else {
         if (mid != id_noreduce) {
             tmp_v = GET_TAIL(v->vstack, len);
-            tmp = RARRAY_PTR(tmp_v)[0];
+            tmp = RARRAY_AT(tmp_v, 0);
         }
         else {
-            tmp = RARRAY_PTR(v->vstack)[ RARRAY_LEN(v->vstack) - len ];
+            tmp = RARRAY_AT(v->vstack, RARRAY_LEN(v->vstack) - len);
         }
         CUT_TAIL(v->vstack, len);
         if (v->debug) {

Modified: MacRuby/trunk/ext/readline/readline.c
===================================================================
--- MacRuby/trunk/ext/readline/readline.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/readline/readline.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -188,7 +188,7 @@
 	return NULL;
     result = ALLOC_N(char *, matches + 2);
     for (i = 0; i < matches; i++) {
-	temp = rb_obj_as_string(RARRAY_PTR(ary)[i]);
+	temp = rb_obj_as_string(RARRAY_AT(ary, i));
 	result[i + 1] = ALLOC_N(char, RSTRING_LEN(temp) + 1);
 	strcpy(result[i + 1], RSTRING_PTR(temp));
     }

Modified: MacRuby/trunk/ext/sdbm/init.c
===================================================================
--- MacRuby/trunk/ext/sdbm/init.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/sdbm/init.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -323,7 +323,7 @@
     }
 
     for (i = 0; i < RARRAY_LEN(ary); i++) {
-	keystr = RARRAY_PTR(ary)[i];
+	keystr = RARRAY_AT(ary, i);
 	StringValue(keystr);
 	key.dptr = RSTRING_PTR(keystr);
 	key.dsize = RSTRING_LEN(keystr);
@@ -418,7 +418,7 @@
     if (RARRAY_LEN(pair) < 2) {
 	rb_raise(rb_eArgError, "pair must be [key, value]");
     }
-    fsdbm_store(dbm, RARRAY_PTR(pair)[0], RARRAY_PTR(pair)[1]);
+    fsdbm_store(dbm, RARRAY_AT(pair, 0), RARRAY_AT(pair, 1));
     return Qnil;
 }
 

Modified: MacRuby/trunk/ext/socket/socket.c
===================================================================
--- MacRuby/trunk/ext/socket/socket.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/socket/socket.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -3054,7 +3054,7 @@
     for (res = res0; res; res = res->ai_next) {
 	ary = ipaddr(res->ai_addr, do_not_reverse_lookup);
 	if (res->ai_canonname) {
-	    RARRAY_PTR(ary)[2] = rb_str_new2(res->ai_canonname);
+	    rb_ary_store(ary, 2, rb_str_new2(res->ai_canonname));
 	}
 	rb_ary_push(ary, INT2FIX(res->ai_family));
 	rb_ary_push(ary, INT2FIX(res->ai_socktype));
@@ -3296,16 +3296,16 @@
 	sa = tmp;
 	MEMZERO(&hints, struct addrinfo, 1);
 	if (RARRAY_LEN(sa) == 3) {
-	    af = RARRAY_PTR(sa)[0];
-	    port = RARRAY_PTR(sa)[1];
-	    host = RARRAY_PTR(sa)[2];
+	    af = RARRAY_AT(sa, 0);
+	    port = RARRAY_AT(sa, 1);
+	    host = RARRAY_AT(sa, 2);
 	}
 	else if (RARRAY_LEN(sa) >= 4) {
-	    af = RARRAY_PTR(sa)[0];
-	    port = RARRAY_PTR(sa)[1];
-	    host = RARRAY_PTR(sa)[3];
+	    af = RARRAY_AT(sa, 0);
+	    port = RARRAY_AT(sa, 1);
+	    host = RARRAY_AT(sa, 3);
 	    if (NIL_P(host)) {
-		host = RARRAY_PTR(sa)[2];
+		host = RARRAY_AT(sa, 2);
 	    }
 	    else {
 		/*

Modified: MacRuby/trunk/ext/syck/rubyext.c
===================================================================
--- MacRuby/trunk/ext/syck/rubyext.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/syck/rubyext.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -25,9 +25,9 @@
     struct RClass  klass;
     /*struct RFloat  flonum;*/
     /*struct RString string;*/
-    struct RArray  array;
     /*struct RRegexp regexp;*/
 #if !WITH_OBJC
+    struct RArray  array;
     struct RHash   hash;
 #endif
     /*struct RData   data;*/

Modified: MacRuby/trunk/ext/tk/tcltklib.c
===================================================================
--- MacRuby/trunk/ext/tk/tcltklib.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/tk/tcltklib.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -1170,15 +1170,15 @@
     case T_BIGNUM:
         /* time is micro-second value */
         divmod = rb_funcall(time, rb_intern("divmod"), 1, LONG2NUM(1000000));
-        tcl_time.sec  = NUM2LONG(RARRAY_PTR(divmod)[0]);
-        tcl_time.usec = NUM2LONG(RARRAY_PTR(divmod)[1]);
+        tcl_time.sec  = NUM2LONG(RARRAY_AT(divmod, 0));
+        tcl_time.usec = NUM2LONG(RARRAY_AT(divmod, 1));
         break;
 
     case T_FLOAT:
         /* time is second value */
         divmod = rb_funcall(time, rb_intern("divmod"), 1, INT2FIX(1));
-        tcl_time.sec  = NUM2LONG(RARRAY_PTR(divmod)[0]);
-        tcl_time.usec = (long)(NUM2DBL(RARRAY_PTR(divmod)[1]) * 1000000);
+        tcl_time.sec  = NUM2LONG(RARRAY_AT(divmod, 0));
+        tcl_time.usec = (long)(NUM2DBL(RARRAY_AT(divmod, 1)) * 1000000);
 
     default:
         {
@@ -5620,7 +5620,7 @@
     }
 
     /* set result */
-    RARRAY_PTR(q->result)[0] = ret;
+    rb_ary_store(q->result, 0, ret);
 
     /* complete */
     *(q->done) = -1;
@@ -5745,7 +5745,7 @@
     DUMP2("back from handler (current thread:%lx)", current);
 
     /* get result & free allocated memory */
-    ret = RARRAY_PTR(result)[0];
+    ret = RARRAY_AT(result, 0);
     free(alloc_done);
     if (argv) free(argv);
 
@@ -5979,7 +5979,7 @@
     }
 
     /* set result */
-    RARRAY_PTR(q->result)[0] = ret;
+    rb_ary_store(q->result, 0, ret);
 
     /* complete */
     *(q->done) = -1;
@@ -6102,7 +6102,7 @@
     DUMP2("back from handler (current thread:%lx)", current);
 
     /* get result & free allocated memory */
-    ret = RARRAY_PTR(result)[0];
+    ret = RARRAY_AT(result, 0);
 
     free(alloc_done);
     free(eval_str);
@@ -7093,7 +7093,7 @@
     }
 
     /* set result */
-    RARRAY_PTR(q->result)[0] = ret;
+    rb_ary_store(q->result, 0, ret);
 
     /* complete */
     *(q->done) = -1;
@@ -7218,7 +7218,7 @@
     DUMP2("back from handler (current thread:%lx)", current);
 
     /* get result & free allocated memory */
-    ret = RARRAY_PTR(result)[0];
+    ret = RARRAY_AT(result, 0);
     //free(alloc_done);
     ckfree((char*)alloc_done);
 

Modified: MacRuby/trunk/ext/tk/tkutil/tkutil.c
===================================================================
--- MacRuby/trunk/ext/tk/tkutil/tkutil.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/ext/tk/tkutil/tkutil.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -268,8 +268,8 @@
     /* size = RARRAY_LEN(ary); */
     size = 0;
     for(idx = 0; idx < RARRAY_LEN(ary); idx++) {
-        if (TYPE(RARRAY_PTR(ary)[idx]) == T_HASH) {
-            size += 2 * RHASH_SIZE(RARRAY_PTR(ary)[idx]);
+        if (TYPE(RARRAY_AT(ary, idx)) == T_HASH) {
+            size += 2 * RHASH_SIZE(RARRAY_AT(ary, idx));
         } else {
             size++;
         }
@@ -277,7 +277,7 @@
 
     dst = rb_ary_new2(size);
     for(idx = 0; idx < RARRAY_LEN(ary); idx++) {
-        val = RARRAY_PTR(ary)[idx];
+        val = RARRAY_AT(ary, idx);
         str_val = Qnil;
         switch(TYPE(val)) {
         case T_ARRAY:
@@ -308,7 +308,7 @@
             }
             size2 = RARRAY_LEN(val);
             for(idx2 = 0; idx2 < size2; idx2++) {
-                val2 = RARRAY_PTR(val)[idx2];
+                val2 = RARRAY_AT(val, idx2);
                 switch(TYPE(val2)) {
                 case T_ARRAY:
                     str_val = ary2list(val2, enc_flag, self);
@@ -369,13 +369,13 @@
 
     if (RTEST(dst_enc) && !NIL_P(sys_enc)) {
         for(idx = 0; idx < RARRAY_LEN(dst); idx++) {
-            str_val = RARRAY_PTR(dst)[idx];
+            str_val = RARRAY_AT(dst, idx);
             if (rb_obj_respond_to(self, ID_toUTF8, Qtrue)) {
                 str_val = rb_funcall(self, ID_toUTF8, 1, str_val);
             } else {
                 str_val = rb_funcall(cTclTkLib, ID_toUTF8, 1, str_val);
             }
-            RARRAY_PTR(dst)[idx] = str_val;
+            rb_ary_store(dst, idx, str_val);
         }
         val = rb_apply(cTclTkLib, ID_merge_tklist, dst);
         if (TYPE(dst_enc) == T_STRING) {
@@ -421,7 +421,7 @@
     size = RARRAY_LEN(ary);
     dst = rb_ary_new2(size);
     for(idx = 0; idx < RARRAY_LEN(ary); idx++) {
-        val = RARRAY_PTR(ary)[idx];
+        val = RARRAY_AT(ary, idx);
         str_val = Qnil;
         switch(TYPE(val)) {
         case T_ARRAY:
@@ -462,13 +462,13 @@
 
     if (RTEST(dst_enc) && !NIL_P(sys_enc)) {
         for(idx = 0; idx < RARRAY_LEN(dst); idx++) {
-            str_val = RARRAY_PTR(dst)[idx];
+            str_val = RARRAY_AT(dst, idx);
             if (rb_obj_respond_to(self, ID_toUTF8, Qtrue)) {
                 str_val = rb_funcall(self, ID_toUTF8, 1, str_val);
             } else {
                 str_val = rb_funcall(cTclTkLib, ID_toUTF8, 1, str_val);
             }
-            RARRAY_PTR(dst)[idx] = str_val;
+            rb_ary_store(dst, idx, str_val);
         }
         val = rb_apply(cTclTkLib, ID_merge_tklist, dst);
         if (TYPE(dst_enc) == T_STRING) {
@@ -504,27 +504,27 @@
     len = RARRAY_LEN(assoc);
 
     for(i = 0; i < len; i++) {
-        pair = RARRAY_PTR(assoc)[i];
+        pair = RARRAY_AT(assoc, i);
         if (TYPE(pair) != T_ARRAY) {
             rb_ary_push(dst, key2keyname(pair));
             continue;
         }
         switch(RARRAY_LEN(assoc)) {
         case 2:
-            rb_ary_push(dst, RARRAY_PTR(pair)[2]);
+            rb_ary_push(dst, RARRAY_AT(pair, 2));
 
         case 1:
-            rb_ary_push(dst, key2keyname(RARRAY_PTR(pair)[0]));
+            rb_ary_push(dst, key2keyname(RARRAY_AT(pair, 0)));
 
         case 0:
             continue;
 
         default:
-            rb_ary_push(dst, key2keyname(RARRAY_PTR(pair)[0]));
+            rb_ary_push(dst, key2keyname(RARRAY_AT(pair, 0)));
 
             val = rb_ary_new2(RARRAY_LEN(pair) - 1);
             for(j = 1; j < RARRAY_LEN(pair); j++) {
-                rb_ary_push(val, RARRAY_PTR(pair)[j]);
+                rb_ary_push(val, RARRAY_AT(pair, j));
             }
 
             rb_ary_push(dst, val);
@@ -552,27 +552,27 @@
     len = RARRAY_LEN(assoc);
 
     for(i = 0; i < len; i++) {
-        pair = RARRAY_PTR(assoc)[i];
+        pair = RARRAY_AT(assoc, i);
         if (TYPE(pair) != T_ARRAY) {
             rb_ary_push(dst, key2keyname(pair));
             continue;
         }
         switch(RARRAY_LEN(assoc)) {
         case 2:
-            rb_ary_push(dst, get_eval_string_core(RARRAY_PTR(pair)[2], Qtrue, self));
+            rb_ary_push(dst, get_eval_string_core(RARRAY_AT(pair, 2), Qtrue, self));
 
         case 1:
-            rb_ary_push(dst, key2keyname(RARRAY_PTR(pair)[0]));
+            rb_ary_push(dst, key2keyname(RARRAY_AT(pair, 0)));
 
         case 0:
             continue;
 
         default:
-            rb_ary_push(dst, key2keyname(RARRAY_PTR(pair)[0]));
+            rb_ary_push(dst, key2keyname(RARRAY_AT(pair, 0)));
 
             val = rb_ary_new2(RARRAY_LEN(pair) - 1);
             for(j = 1; j < RARRAY_LEN(pair); j++) {
-                rb_ary_push(val, RARRAY_PTR(pair)[j]);
+                rb_ary_push(val, RARRAY_AT(pair, j));
             }
 
             rb_ary_push(dst, get_eval_string_core(val, Qtrue, self));
@@ -594,7 +594,7 @@
 {
     volatile VALUE ary;
 
-    ary = RARRAY_PTR(args)[0];
+    ary = RARRAY_AT(args, 0);
 
     if (key == Qundef) return ST_CONTINUE;
 #if 0
@@ -605,7 +605,7 @@
 
     if (val == TK_None) return ST_CHECK;
 
-    rb_ary_push(ary, get_eval_string_core(val, Qnil, RARRAY_PTR(args)[1]));
+    rb_ary_push(ary, get_eval_string_core(val, Qnil, RARRAY_AT(args, 1)));
 
     return ST_CHECK;
 }
@@ -636,21 +636,21 @@
 {
     volatile VALUE ary;
 
-    ary = RARRAY_PTR(args)[0];
+    ary = RARRAY_AT(args, 0);
 
     if (key == Qundef) return ST_CONTINUE;
 #if 0
     rb_ary_push(ary, key2keyname(key));
     if (val != TK_None) {
         rb_ary_push(ary, get_eval_string_core(val, Qtrue, 
-                                              RARRAY_PTR(args)[1]));
+                                              RARRAY_AT(args, 1)));
     }
 #endif
     rb_ary_push(ary, key2keyname(key));
 
     if (val == TK_None) return ST_CHECK;
 
-    rb_ary_push(ary, get_eval_string_core(val, Qtrue, RARRAY_PTR(args)[1]));
+    rb_ary_push(ary, get_eval_string_core(val, Qtrue, RARRAY_AT(args, 1)));
 
     return ST_CHECK;
 }
@@ -1279,7 +1279,7 @@
     buf = ALLOC_N(char, len + 1);
 
     for(i = 0; i < len; i++) {
-        ptr = RSTRING_PTR(RARRAY_PTR(list)[i]);
+        ptr = RSTRING_PTR(RARRAY_AT(list, i));
         if (*ptr == '%' && *(ptr + 2) == '\0') {
             *(buf + i) = *(ptr + 1);
         } else {
@@ -1355,20 +1355,20 @@
      *         ivar  ==> symbol
      */
     for(idx = 0; idx < len; idx++) {
-        inf = RARRAY_PTR(key_inf)[idx];
+        inf = RARRAY_AT(key_inf, idx);
         if (TYPE(inf) != T_ARRAY) continue;
-        *(key  + real_len) = NUM2CHR(RARRAY_PTR(inf)[0]);
-        *(type + real_len) = NUM2CHR(RARRAY_PTR(inf)[1]);
+        *(key  + real_len) = NUM2CHR(RARRAY_AT(inf, 0));
+        *(type + real_len) = NUM2CHR(RARRAY_AT(inf, 1));
 
         *(ivar + real_len) 
             = rb_intern(
                 RSTRING_PTR(
                   rb_str_cat2(rb_str_new2("@"), 
-                              rb_id2name(SYM2ID(RARRAY_PTR(inf)[2])))
+                              rb_id2name(SYM2ID(RARRAY_AT(inf, 2))))
                 )
               );
 
-        rb_attr(self, SYM2ID(RARRAY_PTR(inf)[2]), 1, 0, Qtrue);
+        rb_attr(self, SYM2ID(RARRAY_AT(inf, 2)), 1, 0, Qtrue);
         real_len++;
     }
     *(key + real_len) = '\0';
@@ -1382,9 +1382,9 @@
      */
     len = RARRAY_LEN(proc_inf);
     for(idx = 0; idx < len; idx++) {
-        inf = RARRAY_PTR(proc_inf)[idx];
+        inf = RARRAY_AT(proc_inf, idx);
         if (TYPE(inf) != T_ARRAY) continue;
-        rb_hash_aset(proc, RARRAY_PTR(inf)[0], RARRAY_PTR(inf)[1]);
+        rb_hash_aset(proc, RARRAY_AT(inf, 0), RARRAY_AT(inf, 1));
     }
 
     rb_const_set(self, ID_SUBST_INFO, 
@@ -1441,9 +1441,9 @@
         }
 
         if (NIL_P(proc)) {
-            rb_ary_push(dst, RARRAY_PTR(val_ary)[idx]);
+            rb_ary_push(dst, RARRAY_AT(val_ary, idx));
         } else {
-            rb_ary_push(dst, rb_funcall(proc, ID_call, 1, RARRAY_PTR(val_ary)[idx]));
+            rb_ary_push(dst, rb_funcall(proc, ID_call, 1, RARRAY_AT(val_ary, idx)));
         }
     }
 

Modified: MacRuby/trunk/hash.c
===================================================================
--- MacRuby/trunk/hash.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/hash.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -344,7 +344,7 @@
     values_cb.equal = rb_cfdictionary_equal_cb;
 
     hash = (VALUE)CFDictionaryCreateMutable(NULL, 0, &keys_cb, &values_cb);
-    if (klass != 0)
+    if (klass != 0 && klass != rb_cHash && klass != rb_cHashRuby)
 	*(Class *)hash = RCLASS_OCID(klass);
 
     return hash;
@@ -362,7 +362,7 @@
 rb_hash_new(void)
 {
 #if WITH_OBJC
-    return hash_alloc(rb_cHashRuby);
+    return hash_alloc(0);
 #else
     return hash_alloc(rb_cHash);
 #endif
@@ -3041,8 +3041,9 @@
 
 #if WITH_OBJC
     rb_cHash = rb_objc_import_class((Class)objc_getClass("NSDictionary"));
-    rb_const_set(rb_cObject, rb_intern("Hash"),
-	rb_objc_import_class((Class)objc_getClass("NSMutableDictionary")));
+    rb_cHashRuby = rb_objc_import_class((Class)objc_getClass("NSMutableDictionary"));
+    FL_UNSET(rb_cHashRuby, RCLASS_OBJC_IMPORTED);
+    rb_const_set(rb_cObject, rb_intern("Hash"), rb_cHashRuby);
     rb_define_method(rb_cHash, "freeze", rb_hash_freeze, 0);
     rb_define_method(rb_cHash, "frozen?", rb_hash_frozen, 0);
 #else

Modified: MacRuby/trunk/object.c
===================================================================
--- MacRuby/trunk/object.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/object.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -1405,9 +1405,11 @@
 	rb_raise(rb_eTypeError, "can't create instance of singleton class");
     }
     obj = rb_funcall(klass, ID_ALLOCATOR, 0, 0);
+#if !WITH_OBJC
     if (rb_obj_class(obj) != rb_class_real(klass)) {
 	rb_raise(rb_eTypeError, "wrong instance allocation");
     }
+#endif
     return obj;
 }
 
@@ -2321,6 +2323,15 @@
     return obj;
 }
 
+#if WITH_OBJC
+static VALUE
+rb_obj_is_pure(VALUE recv)
+{
+    return rb_objc_is_non_native(recv) ? Qtrue : Qfalse;
+}
+#endif
+
+
 /*
  *  Document-class: Class
  *
@@ -2479,6 +2490,10 @@
     rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
     rb_define_method(rb_mKernel, "tap", rb_obj_tap, 0);
 
+#if WITH_OBJC
+    rb_define_method(rb_mKernel, "__pure__?", rb_obj_is_pure, 0);
+#endif
+
     rb_define_global_function("sprintf", rb_f_sprintf, -1); /* in sprintf.c */
     rb_define_global_function("format", rb_f_sprintf, -1);  /* in sprintf.c */
 

Modified: MacRuby/trunk/proc.c
===================================================================
--- MacRuby/trunk/proc.c	2008-03-26 22:51:38 UTC (rev 120)
+++ MacRuby/trunk/proc.c	2008-03-28 22:38:12 UTC (rev 121)
@@ -1504,9 +1504,15 @@
 {
     volatile VALUE a;
 
+#if WITH_OBJC
+    if (TYPE(args) != T_ARRAY) {
+    	return rb_method_call(1, &args, method);
+    }
+#else
     if (CLASS_OF(args) != rb_cArray) {
 	args = rb_ary_new3(1, args);
     }
+#endif
 
     a = args;
     return rb_method_call(RARRAY_LEN(a), RARRAY_PTR(a), method);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080328/9d94d6e1/attachment-0001.html


More information about the macruby-changes mailing list