diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-14 10:22:09 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-14 19:32:29 +0000 |
commit | 16288498cf0e1eb389ac3acdce86eb74cc69e67a (patch) | |
tree | 32ffcf8899a40d8bf076b6ffb58823991dac1978 /src/qml/jit | |
parent | b9311cc01da09f7f736850f500113f3e576c21a9 (diff) |
Implement support for destructuring of rest elements
"var [x, ...y] = array" now works as intended.
Change-Id: I45238f27f468d0b0e14dc0e931c55c4f40043690
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4jit.cpp | 14 | ||||
-rw-r--r-- | src/qml/jit/qv4jit_p.h | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/qml/jit/qv4jit.cpp b/src/qml/jit/qv4jit.cpp index e0a5a0590c..ff139e6645 100644 --- a/src/qml/jit/qv4jit.cpp +++ b/src/qml/jit/qv4jit.cpp @@ -725,6 +725,17 @@ void BaselineJIT::generate_IteratorNext(int returnUndefinedWhenDone) as->checkException(); } +void BaselineJIT::generate_DestructureRestElement() +{ + as->saveAccumulatorInFrame(); + as->prepareCallWithArgCount(2); + as->passAccumulatorAsArg(1); + as->passEngineAsArg(0); + JIT_GENERATE_RUNTIME_CALL(Runtime::method_destructureRestElement, Assembler::ResultInAccumulator); + as->checkException(); +} + + static ReturnedValue deleteMemberHelper(QV4::Function *function, const QV4::Value &base, int member) { @@ -1280,6 +1291,9 @@ void BaselineJIT::collectLabelsInBytecode() MOTH_BEGIN_INSTR(IteratorNext) MOTH_END_INSTR(IteratorNext) + MOTH_BEGIN_INSTR(DestructureRestElement) + MOTH_END_INSTR(DestructureRestElement) + MOTH_BEGIN_INSTR(DeleteMember) MOTH_END_INSTR(DeleteMember) diff --git a/src/qml/jit/qv4jit_p.h b/src/qml/jit/qv4jit_p.h index 942b96071f..d57e043bc2 100644 --- a/src/qml/jit/qv4jit_p.h +++ b/src/qml/jit/qv4jit_p.h @@ -187,6 +187,7 @@ public: void generate_PopContext(int reg) override; void generate_GetIterator(int iterator) override; void generate_IteratorNext(int returnUndefinedWhenDone) override; + void generate_DestructureRestElement() override; void generate_DeleteMember(int member, int base) override; void generate_DeleteSubscript(int base, int index) override; void generate_DeleteName(int name) override; |