[macruby-changes] [4789] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Oct 11 21:46:22 PDT 2010


Revision: 4789
          http://trac.macosforge.org/projects/ruby/changeset/4789
Author:   lsansonetti at apple.com
Date:     2010-10-11 21:46:19 -0700 (Mon, 11 Oct 2010)
Log Message:
-----------
when creating a binding, keep a reference to the top one

Modified Paths:
--------------
    MacRuby/trunk/compiler.cpp
    MacRuby/trunk/debugger.cpp
    MacRuby/trunk/eval.c
    MacRuby/trunk/proc.c
    MacRuby/trunk/vm.cpp
    MacRuby/trunk/vm.h
    MacRuby/trunk/vm_eval.c

Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/compiler.cpp	2010-10-12 04:46:19 UTC (rev 4789)
@@ -1334,11 +1334,12 @@
 {
     if (pushBindingFunc == NULL) {
 	// void rb_vm_push_binding(VALUE self, rb_vm_block_t *current_block,
-	//			   rb_vm_var_uses **parent_var_uses,
-	//			   int lvars_size, ...);
+	// 	rb_vm_binding_t *top_binding, rb_vm_var_uses **parent_var_uses,
+	//	int lvars_size, ...);
 	std::vector<const Type *> types;
 	types.push_back(RubyObjTy);
 	types.push_back(PtrTy);
+	types.push_back(PtrTy);
 	types.push_back(PtrPtrTy);
 	types.push_back(Int32Ty);
 	FunctionType *ft = FunctionType::get(VoidTy, types, true);
@@ -1350,6 +1351,7 @@
     params.push_back(current_self);
     params.push_back(running_block == NULL
 	    ? compile_const_pointer(NULL) : running_block);
+    params.push_back(compile_const_pointer(rb_vm_current_binding()));
     if (current_var_uses == NULL) {
 	// there is no local variables in this scope
 	params.push_back(compile_const_pointer_to_pointer(NULL));

Modified: MacRuby/trunk/debugger.cpp
===================================================================
--- MacRuby/trunk/debugger.cpp	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/debugger.cpp	2010-10-12 04:46:19 UTC (rev 4789)
@@ -373,7 +373,7 @@
 {
     if (binding == NULL) {
 	if (frame == 0) {
-	    binding = rb_vm_create_binding(self, block, lvars_size, lvars,
+	    binding = rb_vm_create_binding(self, block, NULL, lvars_size, lvars,
 		    false);
 	}
 	else {

Modified: MacRuby/trunk/eval.c
===================================================================
--- MacRuby/trunk/eval.c	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/eval.c	2010-10-12 04:46:19 UTC (rev 4789)
@@ -777,16 +777,15 @@
 static VALUE
 rb_f_local_variables(VALUE rcv, SEL sel)
 {
-    rb_vm_binding_t *binding = rb_vm_current_binding();
-    assert(binding != NULL);
-
+    rb_vm_binding_t *b = rb_vm_current_binding();
     VALUE ary = rb_ary_new();
-    rb_vm_local_t *l;
-   
-    for (l = binding->locals; l != NULL; l = l->next) {
-	rb_ary_push(ary, ID2SYM(l->name));
+    while (b != NULL) {
+	rb_vm_local_t *l;
+	for (l = b->locals; l != NULL; l = l->next) {
+	    rb_ary_push(ary, ID2SYM(l->name));
+	}
+	b = b->next;
     }
-
     return ary;
 }
 

Modified: MacRuby/trunk/proc.c
===================================================================
--- MacRuby/trunk/proc.c	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/proc.c	2010-10-12 04:46:19 UTC (rev 4789)
@@ -230,7 +230,7 @@
     return Data_Wrap_Struct(rb_cBinding, NULL, NULL, bind);
 }
 
-static VALUE
+VALUE
 rb_binding_new_from_binding(rb_vm_binding_t *bind)
 {
     return Data_Wrap_Struct(rb_cBinding, NULL, NULL, bind);

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/vm.cpp	2010-10-12 04:46:19 UTC (rev 4789)
@@ -3093,12 +3093,14 @@
 
 extern "C"
 rb_vm_binding_t *
-rb_vm_create_binding(VALUE self, rb_vm_block_t *current_block, int lvars_size,
-	va_list lvars, bool vm_push)
+rb_vm_create_binding(VALUE self, rb_vm_block_t *current_block,
+	rb_vm_binding_t *top_binding, int lvars_size, va_list lvars,
+	bool vm_push)
 {
     rb_vm_binding_t *binding =
 	(rb_vm_binding_t *)xmalloc(sizeof(rb_vm_binding_t));
     GC_WB(&binding->self, self);
+    GC_WB(&binding->next, top_binding);
 
     rb_vm_local_t **l = &binding->locals;
 
@@ -3126,12 +3128,13 @@
 extern "C"
 void
 rb_vm_push_binding(VALUE self, rb_vm_block_t *current_block,
-	rb_vm_var_uses **parent_var_uses, int lvars_size, ...)
+	rb_vm_binding_t *top_binding, rb_vm_var_uses **parent_var_uses,
+	int lvars_size, ...)
 {
     va_list lvars;
     va_start(lvars, lvars_size);
     rb_vm_binding_t *binding = rb_vm_create_binding(self, current_block,
-	    lvars_size, lvars, true);
+	    top_binding, lvars_size, lvars, true);
     va_end(lvars);
 
     rb_vm_add_binding_lvar_use(binding, current_block, parent_var_uses);
@@ -3731,8 +3734,9 @@
 VALUE *
 RoxorVM::get_binding_lvar(ID name, bool create)
 {
-    if (!bindings.empty()) {
-	rb_vm_binding_t *b = bindings.back();
+    rb_vm_binding_t *current_b = current_binding();
+    rb_vm_binding_t *b = current_b;
+    while (b != NULL) {
 	rb_vm_local_t **l = &b->locals;
 	while (*l != NULL) {
 	    if ((*l)->name == name) {
@@ -3740,13 +3744,19 @@
 	    }
 	    l = &(*l)->next;
 	}
-	if (create) {
-	    GC_WB(l, xmalloc(sizeof(rb_vm_local_t)));
-	    (*l)->name = name;
-	    GC_WB(&(*l)->value, xmalloc(sizeof(VALUE *)));
-	    (*l)->next = NULL;
-	    return (*l)->value;
+	b = b->next;
+    }
+    if (create && current_b != NULL) {
+	rb_vm_binding_t *b = current_b;
+	rb_vm_local_t **l = &b->locals;
+	while (*l != NULL) {
+	    l = &(*l)->next;
 	}
+	GC_WB(l, xmalloc(sizeof(rb_vm_local_t)));
+	(*l)->name = name;
+	GC_WB(&(*l)->value, xmalloc(sizeof(VALUE *)));
+	(*l)->next = NULL;
+	return (*l)->value;
     }
     return NULL;
 }

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/vm.h	2010-10-12 04:46:19 UTC (rev 4789)
@@ -56,10 +56,11 @@
     VALUE *dvars[1];
 } rb_vm_block_t;
 
-typedef struct {
+typedef struct rb_vm_binding {
     VALUE self;
     rb_vm_block_t *block;
     rb_vm_local_t *locals;
+    struct rb_vm_binding *next;
 } rb_vm_binding_t;
 
 #define VM_METHOD_EMPTY		1 // method has an empty body (compilation)
@@ -438,10 +439,12 @@
 }
 
 rb_vm_binding_t *rb_vm_create_binding(VALUE self, rb_vm_block_t *current_block,
-	int lvars_size, va_list lvars, bool vm_push);
+	rb_vm_binding_t *top_binding, int lvars_size, va_list lvars,
+	bool vm_push);
 rb_vm_binding_t *rb_vm_current_binding(void);
 void rb_vm_add_binding(rb_vm_binding_t *binding);
 void rb_vm_pop_binding();
+VALUE rb_binding_new_from_binding(rb_vm_binding_t *binding);
 
 void rb_vm_thread_pre_init(rb_vm_thread_t *t, rb_vm_block_t *body, int argc,
 	const VALUE *argv, void *vm);

Modified: MacRuby/trunk/vm_eval.c
===================================================================
--- MacRuby/trunk/vm_eval.c	2010-10-12 01:05:37 UTC (rev 4788)
+++ MacRuby/trunk/vm_eval.c	2010-10-12 04:46:19 UTC (rev 4789)
@@ -340,6 +340,8 @@
 #endif
 }
 
+#define GetBindingPtr(obj) ((rb_vm_binding_t *)DATA_PTR(obj))
+
 static VALUE
 eval_string(VALUE self, VALUE klass, VALUE src, VALUE scope, const char *file,
 	    const int line)
@@ -350,7 +352,7 @@
 	    rb_raise(rb_eTypeError, "wrong argument type %s (expected Binding)",
 		     rb_obj_classname(scope));
 	}
-	binding = (rb_vm_binding_t *)DATA_PTR(scope);
+	binding = GetBindingPtr(scope);
     }
     return rb_vm_eval_string(self, klass, src, binding, file, line);
 }
@@ -461,6 +463,16 @@
 	    klass = 0;
 	    break;
     }
+#if 0
+    if (!NIL_P(scope)) {
+	rb_vm_binding_t *t = rb_vm_current_binding();
+	assert(t != NULL);
+	rb_vm_binding_t *tmp = rb_vm_create_binding(t->self,
+		t->block, GetBindingPtr(scope), 0, NULL, false);
+	GC_WB(&tmp->locals, t->locals);
+	scope = rb_binding_new_from_binding(tmp);
+    }
+#endif
     return eval_string(self, klass, src, scope, file, line);
 }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101011/7765c8ec/attachment.html>


More information about the macruby-changes mailing list