aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/v8/qjsengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/qml/v8/qjsengine.cpp')
-rw-r--r--src/qml/qml/v8/qjsengine.cpp119
1 files changed, 45 insertions, 74 deletions
diff --git a/src/qml/qml/v8/qjsengine.cpp b/src/qml/qml/v8/qjsengine.cpp
index dbd0851fec..13281875e6 100644
--- a/src/qml/qml/v8/qjsengine.cpp
+++ b/src/qml/qml/v8/qjsengine.cpp
@@ -43,10 +43,13 @@
#include "qjsengine_p.h"
#include "qjsvalue.h"
#include "qjsvalue_p.h"
-#include "qscriptisolate_p.h"
-#include "qscript_impl_p.h"
#include "qv8engine_p.h"
+#include "private/qv4engine_p.h"
+#include "private/qv4mm_p.h"
+#include "private/qv4globalobject_p.h"
+#include "private/qv4script_p.h"
+
#include <QtCore/qdatetime.h>
#include <QtCore/qmetaobject.h>
#include <QtCore/qstringlist.h>
@@ -62,13 +65,13 @@
#include <qmutex.h>
#include <qwaitcondition.h>
#include <private/qqmlglobal_p.h>
+#include <qqmlengine.h>
#undef Q_D
#undef Q_Q
#define Q_D(blah)
#define Q_Q(blah)
-Q_DECLARE_METATYPE(QObjectList)
Q_DECLARE_METATYPE(QList<int>)
/*!
@@ -223,9 +226,7 @@ QJSEngine::~QJSEngine()
*/
void QJSEngine::collectGarbage()
{
- Q_D(QJSEngine);
- QScriptIsolate api(d);
- d->collectGarbage();
+ d->m_v4Engine->memoryManager->runGC();
}
/*!
@@ -258,10 +259,18 @@ void QJSEngine::collectGarbage()
*/
QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, int lineNumber)
{
- Q_D(QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return QJSValuePrivate::get(d->evaluate(program, fileName, qmlSourceCoordinate(lineNumber)));
+ QV4::ExecutionContext *ctx = d->m_v4Engine->current;
+ try {
+ QV4::Script script(ctx, program, fileName, lineNumber);
+ script.strictMode = ctx->strictMode;
+ script.inheritContext = true;
+ script.parse();
+ QV4::Value result = script.run();
+ return new QJSValuePrivate(d->m_v4Engine, result);
+ } catch (QV4::Exception& ex) {
+ ex.accept(ctx);
+ return new QJSValuePrivate(d->m_v4Engine, ex.value());
+ }
}
/*!
@@ -274,10 +283,7 @@ QJSValue QJSEngine::evaluate(const QString& program, const QString& fileName, in
*/
QJSValue QJSEngine::newObject()
{
- Q_D(QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return QJSValuePrivate::get(new QJSValuePrivate(d, v8::Object::New()));
+ return new QJSValuePrivate(d->m_v4Engine->newObject());
}
/*!
@@ -287,10 +293,11 @@ QJSValue QJSEngine::newObject()
*/
QJSValue QJSEngine::newArray(uint length)
{
- Q_D(QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return QJSValuePrivate::get(d->newArray(length));
+ QV4::ArrayObject *array = d->m_v4Engine->newArrayObject();
+ if (length < 0x1000)
+ array->arrayReserve(length);
+ array->setArrayLengthUnchecked(length);
+ return new QJSValuePrivate(array);
}
/*!
@@ -316,9 +323,9 @@ QJSValue QJSEngine::newArray(uint length)
QJSValue QJSEngine::newQObject(QObject *object)
{
Q_D(QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return d->scriptValueFromInternal(d->newQObject(object, QV8Engine::JavaScriptOwnership));
+ QV4::ExecutionEngine *v4 = QV8Engine::getV4(d);
+ QQmlEngine::setObjectOwnership(object, QQmlEngine::JavaScriptOwnership);
+ return new QJSValuePrivate(v4, QV4::QObjectWrapper::wrap(v4, object));
}
/*!
@@ -333,10 +340,7 @@ QJSValue QJSEngine::newQObject(QObject *object)
*/
QJSValue QJSEngine::globalObject() const
{
- Q_D(const QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return d->scriptValueFromInternal(d->global());
+ return new QJSValuePrivate(d->m_v4Engine->globalObject);
}
/*!
@@ -346,9 +350,7 @@ QJSValue QJSEngine::globalObject() const
QJSValue QJSEngine::create(int type, const void *ptr)
{
Q_D(QJSEngine);
- QScriptIsolate api(d, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return d->scriptValueFromInternal(d->metaTypeToJS(type, ptr));
+ return new QJSValuePrivate(d->m_v4Engine, d->metaTypeToJS(type, ptr));
}
/*!
@@ -358,51 +360,49 @@ QJSValue QJSEngine::create(int type, const void *ptr)
bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr)
{
QJSValuePrivate *vp = QJSValuePrivate::get(value);
- QV8Engine *engine = vp->engine();
+ QV8Engine *engine = vp->engine ? vp->engine->v8Engine : 0;
if (engine) {
- QScriptIsolate api(engine, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- return engine->metaTypeFromJS(*vp, type, ptr);
+ return engine->metaTypeFromJS(vp->getValue(engine->m_v4Engine), type, ptr);
} else {
switch (type) {
case QMetaType::Bool:
- *reinterpret_cast<bool*>(ptr) = vp->toBool();
+ *reinterpret_cast<bool*>(ptr) = vp->value.toBoolean();
return true;
case QMetaType::Int:
- *reinterpret_cast<int*>(ptr) = vp->toInt32();
+ *reinterpret_cast<int*>(ptr) = vp->value.toInt32();
return true;
case QMetaType::UInt:
- *reinterpret_cast<uint*>(ptr) = vp->toUInt32();
+ *reinterpret_cast<uint*>(ptr) = vp->value.toUInt32();
return true;
case QMetaType::LongLong:
- *reinterpret_cast<qlonglong*>(ptr) = vp->toInteger();
+ *reinterpret_cast<qlonglong*>(ptr) = vp->value.toInteger();
return true;
case QMetaType::ULongLong:
- *reinterpret_cast<qulonglong*>(ptr) = vp->toInteger();
+ *reinterpret_cast<qulonglong*>(ptr) = vp->value.toInteger();
return true;
case QMetaType::Double:
- *reinterpret_cast<double*>(ptr) = vp->toNumber();
+ *reinterpret_cast<double*>(ptr) = vp->value.toNumber();
return true;
case QMetaType::QString:
- *reinterpret_cast<QString*>(ptr) = vp->toString();
+ *reinterpret_cast<QString*>(ptr) = value.toString();
return true;
case QMetaType::Float:
- *reinterpret_cast<float*>(ptr) = vp->toNumber();
+ *reinterpret_cast<float*>(ptr) = vp->value.toNumber();
return true;
case QMetaType::Short:
- *reinterpret_cast<short*>(ptr) = vp->toInt32();
+ *reinterpret_cast<short*>(ptr) = vp->value.toInt32();
return true;
case QMetaType::UShort:
- *reinterpret_cast<unsigned short*>(ptr) = vp->toUInt16();
+ *reinterpret_cast<unsigned short*>(ptr) = vp->value.toUInt16();
return true;
case QMetaType::Char:
- *reinterpret_cast<char*>(ptr) = vp->toInt32();
+ *reinterpret_cast<char*>(ptr) = vp->value.toInt32();
return true;
case QMetaType::UChar:
- *reinterpret_cast<unsigned char*>(ptr) = vp->toUInt16();
+ *reinterpret_cast<unsigned char*>(ptr) = vp->value.toUInt16();
return true;
case QMetaType::QChar:
- *reinterpret_cast<QChar*>(ptr) = vp->toUInt16();
+ *reinterpret_cast<QChar*>(ptr) = vp->value.toUInt16();
return true;
default:
return false;
@@ -424,35 +424,6 @@ bool QJSEngine::convertV2(const QJSValue &value, int type, void *ptr)
\sa toScriptValue()
*/
-/*!
- \internal
-
- Returns this engine's internal V8 context.
-
- The context enables direct use of the V8 API.
- The caller is responsible for ensuring that a handle scope is in place,
- and for entering/exiting the context.
- Example:
-
- \code
- QJSEngine eng;
- ...
- v8::HandleScope handleScope;
- v8::Local<v8::Context> context = qt_QJSEngineV8Context(&eng);
- v8::Context::Scope contextScope(context);
-
- // Do stuff (e.g., call v8::Script::Compile()) ...
- \endcode
-
- \sa qt_QJSValueV8Value()
-*/
-Q_QML_EXPORT v8::Local<v8::Context> qt_QJSEngineV8Context(QJSEngine *engine)
-{
- Q_ASSERT(engine != 0);
- QV8Engine *d = engine->handle();
- return v8::Local<v8::Context>::New(d->context());
-}
-
QT_END_NAMESPACE
#include "moc_qjsengine.cpp"