Lua: left eval or

pull/1224/head
Zef Hemel 2025-01-26 08:05:52 +01:00
parent a28c3fd5b8
commit 265aa8dab6
2 changed files with 23 additions and 1 deletions

View File

@ -45,7 +45,13 @@ Deno.test("Evaluator test", async () => {
assertEquals(evalExpr(`true and false`), false);
assertEquals(evalExpr(`true or false`), true);
assertEquals(evalExpr(`not true`), false);
// Test eager evaluation of left operand
assertEquals(
evalExpr(
`true or (function() error("this should not be evaluated") end)()`,
),
true,
);
// Tables
const tbl = evalExpr(`{3, 1, 2}`);
assertEquals(tbl.get(1), 3);

View File

@ -53,6 +53,22 @@ export function evalExpression(
case "Nil":
return null;
case "Binary": {
if (e.operator === "or") {
// Special case: eagerly evaluate left before even attempting right
const left = evalExpression(e.left, env, sf);
if (left instanceof Promise) {
return left.then((left) => {
if (luaTruthy(left)) {
return left;
}
return evalExpression(e.right, env, sf);
});
} else if (luaTruthy(left)) {
return left;
} else {
return evalExpression(e.right, env, sf);
}
}
const values = evalPromiseValues([
evalExpression(e.left, env, sf),
evalExpression(e.right, env, sf),