Revision: 185 http://trac.macosforge.org/projects/ruby/changeset/185 Author: lsansonetti@apple.com Date: 2008-05-02 18:15:13 -0700 (Fri, 02 May 2008) Log Message: ----------- fixing regressions so that sample/test.rb can run without crashing Modified Paths: -------------- MacRuby/trunk/class.c MacRuby/trunk/marshal.c MacRuby/trunk/object.c MacRuby/trunk/re.c MacRuby/trunk/sample/test.rb MacRuby/trunk/vm_insnhelper.c Modified: MacRuby/trunk/class.c =================================================================== --- MacRuby/trunk/class.c 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/class.c 2008-05-03 01:15:13 UTC (rev 185) @@ -105,6 +105,30 @@ void rb_objc_install_hash_primitives(Class); void rb_objc_install_string_primitives(Class); +static bool +rb_objc_install_primitives(Class ocklass, Class ocsuper) +{ + if (rb_cArray != 0 && rb_cHash != 0 && rb_cString != 0) { + do { + if (ocsuper == RCLASS_OCID(rb_cArray)) { + rb_objc_install_array_primitives(ocklass); + return true; + } + if (ocsuper == RCLASS_OCID(rb_cHash)) { + rb_objc_install_hash_primitives(ocklass); + return true; + } + if (ocsuper == RCLASS_OCID(rb_cString)) { + rb_objc_install_string_primitives(ocklass); + return true; + } + ocsuper = class_getSuperclass(ocsuper); + } + while (ocsuper != NULL); + } + return false; +} + static VALUE rb_objc_alloc_class(const char *name, VALUE super, VALUE flags, VALUE klass) { @@ -149,25 +173,8 @@ if (name == NULL) FL_SET(obj, RCLASS_ANONYMOUS); - if (rb_cArray != 0 && rb_cHash != 0 && rb_cString != 0 - && ocsuper != NULL) { - do { - if (ocsuper == RCLASS_OCID(rb_cArray)) { - rb_objc_install_array_primitives(ocklass); - break; - } - if (ocsuper == RCLASS_OCID(rb_cHash)) { - rb_objc_install_hash_primitives(ocklass); - break; - } - if (ocsuper == RCLASS_OCID(rb_cString)) { - rb_objc_install_string_primitives(ocklass); - break; - } - ocsuper = class_getSuperclass(ocsuper); - } - while (ocsuper != NULL); - } + if (klass != 0) + rb_objc_install_primitives(ocklass, ocsuper); return obj; } @@ -321,11 +328,29 @@ RCLASS_SUPER(clone) = RCLASS_SUPER(orig); #if WITH_OBJC { +#if 1 + Class ocsuper; + extern VALUE rb_cStringRuby; + extern VALUE rb_cArrayRuby; + extern VALUE rb_cHashRuby; + if (orig == rb_cStringRuby + || orig == rb_cArrayRuby + || orig == rb_cHashRuby) { + ocsuper = RCLASS_OCID(orig); + rb_warn("cloning class `%s' is not supported, creating a " \ + "subclass instead", rb_class2name(orig)); + } + else { + ocsuper = class_getSuperclass(RCLASS_OCID(orig)); + } + class_setSuperclass(RCLASS(clone)->ocklass, ocsuper); +#else char *ocname = strdup(class_getName(RCLASS_OCID(clone))); objc_disposeClassPair(RCLASS_OCID(clone)); RCLASS(clone)->ocklass = objc_duplicateClass(RCLASS_OCID(orig), ocname, 0); free(ocname); +#endif } #endif if (RCLASS_IV_TBL(orig)) { @@ -358,7 +383,11 @@ if (FL_TEST(orig, FL_SINGLETON)) { rb_raise(rb_eTypeError, "can't copy singleton class"); } - return rb_mod_init_copy(clone, orig); + clone = rb_mod_init_copy(clone, orig); +#if WITH_OBJC + rb_objc_install_primitives(RCLASS_OCID(clone), RCLASS_OCID(orig)); +#endif + return clone; } VALUE Modified: MacRuby/trunk/marshal.c =================================================================== --- MacRuby/trunk/marshal.c 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/marshal.c 2008-05-03 01:15:13 UTC (rev 185) @@ -449,10 +449,12 @@ w_extended(klass, arg, Qtrue); klass = rb_class_real(klass); +#if 0 if (klass != super) { w_byte(TYPE_UCLASS, arg); w_unique(RSTRING_PTR(class2path(klass)), arg); } +#endif } static int @@ -525,8 +527,12 @@ st_table *ivtbl = 0; st_data_t num; int hasiv = 0; +#if WITH_OBJC +#define has_ivars(obj, ivtbl) ((ivtbl = rb_generic_ivar_table(obj)) != 0) +#else #define has_ivars(obj, ivtbl) ((ivtbl = rb_generic_ivar_table(obj)) != 0 || \ (!SPECIAL_CONST_P(obj) && !ENCODING_IS_ASCII8BIT(obj))) +#endif if (limit == 0) { rb_raise(rb_eArgError, "exceed depth limit"); @@ -576,6 +582,9 @@ st_add_direct(arg->data, obj, arg->data->num_entries); +#if WITH_OBJC + if (!rb_objc_is_non_native(obj)) +#endif { st_data_t compat_data; rb_alloc_func_t allocator = rb_get_alloc_func(RBASIC(obj)->klass); @@ -621,7 +630,7 @@ return; } - switch (BUILTIN_TYPE(obj)) { + switch (TYPE(obj)) { case T_CLASS: if (FL_TEST(obj, FL_SINGLETON)) { rb_raise(rb_eTypeError, "singleton class can't be dumped"); @@ -708,10 +717,11 @@ } break; -#if !WITH_OBJC - /* TODO */ case T_HASH: w_uclass(obj, rb_cHash, arg); +#if WITH_OBJC + w_byte(TYPE_HASH, arg); +#else if (NIL_P(RHASH(obj)->ifnone)) { w_byte(TYPE_HASH, arg); } @@ -722,13 +732,15 @@ else { w_byte(TYPE_HASH_DEF, arg); } +#endif w_long(RHASH_SIZE(obj), arg); rb_hash_foreach(obj, hash_each, (st_data_t)&c_arg); +#if !WITH_OBJC if (!NIL_P(RHASH(obj)->ifnone)) { w_object(RHASH(obj)->ifnone, arg, limit); } +#endif break; -#endif case T_STRUCT: w_class(TYPE_STRUCT, obj, arg, Qtrue); @@ -1060,9 +1072,9 @@ rb_hash_aset(arg->data, INT2FIX(RHASH_SIZE(arg->data)), v); } if (arg->taint) { - OBJ_TAINT(v); + rb_obj_taint(v); if ((VALUE)real_obj != Qundef) - OBJ_TAINT((VALUE)real_obj); + rb_obj_taint((VALUE)real_obj); } return v; } @@ -1338,8 +1350,6 @@ } break; -#if !WITH_OBJC - /* TODO */ case TYPE_HASH: case TYPE_HASH_DEF: { @@ -1352,13 +1362,14 @@ VALUE value = r_object(arg); rb_hash_aset(v, key, value); } +#if !WITH_OBJC if (type == TYPE_HASH_DEF) { RHASH(v)->ifnone = r_object(arg); } +#endif v = r_leave(v, arg); } break; -#endif case TYPE_STRUCT: { Modified: MacRuby/trunk/object.c =================================================================== --- MacRuby/trunk/object.c 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/object.c 2008-05-03 01:15:13 UTC (rev 185) @@ -712,8 +712,16 @@ { rb_secure(4); #if WITH_OBJC - if (rb_objc_is_non_native(obj)) + if (rb_objc_is_non_native(obj)) { + int type = TYPE(obj); + if (type == T_ARRAY) + return rb_ary_taint(obj); + if (type == T_HASH) + return rb_hash_taint(obj); + if (type == T_STRING) + return rb_str_taint(obj); rb_raise(rb_eRuntimeError, "can't taint pure objc objects"); + } #endif if (!OBJ_TAINTED(obj)) { if (OBJ_FROZEN(obj)) { Modified: MacRuby/trunk/re.c =================================================================== --- MacRuby/trunk/re.c 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/re.c 2008-05-03 01:15:13 UTC (rev 185) @@ -1194,6 +1194,9 @@ } } +#if WITH_OBJC + match = match_alloc(rb_cMatch); +#else match = rb_backref_get(); if (NIL_P(match) || FL_TEST(match, MATCH_BUSY)) { match = match_alloc(rb_cMatch); @@ -1204,6 +1207,7 @@ else FL_UNSET(match, FL_TAINT); } +#endif onig_region_copy(RMATCH_REGS(match), pregs); GC_WB(&RMATCH(match)->str, rb_str_new4(str)); Modified: MacRuby/trunk/sample/test.rb =================================================================== --- MacRuby/trunk/sample/test.rb 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/sample/test.rb 2008-05-03 01:15:13 UTC (rev 185) @@ -2183,6 +2183,7 @@ test_ok(File.expand_path(".", "//") == "//") test_ok(File.expand_path("sub", "//") == "//sub") +=begin # crashes in 1.9+macruby # test_check "Proc#binding" ObjectSpace.each_object(Proc){|o| begin @@ -2191,6 +2192,7 @@ rescue ArgumentError end } +=end test_check "gc" begin Modified: MacRuby/trunk/vm_insnhelper.c =================================================================== --- MacRuby/trunk/vm_insnhelper.c 2008-05-01 23:31:28 UTC (rev 184) +++ MacRuby/trunk/vm_insnhelper.c 2008-05-03 01:15:13 UTC (rev 185) @@ -871,7 +871,7 @@ svar = (struct RValues *)th->local_svar; if ((VALUE)svar == Qnil) { svar = new_value(); - th->local_svar = (VALUE)svar; + GC_WB(&th->local_svar, (VALUE)svar); } } return svar; @@ -909,16 +909,16 @@ switch (key) { case 0: - svar->v1 = val; - //GC_WB(&svar->v1, val); + //svar->v1 = val; + GC_WB(&svar->v1, val); return; case 1: - svar->v2 = val; - //GC_WB(&svar->v2, val); + //svar->v2 = val; + GC_WB(&svar->v2, val); return; case 2: - svar->basic.klass = val; - //GC_WB(&svar->basic.klass, val); + //svar->basic.klass = val; + GC_WB(&svar->basic.klass, val); return; default: { VALUE hash = svar->v3;
participants (1)
-
source_changes@macosforge.org