mirror of
https://github.com/bendtherules/ask262.git
synced 2026-08-19 00:31:06 +00:00
26 lines
1.1 KiB
TypeScript
26 lines
1.1 KiB
TypeScript
import { Value } from '../value.mts';
|
|
import { Evaluate, type ValueEvaluator } from '../evaluator.mts';
|
|
import { Q, X } from '../completion.mts';
|
|
import type { ParseNode } from '../parser/ParseNode.mts';
|
|
import { GetValue, ToBoolean } from '#self';
|
|
|
|
/** https://tc39.es/ecma262/#sec-binary-logical-operators-runtime-semantics-evaluation */
|
|
// LogicalORExpression :
|
|
// LogicalORExpression `||` LogicalANDExpression
|
|
export function* Evaluate_LogicalORExpression({ LogicalORExpression, LogicalANDExpression }: ParseNode.LogicalORExpression): ValueEvaluator {
|
|
// 1. Let lref be the result of evaluating LogicalORExpression.
|
|
const lref = Q(yield* Evaluate(LogicalORExpression));
|
|
// 2. Let lval be ? GetValue(lref).
|
|
const lval = Q(yield* GetValue(lref));
|
|
// 3. Let lbool be ! ToBoolean(lval).
|
|
const lbool = X(ToBoolean(lval));
|
|
// 4. If lbool is false, return lval.
|
|
if (lbool === Value.true) {
|
|
return lval;
|
|
}
|
|
// 5. Let rref be the result of evaluating LogicalANDExpression.
|
|
const rref = Q(yield* Evaluate(LogicalANDExpression));
|
|
// 6. Return ? GetValue(rref).
|
|
return Q(yield* GetValue(rref));
|
|
}
|