diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2019-02-06 11:14:10 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-02-25 12:49:05 +0000 |
commit | 3fdc562743cdaddf554785bd83b66b254f560090 (patch) | |
tree | 9c49316f3fb666370254279970e41ef3befb2ea9 /src/qml/compiler/qv4codegen.cpp | |
parent | e622e069c9b0928e09a8b6fef15168407a4d995a (diff) |
V4: Fix unwind handling when destructuring lists
If there was a rest element in the list, the generated code would jump
over the clean-up (closing of the iterator). However, this would also
jump over any resetting of the unwind handler.
(cherry-picked from commit 3310f173c1c6208cb0f6541578419196bc29831f)
Task-number: QTBUG-73985
Change-Id: I9a1bcb9e69fd98975fe9c89e23a4568b0dafdf83
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qml/compiler/qv4codegen.cpp')
-rw-r--r-- | src/qml/compiler/qv4codegen.cpp | 15 |
1 files changed, 1 insertions, 14 deletions
diff --git a/src/qml/compiler/qv4codegen.cpp b/src/qml/compiler/qv4codegen.cpp index 04da41430c..010848bdca 100644 --- a/src/qml/compiler/qv4codegen.cpp +++ b/src/qml/compiler/qv4codegen.cpp @@ -727,9 +727,6 @@ void Codegen::destructureElementList(const Codegen::Reference &array, PatternEle bytecodeGenerator->addInstruction(iteratorObjInstr); iterator.storeConsumeAccumulator(); - bool hasRest = false; - - BytecodeGenerator::Label end = bytecodeGenerator->newLabel(); { auto cleanup = [this, iterator, iteratorDone]() { iterator.loadInAccumulator(); @@ -760,27 +757,17 @@ void Codegen::destructureElementList(const Codegen::Reference &array, PatternEle Reference::fromConst(this, Encode(true)).storeOnStack(iteratorDone.stackSlot()); bytecodeGenerator->addInstruction(Instruction::DestructureRestElement()); initializeAndDestructureBindingElement(e, Reference::fromAccumulator(this), isDefinition); - hasRest = true; } else { Instruction::IteratorNext next; next.value = iteratorValue.stackSlot(); next.done = iteratorDone.stackSlot(); bytecodeGenerator->addInstruction(next); initializeAndDestructureBindingElement(e, iteratorValue, isDefinition); - if (hasError) { - end.link(); + if (hasError) return; - } } } - - if (hasRest) - // no need to close the iterator - bytecodeGenerator->jump().link(end); } - - - end.link(); } void Codegen::destructurePattern(Pattern *p, const Reference &rhs) |