aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4runtime.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-09-16 19:44:45 +0200
committerLars Knoll <lars.knoll@qt.io>2018-09-27 08:34:14 +0000
commit20a434faa81059fd2e969e7c372758d2e03da9e6 (patch)
tree07f41afc9663342a2ef06e8e0692cf3022950176 /src/qml/jsruntime/qv4runtime.cpp
parent7c592625032a98f68fd6a09026e466c5fbc7bb09 (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.cpp12
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());
}