diff options
author | Lars Knoll <lars.knoll@qt.io> | 2017-08-16 21:24:33 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2017-08-25 12:05:45 +0000 |
commit | 3c201dd0d95020c4cb4c8ceaf779673d411664e7 (patch) | |
tree | 97d4316e6d2ce54c0fa20600dcd1429f1b8ab789 /src/qml/compiler | |
parent | 34280d266fe4bed0274b260c0091d50908acd087 (diff) |
Specialize possible direct calls to eval
To avoid additional overhead on most function calls
Change-Id: I2477b91fda6216b508c8331884a02b601f65590c
Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/qml/compiler')
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 6 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth.cpp | 4 | ||||
-rw-r--r-- | src/qml/compiler/qv4instr_moth_p.h | 6 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 0b8091d70e..273856e541 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -1199,7 +1199,11 @@ bool Codegen::visit(CallExpression *ast) call.callData = calldata; bytecodeGenerator->addInstruction(call); } else if (base.type == Reference::Name) { - if (useFastLookups && base.global) { + if (base.name == QStringLiteral("eval")) { + Instruction::CallPossiblyDirectEval call; + call.callData = calldata; + bytecodeGenerator->addInstruction(call); + } else if (useFastLookups && base.global) { Instruction::CallGlobalLookup call; call.index = registerGlobalGetterLookup(base.nameAsIndex()); call.callData = calldata; diff --git a/src/qml/compiler/qv4instr_moth.cpp b/src/qml/compiler/qv4instr_moth.cpp index a6d0691db7..9101537236 100644 --- a/src/qml/compiler/qv4instr_moth.cpp +++ b/src/qml/compiler/qv4instr_moth.cpp @@ -274,6 +274,10 @@ void dumpBytecode(const char *code, int len, int nLocals, int nFormals) d << instr.name << "(" << instr.callData.dump(nFormals) << ")"; MOTH_END_INSTR(CallName) + MOTH_BEGIN_INSTR(CallPossiblyDirectEval) + d << "(" << instr.callData.dump(nFormals) << ")"; + MOTH_END_INSTR(CallPossiblyDirectEval) + MOTH_BEGIN_INSTR(CallGlobalLookup) d << instr.index << "(" << instr.callData.dump(nFormals) << ")"; MOTH_END_INSTR(CallGlobalLookup) diff --git a/src/qml/compiler/qv4instr_moth_p.h b/src/qml/compiler/qv4instr_moth_p.h index 3d004d10e9..2ce0ff7b22 100644 --- a/src/qml/compiler/qv4instr_moth_p.h +++ b/src/qml/compiler/qv4instr_moth_p.h @@ -110,6 +110,7 @@ QT_BEGIN_NAMESPACE F(CallPropertyLookup, callPropertyLookup) \ F(CallElement, callElement) \ F(CallName, callName) \ + F(CallPossiblyDirectEval, callPossiblyDirectEval) \ F(CallGlobalLookup, callGlobalLookup) \ F(SetExceptionHandler, setExceptionHandler) \ F(ThrowException, throwException) \ @@ -440,6 +441,10 @@ union Instr int name; StackSlot callData; }; + struct instr_callPossiblyDirectEval { + MOTH_INSTR_HEADER + StackSlot callData; + }; struct instr_callGlobalLookup { MOTH_INSTR_HEADER int index; @@ -750,6 +755,7 @@ union Instr instr_callPropertyLookup callPropertyLookup; instr_callElement callElement; instr_callName callName; + instr_callPossiblyDirectEval callPossiblyDirectEval; instr_callGlobalLookup callGlobalLookup; instr_throwException throwException; instr_getException getException; |