aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/v4
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2011-07-25 08:31:21 +0200
committerQt by Nokia <qt-info@nokia.com>2011-08-30 13:18:28 +0200
commit2b4882d0186780b84cbc2a6c0614a0d084567e3f (patch)
treee3654cf4b3c83cf5b6f8cd44901add7d7bf698ae /src/declarative/qml/v4
parentbcf5af7423dc496fd70534f0b32cd2ace3a1a5c8 (diff)
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 <roberto.raggi@nokia.com> Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Diffstat (limited to 'src/declarative/qml/v4')
-rw-r--r--src/declarative/qml/v4/qdeclarativev4compiler.cpp7
-rw-r--r--src/declarative/qml/v4/qdeclarativev4ir.cpp82
-rw-r--r--src/declarative/qml/v4/qdeclarativev4ir_p.h26
-rw-r--r--src/declarative/qml/v4/qdeclarativev4irbuilder.cpp29
-rw-r--r--src/declarative/qml/v4/qdeclarativev4irbuilder_p.h3
5 files changed, 50 insertions, 97 deletions
diff --git a/src/declarative/qml/v4/qdeclarativev4compiler.cpp b/src/declarative/qml/v4/qdeclarativev4compiler.cpp
index c77a737dca..9d7c9f7462 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>();
+ 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;
diff --git a/src/declarative/qml/v4/qdeclarativev4ir.cpp b/src/declarative/qml/v4/qdeclarativev4ir.cpp
index 9555b9ef54..b7b8eac0fc 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>();
+ 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)
diff --git a/src/declarative/qml/v4/qdeclarativev4ir_p.h b/src/declarative/qml/v4/qdeclarativev4ir_p.h
index 0c93fbbfd5..e79a289472 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<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
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp b/src/declarative/qml/v4/qdeclarativev4irbuilder.cpp
index 18a52bb8cd..5eb46823c7 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<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;
}
diff --git a/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h b/src/declarative/qml/v4/qdeclarativev4irbuilder_p.h
index 47f5b3f6fc..004e3a1a11 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;