[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