Introduce the ExecutionEngine.
authorRoberto Raggi <roberto.raggi@nokia.com>
Mon, 14 May 2012 15:12:25 +0000 (17:12 +0200)
committerRoberto Raggi <roberto.raggi@nokia.com>
Mon, 14 May 2012 15:12:25 +0000 (17:12 +0200)
main.cpp
qmljs_objects.cpp
qmljs_objects.h
qmljs_runtime.cpp
qv4ecmaobjects.cpp
qv4ecmaobjects_p.h
qv4isel.cpp
qv4isel_p.h

index 1c7c910..459c560 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -47,7 +47,7 @@ struct Print: FunctionObject
 } // builtins
 
 
-void evaluate(QQmlJS::Engine *engine, const QString &fileName, const QString &code)
+void evaluate(QQmlJS::VM::ExecutionEngine *vm, QQmlJS::Engine *engine, const QString &fileName, const QString &code)
 {
     using namespace QQmlJS;
 
@@ -73,7 +73,7 @@ void evaluate(QQmlJS::Engine *engine, const QString &fileName, const QString &co
         const size_t codeSize = 10 * getpagesize();
         uchar *code = (uchar *) malloc(codeSize);
 
-        x86_64::InstructionSelection isel(&module, code);
+        x86_64::InstructionSelection isel(vm, &module, code);
         QHash<QString, IR::Function *> codeByName;
         foreach (IR::Function *function, module.functions) {
             isel(function);
@@ -85,31 +85,15 @@ void evaluate(QQmlJS::Engine *engine, const QString &fileName, const QString &co
         if (! protect(code, codeSize))
             Q_UNREACHABLE();
 
-        VM::Context *ctx = new VM::Context;
-        ctx->init();
+        VM::Object *globalObject = vm->globalObject.objectValue;
+        VM::Context *ctx = vm->rootContext;
 
-        VM::String *prototype = VM::String::get(ctx, QLatin1String("prototype"));
-
-        VM::Object *globalObject = new VM::ArgumentsObject(ctx);
-        __qmljs_init_object(ctx, &ctx->activation, globalObject);
-
-        globalObject->put(VM::String::get(ctx, QLatin1String("print")),
+        globalObject->put(vm->identifier(QLatin1String("print")),
                           VM::Value::object(ctx, new builtins::Print(ctx)));
 
-        globalObject->put(VM::String::get(ctx, QLatin1String("Object")),
-                          VM::Value::object(ctx, new builtins::ObjectCtor(ctx)));
-
-        VM::FunctionObject *stringCtor = new VM::StringCtor(ctx);
-        stringCtor->put(prototype, VM::Value::object(ctx, new VM::StringPrototype(ctx, stringCtor)));
-        globalObject->put(VM::String::get(ctx, QLatin1String("String")), VM::Value::object(ctx, stringCtor));
-
-        VM::FunctionObject *numberCtor = new VM::NumberCtor(ctx);
-        numberCtor->put(prototype, VM::Value::object(ctx, new VM::NumberPrototype(ctx, numberCtor)));
-        globalObject->put(VM::String::get(ctx, QLatin1String("Number")), VM::Value::object(ctx, numberCtor));
-
         foreach (IR::Function *function, module.functions) {
             if (function->name && ! function->name->isEmpty()) {
-                globalObject->put(VM::String::get(ctx, *function->name),
+                globalObject->put(vm->identifier(*function->name),
                                   VM::Value::object(ctx, new VM::ScriptFunction(ctx, function)));
             }
         }
@@ -125,13 +109,14 @@ int main(int argc, char *argv[])
     QStringList args = app.arguments();
     args.removeFirst();
 
+    VM::ExecutionEngine vm;
     Engine engine;
     foreach (const QString &fn, args) {
         QFile file(fn);
         if (file.open(QFile::ReadOnly)) {
             const QString code = QString::fromUtf8(file.readAll());
             file.close();
-            evaluate(&engine, fn, code);
+            evaluate(&vm, &engine, fn, code);
         }
     }
 }
index bcc08d3..704eead 100644 (file)
@@ -1,6 +1,7 @@
 
 #include "qmljs_objects.h"
 #include "qv4ir_p.h"
+#include "qv4ecmaobjects_p.h"
 #include <QtCore/QDebug>
 #include <cassert>
 
@@ -13,7 +14,7 @@ Object::~Object()
 
 void Object::setProperty(Context *ctx, const QString &name, const Value &value)
 {
-    put(String::get(ctx, name), value);
+    put(ctx->engine->identifier(name), value);
 }
 
 void Object::setProperty(Context *ctx, const QString &name, void (*code)(Context *))
@@ -96,15 +97,13 @@ bool Object::deleteProperty(String *name, bool flag)
     return false;
 }
 
-void Object::defaultValue(Value *result, int typeHint)
+void Object::defaultValue(Context *ctx, Value *result, int typeHint)
 {
-    Context *ctx = 0; // ###
-
     if (typeHint == STRING_HINT) {
         if (asFunctionObject() != 0)
-            __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("function")));
+            __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("function")));
         else
-            __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("object")));
+            __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("object")));
     } else {
         __qmljs_init_undefined(ctx, result);
     }
