[macruby-changes] [4533] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 21 18:00:10 PDT 2010


Revision: 4533
          http://trac.macosforge.org/projects/ruby/changeset/4533
Author:   lsansonetti at apple.com
Date:     2010-09-21 18:00:06 -0700 (Tue, 21 Sep 2010)
Log Message:
-----------
issue write barriers when storing objects into Binding slots (this should fix most of the macirb crashers)

Modified Paths:
--------------
    MacRuby/trunk/compiler.cpp
    MacRuby/trunk/compiler.h
    MacRuby/trunk/kernel.c

Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp	2010-09-20 23:04:00 UTC (rev 4532)
+++ MacRuby/trunk/compiler.cpp	2010-09-22 01:00:06 UTC (rev 4533)
@@ -154,6 +154,7 @@
 
     reset_compiler_state();
 
+    writeBarrierFunc = get_function("vm_gc_wb");
     dispatchFunc = get_function("vm_dispatch");
     fastPlusFunc = get_function("vm_fast_plus");
     fastMinusFunc = get_function("vm_fast_minus");
@@ -6108,7 +6109,7 @@
 }
 
 Value *
-RoxorCompiler::compile_lvar_slot(ID name)
+RoxorCompiler::compile_lvar_slot(ID name, bool *need_wb)
 {
     std::map<ID, Value *>::iterator iter = lvars.find(name);
     if (iter != lvars.end()) {
@@ -6123,6 +6124,9 @@
 	printf("get_binding_lvar %s (%p)\n", rb_id2name(name), *(void **)var);
 #endif
 	Value *int_val = ConstantInt::get(IntTy, (long)var);
+	if (need_wb != NULL) {
+	    *need_wb = true;
+	}
 	return new IntToPtrInst(int_val, RubyObjPtrTy, "", bb);
     }
     assert(current_block);
@@ -6135,6 +6139,12 @@
 }
 
 Value *
+RoxorCompiler::compile_lvar_slot(ID name)
+{
+    return compile_lvar_slot(name, NULL);
+}
+
+Value *
 RoxorCompiler::compile_dvar_assignment(ID vid, Value *val)
 {
     if (running_block != NULL) {
@@ -6162,14 +6172,21 @@
 
 	bb = merge_bb;
     }
-
     return compile_lvar_assignment(vid, val);
 }
 
 Value *
 RoxorCompiler::compile_lvar_assignment(ID vid, Value *val)
 {
-    new StoreInst(val, compile_lvar_slot(vid), bb);
+    bool need_wb = false;
+    Value *slot = compile_lvar_slot(vid, &need_wb);
+    if (need_wb) {
+	Value *args[] = { slot, val };
+	return CallInst::Create(writeBarrierFunc, args, args + 2, "", bb);
+    }
+    else {
+	new StoreInst(val, slot, bb);
+    }
     return val;
 }
 

Modified: MacRuby/trunk/compiler.h
===================================================================
--- MacRuby/trunk/compiler.h	2010-09-20 23:04:00 UTC (rev 4532)
+++ MacRuby/trunk/compiler.h	2010-09-22 01:00:06 UTC (rev 4533)
@@ -141,6 +141,7 @@
 	bool block_declaration;
 	AllocaInst *dispatch_argv;
 
+	Function *writeBarrierFunc;
 	Function *dispatchFunc;
 	Function *fastPlusFunc;
 	Function *fastMinusFunc;
@@ -411,6 +412,7 @@
 	void compile_rethrow_exception(void);
 	void compile_pop_exception(int pos=0);
 	Value *compile_lvar_slot(ID name);
+	Value *compile_lvar_slot(ID name, bool *need_wb);
 	bool compile_lvars(ID *tbl);
 	Value *compile_new_struct(Value *klass, std::vector<Value *> &fields);
 	Value *compile_new_opaque(Value *klass, Value *val);

Modified: MacRuby/trunk/kernel.c
===================================================================
--- MacRuby/trunk/kernel.c	2010-09-20 23:04:00 UTC (rev 4532)
+++ MacRuby/trunk/kernel.c	2010-09-22 01:00:06 UTC (rev 4533)
@@ -25,6 +25,13 @@
 #endif
 
 PRIMITIVE VALUE
+vm_gc_wb(void *slot, void *val)
+{
+    GC_WB(slot, val);
+    return (VALUE)val;
+}
+
+PRIMITIVE VALUE
 vm_ivar_get(VALUE obj, ID name, void *cache_p)
 {
     struct icache *cache = (struct icache *)cache_p;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100921/970954ed/attachment.html>


More information about the macruby-changes mailing list