[macruby-changes] [4206] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 4 19:46:06 PDT 2010


Revision: 4206
          http://trac.macosforge.org/projects/ruby/changeset/4206
Author:   vincent.isambart at gmail.com
Date:     2010-06-04 19:46:02 -0700 (Fri, 04 Jun 2010)
Log Message:
-----------
Laurent does not want weak refs anymore

Modified Paths:
--------------
    MacRuby/trunk/gc.c
    MacRuby/trunk/include/ruby/ruby.h
    MacRuby/trunk/vm.cpp

Modified: MacRuby/trunk/gc.c
===================================================================
--- MacRuby/trunk/gc.c	2010-06-05 01:00:26 UTC (rev 4205)
+++ MacRuby/trunk/gc.c	2010-06-05 02:46:02 UTC (rev 4206)
@@ -258,18 +258,6 @@
 
 VALUE rb_mGC;
 
-void
-rb_gc_assign_weak_ref(const void *value, const void **location)
-{
-    auto_assign_weak_reference(__auto_zone, value, location, NULL);
-}
-
-void*
-rb_gc_read_weak_ref(void **referrer)
-{
-    return auto_read_weak_reference(__auto_zone, referrer);
-}
-
 void *
 rb_gc_memmove(void *dst, const void *src, size_t len)
 {

Modified: MacRuby/trunk/include/ruby/ruby.h
===================================================================
--- MacRuby/trunk/include/ruby/ruby.h	2010-06-05 01:00:26 UTC (rev 4205)
+++ MacRuby/trunk/include/ruby/ruby.h	2010-06-05 02:46:02 UTC (rev 4206)
@@ -1117,9 +1117,6 @@
 }
 #define GC_RELEASE(obj) (rb_objc_release((void *)obj))
 
-void *rb_gc_read_weak_ref(void **referrer);
-void rb_gc_assign_weak_ref(const void *value, const void **location);
-
 #if RUBY_INCLUDED_AS_FRAMEWORK
 #include <MacRuby/ruby/missing.h>
 #include <MacRuby/ruby/intern.h>

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2010-06-05 01:00:26 UTC (rev 4205)
+++ MacRuby/trunk/vm.cpp	2010-06-05 02:46:02 UTC (rev 4206)
@@ -2786,14 +2786,15 @@
 	|| ((*var_uses)->uses_count == VM_LVAR_USES_SIZE)) {
 
 	rb_vm_var_uses *new_uses =
-	    (rb_vm_var_uses *)malloc(sizeof(rb_vm_var_uses));
-	new_uses->next = *var_uses;
+	    (rb_vm_var_uses *)xmalloc(sizeof(rb_vm_var_uses));
 	new_uses->uses_count = 0;
+	GC_WB(&new_uses->next, *var_uses);
+	// var_uses should be on the stack so no need for GC_WB
 	*var_uses = new_uses;
     }
 
     const int current_index = (*var_uses)->uses_count;
-    rb_gc_assign_weak_ref(use, (const void **)&(*var_uses)->uses[current_index]);
+    GC_WB(&(*var_uses)->uses[current_index], use);
     (*var_uses)->use_types[current_index] = use_type;
     ++(*var_uses)->uses_count;
 }
