aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-05-14 14:12:33 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-14 19:32:42 +0000
commitc4ef0d6e4b5bb7de7b0ab08928d693988a60b25d (patch)
tree0ff9682886da081c2d8e89becfd90cfb7083540d /src/qml/jit
parentd8eade23bc4fdd7040204f4374ef26975b94ea0a (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.cpp14
-rw-r--r--src/qml/jit/qv4jit_p.h1
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;