aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jit
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-05-04 10:56:19 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-09 20:47:27 +0000
commit128485ccdb4f1c6f1bf1ebea85c5bed749cacd7a (patch)
tree350c795726910498f2a2ee7f9caa71018ae7ad5a /src/qml/jit
parent20a5d1ab3f47b4da6ba39143beaafedb26dbad6a (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.cpp24
-rw-r--r--src/qml/jit/qv4jit_p.h3
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;