summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/script/api/qscriptcontext.cpp12
-rw-r--r--src/script/api/qscriptengine.cpp61
-rw-r--r--src/script/api/qscriptengine_p.h4
-rw-r--r--src/script/api/qscriptvalue.cpp4
-rw-r--r--src/script/api/qscriptvalueiterator.cpp2
-rw-r--r--src/script/bridge/qscriptfunction.cpp4
6 files changed, 42 insertions, 45 deletions
diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
index e05e786..8d4fe18 100644
--- a/src/script/api/qscriptcontext.cpp
+++ b/src/script/api/qscriptcontext.cpp
@@ -205,8 +205,8 @@ QScriptContext::QScriptContext()
QScriptValue QScriptContext::throwValue(const QScriptValue &value)
{
Q_D(QScriptContext);
- JSC::ExecState *exec = d->engine->globalObject->globalExec();
JSC::JSValue jscValue = d->engine->scriptValueToJSCValue(value);
+ JSC::ExecState *exec = d->frame;
exec->setException(jscValue);
return value;
}
@@ -248,7 +248,7 @@ QScriptValue QScriptContext::throwError(Error error, const QString &text)
jscError = JSC::URIError;
break;
}
- JSC::ExecState *exec = d->engine->globalObject->globalExec();
+ JSC::ExecState *exec = d->frame;
JSC::JSObject *result = JSC::throwError(exec, jscError, QScript::qtStringToJSCUString(text));
return d->engine->scriptValueFromJSCValue(result);
}
@@ -264,7 +264,7 @@ QScriptValue QScriptContext::throwError(Error error, const QString &text)
QScriptValue QScriptContext::throwError(const QString &text)
{
Q_D(QScriptContext);
- JSC::ExecState *exec = d->engine->globalObject->globalExec();
+ JSC::ExecState *exec = d->frame;
JSC::JSObject *result = JSC::throwError(exec, JSC::GeneralError, QScript::qtStringToJSCUString(text));
return d->engine->scriptValueFromJSCValue(result);
}
@@ -334,7 +334,7 @@ QScriptValue QScriptContext::callee() const
QScriptValue QScriptContext::argumentsObject() const
{
Q_D(const QScriptContext);
- if (d->frame == d->engine->globalObject->globalExec()) {
+ if (d->frame == d->engine->globalExec()) {
//global context doesn't have any argument, return an empty object
return static_cast<QScriptEngine *>(d->engine->q_ptr)->newObject();
}
@@ -481,7 +481,7 @@ void QScriptContext::setThisObject(const QScriptValue &thisObject)
"a different engine");
return;
}
- if (d->frame == d->engine->globalObject->globalExec()) {
+ if (d->frame == d->engine->globalExec()) {
qWarning("QScriptContext::setThisObject(): setting this-object of global context is not supported");
return;
}
@@ -501,7 +501,7 @@ void QScriptContext::setThisObject(const QScriptValue &thisObject)
QScriptContext::ExecutionState QScriptContext::state() const
{
Q_D(const QScriptContext);
- if (d->engine->globalObject->globalExec()->hadException())
+ if (d->frame->hadException())
return QScriptContext::ExceptionState;
return QScriptContext::NormalState;
}
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 5cbb8d7..2f7e976 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -313,6 +313,7 @@ struct GlobalClientData : public JSC::JSGlobalData::ClientData
GlobalClientData(QScriptEnginePrivate *e)
: engine(e) {}
virtual ~GlobalClientData() {}
+ virtual void mark() { engine->mark(); }
QScriptEnginePrivate *engine;
};
@@ -596,50 +597,35 @@ GlobalObject::~GlobalObject()
void GlobalObject::mark()
{
JSC::JSGlobalObject::mark();
- engine->mark();
}
bool GlobalObject::getOwnPropertySlot(JSC::ExecState* exec,
const JSC::Identifier& propertyName,
JSC::PropertySlot& slot)
{
- if (engine->customGlobalObject)
- return engine->customGlobalObject->getOwnPropertySlot(exec, propertyName, slot);
return JSC::JSGlobalObject::getOwnPropertySlot(exec, propertyName, slot);
}
void GlobalObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName,
JSC::JSValue value, JSC::PutPropertySlot& slot)
{
- if (engine->customGlobalObject) {
- engine->customGlobalObject->put(exec, propertyName, value, slot);
- return;
- }
JSC::JSGlobalObject::put(exec, propertyName, value, slot);
}
bool GlobalObject::deleteProperty(JSC::ExecState* exec,
const JSC::Identifier& propertyName)
{
- if (engine->customGlobalObject)
- return engine->customGlobalObject->deleteProperty(exec, propertyName);
return JSC::JSGlobalObject::deleteProperty(exec, propertyName);
}
bool GlobalObject::getPropertyAttributes(JSC::ExecState* exec, const JSC::Identifier& propertyName,
unsigned& attributes) const
{
- if (engine->customGlobalObject)
- return engine->customGlobalObject->getPropertyAttributes(exec, propertyName, attributes);
return JSC::JSGlobalObject::getPropertyAttributes(exec, propertyName, attributes);
}
void GlobalObject::getPropertyNames(JSC::ExecState* exec, JSC::PropertyNameArray& propertyNames)
{
- if (engine->customGlobalObject) {
- engine->customGlobalObject->getPropertyNames(exec, propertyNames);
- return;
- }
JSC::JSGlobalObject::getPropertyNames(exec, propertyNames);
}
@@ -810,7 +796,7 @@ QScriptEnginePrivate::QScriptEnginePrivate() : idGenerator(1)
globalData = JSC::JSGlobalData::create().releaseRef();
globalData->clientData = new QScript::GlobalClientData(this);
- globalObject = new (globalData)QScript::GlobalObject(this);
+ JSC::JSGlobalObject *globalObject = new (globalData)QScript::GlobalObject(this);
JSC::ExecState* exec = globalObject->globalExec();
@@ -1043,6 +1029,16 @@ void QScriptEnginePrivate::releaseContextForFrame(JSC::ExecState *frame)
delete ctx;
}
+JSC::JSGlobalObject *QScriptEnginePrivate::globalObject() const
+{
+ return globalData->head;
+}
+
+JSC::ExecState *QScriptEnginePrivate::globalExec() const
+{
+ return globalObject()->globalExec();
+}
+
void QScriptEnginePrivate::mark()
{
if (customGlobalObject && !customGlobalObject->marked())
@@ -1085,14 +1081,14 @@ void QScriptEnginePrivate::mark()
bool QScriptEnginePrivate::isCollecting() const
{
- return globalObject->globalData()->heap.isBusy();
+ return globalData->heap.isBusy();
}
void QScriptEnginePrivate::collectGarbage()
{
// ### why isn't the global object always marked by the Collector?
- if (!globalObject->marked())
- globalObject->mark();
+ if (!globalObject()->marked())
+ globalObject()->mark();
JSC::JSLock lock(false);
globalData->heap.collect();
}
@@ -1370,7 +1366,7 @@ QScriptEngine::~QScriptEngine()
QScriptValue QScriptEngine::globalObject() const
{
Q_D(const QScriptEngine);
- JSC::JSObject *result = d->customGlobalObject ? d->customGlobalObject : d->globalObject;
+ JSC::JSObject *result = d->globalObject();
return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(result);
}
@@ -1392,10 +1388,8 @@ void QScriptEngine::setGlobalObject(const QScriptValue &object)
if (!object.isObject() || globalObject().strictlyEquals(object))
return;
JSC::JSObject *jscObject = JSC::asObject(d->scriptValueToJSCValue(object));
- if (jscObject == d->globalObject)
- d->customGlobalObject = 0;
- else
- d->customGlobalObject = jscObject;
+ qWarning("QScriptEngine::setGlobalObject() is not implemented");
+// d->customGlobalObject = jscObject;
}
/*!
@@ -2416,7 +2410,7 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
}
}
if (result.isObject() && info && info->prototype
- && JSC::JSValue::strictEqual(scriptValueToJSCValue(result.prototype()), globalObject->objectPrototype())) {
+ && JSC::JSValue::strictEqual(scriptValueToJSCValue(result.prototype()), globalObject()->objectPrototype())) {
result.setPrototype(scriptValueFromJSCValue(info->prototype));
}
return result;
@@ -2675,17 +2669,18 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf,
void QScriptEngine::installTranslatorFunctions(const QScriptValue &object)
{
Q_D(QScriptEngine);
- JSC::ExecState* exec = d->globalObject->globalExec();
+ JSC::ExecState* exec = d->currentFrame;
JSC::JSValue jscObject = d->scriptValueToJSCValue(object);
+ JSC::JSGlobalObject *glob = d->globalObject();
if (!jscObject || !jscObject.isObject())
- jscObject = d->globalObject;
+ jscObject = glob;
// unsigned attribs = JSC::DontEnum;
- JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate));
- JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp));
- JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr));
- JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "QT_TR_NOOP"), QScript::functionQsTrNoOp));
+ JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 5, JSC::Identifier(exec, "qsTranslate"), QScript::functionQsTranslate));
+ JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 2, JSC::Identifier(exec, "QT_TRANSLATE_NOOP"), QScript::functionQsTranslateNoOp));
+ JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 3, JSC::Identifier(exec, "qsTr"), QScript::functionQsTr));
+ JSC::asObject(jscObject)->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "QT_TR_NOOP"), QScript::functionQsTrNoOp));
- d->globalObject->stringPrototype()->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, d->globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "arg"), QScript::stringProtoFuncArg));
+ glob->stringPrototype()->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, glob->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "arg"), QScript::stringProtoFuncArg));
}
/*!
@@ -3286,7 +3281,7 @@ int QScriptEngine::processEventsInterval() const
bool QScriptEngine::isEvaluating() const
{
Q_D(const QScriptEngine);
- return (d->currentFrame != d->globalObject->globalExec());
+ return (d->currentFrame != d->globalExec());
}
/*!
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index d1af106..4db77c0 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -110,6 +110,9 @@ public:
QScriptContext *contextForFrame(JSC::ExecState *frame);
void releaseContextForFrame(JSC::ExecState *frame);
+ JSC::JSGlobalObject *globalObject() const;
+ JSC::ExecState *globalExec() const;
+
void mark();
bool isCollecting() const;
void collectGarbage();
@@ -159,7 +162,6 @@ public:
#endif
JSC::JSGlobalData *globalData;
- JSC::JSGlobalObject *globalObject;
JSC::JSObject *customGlobalObject;
JSC::ExecState *currentFrame;
QHash<JSC::ExecState*, QScriptContext*> contextForFrameHash;
diff --git a/src/script/api/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp
index 7693af8..5ace14d 100644
--- a/src/script/api/qscriptvalue.cpp
+++ b/src/script/api/qscriptvalue.cpp
@@ -1982,7 +1982,7 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject);
if (!jscThisObject || !jscThisObject.isObject())
- jscThisObject = eng_p->globalObject;
+ jscThisObject = eng_p->globalObject();
QVector<JSC::JSValue> argsVector;
argsVector.resize(args.size());
@@ -2057,7 +2057,7 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject,
JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject);
if (!jscThisObject || !jscThisObject.isObject())
- jscThisObject = eng_p->globalObject;
+ jscThisObject = eng_p->globalObject();
JSC::JSValue array = eng_p->scriptValueToJSCValue(arguments);
// copied from runtime/FunctionPrototype.cpp, functionProtoFuncApply()
diff --git a/src/script/api/qscriptvalueiterator.cpp b/src/script/api/qscriptvalueiterator.cpp
index 1366c3f..dbf290b 100644
--- a/src/script/api/qscriptvalueiterator.cpp
+++ b/src/script/api/qscriptvalueiterator.cpp
@@ -114,7 +114,7 @@ public:
if (propertyNames != 0)
return;
QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(object.engine());
- JSC::ExecState *exec = eng_p->globalObject->globalExec();
+ JSC::ExecState *exec = eng_p->globalExec();
propertyNames = new JSC::PropertyNameArray(exec);
JSC::asObject(QScriptValuePrivate::get(object)->jscValue)->getPropertyNames(exec, *propertyNames);
}
diff --git a/src/script/bridge/qscriptfunction.cpp b/src/script/bridge/qscriptfunction.cpp
index 8d2f0c8..ee5c9c3 100644
--- a/src/script/bridge/qscriptfunction.cpp
+++ b/src/script/bridge/qscriptfunction.cpp
@@ -32,7 +32,7 @@ namespace QScript
FunctionWrapper::FunctionWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name,
QScriptEngine::FunctionSignature function)
- : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(),
+ : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalExec(),
length, name, proxyCall), data(new Data())
{
data->engine = engine;
@@ -85,7 +85,7 @@ JSC::JSObject* FunctionWrapper::proxyConstruct(JSC::ExecState *exec, JSC::JSObje
FunctionWithArgWrapper::FunctionWithArgWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name,
QScriptEngine::FunctionWithArgSignature function, void *arg)
- : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(),
+ : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalExec(),
length, name, proxyCall), data(new Data())
{
data->engine = engine;