[macruby-changes] [587] MacRuby/trunk/marshal.c

source_changes at macosforge.org source_changes at macosforge.org
Mon Sep 8 18:55:33 PDT 2008


Revision: 587
          http://trac.macosforge.org/projects/ruby/changeset/587
Author:   lsansonetti at apple.com
Date:     2008-09-08 18:55:33 -0700 (Mon, 08 Sep 2008)
Log Message:
-----------
tracking a silly marshal bug, starting with missing wb

Modified Paths:
--------------
    MacRuby/trunk/marshal.c

Modified: MacRuby/trunk/marshal.c
===================================================================
--- MacRuby/trunk/marshal.c	2008-09-09 00:20:56 UTC (rev 586)
+++ MacRuby/trunk/marshal.c	2008-09-09 01:55:33 UTC (rev 587)
@@ -899,11 +899,13 @@
 {
     VALUE obj, port, a1, a2;
     int limit = -1;
-    struct dump_arg arg;
-    struct dump_call_arg c_arg;
+    struct dump_arg *arg;
+    struct dump_call_arg *c_arg;
 
     port = Qnil;
     rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
+    arg = (struct dump_arg *)xmalloc(sizeof(struct dump_arg));
+    c_arg = (struct dump_call_arg *)xmalloc(sizeof(struct dump_call_arg));
     if (argc == 3) {
 	if (!NIL_P(a2)) limit = NUM2INT(a2);
 	if (NIL_P(a1)) goto type_error;
@@ -914,39 +916,39 @@
 	else if (NIL_P(a1)) goto type_error;
 	else port = a1;
     }
-    arg.dest = 0;
+    arg->dest = 0;
     if (!NIL_P(port)) {
 	if (!rb_obj_respond_to(port, s_write, Qtrue)) {
 	  type_error:
 	    rb_raise(rb_eTypeError, "instance of IO needed");
 	}
-	arg.str = rb_str_buf_new(0);
-	arg.dest = port;
+	GC_WB(&arg->str, rb_str_buf_new(0));
+	GC_WB(&arg->dest, port);
 	if (rb_obj_respond_to(port, s_binmode, Qtrue)) {
 	    rb_funcall2(port, s_binmode, 0, 0);
 	}
     }
     else {
 	port = rb_str_buf_new(0);
-	arg.str = port;
+	GC_WB(&arg->str, port);
     }
 
-    RSTRING_BYTEPTR(arg.str); /* force bytestring creation */
+    RSTRING_BYTEPTR(arg->str); /* force bytestring creation */
 
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.taint   = Qfalse;
-    arg.compat_tbl = st_init_numtable();
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
-    arg.encodings = 0;
-    c_arg.obj   = obj;
-    c_arg.arg   = &arg;
-    c_arg.limit = limit;
+    GC_WB(&arg->symbols, st_init_numtable());
+    GC_WB(&arg->data, st_init_numtable());
+    arg->taint   = Qfalse;
+    GC_WB(&arg->compat_tbl, st_init_numtable());
+    GC_WB(&arg->wrapper, Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, arg));
+    arg->encodings = 0;
+    GC_WB(&c_arg->obj, obj);
+    GC_WB(&c_arg->arg, arg);
+    c_arg->limit = limit;
 
-    w_byte(MARSHAL_MAJOR, &arg);
-    w_byte(MARSHAL_MINOR, &arg);
+    w_byte(MARSHAL_MAJOR, arg);
+    w_byte(MARSHAL_MINOR, arg);
 
-    rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
+    rb_ensure(dump, (VALUE)c_arg, dump_ensure, (VALUE)arg);
 
     return port;
 }
@@ -1241,6 +1243,8 @@
     int type = r_byte(arg);
     long id;
 
+printf("type %c %d\n",(char)type,type);
+
     switch (type) {
       case TYPE_LINK:
 	id = r_long(arg);
@@ -1612,6 +1616,7 @@
 	rb_raise(rb_eArgError, "dump format error(0x%x)", type);
 	break;
     }
+printf("r_object0 -> %p (%s)\n", (void*)v, RSTRING_PTR(rb_inspect(v)));
     return v;
 }
 
@@ -1655,34 +1660,31 @@
     VALUE port, proc;
     int major, minor;
     VALUE v;
-    struct load_arg arg;
+    struct load_arg *arg;
 
+    arg = (struct load_arg *)xmalloc(sizeof(struct load_arg));
     rb_scan_args(argc, argv, "11", &port, &proc);
     v = rb_check_string_type(port);
     if (!NIL_P(v)) {
-	arg.taint = OBJ_TAINTED(port); /* original taintedness */
+	arg->taint = OBJ_TAINTED(port); /* original taintedness */
 	port = v;
     }
     else if (rb_obj_respond_to(port, s_getbyte, Qtrue) && rb_obj_respond_to(port, s_read, Qtrue)) {
 	if (rb_obj_respond_to(port, s_binmode, Qtrue)) {
 	    rb_funcall2(port, s_binmode, 0, 0);
 	}
-	arg.taint = Qtrue;
+	arg->taint = Qtrue;
     }
     else {
 	rb_raise(rb_eTypeError, "instance of IO needed");
     }
-    arg.src = port;
-    arg.offset = 0;
-    arg.compat_tbl = st_init_numtable();
-#if WITH_OBJC
-    arg.compat_tbl_wrapper = Data_Wrap_Struct(rb_cData, NULL, 0, arg.compat_tbl);
-#else
-    arg.compat_tbl_wrapper = Data_Wrap_Struct(rb_cData, rb_mark_tbl, 0, arg.compat_tbl);
-#endif
+    GC_WB(&arg->src, port);
+    arg->offset = 0;
+    GC_WB(&arg->compat_tbl, st_init_numtable());
+    GC_WB(&arg->compat_tbl_wrapper, Data_Wrap_Struct(rb_cData, NULL/*rb_mark_tbl*/, 0, arg->compat_tbl));
 
-    major = r_byte(&arg);
-    minor = r_byte(&arg);
+    major = r_byte(arg);
+    minor = r_byte(arg);
     if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
 	rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
 \tformat version %d.%d required; %d.%d given",
@@ -1694,11 +1696,11 @@
 		MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
     }
 
-    arg.symbols = st_init_numtable();
-    arg.data   = rb_hash_new();
-    if (NIL_P(proc)) arg.proc = 0;
-    else             arg.proc = proc;
-    v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
+    GC_WB(&arg->symbols, st_init_numtable());
+    GC_WB(&arg->data, rb_hash_new());
+    if (NIL_P(proc)) arg->proc = 0;
+    else             arg->proc = proc;
+    v = rb_ensure(load, (VALUE)arg, load_ensure, (VALUE)arg);
 
     return v;
 }
@@ -1764,6 +1766,7 @@
     rb_gc_register_address(&compat_allocator_tbl_wrapper);
     compat_allocator_tbl_wrapper =
 	Data_Wrap_Struct(rb_cData, mark_marshal_compat_t, 0, compat_allocator_tbl);
+    rb_objc_retain((void *)compat_allocator_tbl_wrapper);
 }
 
 VALUE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080908/f5c0d682/attachment-0001.html 


More information about the macruby-changes mailing list