diff --git a/compiler/gengo/gengo.go b/compiler/gengo/gengo.go index d66b800..c4501d1 100644 --- a/compiler/gengo/gengo.go +++ b/compiler/gengo/gengo.go @@ -1938,8 +1938,19 @@ func (g *Generator) emitExpr(expr ast.Expr) { g.emitLiteral(folded) break } - // Short-circuit AND/OR: Harbour evaluates right operand only if needed + // Short-circuit AND/OR: Harbour evaluates right operand only if needed. + // With a literal LHS we can skip the PushBool/PopLogical roundtrip + // entirely — .T. .AND. B folds to B, .F. .AND. B folds to false, + // and symmetrically for OR. if e.Op == token.AND { + if v, ok := boolLiteralValue(e.Left); ok { + if v { + g.emitExpr(e.Right) + } else { + g.writeln("t.PushBool(false)") + } + break + } g.emitExpr(e.Left) g.writeln("if !t.PopLogical() {") g.writeln("t.PushBool(false)") @@ -1947,6 +1958,14 @@ func (g *Generator) emitExpr(expr ast.Expr) { g.emitExpr(e.Right) g.writeln("}") } else if e.Op == token.OR { + if v, ok := boolLiteralValue(e.Left); ok { + if v { + g.writeln("t.PushBool(true)") + } else { + g.emitExpr(e.Right) + } + break + } g.emitExpr(e.Left) g.writeln("if t.PopLogical() {") g.writeln("t.PushBool(true)")