[macruby-changes] [2871] MacRuby/trunk/struct.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Oct 20 17:18:16 PDT 2009


Revision: 2871
          http://trac.macosforge.org/projects/ruby/changeset/2871
Author:   lsansonetti at apple.com
Date:     2009-10-20 17:18:15 -0700 (Tue, 20 Oct 2009)
Log Message:
-----------
adding missing write barriers

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

Modified: MacRuby/trunk/struct.c
===================================================================
--- MacRuby/trunk/struct.c	2009-10-21 00:17:32 UTC (rev 2870)
+++ MacRuby/trunk/struct.c	2009-10-21 00:18:15 UTC (rev 2871)
@@ -171,7 +171,8 @@
     for (i=0; i<RARRAY_LEN(members); i++) {
 	slot = RARRAY_AT(members, i);
 	if (SYM2ID(slot) == field) {
-	    return RSTRUCT_PTR(obj)[i] = val;
+	    GC_WB(&RSTRUCT_PTR(obj)[i], val);
+	    return val;
 	}
     }
     rb_name_error(rb_frame_this_func(), "`%s' is not a struct member",
@@ -375,10 +376,13 @@
     if (n < RARRAY_LEN(values)) {
 	rb_raise(rb_eArgError, "struct size differs");
     }
-    MEMCPY(RSTRUCT_PTR(self), RARRAY_PTR(values), VALUE, RARRAY_LEN(values));
+    for (int i = 0; i < RARRAY_LEN(values); i++) {
+	GC_WB(&RSTRUCT_PTR(self)[i], RARRAY_AT(values, i));
+    }
     if (n > RARRAY_LEN(values)) {
-	rb_mem_clear(RSTRUCT_PTR(self)+RARRAY_LEN(values),
-		     n-RARRAY_LEN(values));
+	for (int i = RARRAY_LEN(values); i < n; i++) {
+	    RSTRUCT_PTR(self)[i] = Qnil;
+	}
     }
     return Qnil;
 }
@@ -583,7 +587,9 @@
     if (RSTRUCT_LEN(copy) != RSTRUCT_LEN(s)) {
 	rb_raise(rb_eTypeError, "struct size mismatch");
     }
-    MEMCPY(RSTRUCT_PTR(copy), RSTRUCT_PTR(s), VALUE, RSTRUCT_LEN(copy));
+    for (int i = 0; i < RSTRUCT_LEN(copy); i++) {
+	GC_WB(&RSTRUCT_PTR(copy)[i], RSTRUCT_PTR(s)[i]);
+    }
 
     return copy;
 }
@@ -665,7 +671,7 @@
     }
     for (i=0; i<len; i++) {
 	if (SYM2ID(RARRAY_AT(members, i)) == id) {
-	    RSTRUCT_PTR(s)[i] = val;
+	    GC_WB(&RSTRUCT_PTR(s)[i], val);
 	    return val;
 	}
     }
@@ -713,7 +719,8 @@
 		 i, RSTRUCT_LEN(s));
     }
     rb_struct_modify(s);
-    return RSTRUCT_PTR(s)[i] = val;
+    GC_WB(&RSTRUCT_PTR(s)[i], val);
+    return val;
 }
 
 VALUE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091020/d990aaf9/attachment.html>


More information about the macruby-changes mailing list