aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-05-14 10:22:09 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-14 19:32:29 +0000
commit16288498cf0e1eb389ac3acdce86eb74cc69e67a (patch)
tree32ffcf8899a40d8bf076b6ffb58823991dac1978 /src/qml/jit
parentb9311cc01da09f7f736850f500113f3e576c21a9 (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.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 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;