diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-14 14:12:33 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-14 19:32:42 +0000 |
commit | c4ef0d6e4b5bb7de7b0ab08928d693988a60b25d (patch) | |
tree | 0ff9682886da081c2d8e89becfd90cfb7083540d /src/qml/jit | |
parent | d8eade23bc4fdd7040204f4374ef26975b94ea0a (diff) |
Call iterator.return when required in destructuring assignments
Array destructuring assignments require a call to iterator.return if
the iterator hasn't been exhausted during destructuring.
Change-Id: I39fe4bc01bef6fb2ad3bda92caf6779fbbddc8e2
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 a480cfbc30..15ece7e903 100644 --- a/src/qml/jit/qv4jit.cpp +++ b/src/qml/jit/qv4jit.cpp @@ -725,6 +725,17 @@ void BaselineJIT::generate_IteratorNext(int value) as->checkException(); } +void BaselineJIT::generate_IteratorClose(int done) +{ + as->saveAccumulatorInFrame(); + as->prepareCallWithArgCount(3); + as->passRegAsArg(done, 2); + as->passAccumulatorAsArg(1); + as->passEngineAsArg(0); + JIT_GENERATE_RUNTIME_CALL(Runtime::method_iteratorClose, Assembler::ResultInAccumulator); + as->checkException(); +} + void BaselineJIT::generate_DestructureRestElement() { as->saveAccumulatorInFrame(); @@ -1291,6 +1302,9 @@ void BaselineJIT::collectLabelsInBytecode() MOTH_BEGIN_INSTR(IteratorNext) MOTH_END_INSTR(IteratorNext) + MOTH_BEGIN_INSTR(IteratorClose) + MOTH_END_INSTR(IteratorClose) + MOTH_BEGIN_INSTR(DestructureRestElement) MOTH_END_INSTR(DestructureRestElement) diff --git a/src/qml/jit/qv4jit_p.h b/src/qml/jit/qv4jit_p.h index fa4a367e91..d48041d954 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 value) override; + void generate_IteratorClose(int done) override; void generate_DestructureRestElement() override; void generate_DeleteMember(int member, int base) override; void generate_DeleteSubscript(int base, int index) override; |