diff options
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/particles.pri | 4 | ||||
-rw-r--r-- | src/particles/particles.pro | 1 | ||||
-rw-r--r-- | src/particles/qquickcustomaffector.cpp | 17 | ||||
-rw-r--r-- | src/particles/qquickcustomaffector_p.h | 2 | ||||
-rw-r--r-- | src/particles/qquickfriction.cpp | 2 | ||||
-rw-r--r-- | src/particles/qquickparticleemitter.cpp | 13 | ||||
-rw-r--r-- | src/particles/qquickparticleemitter_p.h | 2 | ||||
-rw-r--r-- | src/particles/qquickparticlesystem.cpp | 8 | ||||
-rw-r--r-- | src/particles/qquickparticlesystem_p.h | 8 | ||||
-rw-r--r-- | src/particles/qquicktrailemitter.cpp | 15 | ||||
-rw-r--r-- | src/particles/qquicktrailemitter_p.h | 2 | ||||
-rw-r--r-- | src/particles/qquickv4particledata.cpp (renamed from src/particles/qquickv8particledata.cpp) | 227 | ||||
-rw-r--r-- | src/particles/qquickv4particledata_p.h (renamed from src/particles/qquickv8particledata_p.h) | 12 |
13 files changed, 166 insertions, 147 deletions
diff --git a/src/particles/particles.pri b/src/particles/particles.pri index 3e083ab291..9b41a30d6b 100644 --- a/src/particles/particles.pri +++ b/src/particles/particles.pri @@ -25,7 +25,7 @@ HEADERS += \ $$PWD/qquickturbulence_p.h \ $$PWD/qquickwander_p.h \ $$PWD/qquickcumulativedirection_p.h \ - $$PWD/qquickv8particledata_p.h \ + $$PWD/qquickv4particledata_p.h \ $$PWD/qquickrectangleextruder_p.h \ $$PWD/qquickparticlegroup_p.h \ $$PWD/qquickgroupgoal_p.h \ @@ -58,7 +58,7 @@ SOURCES += \ $$PWD/qquickturbulence.cpp \ $$PWD/qquickwander.cpp \ $$PWD/qquickcumulativedirection.cpp \ - $$PWD/qquickv8particledata.cpp \ + $$PWD/qquickv4particledata.cpp \ $$PWD/qquickrectangleextruder.cpp \ $$PWD/qquickparticlegroup.cpp \ $$PWD/qquickgroupgoal.cpp diff --git a/src/particles/particles.pro b/src/particles/particles.pro index 632856ccca..71be71ae25 100644 --- a/src/particles/particles.pro +++ b/src/particles/particles.pro @@ -3,7 +3,6 @@ TARGET = QtQuickParticles CONFIG += internal_module QT = core-private gui-private qml-private quick-private -QT_PRIVATE = v8-private DEFINES += QT_NO_URL_CAST_FROM_STRING QT_NO_INTEGER_EVENT_COORDINATES win32-msvc*:DEFINES *= _CRT_SECURE_NO_WARNINGS diff --git a/src/particles/qquickcustomaffector.cpp b/src/particles/qquickcustomaffector.cpp index 99984bf804..40d0df1a22 100644 --- a/src/particles/qquickcustomaffector.cpp +++ b/src/particles/qquickcustomaffector.cpp @@ -103,7 +103,7 @@ QQuickCustomAffector::QQuickCustomAffector(QQuickItem *parent) : bool QQuickCustomAffector::isAffectConnected() { - IS_SIGNAL_CONNECTED(this, QQuickCustomAffector, affectParticles, (QQmlV8Handle,qreal)); + IS_SIGNAL_CONNECTED(this, QQuickCustomAffector, affectParticles, (QQmlV4Handle,qreal)); } void QQuickCustomAffector::affectSystem(qreal dt) @@ -143,15 +143,16 @@ void QQuickCustomAffector::affectSystem(qreal dt) if (m_onceOff) dt = 1.0; - v8::HandleScope handle_scope; - v8::Context::Scope scope(QQmlEnginePrivate::getV8Engine(qmlEngine(this))->context()); - v8::Handle<v8::Array> array = v8::Array::New(toAffect.size()); + QQmlEngine *qmlEngine = ::qmlEngine(this); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + + QV4::ArrayObject *array = v4->newArrayObject(toAffect.size()); for (int i=0; i<toAffect.size(); i++) - array->Set(i, toAffect[i]->v8Value().toHandle()); + array->putIndexed(i, toAffect[i]->v4Value().toValue()); if (dt >= simulationCutoff || dt <= simulationDelta) { affectProperties(toAffect, dt); - emit affectParticles(QQmlV8Handle::fromHandle(array), dt); + emit affectParticles(QQmlV4Handle(QV4::Value::fromObject(array)), dt); } else { int realTime = m_system->timeInt; m_system->timeInt -= dt * 1000.0; @@ -159,12 +160,12 @@ void QQuickCustomAffector::affectSystem(qreal dt) m_system->timeInt += simulationDelta * 1000.0; dt -= simulationDelta; affectProperties(toAffect, simulationDelta); - emit affectParticles(QQmlV8Handle::fromHandle(array), simulationDelta); + emit affectParticles(QQmlV4Handle(QV4::Value::fromObject(array)), simulationDelta); } m_system->timeInt = realTime; if (dt > 0.0) { affectProperties(toAffect, dt); - emit affectParticles(QQmlV8Handle::fromHandle(array), dt); + emit affectParticles(QQmlV4Handle(QV4::Value::fromObject(array)), dt); } } diff --git a/src/particles/qquickcustomaffector_p.h b/src/particles/qquickcustomaffector_p.h index a4a077f864..1a12684c48 100644 --- a/src/particles/qquickcustomaffector_p.h +++ b/src/particles/qquickcustomaffector_p.h @@ -99,7 +99,7 @@ public: signals: - void affectParticles(QQmlV8Handle particles, qreal dt); + void affectParticles(QQmlV4Handle particles, qreal dt); void positionChanged(QQuickDirection * arg); diff --git a/src/particles/qquickfriction.cpp b/src/particles/qquickfriction.cpp index 6d82408707..4802077100 100644 --- a/src/particles/qquickfriction.cpp +++ b/src/particles/qquickfriction.cpp @@ -40,6 +40,8 @@ ****************************************************************************/ #include "qquickfriction_p.h" +#include <math.h> + QT_BEGIN_NAMESPACE /*! \qmltype Friction diff --git a/src/particles/qquickparticleemitter.cpp b/src/particles/qquickparticleemitter.cpp index 6d9b945def..6627291c55 100644 --- a/src/particles/qquickparticleemitter.cpp +++ b/src/particles/qquickparticleemitter.cpp @@ -256,7 +256,7 @@ QQuickParticleEmitter::~QQuickParticleEmitter() bool QQuickParticleEmitter::isEmitConnected() { - IS_SIGNAL_CONNECTED(this, QQuickParticleEmitter, emitParticles, (QQmlV8Handle)); + IS_SIGNAL_CONNECTED(this, QQuickParticleEmitter, emitParticles, (QQmlV4Handle)); } void QQuickParticleEmitter::componentComplete() @@ -479,15 +479,16 @@ void QQuickParticleEmitter::emitWindow(int timeStamp) m_system->emitParticle(d); if (isEmitConnected()) { + QQmlEngine *qmlEngine = ::qmlEngine(this); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + //Done after emitParticle so that the Painter::load is done first, this allows you to customize its static variables //We then don't need to request another reload, because the first reload isn't scheduled until we get back to the render thread - v8::HandleScope handle_scope; - v8::Context::Scope scope(QQmlEnginePrivate::getV8Engine(qmlEngine(this))->context()); - v8::Handle<v8::Array> array = v8::Array::New(toEmit.size()); + QV4::ArrayObject *array = v4->newArrayObject(toEmit.size()); for (int i=0; i<toEmit.size(); i++) - array->Set(i, toEmit[i]->v8Value().toHandle()); + array->putIndexed(i, toEmit[i]->v4Value().toValue()); - emitParticles(QQmlV8Handle::fromHandle(array));//A chance for arbitrary JS changes + emitParticles(QQmlV4Handle(QV4::Value::fromObject(array)));//A chance for arbitrary JS changes } m_last_emission = pt; diff --git a/src/particles/qquickparticleemitter_p.h b/src/particles/qquickparticleemitter_p.h index 70de934f6d..051e27816d 100644 --- a/src/particles/qquickparticleemitter_p.h +++ b/src/particles/qquickparticleemitter_p.h @@ -119,7 +119,7 @@ public: void setVelocityFromMovement(qreal s); virtual void componentComplete(); signals: - void emitParticles(QQmlV8Handle particles); + void emitParticles(QQmlV4Handle particles); void particlesPerSecondChanged(qreal); void particleDurationChanged(int); void enabledChanged(bool); diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp index 1e59290ceb..b13020fc7d 100644 --- a/src/particles/qquickparticlesystem.cpp +++ b/src/particles/qquickparticlesystem.cpp @@ -46,7 +46,7 @@ #include "qquickparticlepainter_p.h" #include <private/qquickspriteengine_p.h> #include <private/qquicksprite_p.h> -#include "qquickv8particledata_p.h" +#include "qquickv4particledata_p.h" #include "qquickparticlegroup_p.h" #include "qquicktrailemitter_p.h"//###For auto-follow on states, perhaps should be in emitter? @@ -527,11 +527,11 @@ void QQuickParticleData::clone(const QQuickParticleData& other) animationOwner = other.animationOwner; } -QQmlV8Handle QQuickParticleData::v8Value() +QQmlV4Handle QQuickParticleData::v4Value() { if (!v8Datum) - v8Datum = new QQuickV8ParticleData(QQmlEnginePrivate::getV8Engine(qmlEngine(system)), this); - return v8Datum->v8Value(); + v8Datum = new QQuickV4ParticleData(QQmlEnginePrivate::getV8Engine(qmlEngine(system)), this); + return v8Datum->v4Value(); } //sets the x accleration without affecting the instantaneous x velocity or position void QQuickParticleData::setInstantaneousAX(qreal ax) diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index 1177e30b8f..df57cd2cc7 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -51,7 +51,7 @@ #include <private/qquicksprite_p.h> #include <QAbstractAnimation> #include <QtQml/qqml.h> -#include <private/qv8engine_p.h> //For QQmlV8Handle +#include <private/qv8engine_p.h> //For QQmlV4Handle QT_BEGIN_NAMESPACE @@ -63,7 +63,7 @@ class QQuickParticleData; class QQuickParticleSystemAnimation; class QQuickStochasticEngine; class QQuickSprite; -class QQuickV8ParticleData; +class QQuickV4ParticleData; class QQuickParticleGroup; class QQuickImageParticle; @@ -228,10 +228,10 @@ public: float lifeLeft(); float curSize(); void clone(const QQuickParticleData& other);//Not =, leaves meta-data like index - QQmlV8Handle v8Value(); + QQmlV4Handle v4Value(); void extendLife(float time); private: - QQuickV8ParticleData* v8Datum; + QQuickV4ParticleData* v8Datum; }; class Q_AUTOTEST_EXPORT QQuickParticleSystem : public QQuickItem diff --git a/src/particles/qquicktrailemitter.cpp b/src/particles/qquicktrailemitter.cpp index 8b14626b54..4f4a05d09a 100644 --- a/src/particles/qquicktrailemitter.cpp +++ b/src/particles/qquicktrailemitter.cpp @@ -129,7 +129,7 @@ QQuickTrailEmitter::QQuickTrailEmitter(QQuickItem *parent) : bool QQuickTrailEmitter::isEmitFollowConnected() { - IS_SIGNAL_CONNECTED(this, QQuickTrailEmitter, emitFollowParticles, (QQmlV8Handle,QQmlV8Handle)); + IS_SIGNAL_CONNECTED(this, QQuickTrailEmitter, emitFollowParticles, (QQmlV4Handle,QQmlV4Handle)); } void QQuickTrailEmitter::recalcParticlesPerSecond(){ @@ -269,16 +269,17 @@ void QQuickTrailEmitter::emitWindow(int timeStamp) m_system->emitParticle(d); if (isEmitConnected() || isEmitFollowConnected()) { - v8::HandleScope handle_scope; - v8::Context::Scope scope(QQmlEnginePrivate::getV8Engine(qmlEngine(this))->context()); - v8::Handle<v8::Array> array = v8::Array::New(toEmit.size()); + QQmlEngine *qmlEngine = ::qmlEngine(this); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(qmlEngine->handle()); + + QV4::ArrayObject *array = v4->newArrayObject(toEmit.size()); for (int i=0; i<toEmit.size(); i++) - array->Set(i, toEmit[i]->v8Value().toHandle()); + array->putIndexed(i, toEmit[i]->v4Value().toValue()); if (isEmitFollowConnected()) - emitFollowParticles(QQmlV8Handle::fromHandle(array), d->v8Value());//A chance for many arbitrary JS changes + emitFollowParticles(QQmlV4Handle(QV4::Value::fromObject(array)), d->v4Value());//A chance for many arbitrary JS changes else if (isEmitConnected()) - emitParticles(QQmlV8Handle::fromHandle(array));//A chance for arbitrary JS changes + emitParticles(QQmlV4Handle(QV4::Value::fromObject(array)));//A chance for arbitrary JS changes } m_lastEmission[d->index] = pt; } diff --git a/src/particles/qquicktrailemitter_p.h b/src/particles/qquicktrailemitter_p.h index 3ae1507f1a..54041f1751 100644 --- a/src/particles/qquicktrailemitter_p.h +++ b/src/particles/qquicktrailemitter_p.h @@ -91,7 +91,7 @@ public: } signals: - void emitFollowParticles(QQmlV8Handle particles, QQmlV8Handle followed); + void emitFollowParticles(QQmlV4Handle particles, QQmlV4Handle followed); void particlesPerParticlePerSecondChanged(int arg); diff --git a/src/particles/qquickv8particledata.cpp b/src/particles/qquickv4particledata.cpp index 44f992c163..a5ec20aabb 100644 --- a/src/particles/qquickv8particledata.cpp +++ b/src/particles/qquickv4particledata.cpp @@ -39,9 +39,12 @@ ** ****************************************************************************/ -#include "qquickv8particledata_p.h" +#include <math.h> +#include "qquickv4particledata_p.h" #include "qquickparticlesystem_p.h"//for QQuickParticleData #include <QDebug> +#include <private/qv4engine_p.h> +#include <private/qv4functionobject_p.h> QT_BEGIN_NAMESPACE @@ -268,125 +271,140 @@ QT_BEGIN_NAMESPACE //### Particle data handles are not locked to within certain scopes like QQuickContext2D, but there's no way to reload either... -class QV8ParticleDataResource : public QV8ObjectResource +struct QV4ParticleData : public QV4::Object { - V8_RESOURCE_TYPE(ParticleDataType) -public: - QV8ParticleDataResource(QV8Engine *e) : QV8ObjectResource(e) {} + Q_MANAGED + QV4ParticleData(QV4::ExecutionEngine *engine, QQuickParticleData *datum) + : Object(engine) + { + vtbl = &static_vtbl; + this->datum = datum; + } + QQuickParticleData* datum;//TODO: Guard needed? + + static void destroy(Managed *that) + { that->as<QV4ParticleData>()->~QV4ParticleData(); } }; +DEFINE_MANAGED_VTABLE(QV4ParticleData); + class QV8ParticleDataDeletable : public QV8Engine::Deletable { public: QV8ParticleDataDeletable(QV8Engine *engine); ~QV8ParticleDataDeletable(); - v8::Persistent<v8::Function> constructor; + QV4::PersistentValue proto; }; -static v8::Handle<v8::Value> particleData_discard(const v8::Arguments &args) +static QV4::Value particleData_discard(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V8THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); r->datum->lifeSpan = 0; //Don't kill(), because it could still be in the middle of being created - return v8::Undefined(); + return QV4::Value::undefinedValue(); } -static v8::Handle<v8::Value> particleData_lifeLeft(const v8::Arguments &args) +static QV4::Value particleData_lifeLeft(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V8THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); - return v8::Number::New(r->datum->lifeLeft()); + return QV4::Value::fromDouble(r->datum->lifeLeft()); } -static v8::Handle<v8::Value> particleData_curSize(const v8::Arguments &args) +static QV4::Value particleData_curSize(QV4::SimpleCallContext *ctx) { - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(args.This()); + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); if (!r || !r->datum) - V8THROW_ERROR("Not a valid ParticleData object"); + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); - return v8::Number::New(r->datum->curSize()); + return QV4::Value::fromDouble(r->datum->curSize()); } -#define COLOR_GETTER_AND_SETTER(VAR, NAME) static v8::Handle<v8::Value> particleData_get_ ## NAME (v8::Local<v8::String>, const v8::AccessorInfo &info) \ +#define COLOR_GETTER_AND_SETTER(VAR, NAME) static QV4::Value particleData_get_ ## NAME (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ - return v8::Number::New((r->datum->color. VAR )/255.0);\ + return QV4::Value::fromDouble((r->datum->color. VAR )/255.0);\ }\ \ -static void particleData_set_ ## NAME (v8::Local<v8::String>, v8::Local<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## NAME (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum->color. VAR = qMin(255, qMax(0, (int)floor(value->NumberValue() * 255.0)));\ + r->datum->color. VAR = qMin(255, qMax(0, (int)floor(ctx->argument(0).toNumber() * 255.0)));\ + return QV4::Value::undefinedValue(); \ } -#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Local<v8::String>, const v8::AccessorInfo &info) \ +#define SEMIBOOL_GETTER_AND_SETTER(VARIABLE) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ - return v8::Boolean::New(r->datum-> VARIABLE);\ + return QV4::Value::fromBoolean(r->datum-> VARIABLE);\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Local<v8::String>, v8::Local<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> VARIABLE = value->BooleanValue() ? 1.0 : 0.0;\ + r->datum-> VARIABLE = ctx->argument(0).toBoolean() ? 1.0 : 0.0;\ + return QV4::Value::undefinedValue(); \ } -#define FLOAT_GETTER_AND_SETTER(VARIABLE) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Local<v8::String>, const v8::AccessorInfo &info) \ +#define FLOAT_GETTER_AND_SETTER(VARIABLE) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ - return v8::Number::New(r->datum-> VARIABLE);\ + return QV4::Value::fromDouble(r->datum-> VARIABLE);\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Local<v8::String>, v8::Local<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> VARIABLE = value->NumberValue();\ + r->datum-> VARIABLE = ctx->argument(0).toNumber();\ + return QV4::Value::undefinedValue(); \ } -#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER) static v8::Handle<v8::Value> particleData_get_ ## VARIABLE (v8::Local<v8::String>, const v8::AccessorInfo &info) \ +#define FAKE_FLOAT_GETTER_AND_SETTER(VARIABLE, GETTER, SETTER) static QV4::Value particleData_get_ ## VARIABLE (QV4::SimpleCallContext *ctx) \ { \ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This()); \ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum) \ - V8THROW_ERROR("Not a valid ParticleData object"); \ + ctx->throwError(QStringLiteral("Not a valid ParticleData object")); \ \ - return v8::Number::New(r->datum-> GETTER ());\ + return QV4::Value::fromDouble(r->datum-> GETTER ());\ }\ \ -static void particleData_set_ ## VARIABLE (v8::Local<v8::String>, v8::Local<v8::Value> value, const v8::AccessorInfo &info)\ +static QV4::Value particleData_set_ ## VARIABLE (QV4::SimpleCallContext *ctx)\ {\ - QV8ParticleDataResource *r = v8_resource_cast<QV8ParticleDataResource>(info.This());\ + QV4ParticleData *r = ctx->thisObject.as<QV4ParticleData>(); \ if (!r || !r->datum)\ - V8THROW_ERROR_SETTER("Not a valid ParticleData object");\ + ctx->throwError(QStringLiteral("Not a valid ParticleData object"));\ \ - r->datum-> SETTER ( value->NumberValue() );\ + r->datum-> SETTER ( ctx->argument(0).toNumber() );\ + return QV4::Value::undefinedValue(); \ } -#define REGISTER_ACCESSOR(FT, ENGINE, VARIABLE, NAME) FT ->PrototypeTemplate()->SetAccessor( v8::String::New( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE , v8::External::New(ENGINE)) +#define REGISTER_ACCESSOR(PROTO, ENGINE, VARIABLE, NAME) \ + PROTO ->defineAccessorProperty( ENGINE, QStringLiteral( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE ) COLOR_GETTER_AND_SETTER(r, red) COLOR_GETTER_AND_SETTER(g, green) @@ -425,82 +443,77 @@ FAKE_FLOAT_GETTER_AND_SETTER(curAY, curAY, setInstantaneousAY) QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine) { - v8::HandleScope handle_scope; - v8::Context::Scope scope(engine->context()); - - v8::Local<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(); - ft->InstanceTemplate()->SetHasExternalResource(true); - ft->PrototypeTemplate()->Set(v8::String::New("discard"), V8FUNCTION(particleData_discard, engine)); - ft->PrototypeTemplate()->Set(v8::String::New("lifeLeft"), V8FUNCTION(particleData_lifeLeft, engine)); - ft->PrototypeTemplate()->Set(v8::String::New("currentSize"), V8FUNCTION(particleData_curSize, engine)); - REGISTER_ACCESSOR(ft, engine, x, initialX); - REGISTER_ACCESSOR(ft, engine, y, initialY); - REGISTER_ACCESSOR(ft, engine, t, t); - REGISTER_ACCESSOR(ft, engine, lifeSpan, lifeSpan); - REGISTER_ACCESSOR(ft, engine, size, startSize); - REGISTER_ACCESSOR(ft, engine, endSize, endSize); - REGISTER_ACCESSOR(ft, engine, vx, initialVX); - REGISTER_ACCESSOR(ft, engine, vy, initialVY); - REGISTER_ACCESSOR(ft, engine, ax, initialAX); - REGISTER_ACCESSOR(ft, engine, ay, initialAY); - REGISTER_ACCESSOR(ft, engine, xx, xDeformationVectorX); - REGISTER_ACCESSOR(ft, engine, xy, xDeformationVectorY); - REGISTER_ACCESSOR(ft, engine, yx, yDeformationVectorX); - REGISTER_ACCESSOR(ft, engine, yy, yDeformationVectorY); - REGISTER_ACCESSOR(ft, engine, rotation, rotation); - REGISTER_ACCESSOR(ft, engine, rotationVelocity, rotationVelocity); - REGISTER_ACCESSOR(ft, engine, autoRotate, autoRotate); - REGISTER_ACCESSOR(ft, engine, animIdx, animationIndex); - REGISTER_ACCESSOR(ft, engine, frameDuration, frameDuration); - REGISTER_ACCESSOR(ft, engine, frameAt, frameAt); - REGISTER_ACCESSOR(ft, engine, frameCount, frameCount); - REGISTER_ACCESSOR(ft, engine, animT, animationT); - REGISTER_ACCESSOR(ft, engine, r, r); - REGISTER_ACCESSOR(ft, engine, update, update); - REGISTER_ACCESSOR(ft, engine, curX, x); - REGISTER_ACCESSOR(ft, engine, curVX, vx); - REGISTER_ACCESSOR(ft, engine, curAX, ax); - REGISTER_ACCESSOR(ft, engine, curY, y); - REGISTER_ACCESSOR(ft, engine, curVY, vy); - REGISTER_ACCESSOR(ft, engine, curAY, ay); - REGISTER_ACCESSOR(ft, engine, red, red); - REGISTER_ACCESSOR(ft, engine, green, green); - REGISTER_ACCESSOR(ft, engine, blue, blue); - REGISTER_ACCESSOR(ft, engine, alpha, alpha); - - constructor = qPersistentNew(ft->GetFunction()); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + QV4::Object *p = v4->newObject(); + + p->defineDefaultProperty(v4, QStringLiteral("discard"), particleData_discard); + p->defineDefaultProperty(v4, QStringLiteral("lifeLeft"), particleData_lifeLeft); + p->defineDefaultProperty(v4, QStringLiteral("currentSize"), particleData_curSize); + + REGISTER_ACCESSOR(p, v4, x, initialX); + REGISTER_ACCESSOR(p, v4, y, initialY); + REGISTER_ACCESSOR(p, v4, t, t); + REGISTER_ACCESSOR(p, v4, lifeSpan, lifeSpan); + REGISTER_ACCESSOR(p, v4, size, startSize); + REGISTER_ACCESSOR(p, v4, endSize, endSize); + REGISTER_ACCESSOR(p, v4, vx, initialVX); + REGISTER_ACCESSOR(p, v4, vy, initialVY); + REGISTER_ACCESSOR(p, v4, ax, initialAX); + REGISTER_ACCESSOR(p, v4, ay, initialAY); + REGISTER_ACCESSOR(p, v4, xx, xDeformationVectorX); + REGISTER_ACCESSOR(p, v4, xy, xDeformationVectorY); + REGISTER_ACCESSOR(p, v4, yx, yDeformationVectorX); + REGISTER_ACCESSOR(p, v4, yy, yDeformationVectorY); + REGISTER_ACCESSOR(p, v4, rotation, rotation); + REGISTER_ACCESSOR(p, v4, rotationVelocity, rotationVelocity); + REGISTER_ACCESSOR(p, v4, autoRotate, autoRotate); + REGISTER_ACCESSOR(p, v4, animIdx, animationIndex); + REGISTER_ACCESSOR(p, v4, frameDuration, frameDuration); + REGISTER_ACCESSOR(p, v4, frameAt, frameAt); + REGISTER_ACCESSOR(p, v4, frameCount, frameCount); + REGISTER_ACCESSOR(p, v4, animT, animationT); + REGISTER_ACCESSOR(p, v4, r, r); + REGISTER_ACCESSOR(p, v4, update, update); + REGISTER_ACCESSOR(p, v4, curX, x); + REGISTER_ACCESSOR(p, v4, curVX, vx); + REGISTER_ACCESSOR(p, v4, curAX, ax); + REGISTER_ACCESSOR(p, v4, curY, y); + REGISTER_ACCESSOR(p, v4, curVY, vy); + REGISTER_ACCESSOR(p, v4, curAY, ay); + REGISTER_ACCESSOR(p, v4, red, red); + REGISTER_ACCESSOR(p, v4, green, green); + REGISTER_ACCESSOR(p, v4, blue, blue); + REGISTER_ACCESSOR(p, v4, alpha, alpha); + + proto = QV4::Value::fromObject(p); } QV8ParticleDataDeletable::~QV8ParticleDataDeletable() { - qPersistentDispose(constructor); } V8_DEFINE_EXTENSION(QV8ParticleDataDeletable, particleV8Data); -QQuickV8ParticleData::QQuickV8ParticleData(QV8Engine* engine, QQuickParticleData* datum) +QQuickV4ParticleData::QQuickV4ParticleData(QV8Engine* engine, QQuickParticleData* datum) { if (!engine || !datum) return; - v8::HandleScope handle_scope; - v8::Context::Scope scope(engine->context()); QV8ParticleDataDeletable *d = particleV8Data(engine); - m_v8Value = qPersistentNew(d->constructor->NewInstance()); - QV8ParticleDataResource *r = new QV8ParticleDataResource(engine); - r->datum = datum; - m_v8Value->SetExternalResource(r); + QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine); + QV4::Object *o = new (v4->memoryManager) QV4ParticleData(v4, datum); + o->prototype = d->proto.value().asObject(); + m_v4Value = QV4::Value::fromObject(o); } -QQuickV8ParticleData::~QQuickV8ParticleData() +QQuickV4ParticleData::~QQuickV4ParticleData() { - qPersistentDispose(m_v8Value); } -QQmlV8Handle QQuickV8ParticleData::v8Value() +QQmlV4Handle QQuickV4ParticleData::v4Value() { - return QQmlV8Handle::fromHandle(m_v8Value); + return QQmlV4Handle(m_v4Value); } QT_END_NAMESPACE diff --git a/src/particles/qquickv8particledata_p.h b/src/particles/qquickv4particledata_p.h index e3c1bf9324..b3614f94ff 100644 --- a/src/particles/qquickv8particledata_p.h +++ b/src/particles/qquickv4particledata_p.h @@ -44,16 +44,18 @@ #include <private/qv8engine_p.h> +#include <private/qv4value_p.h> + QT_BEGIN_NAMESPACE class QQuickParticleData; -class QQuickV8ParticleData { +class QQuickV4ParticleData { public: - QQuickV8ParticleData(QV8Engine*,QQuickParticleData*); - ~QQuickV8ParticleData(); - QQmlV8Handle v8Value(); + QQuickV4ParticleData(QV8Engine*,QQuickParticleData*); + ~QQuickV4ParticleData(); + QQmlV4Handle v4Value(); private: - v8::Persistent<v8::Object> m_v8Value; + QV4::PersistentValue m_v4Value; }; |