diff options
Diffstat (limited to 'src/qml/jsapi')
-rw-r--r-- | src/qml/jsapi/qjsengine.cpp | 72 | ||||
-rw-r--r-- | src/qml/jsapi/qjsengine.h | 11 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue.cpp | 50 | ||||
-rw-r--r-- | src/qml/jsapi/qjsvalue.h | 6 |
4 files changed, 72 insertions, 67 deletions
diff --git a/src/qml/jsapi/qjsengine.cpp b/src/qml/jsapi/qjsengine.cpp index 6cab8def4f..1c1314f05d 100644 --- a/src/qml/jsapi/qjsengine.cpp +++ b/src/qml/jsapi/qjsengine.cpp @@ -304,8 +304,9 @@ QJSEngine::QJSEngine() QJSEngine::QJSEngine(QObject *parent) : QObject(*new QJSEnginePrivate, parent) - , d(new QV8Engine(this)) + , m_v4Engine(new QV4::ExecutionEngine) { + m_v4Engine->v8Engine = new QV8Engine(this, m_v4Engine); checkForApplicationInstance(); QJSEnginePrivate::addToDebugServer(this); @@ -316,8 +317,9 @@ QJSEngine::QJSEngine(QObject *parent) */ QJSEngine::QJSEngine(QJSEnginePrivate &dd, QObject *parent) : QObject(dd, parent) - , d(new QV8Engine(this)) + , m_v4Engine(new QV4::ExecutionEngine) { + m_v4Engine->v8Engine = new QV8Engine(this, m_v4Engine); checkForApplicationInstance(); } @@ -331,11 +333,12 @@ QJSEngine::QJSEngine(QJSEnginePrivate &dd, QObject *parent) QJSEngine::~QJSEngine() { QJSEnginePrivate::removeFromDebugServer(this); - delete d; + delete m_v4Engine->v8Engine; + delete m_v4Engine; } /*! - \fn QV8Engine *QJSEngine::handle() const + \fn QV4::ExecutionEngine *QJSEngine::handle() const \internal */ @@ -352,7 +355,7 @@ QJSEngine::~QJSEngine() */ void QJSEngine::collectGarbage() { - d->m_v4Engine->memoryManager->runGC(); + m_v4Engine->memoryManager->runGC(); } #if QT_DEPRECATED_SINCE(5, 6) @@ -409,12 +412,12 @@ void QJSEngine::installTranslatorFunctions(const QJSValue &object) void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object) { QV4::ExecutionEngine *otherEngine = QJSValuePrivate::engine(&object); - if (otherEngine && otherEngine != d->m_v4Engine) { + if (otherEngine && otherEngine != m_v4Engine) { qWarning("QJSEngine: Trying to install extensions from a different engine"); return; } - QV4::Scope scope(d->m_v4Engine); + QV4::Scope scope(m_v4Engine); QV4::ScopedObject obj(scope); QV4::Value *val = QJSValuePrivate::getValue(&object); if (val) @@ -455,17 +458,16 @@ void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSVal */ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, int lineNumber) { - QV4::ExecutionEngine *v4 = d->m_v4Engine; + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); - QV4::ExecutionContextSaver saver(scope); - - QV4::ExecutionContext *ctx = v4->currentContext; - if (ctx->d() != v4->rootContext()->d()) - ctx = v4->pushGlobalContext(); QV4::ScopedValue result(scope); - QV4::Script script(ctx, program, fileName, lineNumber); - script.strictMode = ctx->d()->strictMode; + QV4::Script script(v4->rootContext(), QV4::Compiler::GlobalCode, program, fileName, lineNumber); + script.strictMode = false; + if (v4->currentStackFrame) + script.strictMode = v4->currentStackFrame->v4Function->isStrict(); + else if (v4->globalCode) + script.strictMode = v4->globalCode->isStrict(); script.inheritContext = true; script.parse(); if (!scope.engine->hasException) @@ -473,7 +475,9 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in if (scope.engine->hasException) result = v4->catchException(); - return QJSValue(v4, result->asReturnedValue()); + QJSValue retval(v4, result->asReturnedValue()); + + return retval; } /*! @@ -486,9 +490,9 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in */ QJSValue QJSEngine::newObject() { - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedValue v(scope, d->m_v4Engine->newObject()); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedValue v(scope, m_v4Engine->newObject()); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -498,12 +502,12 @@ QJSValue QJSEngine::newObject() */ QJSValue QJSEngine::newArray(uint length) { - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedArrayObject array(scope, d->m_v4Engine->newArrayObject()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedArrayObject array(scope, m_v4Engine->newArrayObject()); if (length < 0x1000) array->arrayReserve(length); array->setArrayLengthUnchecked(length); - return QJSValue(d->m_v4Engine, array.asReturnedValue()); + return QJSValue(m_v4Engine, array.asReturnedValue()); } /*! @@ -529,7 +533,7 @@ QJSValue QJSEngine::newArray(uint length) QJSValue QJSEngine::newQObject(QObject *object) { Q_D(QJSEngine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(d); + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); if (object) { QQmlData *ddata = QQmlData::get(object, true); @@ -556,13 +560,13 @@ QJSValue QJSEngine::newQObject(QObject *object) QJSValue QJSEngine::newQMetaObject(const QMetaObject* metaObject) { Q_D(QJSEngine); - QV4::ExecutionEngine *v4 = QV8Engine::getV4(d); + QV4::ExecutionEngine *v4 = m_v4Engine; QV4::Scope scope(v4); QV4::ScopedValue v(scope, QV4::QMetaObjectWrapper::create(v4, metaObject)); return QJSValue(v4, v->asReturnedValue()); } -/*! \fn QJSValue QJSEngine::newQMetaObject<T>() +/*! \fn template <typename T> QJSValue QJSEngine::newQMetaObject() \since 5.8 Creates a JavaScript object that wraps the static QMetaObject associated @@ -584,10 +588,9 @@ QJSValue QJSEngine::newQMetaObject(const QMetaObject* metaObject) { */ QJSValue QJSEngine::globalObject() const { - Q_D(const QJSEngine); - QV4::Scope scope(d->m_v4Engine); - QV4::ScopedValue v(scope, d->m_v4Engine->globalObject); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + QV4::Scope scope(m_v4Engine); + QV4::ScopedValue v(scope, m_v4Engine->globalObject); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -596,10 +599,9 @@ QJSValue QJSEngine::globalObject() const */ QJSValue QJSEngine::create(int type, const void *ptr) { - Q_D(QJSEngine); - QV4::Scope scope(d->m_v4Engine); + QV4::Scope scope(m_v4Engine); QV4::ScopedValue v(scope, scope.engine->metaTypeToJS(type, ptr)); - return QJSValue(d->m_v4Engine, v->asReturnedValue()); + return QJSValue(m_v4Engine, v->asReturnedValue()); } /*! @@ -722,14 +724,14 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) } } -/*! \fn QJSValue QJSEngine::toScriptValue(const T &value) +/*! \fn template <typename T> QJSValue QJSEngine::toScriptValue(const T &value) Creates a QJSValue with the given \a value. \sa fromScriptValue() */ -/*! \fn T QJSEngine::fromScriptValue(const QJSValue &value) +/*! \fn template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value) Returns the given \a value converted to the template type \c{T}. @@ -739,7 +741,7 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr) QJSEnginePrivate *QJSEnginePrivate::get(QV4::ExecutionEngine *e) { - return e->v8Engine->publicEngine()->d_func(); + return e->jsEngine()->d_func(); } QJSEnginePrivate::~QJSEnginePrivate() diff --git a/src/qml/jsapi/qjsengine.h b/src/qml/jsapi/qjsengine.h index 41c4b81270..89642b6f20 100644 --- a/src/qml/jsapi/qjsengine.h +++ b/src/qml/jsapi/qjsengine.h @@ -47,10 +47,10 @@ #include <QtCore/qobject.h> #include <QtQml/qjsvalue.h> -QT_BEGIN_NAMESPACE +#include <QtQml/qqmldebug.h> +QT_BEGIN_NAMESPACE -class QV8Engine; template <typename T> inline T qjsvalue_cast(const QJSValue &); @@ -109,7 +109,7 @@ public: void installExtensions(Extensions extensions, const QJSValue &object = QJSValue()); - QV8Engine *handle() const { return d; } + QV4::ExecutionEngine *handle() const { return m_v4Engine; } private: QJSValue create(int type, const void *ptr); @@ -119,13 +119,12 @@ private: friend inline bool qjsvalue_cast_helper(const QJSValue &, int, void *); protected: - QJSEngine(QJSEnginePrivate &dd, QObject *parent = Q_NULLPTR); + QJSEngine(QJSEnginePrivate &dd, QObject *parent = nullptr); private: - QV8Engine *d; + QV4::ExecutionEngine *m_v4Engine; Q_DISABLE_COPY(QJSEngine) Q_DECLARE_PRIVATE(QJSEngine) - friend class QV8Engine; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QJSEngine::Extensions) diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp index 24aa4ac5f2..c4090ac482 100644 --- a/src/qml/jsapi/qjsvalue.cpp +++ b/src/qml/jsapi/qjsvalue.cpp @@ -53,7 +53,7 @@ #include "qv4errorobject_p.h" #include "private/qv8engine_p.h" #include <private/qv4mm_p.h> -#include <private/qv4scopedvalue_p.h> +#include <private/qv4jscall_p.h> #include <private/qv4qobjectwrapper_p.h> /*! @@ -152,6 +152,13 @@ \value NullValue A null value. */ +/*! + \typedef QJSValueList + \relates QJSValue + + This is a typedef for a QList<QJSValue>. +*/ + QT_BEGIN_NAMESPACE using namespace QV4; @@ -257,7 +264,7 @@ QJSValue::QJSValue(const QJSValue& other) */ /*! - \fn QJSValue &operator=(QJSValue && other) + \fn QJSValue &QJSValue::operator=(QJSValue && other) Move-assigns \a other to this QJSValue object. */ @@ -689,21 +696,21 @@ QJSValue QJSValue::call(const QJSValueList &args) Q_ASSERT(engine); Scope scope(engine); - ScopedCallData callData(scope, args.length()); - callData->thisObject = engine->globalObject; + JSCallData jsCallData(scope, args.length()); + *jsCallData->thisObject = engine->globalObject; for (int i = 0; i < args.size(); ++i) { if (!QJSValuePrivate::checkEngine(engine, args.at(i))) { qWarning("QJSValue::call() failed: cannot call function with argument created in a different engine"); return QJSValue(); } - callData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); + jsCallData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); } - f->call(scope, callData); + ScopedValue result(scope, f->call(jsCallData)); if (engine->hasException) - scope.result = engine->catchException(); + result = engine->catchException(); - return QJSValue(engine, scope.result.asReturnedValue()); + return QJSValue(engine, result->asReturnedValue()); } /*! @@ -745,21 +752,21 @@ QJSValue QJSValue::callWithInstance(const QJSValue &instance, const QJSValueList return QJSValue(); } - ScopedCallData callData(scope, args.size()); - callData->thisObject = QJSValuePrivate::convertedToValue(engine, instance); + JSCallData jsCallData(scope, args.size()); + *jsCallData->thisObject = QJSValuePrivate::convertedToValue(engine, instance); for (int i = 0; i < args.size(); ++i) { if (!QJSValuePrivate::checkEngine(engine, args.at(i))) { qWarning("QJSValue::call() failed: cannot call function with argument created in a different engine"); return QJSValue(); } - callData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); + jsCallData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); } - f->call(scope, callData); + ScopedValue result(scope, f->call(jsCallData)); if (engine->hasException) - scope.result = engine->catchException(); + result = engine->catchException(); - return QJSValue(engine, scope.result.asReturnedValue()); + return QJSValue(engine, result->asReturnedValue()); } /*! @@ -794,20 +801,20 @@ QJSValue QJSValue::callAsConstructor(const QJSValueList &args) Q_ASSERT(engine); Scope scope(engine); - ScopedCallData callData(scope, args.size()); + JSCallData jsCallData(scope, args.size()); for (int i = 0; i < args.size(); ++i) { if (!QJSValuePrivate::checkEngine(engine, args.at(i))) { qWarning("QJSValue::callAsConstructor() failed: cannot construct function with argument created in a different engine"); return QJSValue(); } - callData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); + jsCallData->args[i] = QJSValuePrivate::convertedToValue(engine, args.at(i)); } - f->construct(scope, callData); + ScopedValue result(scope, f->callAsConstructor(jsCallData)); if (engine->hasException) - scope.result = engine->catchException(); + result = engine->catchException(); - return QJSValue(engine, scope.result.asReturnedValue()); + return QJSValue(engine, result->asReturnedValue()); } #ifdef QT_DEPRECATED @@ -1242,10 +1249,7 @@ bool QJSValue::deleteProperty(const QString &name) return false; ScopedString s(scope, engine->newString(name)); - bool b = o->deleteProperty(s); - if (engine->hasException) - engine->catchException(); - return b; + return o->deleteProperty(s); } /*! diff --git a/src/qml/jsapi/qjsvalue.h b/src/qml/jsapi/qjsvalue.h index ab20a2607d..56bd64eec1 100644 --- a/src/qml/jsapi/qjsvalue.h +++ b/src/qml/jsapi/qjsvalue.h @@ -133,9 +133,9 @@ public: bool deleteProperty(const QString &name); bool isCallable() const; - QJSValue call(const QJSValueList &args = QJSValueList()); - QJSValue callWithInstance(const QJSValue &instance, const QJSValueList &args = QJSValueList()); - QJSValue callAsConstructor(const QJSValueList &args = QJSValueList()); + QJSValue call(const QJSValueList &args = QJSValueList()); // ### Qt6: Make const + QJSValue callWithInstance(const QJSValue &instance, const QJSValueList &args = QJSValueList()); // ### Qt6: Make const + QJSValue callAsConstructor(const QJSValueList &args = QJSValueList()); // ### Qt6: Make const #ifdef QT_DEPRECATED QT_DEPRECATED QJSEngine *engine() const; |