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/qv4runtime.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/qv4runtime.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 0a098ff7ef..7b1a38ff06 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -349,15 +349,21 @@ QV4::ReturnedValue Runtime::method_instanceof(ExecutionEngine *engine, const Val if (!rhs) return engine->throwTypeError(); + const FunctionObject *f = rhs->as<FunctionObject>(); + // shortcut hasInstance evaluation. In this case we know that we are calling the regular hasInstance() + // method of the FunctionPrototype + if (f && f->d()->prototype() == engine->functionPrototype()->d() && !f->hasHasInstanceProperty()) + return Object::checkedInstanceOf(engine, f, lval); + Scope scope(engine); ScopedValue hasInstance(scope, rhs->get(engine->symbol_hasInstance())); if (hasInstance->isUndefined()) return rhs->instanceOf(lval); - FunctionObject *f = hasInstance->as<FunctionObject>(); - if (!f) + FunctionObject *fHasInstance = hasInstance->as<FunctionObject>(); + if (!fHasInstance) return engine->throwTypeError(); - ScopedValue result(scope, f->call(&rval, &lval, 1)); + ScopedValue result(scope, fHasInstance->call(&rval, &lval, 1)); return Encode(result->toBoolean()); } |