summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-04-08 09:08:02 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-04-08 16:28:37 +0200
commit8dfc088d2f8b1e0eb2c000a80c04ee574f6aba8f (patch)
tree944290c2f2ea5eca9376fc9adcdd5634cffd1a38
parent11a1f28e3c5ebf9dd20a4b7767a66d64edb3ae9d (diff)
Store the global object as an Object pointer in the engine
Change-Id: Ia8b010a9d9c9dd3aacb1b08ce34a42236fa73195 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/v4/qv4context.cpp6
-rw-r--r--src/v4/qv4engine.cpp78
-rw-r--r--src/v4/qv4engine.h2
-rw-r--r--src/v4/qv4functionobject.cpp2
-rw-r--r--src/v4/qv4v8.cpp2
-rw-r--r--tools/v4/main.cpp2
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<double>::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<double>::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> Context::New(ExtensionConfiguration *extensions, Handle<Obje
Local<Object> Context::Global()
{
- return Local<Object>::New(Value::fromVmValue(d->engine->globalObject));
+ return Local<Object>::New(Value::fromVmValue(VM::Value::fromObject(d->engine->globalObject)));
}
Local<Context> 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")),