@@ -136,7 +135,7 @@ ScriptFunction::ScriptFunction(Context *scope, IR::Function *function)
     if (formalParameterCount) {
         formalParameterList = new String*[formalParameterCount];
         for (size_t i = 0; i < formalParameterCount; ++i) {
-            formalParameterList[i] = String::get(0, *function->formals.at(i)); // ### unique
+            formalParameterList[i] = scope->engine->identifier(*function->formals.at(i));
         }
     }
 }
@@ -173,3 +172,38 @@ Value *ArgumentsObject::getProperty(String *name, PropertyAttributes *attributes
         return prop;
     return 0;
 }
+
+ExecutionEngine::ExecutionEngine()
+{
+    rootContext = new VM::Context;
+    rootContext->init(this);
+
+    //
+    // set up the global object
+    //
+    VM::Object *glo = new VM::ArgumentsObject(rootContext);
+    __qmljs_init_object(rootContext, &globalObject, glo);
+    __qmljs_init_object(rootContext, &rootContext->activation, glo);
+
+    objectCtor = ObjectCtor::create(this);
+    stringCtor = StringCtor::create(this);
+    numberCtor = NumberCtor::create(this);
+
+    String *prototype = String::get(rootContext, QLatin1String("prototype"));
+
+    objectCtor.objectValue->get(prototype, &objectPrototype);
+    stringCtor.objectValue->get(prototype, &stringPrototype);
+    numberCtor.objectValue->get(prototype, &numberPrototype);
+
+    glo->put(VM::String::get(rootContext, QLatin1String("Object")), objectCtor);
+    glo->put(VM::String::get(rootContext, QLatin1String("String")), stringCtor);
+    glo->put(VM::String::get(rootContext, QLatin1String("Number")), numberCtor);
+}
+
+String *ExecutionEngine::identifier(const QString &s)
+{
+    String *&id = identifiers[s];
+    if (! id)
+        id = new String(s);
+    return id;
+}
index 2dd4b09..7d1a328 100644 (file)
@@ -23,6 +23,8 @@ struct StringObject;
 struct ArrayObject;
 struct FunctionObject;
 struct ErrorObject;
