Do a quick scan of the global code.
authorRoberto Raggi <roberto.raggi@nokia.com>
Mon, 14 May 2012 08:50:13 +0000 (10:50 +0200)
committerRoberto Raggi <roberto.raggi@nokia.com>
Mon, 14 May 2012 08:50:13 +0000 (10:50 +0200)
qv4codegen.cpp
qv4ir_p.h
qv4isel.cpp

index 221ab5e..9fdf592 100644 (file)
@@ -241,10 +241,13 @@ void Codegen::operator()(AST::Program *node, IR::Module *module)
 {
     _module = module;
 
+    ScanFunctionBody globalCodeInfo;
+    globalCodeInfo(node);
+
     IR::Function *globalCode = _module->newFunction(QLatin1String("%entry"));
-    globalCode->hasDirectEval = true; // ### remove
-    globalCode->hasNestedFunctions = true; // ### remove
-    globalCode->redArea = 10; // ### remove
+    globalCode->hasDirectEval = globalCodeInfo.hasDirectEval;
+    globalCode->hasNestedFunctions = true; // ### FIXME: initialize it with globalCodeInfo.hasNestedFunctions;
+    globalCode->maxNumberOfArguments = globalCodeInfo.maxNumberOfArguments;
     _function = globalCode;
     _block = _function->newBasicBlock();
     _exitBlock = _function->newBasicBlock();
@@ -1339,7 +1342,7 @@ void Codegen::defineFunction(FunctionExpression *ast, bool /*isDeclaration*/)
     IR::BasicBlock *entryBlock = function->newBasicBlock();
     IR::BasicBlock *exitBlock = function->newBasicBlock();
     function->hasDirectEval = functionInfo.hasDirectEval;
-    function->redArea = functionInfo.maxNumberOfArguments;
+    function->maxNumberOfArguments = functionInfo.maxNumberOfArguments;
 
     if (! functionInfo.hasDirectEval) {
         for (int i = 0; i < functionInfo.locals.size(); ++i) {
index 57fe54b..0476263 100644 (file)
--- a/qv4ir_p.h
+++ b/qv4ir_p.h
@@ -587,7 +587,7 @@ struct Function {
     const QString *name;
     QVector<BasicBlock *> basicBlocks;
     int tempCount;
-    int redArea;
+    int maxNumberOfArguments;
     QSet<QString> strings;
     QList<const QString *> formals;
     QList<const QString *> locals;
@@ -601,7 +601,7 @@ struct Function {
         : module(module)
         , pool(&module->pool)
         , tempCount(0)
-        , redArea(0)
+        , maxNumberOfArguments(0)
         , code(0)
         , hasDirectEval(false)
         , hasNestedFunctions(false)
index c53741b..c0c88c3 100644 (file)
@@ -101,7 +101,7 @@ void InstructionSelection::operator()(IR::Function *function)
     function->code = (void (*)(VM::Context *)) _code;
     _codePtr = _code;
 
-    int locals = (function->tempCount + function->redArea) * sizeof(Value);
+    int locals = (function->tempCount + function->maxNumberOfArguments) * sizeof(Value);
     locals = (locals + 15) & ~15;
 
     amd64_push_reg(_codePtr, AMD64_RBP);