diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-09-16 19:44:45 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-09-27 08:34:14 +0000 |
commit | 20a434faa81059fd2e969e7c372758d2e03da9e6 (patch) | |
tree | 07f41afc9663342a2ef06e8e0692cf3022950176 /src/qml/jsruntime/qv4object.cpp | |
parent | 7c592625032a98f68fd6a09026e466c5fbc7bb09 (diff) |
Speed up instanceof operations
Introduce a shortcut if the rhs is a functionobject with the
regular function proto as prototype.
Add an optimized instanceOf implementation when we already have some
checks done, and inline some methods.
Change-Id: Iab9b648ae7bbec749b319e883b6ae90a23875454
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4object.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index ea374e43c0..a7ede4627c 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -731,21 +731,27 @@ ReturnedValue Object::virtualInstanceOf(const Object *typeObject, const Value &v if (!function) return engine->throwTypeError(); - Heap::FunctionObject *f = function->d(); - if (function->isBoundFunction()) - f = function->cast<BoundFunction>()->target(); + return checkedInstanceOf(engine, function, var); +} + +ReturnedValue Object::checkedInstanceOf(ExecutionEngine *engine, const FunctionObject *f, const Value &var) +{ + Scope scope(engine); + if (f->isBoundFunction()) { + ScopedValue v(scope, static_cast<const BoundFunction *>(f)->target()); + f = v->as<FunctionObject>(); + } // 15.3.5.3, 1: HasInstance can only be used on an object const Object *lhs = var.as<Object>(); if (!lhs) return Encode(false); - Scope scope(f->internalClass->engine); // 15.3.5.3, 2 - ScopedFunctionObject ff(scope, f); - ScopedObject o(scope, ff->protoProperty()); + Value p = Value::fromReturnedValue(f->protoProperty()); + const Object *o = p.objectValue(); if (!o) // 15.3.5.3, 3 - return engine->throwTypeError(); + return f->engine()->throwTypeError(); Heap::Object *v = lhs->d(); |