diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-08-04 20:28:23 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2017-08-08 18:58:29 +0000 |
commit | 8f6a865929da5dc130594dbcd5ace97468f51e59 (patch) | |
tree | d905f5f6ba6b7a1ab10dc0a6189f2c2a61308efe /src | |
parent | 50e7badd5f261bd69db9d8f03d5651e346087218 (diff) |
Unify IndexedBuiltinFunction with BuiltinFunction
Now that we pass the function object to the runtime method, we
can retrieve the index from there, and don't need a different
calling convention for the indexed version anymore.
Change-Id: I6c7d747ddb0c217b23fe9ba06435afb4ec0ee24a
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 23 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject_p.h | 21 | ||||
-rw-r--r-- | src/qml/util/qqmladaptormodel.cpp | 32 |
3 files changed, 25 insertions, 51 deletions
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index 061971ec30..344c38ee79 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -471,29 +471,6 @@ ReturnedValue BuiltinFunction::call(const Managed *that, CallData *callData) return f->d()->code(f, callData); } - -ReturnedValue IndexedBuiltinFunction::call(const Managed *that, CallData *callData) -{ - const IndexedBuiltinFunction *f = static_cast<const IndexedBuiltinFunction *>(that); - ExecutionEngine *v4 = f->engine(); - if (v4->hasException) - return Encode::undefined(); - CHECK_STACK_LIMITS(v4); - - Scope scope(v4); - ExecutionContextSaver ctxSaver(scope); - - CallContext::Data *ctx = v4->memoryManager->allocSimpleCallContext(); - ctx->strictMode = f->scope()->strictMode; // ### needed? scope or parent context? - ctx->callData = callData; - v4->pushContext(ctx); - Q_ASSERT(v4->current == ctx); - - ReturnedValue result = f->d()->code(static_cast<QV4::CallContext *>(v4->currentContext), f->d()->index); - v4->memoryManager->freeSimpleCallContext(); - return result; -} - DEFINE_OBJECT_VTABLE(IndexedBuiltinFunction); DEFINE_OBJECT_VTABLE(BoundFunction); diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 5eea262e2e..d76655179d 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -62,6 +62,7 @@ struct QQmlSourceLocation; namespace QV4 { struct BuiltinFunction; +struct IndexedBuiltinFunction; namespace Heap { @@ -101,9 +102,8 @@ struct Q_QML_EXPORT BuiltinFunction : FunctionObject { ReturnedValue (*code)(const QV4::BuiltinFunction *, CallData *); }; -struct IndexedBuiltinFunction : FunctionObject { - inline void init(QV4::ExecutionContext *scope, uint index, ReturnedValue (*code)(QV4::CallContext *ctx, uint index)); - ReturnedValue (*code)(QV4::CallContext *, uint index); +struct IndexedBuiltinFunction : BuiltinFunction { + inline void init(QV4::ExecutionContext *scope, uint index, ReturnedValue (*code)(const QV4::BuiltinFunction *, CallData *)); uint index; }; @@ -202,24 +202,17 @@ struct Q_QML_EXPORT BuiltinFunction : FunctionObject { static ReturnedValue call(const Managed *that, CallData *callData); }; -struct IndexedBuiltinFunction: FunctionObject +struct IndexedBuiltinFunction: BuiltinFunction { - V4_OBJECT2(IndexedBuiltinFunction, FunctionObject) - - static ReturnedValue construct(const Managed *m, CallData *) - { - return m->engine()->throwTypeError(); - } - - static ReturnedValue call(const Managed *that, CallData *callData); + V4_OBJECT2(IndexedBuiltinFunction, BuiltinFunction) }; void Heap::IndexedBuiltinFunction::init(QV4::ExecutionContext *scope, uint index, - ReturnedValue (*code)(QV4::CallContext *ctx, uint index)) + ReturnedValue (*code)(const QV4::BuiltinFunction *, CallData *)) { Heap::FunctionObject::init(scope); - this->index = index; this->code = code; + this->index = index; } diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp index 1f2da174b9..ae1c1a1e4f 100644 --- a/src/qml/util/qqmladaptormodel.cpp +++ b/src/qml/util/qqmladaptormodel.cpp @@ -106,8 +106,8 @@ public: void setValue(const QString &role, const QVariant &value) override; bool resolveIndex(const QQmlAdaptorModel &model, int idx) override; - static QV4::ReturnedValue get_property(QV4::CallContext *ctx, uint propertyId); - static QV4::ReturnedValue set_property(QV4::CallContext *ctx, uint propertyId); + static QV4::ReturnedValue get_property(const QV4::BuiltinFunction *, QV4::CallData *); + static QV4::ReturnedValue set_property(const QV4::BuiltinFunction *, QV4::CallData *); VDMModelDelegateDataType *type; QVector<QVariant> cachedData; @@ -343,12 +343,14 @@ bool QQmlDMCachedModelData::resolveIndex(const QQmlAdaptorModel &, int idx) } } -QV4::ReturnedValue QQmlDMCachedModelData::get_property(QV4::CallContext *ctx, uint propertyId) +QV4::ReturnedValue QQmlDMCachedModelData::get_property(const QV4::BuiltinFunction *b, QV4::CallData *callData) { - QV4::Scope scope(ctx); - QV4::Scoped<QQmlDelegateModelItemObject> o(scope, ctx->thisObject().as<QQmlDelegateModelItemObject>()); + QV4::Scope scope(b); + QV4::Scoped<QQmlDelegateModelItemObject> o(scope, callData->thisObject.as<QQmlDelegateModelItemObject>()); if (!o) - return ctx->engine()->throwTypeError(QStringLiteral("Not a valid VisualData object")); + return scope.engine->throwTypeError(QStringLiteral("Not a valid VisualData object")); + + uint propertyId = static_cast<const QV4::IndexedBuiltinFunction *>(b)->d()->index; QQmlDMCachedModelData *modelData = static_cast<QQmlDMCachedModelData *>(o->d()->item); if (o->d()->item->index == -1) { @@ -363,23 +365,25 @@ QV4::ReturnedValue QQmlDMCachedModelData::get_property(QV4::CallContext *ctx, ui return QV4::Encode::undefined(); } -QV4::ReturnedValue QQmlDMCachedModelData::set_property(QV4::CallContext *ctx, uint propertyId) +QV4::ReturnedValue QQmlDMCachedModelData::set_property(const QV4::BuiltinFunction *b, QV4::CallData *callData) { - QV4::Scope scope(ctx); - QV4::Scoped<QQmlDelegateModelItemObject> o(scope, ctx->thisObject().as<QQmlDelegateModelItemObject>()); + QV4::Scope scope(b); + QV4::Scoped<QQmlDelegateModelItemObject> o(scope, callData->thisObject.as<QQmlDelegateModelItemObject>()); if (!o) - return ctx->engine()->throwTypeError(QStringLiteral("Not a valid VisualData object")); - if (!ctx->argc()) - return ctx->engine()->throwTypeError(); + return scope.engine->throwTypeError(QStringLiteral("Not a valid VisualData object")); + if (!callData->argc) + return scope.engine->throwTypeError(); + + uint propertyId = static_cast<const QV4::IndexedBuiltinFunction *>(b)->d()->index; if (o->d()->item->index == -1) { QQmlDMCachedModelData *modelData = static_cast<QQmlDMCachedModelData *>(o->d()->item); if (!modelData->cachedData.isEmpty()) { if (modelData->cachedData.count() > 1) { - modelData->cachedData[propertyId] = scope.engine->toVariant(ctx->args()[0], QVariant::Invalid); + modelData->cachedData[propertyId] = scope.engine->toVariant(callData->args[0], QVariant::Invalid); QMetaObject::activate(o->d()->item, o->d()->item->metaObject(), propertyId, 0); } else if (modelData->cachedData.count() == 1) { - modelData->cachedData[0] = scope.engine->toVariant(ctx->args()[0], QVariant::Invalid); + modelData->cachedData[0] = scope.engine->toVariant(callData->args[0], QVariant::Invalid); QMetaObject::activate(o->d()->item, o->d()->item->metaObject(), 0, 0); QMetaObject::activate(o->d()->item, o->d()->item->metaObject(), 1, 0); } |