Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -1668,7 +1668,7 @@ func compileLogicalOpExprAux(context *funcContext, reg int, expr ast.Expr, ec *e
}
} else {
reg += compileExpr(context, reg, expr, ecnone(0))
if !hasnextcond {
if !hasnextcond && !isLastAnd {
code.AddABC(OP_TEST, a, 0, 0^flip, sline(expr))
} else {
code.AddABC(OP_TESTSET, sreg, a, 0^flip, sline(expr))
Expand Down
26 changes: 26 additions & 0 deletions script_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,3 +258,29 @@ func TestMergingLoadNilBug(t *testing.T) {
// t.Fatalf("expected 1 LOADNIL instruction, found %d", count)
// }
//}

func TestShortCircuitAssignmentWithCalls(t *testing.T) {
L := NewState()
defer L.Close()
if err := L.DoString(`
function greaterThan(a, b)
return a > b
end

function lessThan(a, b)
return a < b
end

function betweenViaFunctions(val, a, b)
local result = true
result = result and (greaterThan(val, a) and lessThan(val, b))
return result
end

for _, case in ipairs({{2, false}, {3, false}, {4, true}, {5, false}, {6, false}}) do
assert(betweenViaFunctions(case[1], 3, 5) == case[2], "unexpected result for " .. case[1])
end
`); err != nil {
t.Fatal(err)
}
}