Keywords 'break' & 'continue' tested

There were a couple bugs - I'm glad I'm so thorough with these tests.

See #152
This commit is contained in:
2024-12-30 16:56:57 +11:00
parent b84a70cc34
commit 23eb3e45df
4 changed files with 182 additions and 29 deletions

View File

@@ -1,48 +1,100 @@
//make sure it works with multiple repititions
//-------------------------
//test break
while (true) { while (true) {
print "1";
break; break;
print "2"; assert false, "break failed";
} }
print "3"; //test continue
var flag1: bool = true;
while (flag1) {
flag1 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
//test break
while (true) { while (true) {
print 1; break;
assert false, "break failed";
}
//test continue
var flag2: bool = true;
while (flag2) {
flag2 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
//test break
while (true) {
break;
assert false, "break failed";
}
//test continue
var flag3: bool = true;
while (flag3) {
flag3 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
{
//test break
while (true) { while (true) {
print 2; break;
if (true) { assert false, "break failed";
print 3;
while (true) {
print 4;
break;
print 5;
}
print 6;
}
print 7;
} }
print 8;
//test continue
var flag4: bool = true;
while (flag4) {
flag4 = false;
continue;
assert false, "continue failed";
}
print "done";
} }
print 9; //-------------------------
{
//test break
while (true) {
print 1;
while (true) { while (true) {
print 2; {
if (true) {
print 3;
break; break;
print 6;
} }
print 7; assert false, "break failed";
} }
print 8;
//test continue
var flag5: bool = true;
while (flag5) {
flag5 = false;
{
continue;
}
assert false, "continue failed";
}
print "done";
} }
print 9;

View File

@@ -508,7 +508,7 @@ static unsigned int writeInstructionWhileThen(Toy_Routine** rt, Toy_AstWhileThen
unsigned int diff = depth - (*rt)->currentScopeDepth; unsigned int diff = depth - (*rt)->currentScopeDepth;
OVERWRITE_INT(rt, code, addr, addr - (CURRENT_ADDRESS(rt, code) + 8)); //tell continue to return to the start AFTER reading the instruction OVERWRITE_INT(rt, code, addr, CURRENT_ADDRESS(rt, code) - (addr + 8)); //tell continue to return to the start AFTER reading the instruction
OVERWRITE_INT(rt, code, addr, diff); OVERWRITE_INT(rt, code, addr, diff);
//tick down //tick down

View File

@@ -581,6 +581,7 @@ static void processEscape(Toy_VM* vm) {
while (diff > 0 && vm->scope != NULL) { while (diff > 0 && vm->scope != NULL) {
vm->scope = Toy_popScope(vm->scope); vm->scope = Toy_popScope(vm->scope);
diff--;
} }
} }

View File

@@ -0,0 +1,100 @@
//make sure it works with multiple repititions
//-------------------------
//test break
while (true) {
break;
assert false, "break failed";
}
//test continue
var flag1: bool = true;
while (flag1) {
flag1 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
//test break
while (true) {
break;
assert false, "break failed";
}
//test continue
var flag2: bool = true;
while (flag2) {
flag2 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
//test break
while (true) {
break;
assert false, "break failed";
}
//test continue
var flag3: bool = true;
while (flag3) {
flag3 = false;
continue;
assert false, "continue failed";
}
print "done";
//-------------------------
{
//test break
while (true) {
break;
assert false, "break failed";
}
//test continue
var flag4: bool = true;
while (flag4) {
flag4 = false;
continue;
assert false, "continue failed";
}
print "done";
}
//-------------------------
{
//test break
while (true) {
{
break;
}
assert false, "break failed";
}
//test continue
var flag5: bool = true;
while (flag5) {
flag5 = false;
{
continue;
}
assert false, "continue failed";
}
print "done";
}