[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(¤t->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(¤t->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 **)¤t->uses[use_index]);
}
+
+ // indicate to the GC that we do not have a reference here anymore
+ GC_WB(¤t->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