Skip to content

Commit ab6ef62

Browse files
committed
bytecode generator: implement handling of continue statements
1 parent 0470758 commit ab6ef62

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

JSImpl/src/ByteCodeGenerator.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ class ByteCodeGenerator : public ExpressionVisitor
111111

112112
IPLVector<std::pair<size_t, ExpressionPtr>> m_SwitchCases;
113113
IPLVector<size_t> m_BreakInstructionAddresses;
114+
IPLVector<size_t> m_ContinueInstructionAddresses;
114115
};
115116

116117
size_t ByteCodeGenerator::PushInstruction(Instruction::Type opcode, const IPLString& arg0, const IPLString& arg1, const IPLString& arg2)
@@ -352,6 +353,10 @@ void ByteCodeGenerator::Visit(ForStatement* e)
352353
for (auto breakInstructionAddress : m_BreakInstructionAddresses)
353354
m_Code[breakInstructionAddress].Values.Address[0] = m_Code.size();
354355
m_BreakInstructionAddresses.clear();
356+
357+
for (auto continueInstructionAddress : m_ContinueInstructionAddresses)
358+
m_Code[continueInstructionAddress].Values.Address[0] = compareAddress;
359+
m_ContinueInstructionAddresses.clear();
355360
}
356361

357362
void ByteCodeGenerator::Visit(SwitchStatement* e)
@@ -447,6 +452,12 @@ void ByteCodeGenerator::Visit(UnaryExpression* e)
447452
m_BreakInstructionAddresses.push_back(breakAddress);
448453
}
449454
return;
455+
case TokenType::Continue:
456+
{
457+
auto continueAddress = PushInstruction(Instruction::Type::JMP);
458+
m_ContinueInstructionAddresses.push_back(continueAddress);
459+
}
460+
return;
450461
default:
451462
NOT_IMPLEMENTED;
452463
break;

0 commit comments

Comments
 (0)