[macruby-changes] [1520] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sat May 2 21:24:14 PDT 2009
Revision: 1520
http://trac.macosforge.org/projects/ruby/changeset/1520
Author: vincent.isambart at gmail.com
Date: 2009-05-02 21:24:14 -0700 (Sat, 02 May 2009)
Log Message:
-----------
now check if we have to save the local variables on all returns
Modified Paths:
--------------
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-05-03 04:09:05 UTC (rev 1519)
+++ MacRuby/branches/experimental/roxor.cpp 2009-05-03 04:24:14 UTC (rev 1520)
@@ -3140,10 +3140,11 @@
val = nilVal;
}
+ ReturnInst::Create(val, bb);
+
// 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)) {
- // TODO: only call the function is current_use is not NULL
if (keepVarsFunc == NULL) {
// void rb_vm_keep_vars(rb_vm_lvar_uses_t *uses, int lvars_size, ...);
std::vector<const Type *> types;
@@ -3156,7 +3157,7 @@
std::vector<Value *> params;
- params.push_back(new LoadInst(current_lvar_uses, "", bb));
+ params.push_back(NULL); // will be filled later
params.push_back(ConstantInt::get(Type::Int32Ty, (int)lvars.size()));
for (std::map<ID, Value *>::iterator iter = lvars.begin();
@@ -3169,11 +3170,23 @@
}
}
- CallInst::Create(keepVarsFunc, params.begin(), params.end(), "", bb);
+ // searches all ReturnInst in the function we just created and add before
+ // a call to the function to save the local variables if necessary
+ // (we can't do this before finishing compiling the whole function
+ // because we can't be sure if a block is there or not before)
+ for (Function::iterator block_it = f->begin(); block_it != f->end(); ++block_it) {
+ for (BasicBlock::iterator inst_it = block_it->begin(); inst_it != block_it->end(); ++inst_it) {
+ 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
+ CallInst::Create(keepVarsFunc, params.begin(), params.end(), "", inst_it);
+ }
+ }
+ }
}
- ReturnInst::Create(val, bb);
-
bb = old_bb;
entry_bb = old_entry_bb;
lvars = old_lvars;
@@ -8006,7 +8019,7 @@
current = current->next;
free(old_current);
}
- // no use still alive so nothing to do
+ // there's no use alive anymore so nothing to do
return;
use_found:
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-05-03 04:09:05 UTC (rev 1519)
+++ MacRuby/branches/experimental/roxor.h 2009-05-03 04:24:14 UTC (rev 1520)
@@ -19,7 +19,7 @@
};
typedef struct rb_vm_local rb_vm_local_t;
-#define VM_LVAR_USES_SIZE 128
+#define VM_LVAR_USES_SIZE 8
typedef struct rb_vm_lvar_uses {
int uses_count;
void *uses[VM_LVAR_USES_SIZE];
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090502/0584c3eb/attachment.html>
More information about the macruby-changes
mailing list