@@ -2836,23 +2837,12 @@
 rb_vm_keep_vars(rb_vm_var_uses *uses, int lvars_size, ...)
 {
     rb_vm_var_uses *current = uses;
-    int use_index;
 
-    while (current != NULL) {
-	for (use_index = 0; use_index < current->uses_count; ++use_index) {
-	    if (rb_gc_read_weak_ref(&current->uses[use_index]) != NULL) {
-		goto use_found;
-	    }
-	}
-
-	void *old_current = current;
-	current = current->next;
-	free(old_current);
+    if ((current == NULL) || (current->uses_count == 0)) {
+	// there's no use alive so nothing to do
+	return;
     }
-    // there's no use alive anymore so nothing to do
-    return;
 
-use_found:
     rb_vm_kept_local *locals = (rb_vm_kept_local *)xmalloc(
 	    sizeof(rb_vm_kept_local)*lvars_size);
 
@@ -2867,50 +2857,45 @@
     va_end(ar);
 
     while (current != NULL) {
-	for (; use_index < current->uses_count; ++use_index) {
-	    void *use = rb_gc_read_weak_ref(&current->uses[use_index]);
-	    if (use != NULL) {
-		unsigned char type = current->use_types[use_index];
-		rb_vm_local_t *locals_to_replace;
-		if (type == VM_LVAR_USE_TYPE_BLOCK) {
-		    rb_vm_block_t *block = (rb_vm_block_t *)use;
-		    for (int dvar_index = 0; dvar_index < block->dvars_size; ++dvar_index) {
-			for (int lvar_index = 0; lvar_index < lvars_size; ++lvar_index) {
-			    if (block->dvars[dvar_index] == locals[lvar_index].stack_address) {
-				GC_WB(&block->dvars[dvar_index], locals[lvar_index].new_address);
-				break;
-			    }
+	for (int use_index = 0; use_index < current->uses_count; ++use_index) {
+	    void *use = current->uses[use_index];
+	    unsigned char type = current->use_types[use_index];
+	    rb_vm_local_t *locals_to_replace;
+	    if (type == VM_LVAR_USE_TYPE_BLOCK) {
+		rb_vm_block_t *block = (rb_vm_block_t *)use;
+		for (int dvar_index = 0; dvar_index < block->dvars_size; ++dvar_index) {
+		    for (int lvar_index = 0; lvar_index < lvars_size; ++lvar_index) {
+			if (block->dvars[dvar_index] == locals[lvar_index].stack_address) {
+			    GC_WB(&block->dvars[dvar_index], locals[lvar_index].new_address);
+			    break;
 			}
 		    }
+		}
 
-		    // the parent pointers can't be used anymore
-		    block->parent_block = NULL;
-		    block->parent_var_uses = NULL;
+		// the parent pointers can't be used anymore
+		block->parent_block = NULL;
+		block->parent_var_uses = NULL;
 
-		    locals_to_replace = block->locals;
-		}
-		else { // VM_LVAR_USE_TYPE_BINDING
-		    rb_vm_binding_t *binding = (rb_vm_binding_t *)use;
-		    locals_to_replace = binding->locals;
-		}
+		locals_to_replace = block->locals;
+	    }
+	    else { // VM_LVAR_USE_TYPE_BINDING
+		rb_vm_binding_t *binding = (rb_vm_binding_t *)use;
+		locals_to_replace = binding->locals;
+	    }
 
-		for (rb_vm_local_t *l = locals_to_replace; l != NULL; l = l->next) {
-		    for (int lvar_index = 0; lvar_index < lvars_size; ++lvar_index) {
-			if (l->value == locals[lvar_index].stack_address) {
-			    GC_WB(&l->value, locals[lvar_index].new_address);
-			    break;
-			}
+	    for (rb_vm_local_t *l = locals_to_replace; l != NULL; l = l->next) {
+		for (int lvar_index = 0; lvar_index < lvars_size; ++lvar_index) {
+		    if (l->value == locals[lvar_index].stack_address) {
+			GC_WB(&l->value, locals[lvar_index].new_address);
+			break;
 		    }
 		}
-
-		// indicate to the GC that we do not have a reference here anymore
-		rb_gc_assign_weak_ref(NULL, (const void **)&current->uses[use_index]);
 	    }
+
+	    // indicate to the GC that we do not have a reference here anymore
+	    GC_WB(&current->uses[use_index], NULL);
 	}
-	void *old_current = current;
 	current = current->next;
-	use_index = 0;
-	free(old_current);
     }
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100604/4ebde16c/attachment.html>


More information about the macruby-changes mailing list