+struct Context;
+struct ExecutionEngine;
 
 struct String {
     String(const QString &text)
@@ -207,7 +209,7 @@ struct Object {
     virtual bool canPut(String *name);
     virtual bool hasProperty(String *name) const;
     virtual bool deleteProperty(String *name, bool flag);
-    virtual void defaultValue(Value *result, int typeHint);
+    virtual void defaultValue(Context *ctx, Value *result, int typeHint);
     // ### TODO: defineOwnProperty(name, descriptor, boolean) -> boolean
 
     //
@@ -220,19 +222,19 @@ struct Object {
 struct BooleanObject: Object {
     Value value;
     BooleanObject(const Value &value): value(value) {}
-    virtual void defaultValue(Value *result, int /*typehint*/) { *result = value; }
+    virtual void defaultValue(Context *, Value *result, int /*typehint*/) { *result = value; }
 };
 
 struct NumberObject: Object {
     Value value;
     NumberObject(const Value &value): value(value) {}
-    virtual void defaultValue(Value *result, int /*typehint*/) { *result = value; }
+    virtual void defaultValue(Context *, Value *result, int /*typehint*/) { *result = value; }
 };
 
 struct StringObject: Object {
     Value value;
     StringObject(const Value &value): value(value) {}
-    virtual void defaultValue(Value *result, int /*typehint*/) { *result = value; }
+    virtual void defaultValue(Context *, Value *result, int /*typehint*/) { *result = value; }
 };
 
 struct ArrayObject: Object {
@@ -286,6 +288,7 @@ struct ArgumentsObject: Object {
 };
 
 struct Context {
+    ExecutionEngine *engine;
     Context *parent;
     Value activation;
     Value thisObject;
@@ -319,8 +322,9 @@ struct Context {
             __qmljs_init_undefined(this, result);
     }
 
-    void init()
+    void init(ExecutionEngine *eng)
     {
+        engine = eng;
         parent = 0;
         arguments = 0;
         argumentCount = 0;
@@ -333,6 +337,26 @@ struct Context {
     }
 };
 
+struct ExecutionEngine
+{
+    Context *rootContext;
+    Value globalObject;
+
+    Value objectCtor;
+    Value stringCtor;
+    Value numberCtor;
+
+    Value objectPrototype;
+    Value stringPrototype;
+    Value numberPrototype;
+
+    QHash<QString, String *> identifiers;
+
+    ExecutionEngine();
+
+    String *identifier(const QString &s);
+};
+
 } // namespace VM
 } // namespace QQmlJS
 
index 6fdf179..68365f0 100644 (file)
@@ -79,47 +79,47 @@ void __qmljs_init_closure(Context *ctx, Value *result, IR::Function *clos)
 
 void __qmljs_string_literal_undefined(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("undefined")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("undefined")));
 }
 
 void __qmljs_string_literal_null(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("null")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("null")));
 }
 
 void __qmljs_string_literal_true(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("true")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("true")));
 }
 
 void __qmljs_string_literal_false(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("false")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("false")));
 }
 
 void __qmljs_string_literal_object(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("object")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("object")));
 }
 
 void __qmljs_string_literal_boolean(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("boolean")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("boolean")));
 }
 
 void __qmljs_string_literal_number(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("number")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("number")));
 }
 
 void __qmljs_string_literal_string(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("string")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("string")));
 }
 
 void __qmljs_string_literal_function(Context *ctx, Value *result)
 {
-    __qmljs_init_string(ctx, result, String::get(ctx, QLatin1String("function")));
+    __qmljs_init_string(ctx, result, ctx->engine->identifier(QLatin1String("function")));
 }
 
 void __qmljs_delete(Context *ctx, Value *result, const Value *value)
@@ -198,7 +198,7 @@ bool __qmljs_is_function(Context *, const Value *value)
 void __qmljs_object_default_value(Context *ctx, Value *result, Object *object, int typeHint)
 {
     Q_UNUSED(ctx);
-    object->defaultValue(result, typeHint);
+    object->defaultValue(ctx, result, typeHint);
 }
 
 void __qmljs_throw_type_error(Context *ctx, Value *result)
@@ -218,6 +218,7 @@ void __qmljs_new_number_object(Context *ctx, Value *result, double number)
     Value value;
     __qmljs_init_number(ctx, &value, number);
     __qmljs_init_object(ctx, result, new NumberObject(value));
+    result->objectValue->prototype = ctx->engine->numberPrototype.objectValue;
 }
 
 void __qmljs_new_string_object(Context *ctx, Value *result, String *string)
