qDeleteAll(basicBlocks);
}
+QString *Function::newString(const QString &text)
+{
+ return pool->NewString(text);
+}
+
BasicBlock *Function::newBasicBlock()
{
const int index = basicBlocks.size();
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);
}
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;
}
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;
}
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;
}
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;
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;
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;
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;
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;
}
}
}
- 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;
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;
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;
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;
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;
}
}
-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)
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);
qSwap(_function, function);
qSwap(_discard, discarded);
- qSwap(_module, module);
-
- return discarded?0:function;
+ return !discarded;
}
bool QDeclarativeV4IRBuilder::buildName(QList<QStringRef> &name,
// 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
return false;
}
-bool QDeclarativeV4IRBuilder::preVisit(AST::Node *ast)
+bool QDeclarativeV4IRBuilder::preVisit(AST::Node *)
{
return ! _discard;
}
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;
}