Revision: 121 http://trac.macosforge.org/projects/ruby/changeset/121 Author: lsansonetti@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);
participants (1)
-
source_changes@macosforge.org