diff options
author | Robin Burchell <robin.burchell@crimson.no> | 2017-01-18 14:12:51 +0100 |
---|---|---|
committer | Robin Burchell <robin.burchell@crimson.no> | 2017-01-26 15:26:28 +0000 |
commit | 040a70ea209eb8dcd980c077b625dc0b353db89a (patch) | |
tree | 48aaedb3bc7e235eba1bb4c56cf84fb096ab2107 /src/qml/jsruntime/qv4object.cpp | |
parent | 92834d5631cd2ca2a6031f129429da9f34a54fbc (diff) |
jsruntime: Add a vtable hook on Object for instanceof
This will hopefully allow us to customize the behavior of
QmlTypeWrapper to allow comparison QMetaObject comparison against a
QObjectWrapper lhs (i.e. foo instanceof Item will hopefully be possible)
Task-number: QTBUG-24799
Change-Id: I780c8b424ec14d6ed6f93eeac46390e2fc920000
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4object.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index eb9cb80cee..2f664c6398 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -1155,6 +1155,49 @@ uint Object::getLength(const Managed *m) return v->toUInt32(); } +// 'var' is 'V' in 15.3.5.3. +ReturnedValue Object::instanceOf(const Object *typeObject, const Value &var) +{ + QV4::ExecutionEngine *engine = typeObject->internalClass()->engine; + + // 15.3.5.3, Assume F is a Function object. + const FunctionObject *function = typeObject->as<FunctionObject>(); + if (!function) + return engine->throwTypeError(); + + Heap::FunctionObject *f = function->d(); + if (function->isBoundFunction()) + f = function->cast<BoundFunction>()->target(); + + // 15.3.5.3, 1: HasInstance can only be used on an object + const Object *lhs = var.as<Object>(); + if (!lhs) + return Encode(false); + + // 15.3.5.3, 2 + const Object *o = f->protoProperty(); + if (!o) // 15.3.5.3, 3 + return engine->throwTypeError(); + + Heap::Object *v = lhs->d(); + + // 15.3.5.3, 4 + while (v) { + // 15.3.5.3, 4, a + v = v->prototype; + + // 15.3.5.3, 4, b + if (!v) + break; // will return false + + // 15.3.5.3, 4, c + else if (o->d() == v) + return Encode(true); + } + + return Encode(false); +} + bool Object::setArrayLength(uint newLen) { Q_ASSERT(isArrayObject()); |