Cleanup + loopRun

- added loopRun to define custom loops (https://github.com/HaxeFoundation/hscript/commit/20c8bc3f3c72a4dedabf9a647940b9c4f43eedf8)
This commit is contained in:
Jaime Humberto Macias Bustamante
2025-07-26 15:34:35 -07:00
parent 0b1fbf66dc
commit cacb0cdbd6
3 changed files with 30 additions and 78 deletions
+22 -33
View File
@@ -1289,17 +1289,8 @@ class Interp {
function doWhileLoop(econd:Expr, e:Expr):Void {
var old = declared.length;
do {
try {
expr(e);
} catch (err:Stop) {
switch (err) {
case SContinue:
case SBreak:
break;
case SReturn:
throw err;
}
}
if (!loopRun(() -> expr(e)))
break;
} while (expr(econd) == true);
restore(old);
}
@@ -1307,17 +1298,8 @@ class Interp {
function whileLoop(econd:Expr, e:Expr):Void {
var old = declared.length;
while (expr(econd) == true) {
try {
expr(e);
} catch (err:Stop) {
switch (err) {
case SContinue:
case SBreak:
break;
case SReturn:
throw err;
}
}
if (!loopRun(() -> expr(e)))
break;
}
restore(old);
}
@@ -1378,21 +1360,28 @@ class Interp {
if(isKeyValue)
locals.set(ithv, {r: next.key, depth: depth});
locals.set(n, {r: isKeyValue ? next.value : next, depth: depth});
try {
expr(e);
} catch (err:Stop) {
switch (err) {
case SContinue:
case SBreak:
break;
case SReturn:
throw err;
}
}
if (!loopRun(() -> expr(e)))
break;
}
restore(old);
}
inline function loopRun(f:Void -> Void) {
var cont = true;
try {
f();
} catch (err:Stop) {
switch (err) {
case SContinue:
case SBreak:
cont = false;
case SReturn:
throw err;
}
}
return cont;
}
inline function isMap(o:Dynamic):Bool {
return (o is IMap);
}