[macruby-changes] [185] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Fri May 2 18:15:14 PDT 2008
Revision: 185
http://trac.macosforge.org/projects/ruby/changeset/185
Author: lsansonetti at 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;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080502/04543678/attachment-0001.html
More information about the macruby-changes
mailing list