@@ -225,6 +226,7 @@ void __qmljs_new_string_object(Context *ctx, Value *result, String *string)
     Value value;
     __qmljs_init_string(ctx, &value, string);
     __qmljs_init_object(ctx, result, new StringObject(value));
+    result->objectValue->prototype = ctx->engine->stringPrototype.objectValue;
 }
 
 void __qmljs_set_property(Context *ctx, Value *object, String *name, Value *value)
@@ -451,7 +453,7 @@ void __qmljs_call_property(Context *context, Value *result, const Value *base, S
     if (func.type == OBJECT_TYPE) {
         if (FunctionObject *f = func.objectValue->asFunctionObject()) {
             Context *ctx = new Context;
-            ctx->init();
+            ctx->init(context->engine);
             ctx->parent = f->scope;
             if (f->needsActivation)
                 __qmljs_init_object(ctx, &ctx->activation, new ArgumentsObject(ctx));
@@ -484,7 +486,7 @@ void __qmljs_call_value(Context *context, Value *result, const Value *func, Valu
     if (func->type == OBJECT_TYPE) {
         if (FunctionObject *f = func->objectValue->asFunctionObject()) {
             Context *ctx = new Context;
-            ctx->init();
+            ctx->init(context->engine);
             ctx->parent = f->scope;
             if (f->needsActivation)
                 __qmljs_init_object(ctx, &ctx->activation, new ArgumentsObject(ctx));
@@ -525,7 +527,7 @@ void __qmljs_construct_value(Context *context, Value *result, const Value *func,
     if (func->type == OBJECT_TYPE) {
         if (FunctionObject *f = func->objectValue->asFunctionObject()) {
             Context *ctx = new Context;
-            ctx->init();
+            ctx->init(context->engine);
             ctx->parent = f->scope;
             if (f->needsActivation)
                 __qmljs_init_object(ctx, &ctx->activation, new ArgumentsObject(ctx));
@@ -545,7 +547,7 @@ void __qmljs_construct_value(Context *context, Value *result, const Value *func,
             assert(ctx->thisObject.is(OBJECT_TYPE));
             ctx->result = ctx->thisObject;
             Value proto;
-            if (f->get(String::get(ctx, QLatin1String("prototype")), &proto)) { // ### `prototype' should be a unique symbol
+            if (f->get(ctx->engine->identifier(QLatin1String("prototype")), &proto)) { // ### `prototype' should be a unique symbol
                 if (proto.type == OBJECT_TYPE)
                     ctx->thisObject.objectValue->prototype = proto.objectValue;
             }
@@ -572,7 +574,7 @@ void __qmljs_construct_property(Context *context, Value *result, const Value *ba
     if (func.type == OBJECT_TYPE) {
         if (FunctionObject *f = func.objectValue->asFunctionObject()) {
             Context *ctx = new Context;
-            ctx->init();
+            ctx->init(context->engine);
             ctx->parent = f->scope;
             if (f->needsActivation)
                 __qmljs_init_object(ctx, &ctx->activation, new ArgumentsObject(ctx));
@@ -592,7 +594,7 @@ void __qmljs_construct_property(Context *context, Value *result, const Value *ba
             assert(ctx->thisObject.is(OBJECT_TYPE));
 
             Value proto;
-            if (f->get(String::get(ctx, QLatin1String("prototype")), &proto)) { // ### `prototype' should be a unique symbol
+            if (f->get(ctx->engine->identifier(QLatin1String("prototype")), &proto)) { // ### `prototype' should be a unique symbol
                 if (proto.type == OBJECT_TYPE)
                     ctx->thisObject.objectValue->prototype = proto.objectValue;
             }
index bdb3d3f..9b678dc 100644 (file)
@@ -9,6 +9,14 @@ using namespace QQmlJS::VM;
 //
 // Object
 //
+Value ObjectCtor::create(ExecutionEngine *engine)
+{
+    Context *ctx = engine->rootContext;
+    ObjectCtor *ctor = new ObjectCtor(ctx);
+    ctor->setProperty(ctx, QLatin1String("prototype"), Value::object(ctx, new ObjectPrototype(ctx, ctor)));
+    return Value::object(ctx, ctor);
+}
+
 ObjectCtor::ObjectCtor(Context *scope)
     : FunctionObject(scope)
 {
@@ -24,7 +32,6 @@ void ObjectCtor::call(Context *)
     assert(!"not here");
 }
 
-
 ObjectPrototype::ObjectPrototype(Context *ctx, FunctionObject *ctor)
 {
     setProperty(ctx, QLatin1String("constructor"), Value::object(ctx, ctor));
@@ -33,6 +40,14 @@ ObjectPrototype::ObjectPrototype(Context *ctx, FunctionObject *ctor)
 //
 // String
 //
+Value StringCtor::create(ExecutionEngine *engine)
+{
+    Context *ctx = engine->rootContext;
+    StringCtor *ctor = new StringCtor(ctx);
+    ctor->setProperty(ctx, QLatin1String("prototype"), Value::object(ctx, new StringPrototype(ctx, ctor)));
+    return Value::object(ctx, ctor);
+}
+
 StringCtor::StringCtor(Context *scope)
     : FunctionObject(scope)
 {
@@ -97,7 +112,7 @@ void StringPrototype::method_toString(Context *ctx)
 
 void StringPrototype::method_valueOf(Context *ctx)
 {
-    ctx->thisObject.objectValue->defaultValue(&ctx->result, STRING_HINT);
+    ctx->thisObject.objectValue->defaultValue(ctx, &ctx->result, STRING_HINT);
 }
 
 void StringPrototype::method_charAt(Context *ctx)
@@ -338,6 +353,14 @@ void StringPrototype::method_fromCharCode(Context *ctx)
 //
 // Number object
 //
+Value NumberCtor::create(ExecutionEngine *engine)
+{
+    Context *ctx = engine->rootContext;
+    NumberCtor *ctor = new NumberCtor(ctx);
+    ctor->setProperty(ctx, QLatin1String("prototype"), Value::object(ctx, new NumberPrototype(ctx, ctor)));
+    return Value::object(ctx, ctor);
+}
+
 NumberCtor::NumberCtor(Context *scope)
     : FunctionObject(scope)
 {
@@ -396,7 +419,7 @@ void NumberPrototype::method_toString(Context *ctx)
 //                                       .arg(radix));
         if (radix != 10) {
             Value internalValue;
-            self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+            self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
 
             QString str;
             double num = internalValue.toNumber(ctx);
@@ -438,7 +461,7 @@ void NumberPrototype::method_toString(Context *ctx)
     }
 
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
 
     String *str = internalValue.toString(ctx);
     ctx->result = Value::string(ctx, str);
@@ -453,7 +476,7 @@ void NumberPrototype::method_toLocaleString(Context *ctx)
 //            context, QLatin1String("Number.prototype.toLocaleString"));
 //    }
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, STRING_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, STRING_HINT);
     String *str = internalValue.toString(ctx);
     ctx->result = Value::string(ctx, str);
 }
@@ -467,7 +490,7 @@ void NumberPrototype::method_valueOf(Context *ctx)
 //            context, QLatin1String("Number.prototype.toLocaleString"));
 //    }
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
     ctx->result = internalValue;
 }
 
@@ -488,7 +511,7 @@ void NumberPrototype::method_toFixed(Context *ctx)
         fdigits = 0;
 
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
 
     double v = internalValue.toNumber(ctx);
     QString str;
@@ -515,7 +538,7 @@ void NumberPrototype::method_toExponential(Context *ctx)
         fdigits = ctx->argument(0).toInteger(ctx);
 
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
 
     double v = internalValue.toNumber(ctx);
     QString z = QString::number(v, 'e', int (fdigits));
@@ -536,7 +559,7 @@ void NumberPrototype::method_toPrecision(Context *ctx)
         fdigits = ctx->argument(0).toInteger(ctx);
 
     Value internalValue;
-    self.objectValue->defaultValue(&internalValue, NUMBER_HINT);
+    self.objectValue->defaultValue(ctx, &internalValue, NUMBER_HINT);
 
     double v = internalValue.toNumber(ctx);
     ctx->result = Value::string(ctx, QString::number(v, 'g', int (fdigits)));
index 16d5086..4d8cb1d 100644 (file)
@@ -8,6 +8,8 @@ namespace VM {
 
 struct ObjectCtor: FunctionObject
 {
+    static Value create(ExecutionEngine *engine);
+
     ObjectCtor(Context *scope);
 
     virtual void construct(Context *ctx);
@@ -21,6 +23,8 @@ struct ObjectPrototype: Object
 
 struct StringCtor: FunctionObject
 {
+    static Value create(ExecutionEngine *engine);
+
     StringCtor(Context *scope);
 
     virtual void construct(Context *ctx);
@@ -58,6 +62,8 @@ protected:
 
 struct NumberCtor: FunctionObject
 {
+    static Value create(ExecutionEngine *engine);
+
     NumberCtor(Context *scope);
 
     virtual void construct(Context *ctx);
index 260cdd0..e6bdd1e 100644 (file)
@@ -80,8 +80,9 @@ amd64_patch (unsigned char* code, gpointer target)
     else
         x86_patch (code, (unsigned char*)target);
 }
-InstructionSelection::InstructionSelection(IR::Module *module, uchar *buffer)
-    : _module(module)
+InstructionSelection::InstructionSelection(VM::ExecutionEngine *engine, IR::Module *module, uchar *buffer)
+    : _engine(engine)
+    , _module(module)
     , _function(0)
     , _block(0)
     , _buffer(buffer)
@@ -157,10 +158,7 @@ void InstructionSelection::operator()(IR::Function *function)
 
 String *InstructionSelection::identifier(const QString &s)
 {
-    String *&id = _identifiers[s];
-    if (! id)
-        id = new String(s);
-    return id;
+    return _engine->identifier(s);
 }
 
 void InstructionSelection::loadTempAddress(int reg, IR::Temp *t)
@@ -638,7 +636,7 @@ void InstructionSelection::visitMove(IR::Move *s)
                     amd64_mov_reg_reg(_codePtr, AMD64_RDI, AMD64_R14, 8);
                     loadTempAddress(AMD64_RSI, base);
                     amd64_mov_reg_imm(_codePtr, AMD64_RDX, identifier(*m->name));
-                    amd64_mov_reg_imm(_codePtr, AMD64_RCX, VM::String::get(0, *str->value));
+                    amd64_mov_reg_imm(_codePtr, AMD64_RCX, VM::String::get(_engine->rootContext, *str->value));
                     amd64_call_code(_codePtr, __qmljs_set_property_string);
                     return;
                 } else if (IR::Temp *t = s->source->asTemp()) {
index 22f8056..ac6092d 100644 (file)
@@ -12,7 +12,7 @@ namespace x86_64 {
 class InstructionSelection: protected IR::StmtVisitor
 {
 public:
-    InstructionSelection(IR::Module *module, uchar *code);
+    InstructionSelection(VM::ExecutionEngine *engine, IR::Module *module, uchar *code);
     ~InstructionSelection();
 
     void operator()(IR::Function *function);
@@ -35,6 +35,7 @@ protected:
     virtual void visitRet(IR::Ret *);
 
 private:
+    VM::ExecutionEngine *_engine;
     IR::Module *_module;
     IR::Function *_function;
     IR::BasicBlock *_block;
@@ -43,7 +44,6 @@ private:
     uchar *_codePtr;
     QHash<IR::BasicBlock *, QVector<uchar *> > _patches;
     QHash<IR::BasicBlock *, uchar *> _addrs;
-    QHash<QString, VM::String *> _identifiers;
 };
 
 } // end of namespace x86_64