Merge IR::Module and IR::Function.
authorRoberto Raggi <roberto.raggi@nokia.com>
Mon, 25 Jul 2011 06:31:21 +0000 (08:31 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 30 Aug 2011 11:18:28 +0000 (13:18 +0200)
V4 compiles one function at time. There is no reson to keep
IR::Module and IR::Function as separate classes.

Change-Id: Ia6bf971d0d499b14847c3ca725f9cdf5c7e3916c
Reviewed-on: http://codereview.qt.nokia.com/3784
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>

src/declarative/qml/v4/qdeclarativev4compiler.cpp
src/declarative/qml/v4/qdeclarativev4ir.cpp
src/declarative/qml/v4/qdeclarativev4ir_p.h
src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
src/declarative/qml/v4/qdeclarativev4irbuilder_p.h

index c77a737..9d7c9f7 100644 (file)
@@ -91,7 +91,7 @@ void QDeclarativeV4CompilerPrivate::trace(int line, int column)
         if (IR::Stmt *terminator = block->terminator()) {
             if (IR::CJump *cj = terminator->asCJump()) {
                 if (cj->iffalse != next) {
-                    IR::Jump *jump = _function->module->pool->New<IR::Jump>();
+                    IR::Jump *jump = _function->pool->New<IR::Jump>();
                     jump->init(cj->iffalse);
                     block->statements.append(jump);
                 }
@@ -1038,11 +1038,10 @@ bool QDeclarativeV4CompilerPrivate::compile(QDeclarativeJS::AST::Node *node)
         return false;
     }
 
-    IR::Module module(&pool);
-    IR::Function *function = 0;
+    IR::Function thisFunction(&pool), *function = &thisFunction;
 
     QDeclarativeV4IRBuilder irBuilder(expression, engine);
-    if (!(function = irBuilder(&module, node)))
+    if (!irBuilder(function, node))
         return false;
 
     bool discarded = false;
index 9555b9e..b7b8eac 100644 (file)
@@ -400,6 +400,11 @@ Function::~Function()
     qDeleteAll(basicBlocks);
 }
 
+QString *Function::newString(const QString &text)
+{
+    return pool->NewString(text);
+}
+
 BasicBlock *Function::newBasicBlock()
 {
     const int index = basicBlocks.size();
@@ -408,10 +413,7 @@ BasicBlock *Function::newBasicBlock()
 
 void Function::dump(QTextStream &out)
 {
-    QString fname = name;
-    if (fname.isEmpty())
-        fname = QLatin1String("$anonymous");
-    out << "function " << fname << "() {" << endl;
+    out << "function () {" << endl;
     foreach (BasicBlock *bb, basicBlocks) {
         bb->dump(out);
     }
@@ -420,7 +422,7 @@ void Function::dump(QTextStream &out)
 
 Temp *BasicBlock::TEMP(Type type, int index) 
 { 
-    Temp *e = function->module->pool->New<Temp>();
+    Temp *e = function->pool->New<Temp>();
     e->init(type, index);
     return e;
 }
@@ -437,14 +439,14 @@ Expr *BasicBlock::CONST(double value)
 
 Expr *BasicBlock::CONST(Type type, double value) 
 { 
-    Const *e = function->module->pool->New<Const>();
+    Const *e = function->pool->New<Const>();
     e->init(type, value);
     return e;
 }
 
 Expr *BasicBlock::STRING(const QStringRef &value)
 {
-    String *e = function->module->pool->New<String>();
+    String *e = function->pool->New<String>();
     e->init(value);
     return e;
 }
@@ -456,9 +458,9 @@ Name *BasicBlock::NAME(const QString &id, quint32 line, quint32 column)
 
 Name *BasicBlock::NAME(Name *base, const QString &id, quint32 line, quint32 column)
 { 
-    Name *e = function->module->pool->New<Name>();
+    Name *e = function->pool->New<Name>();
     e->init(base, InvalidType,
-            function->module->newString(id),
+            function->newString(id),
             Name::Unbound, line, column);
     return e;
 }
@@ -474,8 +476,8 @@ Name *BasicBlock::SYMBOL(Type type, const QString &id, const QMetaObject *meta,
 Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index, Name::Storage storage,
                          quint32 line, quint32 column)
 {
-    Name *name = function->module->pool->New<Name>();
-    name->init(base, type, function->module->newString(id),
+    Name *name = function->pool->New<Name>();
+    name->init(base, type, function->newString(id),
                Name::Property, line, column);
     name->meta = meta;
     name->index = index;
@@ -486,8 +488,8 @@ Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaOb
 Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaObject *meta, int index,
                          quint32 line, quint32 column)
 {
-    Name *name = function->module->pool->New<Name>();
-    name->init(base, type, function->module->newString(id),
+    Name *name = function->pool->New<Name>();
+    name->init(base, type, function->newString(id),
                Name::Property, line, column);
     name->meta = meta;
     name->index = index;
@@ -496,9 +498,9 @@ Name *BasicBlock::SYMBOL(Name *base, Type type, const QString &id, const QMetaOb
 
 Name *BasicBlock::ID_OBJECT(const QString &id, const QDeclarativeParser::Object *object, quint32 line, quint32 column)
 {
-    Name *name = function->module->pool->New<Name>();
+    Name *name = function->pool->New<Name>();
     name->init(/*base = */ 0, IR::ObjectType,
-               function->module->newString(id),
+               function->newString(id),
                Name::IdObject, line, column);
     name->idObject = object;
     name->index = object->idIndex;
@@ -509,9 +511,9 @@ Name *BasicBlock::ID_OBJECT(const QString &id, const QDeclarativeParser::Object
 Name *BasicBlock::ATTACH_TYPE(const QString &id, const QDeclarativeType *attachType, Name::Storage storage,
                               quint32 line, quint32 column)
 { 
-    Name *name = function->module->pool->New<Name>();
+    Name *name = function->pool->New<Name>();
     name->init(/*base = */ 0, IR::AttachType,
-               function->module->newString(id),
+               function->newString(id),
                Name::AttachType, line, column);
     name->declarativeType = attachType;
     name->storage = storage;
@@ -521,7 +523,7 @@ Name *BasicBlock::ATTACH_TYPE(const QString &id, const QDeclarativeType *attachT
 
 Expr *BasicBlock::UNOP(AluOp op, Expr *expr) 
 { 
-    Unop *e = function->module->pool->New<Unop>();
+    Unop *e = function->pool->New<Unop>();
     e->init(op, expr);
     return e;
 }
@@ -566,21 +568,21 @@ Expr *BasicBlock::BINOP(AluOp op, Expr *left, Expr *right)
         }
     }
 
-    Binop *e = function->module->pool->New<Binop>();
+    Binop *e = function->pool->New<Binop>();
     e->init(op, left, right);
     return e;
 }
 
 Expr *BasicBlock::CALL(Expr *base, ExprList *args)
 { 
-    Call *e = function->module->pool->New<Call>();
+    Call *e = function->pool->New<Call>();
     e->init(base, args);
     return e;
 }
 
 Stmt *BasicBlock::EXP(Expr *expr) 
 { 
-    Exp *s = function->module->pool->New<Exp>();
+    Exp *s = function->pool->New<Exp>();
     s->init(expr);
     statements.append(s);
     return s;
@@ -588,7 +590,7 @@ Stmt *BasicBlock::EXP(Expr *expr)
 
 Stmt *BasicBlock::MOVE(Expr *target, Expr *source, bool isMoveForReturn) 
 { 
-    Move *s = function->module->pool->New<Move>();
+    Move *s = function->pool->New<Move>();
     s->init(target, source, isMoveForReturn);
     statements.append(s);
     return s;
@@ -599,7 +601,7 @@ Stmt *BasicBlock::JUMP(BasicBlock *target)
     if (isTerminated())
         return 0;
 
-    Jump *s = function->module->pool->New<Jump>();
+    Jump *s = function->pool->New<Jump>();
     s->init(target);
     statements.append(s);
     return s;
@@ -610,7 +612,7 @@ Stmt *BasicBlock::CJUMP(Expr *cond, BasicBlock *iftrue, BasicBlock *iffalse)
     if (isTerminated())
         return 0;
 
-    CJump *s = function->module->pool->New<CJump>();
+    CJump *s = function->pool->New<CJump>();
     s->init(cond, iftrue, iffalse);
     statements.append(s);
     return s;
@@ -621,7 +623,7 @@ Stmt *BasicBlock::RET(Expr *expr, Type type, quint32 line, quint32 column)
     if (isTerminated())
         return 0;
 
-    Ret *s = function->module->pool->New<Ret>();
+    Ret *s = function->pool->New<Ret>();
     s->init(expr, type, line, column);
     statements.append(s);
     return s;
@@ -637,36 +639,6 @@ void BasicBlock::dump(QTextStream &out)
     }
 }
 
-Module::Module(QDeclarativePool *pool)
-    : pool(pool)
-{
-}
-
-Module::~Module()
-{
-    qDeleteAll(functions);
-}
-
-QString *Module::newString(const QString &text)
-{
-    return pool->NewString(text);
-}
-
-Function *Module::newFunction(const QString &name)
-{
-    Function *f = new Function(this, name);
-    functions.append(f);
-    return f;
-}
-
-void Module::dump(QTextStream &out)
-{
-    foreach (Function *fun, functions) {
-        fun->dump(out);
-        out << endl;
-    }
-}
-
 #ifdef DEBUG_IR_STRUCTURE
 
 static const char *symbolname(Name::Symbol s) 
index 0c93fbb..e79a289 100644 (file)
@@ -78,7 +78,6 @@ namespace IR {
 
 struct BasicBlock;
 struct Function;
-struct Module;
 
 struct Stmt;
 struct Expr;
@@ -479,17 +478,19 @@ struct Ret: Stmt {
 };
 
 struct Function {
-    Module *module;
-    QString name;
-    int tempCount;
+    QDeclarativePool *pool;
     QVarLengthArray<BasicBlock *, 8> basicBlocks;
+    int tempCount;
 
-    inline BasicBlock *i(BasicBlock *block) { basicBlocks.append(block); return block; }
+    Function(QDeclarativePool *pool)
+      : pool(pool), tempCount(0) {}
 
-    Function(Module *module, const QString &name): module(module), name(name), tempCount(0) {}
     ~Function();
 
     BasicBlock *newBasicBlock();
+    QString *newString(const QString &text);
+
+    inline BasicBlock *i(BasicBlock *block) { basicBlocks.append(block); return block; }
 
     virtual void dump(QTextStream &out);
 };
@@ -550,19 +551,6 @@ struct BasicBlock {
     virtual void dump(QTextStream &out);
 };
 
-struct Module {
-    QDeclarativePool *pool;
-    QVarLengthArray<Function *, 4> functions;
-
-    Module(QDeclarativePool *pool);
-    ~Module();
-
-    QString *newString(const QString &text);
-    Function *newFunction(const QString &name = QString());
-
-    virtual void dump(QTextStream &out);
-};
-
 #ifdef DEBUG_IR_STRUCTURE
 struct IRDump : public ExprVisitor,
                 public StmtVisitor 
index 18a52bb..5eb4682 100644 (file)
@@ -86,19 +86,15 @@ static IR::Type irTypeFromVariantType(int t, QDeclarativeEnginePrivate *engine,
 
 QDeclarativeV4IRBuilder::QDeclarativeV4IRBuilder(const QDeclarativeV4Compiler::Expression *expr, 
                                                              QDeclarativeEnginePrivate *engine)
-: m_expression(expr), m_engine(engine), _module(0), _function(0), _block(0), _discard(false)
+: m_expression(expr), m_engine(engine), _function(0), _block(0), _discard(false)
 {
 }
 
-QDeclarativeJS::IR::Function *
-QDeclarativeV4IRBuilder::operator()(QDeclarativeJS::IR::Module *module, 
+bool QDeclarativeV4IRBuilder::operator()(QDeclarativeJS::IR::Function *function,
                                          QDeclarativeJS::AST::Node *ast)
 {
     bool discarded = false;
 
-    qSwap(_module, module);
-
-    IR::Function *function = _module->newFunction();
     IR::BasicBlock *block = function->newBasicBlock();
 
     qSwap(_discard, discarded);
@@ -131,9 +127,7 @@ QDeclarativeV4IRBuilder::operator()(QDeclarativeJS::IR::Module *module,
     qSwap(_function, function);
     qSwap(_discard, discarded);
 
-    qSwap(_module, module);
-
-    return discarded?0:function;
+    return !discarded;
 }
 
 bool QDeclarativeV4IRBuilder::buildName(QList<QStringRef> &name,
@@ -342,27 +336,28 @@ bool QDeclarativeV4IRBuilder::visit(AST::UiFormal *)
 
 
 // JS
-bool QDeclarativeV4IRBuilder::visit(AST::Program *ast)
+bool QDeclarativeV4IRBuilder::visit(AST::Program *)
 {
-    _function = _module->newFunction();
-    _block = _function->newBasicBlock();
-    accept(ast->elements);
+    Q_ASSERT(!"unreachable");
     return false;
 }
 
 bool QDeclarativeV4IRBuilder::visit(AST::SourceElements *)
 {
+    Q_ASSERT(!"unreachable");
     return false;
 }
 
 bool QDeclarativeV4IRBuilder::visit(AST::FunctionSourceElement *)
 {
-    return true; // look inside
+    Q_ASSERT(!"unreachable");
+    return false;
 }
 
 bool QDeclarativeV4IRBuilder::visit(AST::StatementSourceElement *)
 {
-    return true; // look inside
+    Q_ASSERT(!"unreachable");
+    return false;
 }
 
 // object literals
@@ -683,7 +678,7 @@ bool QDeclarativeV4IRBuilder::visit(AST::FieldMemberExpression *ast)
     return false;
 }
 
-bool QDeclarativeV4IRBuilder::preVisit(AST::Node *ast)
+bool QDeclarativeV4IRBuilder::preVisit(AST::Node *)
 {
     return ! _discard;
 }
@@ -720,7 +715,7 @@ bool QDeclarativeV4IRBuilder::visit(AST::CallExpression *ast)
         IR::ExprList *args = 0, **argsInserter = &args;
         for (AST::ArgumentList *it = ast->arguments; it; it = it->next) {
             IR::Expr *arg = expression(it->expression);
-            *argsInserter = _module->pool->New<IR::ExprList>();
+            *argsInserter = _function->pool->New<IR::ExprList>();
             (*argsInserter)->init(arg);
             argsInserter = &(*argsInserter)->next;
         }
index 47f5b3f..004e3a1 100644 (file)
@@ -55,7 +55,7 @@ class QDeclarativeV4IRBuilder : public QDeclarativeJS::AST::Visitor
 public:
     QDeclarativeV4IRBuilder(const QDeclarativeV4Compiler::Expression *, QDeclarativeEnginePrivate *);
 
-    QDeclarativeJS::IR::Function *operator()(QDeclarativeJS::IR::Module *, QDeclarativeJS::AST::Node *);
+    bool operator()(QDeclarativeJS::IR::Function *, QDeclarativeJS::AST::Node *);
 
 protected:
     struct ExprResult {
@@ -229,7 +229,6 @@ private:
     const QDeclarativeV4Compiler::Expression *m_expression;
     QDeclarativeEnginePrivate *m_engine;
 
-    QDeclarativeJS::IR::Module *_module;
     QDeclarativeJS::IR::Function *_function;
     QDeclarativeJS::IR::BasicBlock *_block;
     bool _discard;