From 8dfc088d2f8b1e0eb2c000a80c04ee574f6aba8f Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 8 Apr 2013 09:08:02 +0200 Subject: Store the global object as an Object pointer in the engine Change-Id: Ia8b010a9d9c9dd3aacb1b08ce34a42236fa73195 Reviewed-by: Simon Hausmann --- src/v4/qv4context.cpp | 6 ++-- src/v4/qv4engine.cpp | 78 +++++++++++++++++++++----------------------- src/v4/qv4engine.h | 2 +- src/v4/qv4functionobject.cpp | 2 +- src/v4/qv4v8.cpp | 2 +- tools/v4/main.cpp | 2 +- 6 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/v4/qv4context.cpp b/src/v4/qv4context.cpp index 462ac969..baddb819 100644 --- a/src/v4/qv4context.cpp +++ b/src/v4/qv4context.cpp @@ -83,7 +83,7 @@ void ExecutionContext::createMutableBinding(String *name, bool deletable) { // find the right context to create the binding on - Object *activation = engine->globalObject.objectValue(); + Object *activation = engine->globalObject; ExecutionContext *ctx = this; while (ctx) { if (ctx->type >= Type_CallContext) { @@ -133,7 +133,7 @@ void GlobalContext::init(ExecutionEngine *eng) type = Type_GlobalContext; strictMode = false; marked = false; - thisObject = eng->globalObject; + thisObject = Value::fromObject(eng->globalObject); engine = eng; outer = 0; lookups = 0; @@ -334,7 +334,7 @@ void ExecutionContext::setProperty(String *name, const Value& value) } if (strictMode || name->isEqualTo(engine->id_this)) throwReferenceError(Value::fromString(name)); - engine->globalObject.objectValue()->put(this, name, value); + engine->globalObject->put(this, name, value); } Value ExecutionContext::getProperty(String *name) diff --git a/src/v4/qv4engine.cpp b/src/v4/qv4engine.cpp index 4e23fa2b..7064ba42 100644 --- a/src/v4/qv4engine.cpp +++ b/src/v4/qv4engine.cpp @@ -69,7 +69,7 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) : memoryManager(new QQmlJS::VM::MemoryManager) , executableAllocator(new QQmlJS::VM::ExecutableAllocator) , debugger(0) - , globalObject(Value::nullValue()) + , globalObject(0) , globalCode(0) , externalResourceComparison(0) , regExpCache(0) @@ -194,52 +194,50 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory) // // set up the global object // - VM::Object *glo = newObject(/*rootContext*/); - globalObject = Value::fromObject(glo); - rootContext->global = glo; - rootContext->thisObject = Value::fromObject(glo); - - glo->defineDefaultProperty(rootContext, QStringLiteral("Object"), objectCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("String"), stringCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Number"), numberCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Boolean"), booleanCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Array"), arrayCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Function"), functionCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Date"), dateCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("RegExp"), regExpCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Error"), errorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("EvalError"), evalErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("RangeError"), rangeErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("ReferenceError"), referenceErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("SyntaxError"), syntaxErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("TypeError"), typeErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("URIError"), uRIErrorCtor); - glo->defineDefaultProperty(rootContext, QStringLiteral("Math"), Value::fromObject(new (memoryManager) MathObject(rootContext))); - glo->defineDefaultProperty(rootContext, QStringLiteral("JSON"), Value::fromObject(new (memoryManager) JsonObject(rootContext))); - - glo->defineReadonlyProperty(this, QStringLiteral("undefined"), Value::undefinedValue()); - glo->defineReadonlyProperty(this, QStringLiteral("NaN"), Value::fromDouble(std::numeric_limits::quiet_NaN())); - glo->defineReadonlyProperty(this, QStringLiteral("Infinity"), Value::fromDouble(Q_INFINITY)); + globalObject = newObject(/*rootContext*/); + rootContext->global = globalObject; + rootContext->thisObject = Value::fromObject(globalObject); + + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Object"), objectCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("String"), stringCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Number"), numberCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Boolean"), booleanCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Array"), arrayCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Function"), functionCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Date"), dateCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("RegExp"), regExpCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Error"), errorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("EvalError"), evalErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("RangeError"), rangeErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("ReferenceError"), referenceErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("SyntaxError"), syntaxErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("TypeError"), typeErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("URIError"), uRIErrorCtor); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("Math"), Value::fromObject(new (memoryManager) MathObject(rootContext))); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("JSON"), Value::fromObject(new (memoryManager) JsonObject(rootContext))); + + globalObject->defineReadonlyProperty(this, QStringLiteral("undefined"), Value::undefinedValue()); + globalObject->defineReadonlyProperty(this, QStringLiteral("NaN"), Value::fromDouble(std::numeric_limits::quiet_NaN())); + globalObject->defineReadonlyProperty(this, QStringLiteral("Infinity"), Value::fromDouble(Q_INFINITY)); evalFunction = new (memoryManager) EvalFunction(rootContext); - glo->defineDefaultProperty(rootContext, QStringLiteral("eval"), Value::fromObject(evalFunction)); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("eval"), Value::fromObject(evalFunction)); - glo->defineDefaultProperty(rootContext, QStringLiteral("parseInt"), GlobalFunctions::method_parseInt, 2); - glo->defineDefaultProperty(rootContext, QStringLiteral("parseFloat"), GlobalFunctions::method_parseFloat, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("isNaN"), GlobalFunctions::method_isNaN, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("isFinite"), GlobalFunctions::method_isFinite, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("decodeURI"), GlobalFunctions::method_decodeURI, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("decodeURIComponent"), GlobalFunctions::method_decodeURIComponent, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("encodeURI"), GlobalFunctions::method_encodeURI, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("encodeURIComponent"), GlobalFunctions::method_encodeURIComponent, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("escape"), GlobalFunctions::method_escape, 1); - glo->defineDefaultProperty(rootContext, QStringLiteral("unescape"), GlobalFunctions::method_unescape, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("parseInt"), GlobalFunctions::method_parseInt, 2); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("parseFloat"), GlobalFunctions::method_parseFloat, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("isNaN"), GlobalFunctions::method_isNaN, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("isFinite"), GlobalFunctions::method_isFinite, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("decodeURI"), GlobalFunctions::method_decodeURI, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("decodeURIComponent"), GlobalFunctions::method_decodeURIComponent, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("encodeURI"), GlobalFunctions::method_encodeURI, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("encodeURIComponent"), GlobalFunctions::method_encodeURIComponent, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("escape"), GlobalFunctions::method_escape, 1); + globalObject->defineDefaultProperty(rootContext, QStringLiteral("unescape"), GlobalFunctions::method_unescape, 1); } ExecutionEngine::~ExecutionEngine() { delete regExpCache; - delete globalObject.asObject(); UnwindHelper::deregisterFunctions(functions); qDeleteAll(functions); delete memoryManager; @@ -495,7 +493,7 @@ void ExecutionEngine::markObjects() { identifierCache->mark(); - globalObject.mark(); + globalObject->mark(); if (globalCode) globalCode->mark(); diff --git a/src/v4/qv4engine.h b/src/v4/qv4engine.h index 3991c809..6170c082 100644 --- a/src/v4/qv4engine.h +++ b/src/v4/qv4engine.h @@ -118,7 +118,7 @@ struct Q_V4_EXPORT ExecutionEngine Debugging::Debugger *debugger; - Value globalObject; + Object *globalObject; VM::Function *globalCode; diff --git a/src/v4/qv4functionobject.cpp b/src/v4/qv4functionobject.cpp index 849f3d50..0d8bac82 100644 --- a/src/v4/qv4functionobject.cpp +++ b/src/v4/qv4functionobject.cpp @@ -393,7 +393,7 @@ Value ScriptFunction::call(Managed *that, ExecutionContext *context, const Value if (!f->strictMode && !thisObject.isObject()) { if (thisObject.isUndefined() || thisObject.isNull()) { - ctx->thisObject = context->engine->globalObject; + ctx->thisObject = Value::fromObject(context->engine->globalObject); } else { ctx->thisObject = Value::fromObject(thisObject.toObject(context)); } diff --git a/src/v4/qv4v8.cpp b/src/v4/qv4v8.cpp index 067e6561..2c7b83a1 100644 --- a/src/v4/qv4v8.cpp +++ b/src/v4/qv4v8.cpp @@ -2086,7 +2086,7 @@ Persistent Context::New(ExtensionConfiguration *extensions, Handle Context::Global() { - return Local::New(Value::fromVmValue(d->engine->globalObject)); + return Local::New(Value::fromVmValue(VM::Value::fromObject(d->engine->globalObject))); } Local Context::GetCurrent() diff --git a/tools/v4/main.cpp b/tools/v4/main.cpp index 86d5ae6e..e61931ce 100644 --- a/tools/v4/main.cpp +++ b/tools/v4/main.cpp @@ -358,7 +358,7 @@ int main(int argc, char *argv[]) QQmlJS::VM::ExecutionContext *ctx = vm.rootContext; - QQmlJS::VM::Object *globalObject = vm.globalObject.objectValue(); + QQmlJS::VM::Object *globalObject = vm.globalObject; QQmlJS::VM::Object *print = new (ctx->engine->memoryManager) builtins::Print(ctx); print->prototype = ctx->engine->objectPrototype; globalObject->put(ctx, vm.newIdentifier(QStringLiteral("print")), -- cgit v1.2.3