diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-05-11 22:23:56 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-13 12:55:20 +0000 |
commit | 3d5ba9f86e32950204bfcdf6591c4740a8ef7507 (patch) | |
tree | 9c599ad6b7fd2bd06d0880dde70ff21d6f522bef /src/qml/jsruntime/qv4vme_moth.cpp | |
parent | 2d6b08bd17377aa6bcb663029a196a8d19cac6ac (diff) |
Add instructions to simplify for-of loops
Added an IteratorNext instruction to fetch the next
iteration value (empty if the iterator is done).
This will also help to implement array destructuring without
requiring huge amounts of byte code.
Change-Id: If96c1e81471e5e2b0b7b2af122238d87741aa371
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4vme_moth.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index 5daead19d2..9fd57e0dcb 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -959,6 +959,12 @@ QV4::ReturnedValue VME::interpret(CppStackFrame &frame, const uchar *code) CHECK_EXCEPTION; MOTH_END_INSTR(GetIterator) + MOTH_BEGIN_INSTR(IteratorNext) + STORE_ACC(); + acc = Runtime::method_iteratorNext(engine, accumulator); + CHECK_EXCEPTION; + MOTH_END_INSTR(IteratorNext) + MOTH_BEGIN_INSTR(DeleteMember) if (!Runtime::method_deleteMember(engine, STACK_VALUE(base), member)) { if (function->isStrict()) { @@ -1086,6 +1092,11 @@ QV4::ReturnedValue VME::interpret(CppStackFrame &frame, const uchar *code) code += offset; MOTH_END_INSTR(JumpNotUndefined) + MOTH_BEGIN_INSTR(JumpEmpty) + if (Q_UNLIKELY(acc == QV4::Primitive::emptyValue().asReturnedValue())) + code += offset; + MOTH_END_INSTR(JumpEmpty) + MOTH_BEGIN_INSTR(CmpEqNull) acc = Encode(ACC.isNullOrUndefined()); MOTH_END_INSTR(CmpEqNull) |