[macruby-changes] [1527] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sun May 3 23:04:21 PDT 2009
Revision: 1527
http://trac.macosforge.org/projects/ruby/changeset/1527
Author: vincent.isambart at gmail.com
Date: 2009-05-03 23:04:19 -0700 (Sun, 03 May 2009)
Log Message:
-----------
move the VM code that I put in proc.c back in the VM
Modified Paths:
--------------
MacRuby/branches/experimental/proc.c
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
MacRuby/branches/experimental/test_vm/block.rb
Modified: MacRuby/branches/experimental/proc.c
===================================================================
--- MacRuby/branches/experimental/proc.c 2009-05-04 01:43:31 UTC (rev 1526)
+++ MacRuby/branches/experimental/proc.c 2009-05-04 06:04:19 UTC (rev 1527)
@@ -34,8 +34,6 @@
return obj;
}
-void rb_gc_assign_weak_ref(const void *value, void *const*location);
-
VALUE
rb_proc_alloc_with_block(VALUE klass, rb_vm_block_t *proc)
{
@@ -43,17 +41,8 @@
obj = Data_Wrap_Struct(klass, NULL, NULL, proc);
if (!(proc->flags & VM_BLOCK_PROC)) {
proc->flags |= VM_BLOCK_PROC;
- if (proc->parent_lvar_uses != NULL) {
- rb_vm_lvar_uses_t** parent_lvar_uses = proc->parent_lvar_uses;
- if ((*parent_lvar_uses == NULL) || ((*parent_lvar_uses)->uses_count == VM_LVAR_USES_SIZE)) {
- rb_vm_lvar_uses_t* new_uses = malloc(sizeof(rb_vm_lvar_uses_t));
- new_uses->next = *parent_lvar_uses;
- new_uses->uses_count = 0;
- *parent_lvar_uses = new_uses;
- }
- int current_index = (*parent_lvar_uses)->uses_count;
- rb_gc_assign_weak_ref(proc, &(*parent_lvar_uses)->uses[current_index]);
- ++(*parent_lvar_uses)->uses_count;
+ if (proc->parent_var_uses != NULL) {
+ rb_vm_add_var_use(proc->parent_var_uses, proc);
}
}
return obj;
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-05-04 01:43:31 UTC (rev 1526)
+++ MacRuby/branches/experimental/roxor.cpp 2009-05-04 06:04:19 UTC (rev 1527)
@@ -230,7 +230,7 @@
ID self_id;
Value *current_self;
bool current_block;
- Value *current_lvar_uses;
+ Value *current_var_uses;
BasicBlock *begin_bb;
BasicBlock *rescue_bb;
BasicBlock *ensure_bb;
@@ -676,7 +676,7 @@
current_instance_method = false;
self_id = rb_intern("self");
current_self = NULL;
- current_lvar_uses = NULL;
+ current_var_uses = NULL;
current_block = false;
current_block_node = NULL;
current_block_func = NULL;
@@ -1244,7 +1244,7 @@
if (prepareBlockFunc == NULL) {
// void *rb_vm_prepare_block(Function *func, NODE *node, VALUE self,
- // rb_vm_lvar_uses_t **parent_lvar_uses,
+ // rb_vm_var_uses **parent_var_uses,
// int dvars_size, ...);
std::vector<const Type *> types;
types.push_back(PtrTy);
@@ -1261,11 +1261,12 @@
params.push_back(compile_const_pointer(current_block_func));
params.push_back(compile_const_pointer(current_block_node));
params.push_back(current_self);
- if (current_lvar_uses == NULL) {
+ if (current_var_uses == NULL) {
+ // there is no local variables in this scope
params.push_back(compile_const_pointer_to_pointer(NULL));
}
else {
- params.push_back(current_lvar_uses);
+ params.push_back(current_var_uses);
}
// Dvars.
@@ -3023,19 +3024,19 @@
Value *sel = arg++;
sel->setName("sel");
+ Value *old_current_var_uses = current_var_uses;
+
if (has_dvars) {
Value *dvars_arg = arg++;
dvars_arg->setName("dvars");
}
- Value *old_current_lvar_uses = current_lvar_uses;
-
if (node->nd_tbl == NULL) {
- current_lvar_uses = NULL;
+ current_var_uses = NULL;
}
else {
- current_lvar_uses = new AllocaInst(PtrTy, "", bb);
- new StoreInst(compile_const_pointer(NULL), current_lvar_uses, bb);
+ current_var_uses = new AllocaInst(PtrTy, "", bb);
+ new StoreInst(compile_const_pointer(NULL), current_var_uses, bb);
int i, args_count = (int)node->nd_tbl[0];
assert(args_count == nargs
@@ -3144,9 +3145,9 @@
// current_lvar_uses has 2 uses or more if it is really used
// (there is always a StoreInst in which we assign it NULL)
- if (current_lvar_uses != NULL && current_lvar_uses->hasNUsesOrMore(2)) {
+ if (current_var_uses != NULL && current_var_uses->hasNUsesOrMore(2)) {
if (keepVarsFunc == NULL) {
- // void rb_vm_keep_vars(rb_vm_lvar_uses_t *uses, int lvars_size, ...);
+ // void rb_vm_keep_vars(rb_vm_var_uses *uses, int lvars_size, ...)
std::vector<const Type *> types;
types.push_back(PtrTy);
types.push_back(Type::Int32Ty);
@@ -3179,8 +3180,9 @@
if (dyn_cast<ReturnInst>(inst_it)) {
// LoadInst needs to be inserted in a BasicBlock
// so we has to wait before putting it in params
- params[0] = new LoadInst(current_lvar_uses, "", inst_it);
- // TODO: only call the function is current_use is not NULL
+ params[0] = new LoadInst(current_var_uses, "", inst_it);
+
+ // TODO: only call the function if current_use is not NULL
CallInst::Create(keepVarsFunc, params.begin(), params.end(), "", inst_it);
}
}
@@ -3192,7 +3194,7 @@
lvars = old_lvars;
current_self = old_self;
rescue_bb = old_rescue_bb;
- current_lvar_uses = old_current_lvar_uses;
+ current_var_uses = old_current_var_uses;
return cast<Value>(f);
}
@@ -7048,7 +7050,8 @@
__attribute__((always_inline))
static VALUE
-__rb_vm_bcall(VALUE self, VALUE dvars, IMP pimp, const rb_vm_arity_t &arity, int argc, const VALUE *argv)
+__rb_vm_bcall(VALUE self, VALUE dvars,
+ IMP pimp, const rb_vm_arity_t &arity, int argc, const VALUE *argv)
{
if ((arity.real != argc) || (arity.max == -1)) {
VALUE *new_argv = (VALUE *)alloca(sizeof(VALUE) * arity.real);
@@ -7914,7 +7917,8 @@
extern "C"
rb_vm_block_t *
-rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self, rb_vm_lvar_uses_t **parent_lvar_uses,
+rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self,
+ rb_vm_var_uses **parent_var_uses,
int dvars_size, ...)
{
NODE *cache_key;
@@ -7949,7 +7953,7 @@
}
b->flags = 0;
b->dvars_size = dvars_size;
- b->parent_lvar_uses = NULL;
+ b->parent_var_uses = NULL;
rb_objc_retain(b);
GET_VM()->blocks[cache_key] = b;
@@ -7962,7 +7966,7 @@
b->self = self;
b->node = node;
- b->parent_lvar_uses = parent_lvar_uses;
+ b->parent_var_uses = parent_var_uses;
va_list ar;
va_start(ar, dvars_size);
@@ -7995,6 +7999,33 @@
void*
rb_gc_read_weak_ref(void **referrer);
+extern "C"
+void
+rb_gc_assign_weak_ref(const void *value, void *const*location);
+
+static const int VM_LVAR_USES_SIZE = 8;
+struct rb_vm_var_uses {
+ int uses_count;
+ void *uses[VM_LVAR_USES_SIZE];
+ struct rb_vm_var_uses *next;
+};
+
+extern "C"
+void
+rb_vm_add_var_use(rb_vm_var_uses **var_uses, rb_vm_block_t *proc)
+{
+ assert(var_uses != NULL);
+ if ((*var_uses == NULL) || ((*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;
+ new_uses->uses_count = 0;
+ *var_uses = new_uses;
+ }
+ int current_index = (*var_uses)->uses_count;
+ rb_gc_assign_weak_ref(proc, &(*var_uses)->uses[current_index]);
+ ++(*var_uses)->uses_count;
+}
+
struct rb_vm_kept_local {
ID name;
VALUE *stack_address;
@@ -8003,9 +8034,9 @@
extern "C"
void
-rb_vm_keep_vars(rb_vm_lvar_uses_t *uses, int lvars_size, ...)
+rb_vm_keep_vars(rb_vm_var_uses *uses, int lvars_size, ...)
{
- rb_vm_lvar_uses_t *current = uses;
+ rb_vm_var_uses *current = uses;
int use_index;
while (current != NULL) {
@@ -8307,8 +8338,8 @@
assert(!(b->flags & VM_BLOCK_ACTIVE));
b->flags |= VM_BLOCK_ACTIVE;
- VALUE v = __rb_vm_bcall(b->self, (VALUE)b->dvars, b->imp, b->arity, argc,
- argv);
+ VALUE v = __rb_vm_bcall(b->self, (VALUE)b->dvars,
+ b->imp, b->arity, argc, argv);
b->flags &= ~VM_BLOCK_ACTIVE;
return v;
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-05-04 01:43:31 UTC (rev 1526)
+++ MacRuby/branches/experimental/roxor.h 2009-05-04 06:04:19 UTC (rev 1527)
@@ -19,13 +19,6 @@
};
typedef struct rb_vm_local rb_vm_local_t;
-#define VM_LVAR_USES_SIZE 8
-typedef struct rb_vm_lvar_uses {
- int uses_count;
- void *uses[VM_LVAR_USES_SIZE];
- struct rb_vm_lvar_uses *next;
-} rb_vm_lvar_uses_t;
-
#define VM_BLOCK_PROC 0x0001 // block is a Proc object
#define VM_BLOCK_LAMBDA 0x0002 // block is a lambda
#define VM_BLOCK_ACTIVE 0x0004 // block is active (being executed)
@@ -37,7 +30,7 @@
IMP imp;
int flags;
rb_vm_local_t *locals;
- rb_vm_lvar_uses_t **parent_lvar_uses;
+ struct rb_vm_var_uses **parent_var_uses;
int dvars_size;
VALUE *dvars[1];
} rb_vm_block_t;
@@ -147,8 +140,10 @@
return (rb_vm_block_t *)DATA_PTR(proc);
}
+void rb_vm_add_var_use(struct rb_vm_var_uses **uses, rb_vm_block_t *proc);
rb_vm_block_t *rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self,
- rb_vm_lvar_uses_t **parent_lvar_uses, int dvars_size, ...);
+ struct rb_vm_var_uses **parent_lvar_uses,
+ int dvars_size, ...);
rb_vm_block_t *rb_vm_current_block(void);
bool rb_vm_block_saved(void);
void rb_vm_change_current_block(rb_vm_block_t *block);
Modified: MacRuby/branches/experimental/test_vm/block.rb
===================================================================
--- MacRuby/branches/experimental/test_vm/block.rb 2009-05-04 01:43:31 UTC (rev 1526)
+++ MacRuby/branches/experimental/test_vm/block.rb 2009-05-04 06:04:19 UTC (rev 1527)
@@ -206,7 +206,22 @@
assert "42", %{
def f()
+ x = 40
a = nil
+ 1.times do
+ 1.times do
+ y = 2
+ a = proc { x + y }
+ end
+ end
+ a
+ end
+ p f.call
+}
+
+assert "42", %{
+ def f()
+ a = nil
b = proc do
x = 42
a = proc { x }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090503/fc766901/attachment-0001.html>
More information about the macruby-changes
mailing list