diff --git a/evaluate_statement.go b/evaluate_statement.go index 05256a9..8036d1e 100644 --- a/evaluate_statement.go +++ b/evaluate_statement.go @@ -150,17 +150,21 @@ func (self *_runtime) evaluateFor(node *_forNode) Value { return self.breakEvaluate(_labelSet, func() Value { result := emptyValue() for { - testResult := self.evaluate(test) - testResultValue := self.GetValue(testResult) - if (toBoolean(testResultValue) == false) { - break + if test != nil { + testResult := self.evaluate(test) + testResultValue := self.GetValue(testResult) + if (toBoolean(testResultValue) == false) { + break + } } value, _ := self.continueEvaluate(body, _labelSet) if !value.isEmpty() { result = value } - updateResult := self.evaluate(update) - self.GetValue(updateResult) // Side-effect trigger + if update != nil { + updateResult := self.evaluate(update) + self.GetValue(updateResult) // Side-effect trigger + } } return result }) diff --git a/otto_test.go b/otto_test.go index ab5e7a8..903b2d7 100644 --- a/otto_test.go +++ b/otto_test.go @@ -773,6 +773,34 @@ func TestFor(t *testing.T) { } `) test("result", "9") + + test(` + abc = 0 + for (;;) { + abc += 1 + if (abc == 3) + break + } + abc + `, "3") + + test(` + for (abc = 0; ;) { + abc += 1 + if (abc == 3) + break + } + abc + `, "3") + + test(` + for (abc = 0; ; abc+=1) { + abc += 1 + if (abc == 3) + break + } + abc + `, "3") } func TestArguments(t *testing.T) { @@ -1844,3 +1872,4 @@ func TestAPI(t *testing.T) { result, _ = object.Value().Call(def, 3) Is(result, "30") } + diff --git a/parser_test.go b/parser_test.go index 23206ef..3967f3e 100644 --- a/parser_test.go +++ b/parser_test.go @@ -637,7 +637,6 @@ func TestParseSuccess(t *testing.T) { --- { @ xyzzy { { TypeError "Nothing happens." } } } `) - } func TestParseFailure(t *testing.T) {