From: Roberto Raggi Date: Mon, 25 Jul 2011 06:31:21 +0000 (+0200) Subject: Merge IR::Module and IR::Function. X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=2b4882d0186780b84cbc2a6c0614a0d084567e3f;p=konrad%2Fqtdeclarative.git Merge IR::Module and IR::Function. 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 Reviewed-by: Qt Sanity Bot --- diff --git a/src/declarative/qml/v4/qdeclarativev4compiler.cpp b/src/declarative/qml/v4/qdeclarativev4compiler.cpp index c77a737..9d7c9f7 100644 --- a/src/declarative/qml/v4/qdeclarativev4compiler.cpp +++ b/src/declarative/qml/v4/qdeclarativev4compiler.cpp @@ -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 *jump = _function->pool->New(); 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; diff --git a/src/declarative/qml/v4/qdeclarativev4ir.cpp b/src/declarative/qml/v4/qdeclarativev4ir.cpp index 9555b9e..b7b8eac 100644 --- a/src/declarative/qml/v4/qdeclarativev4ir.cpp +++ b/src/declarative/qml/v4/qdeclarativev4ir.cpp @@ -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 *e = function->pool->New(); 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 *e = function->pool->New(); e->init(type, value); return e; } Expr *BasicBlock::STRING(const QStringRef &value) { - String *e = function->module->pool->New(); + String *e = function->pool->New(); 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 *e = function->pool->New(); 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->init(base, type, function->module->newString(id), + Name *name = function->pool->New(); + 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->init(base, type, function->module->newString(id), + Name *name = function->pool->New(); + 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 = function->pool->New(); 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 = function->pool->New(); 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 *e = function->pool->New(); 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 *e = function->pool->New(); e->init(op, left, right); return e; } Expr *BasicBlock::CALL(Expr *base, ExprList *args) { - Call *e = function->module->pool->New(); + Call *e = function->pool->New(); e->init(base, args); return e; } Stmt *BasicBlock::EXP(Expr *expr) { - Exp *s = function->module->pool->New(); + Exp *s = function->pool->New(); 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 *s = function->pool->New(); 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 *s = function->pool->New(); 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 *s = function->pool->New(); 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 *s = function->pool->New(); 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) diff --git a/src/declarative/qml/v4/qdeclarativev4ir_p.h b/src/declarative/qml/v4/qdeclarativev4ir_p.h index 0c93fbb..e79a289 100644 --- a/src/declarative/qml/v4/qdeclarativev4ir_p.h +++ b/src/declarative/qml/v4/qdeclarativev4ir_p.h @@ -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 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 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 diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp index 18a52bb..5eb4682 100644 --- a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp +++ b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp @@ -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 &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(); + *argsInserter = _function->pool->New(); (*argsInserter)->init(arg); argsInserter = &(*argsInserter)->next; } diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h b/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h index 47f5b3f..004e3a1 100644 --- a/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h +++ b/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h @@ -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;