diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-04 10:56:19 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-09 20:47:27 +0000 |
commit | 128485ccdb4f1c6f1bf1ebea85c5bed749cacd7a (patch) | |
tree | 350c795726910498f2a2ee7f9caa71018ae7ad5a /src/qml/jit | |
parent | 20a5d1ab3f47b4da6ba39143beaafedb26dbad6a (diff) |
Add some basic support for for-of loops
The support is basically at the same level as for for-in
at the moment.
Currently unimplemented:
* Destructuring
* Proper lexical scoping
* calling iterator.throw()/return() when required
Change-Id: If193ce0b054c4315fc16b7e174334a31b2730dcf
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4jit.cpp | 24 | ||||
-rw-r--r-- | src/qml/jit/qv4jit_p.h | 3 |
2 files changed, 7 insertions, 20 deletions
diff --git a/src/qml/jit/qv4jit.cpp b/src/qml/jit/qv4jit.cpp index 87c3642479..16b6b5fb94 100644 --- a/src/qml/jit/qv4jit.cpp +++ b/src/qml/jit/qv4jit.cpp @@ -662,23 +662,14 @@ void BaselineJIT::generate_PushBlockContext(int reg, int index) void BaselineJIT::generate_PopContext(int reg) { as->popContext(reg); } -void BaselineJIT::generate_ForeachIteratorObject() +void BaselineJIT::generate_GetIterator(int iterator) { as->saveAccumulatorInFrame(); - as->prepareCallWithArgCount(2); + as->prepareCallWithArgCount(3); + as->passInt32AsArg(iterator, 2); as->passAccumulatorAsArg(1); as->passEngineAsArg(0); - JIT_GENERATE_RUNTIME_CALL(Runtime::method_foreachIterator, Assembler::ResultInAccumulator); - as->checkException(); -} - -void BaselineJIT::generate_ForeachNextPropertyName() -{ - as->saveAccumulatorInFrame(); - as->prepareCallWithArgCount(1); - as->passAccumulatorAsArg(0); - JIT_GENERATE_RUNTIME_CALL(Runtime::method_foreachNextPropertyName, - Assembler::ResultInAccumulator); + JIT_GENERATE_RUNTIME_CALL(Runtime::method_getIterator, Assembler::ResultInAccumulator); as->checkException(); } @@ -1220,11 +1211,8 @@ void BaselineJIT::collectLabelsInBytecode() MOTH_BEGIN_INSTR(PopContext) MOTH_END_INSTR(PopContext) - MOTH_BEGIN_INSTR(ForeachIteratorObject) - MOTH_END_INSTR(ForeachIteratorObject) - - MOTH_BEGIN_INSTR(ForeachNextPropertyName) - MOTH_END_INSTR(ForeachNextPropertyName) + MOTH_BEGIN_INSTR(GetIterator) + MOTH_END_INSTR(GetIterator) 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 bf11e69cbb..157fbffeb1 100644 --- a/src/qml/jit/qv4jit_p.h +++ b/src/qml/jit/qv4jit_p.h @@ -182,8 +182,7 @@ public: void generate_PushWithContext(int reg) override; void generate_PushBlockContext(int reg, int index) override; void generate_PopContext(int reg) override; - void generate_ForeachIteratorObject() override; - void generate_ForeachNextPropertyName() override; + void generate_GetIterator(int iterator) override; void generate_DeleteMember(int member, int base) override; void generate_DeleteSubscript(int base, int index) override; void generate_DeleteName(int name) override; |