diff --git a/Makefile b/Makefile index 48b1da9..6db26e6 100644 --- a/Makefile +++ b/Makefile @@ -20,8 +20,8 @@ TEST := -v --run API TEST := -v --run IsValidRegExp TEST := -v --run ParseFailure TEST := -v --run RegExp -TEST := . TEST := -v --run SwitchBreak +TEST := . test: test-i go test $(TEST) diff --git a/otto_test.go b/otto_test.go index 1b93477..cf511b0 100644 --- a/otto_test.go +++ b/otto_test.go @@ -472,7 +472,7 @@ func TestSwitchBreak(t *testing.T) { Terst(t) test := runTest() -//echo "var x = true; while (x) {switch('a') {case 'a': break;} console.log('a'); x = false;}" | otto + test(` var abc = true; var ghi = "Xyzzy"; @@ -486,6 +486,67 @@ func TestSwitchBreak(t *testing.T) { } ghi `, "Nothing happens.") + + test(` + var abc = true; + var ghi = "Xyzzy"; + WHILE: + while (abc) { + switch ('def') { + case 'def': + break WHILE; + } + ghi = "Nothing happens." + abc = false + } + ghi + `, "Xyzzy") + + test(` + var ghi = "Xyzzy"; + FOR: + for (;;) { + switch ('def') { + case 'def': + break FOR; + ghi = "" + } + ghi = "Nothing happens." + } + ghi + `, "Xyzzy") + + test(` + var ghi = "Xyzzy"; + FOR: + for (var jkl in {}) { + switch ('def') { + case 'def': + break FOR; + ghi = "Something happens." + } + ghi = "Nothing happens." + } + ghi + `, "Xyzzy") + + test(` + var ghi = "Xyzzy"; + function jkl() { + switch ('def') { + case 'def': + break; + ghi = "" + } + ghi = "Nothing happens." + } + while (abc) { + jkl() + abc = false + ghi = "Something happens." + } + ghi + `, "Something happens.") } func TestTryFinally(t *testing.T) { diff --git a/parse_statement.go b/parse_statement.go index 0a58dd9..2e13c5a 100644 --- a/parse_statement.go +++ b/parse_statement.go @@ -63,6 +63,12 @@ func (self *_parser) ParseStatement() _node { _labelSet = node._labelSet case *_whileNode: _labelSet = node._labelSet + case *_switchNode: + _labelSet = node._labelSet + case *_forNode: + _labelSet = node._labelSet + case *_forInNode: + _labelSet = node._labelSet } if _labelSet != nil { _labelSet[label] = true diff --git a/runtime.go b/runtime.go index e0b7d7b..9dfb78f 100644 --- a/runtime.go +++ b/runtime.go @@ -158,6 +158,9 @@ func (self *_runtime) _callNode(environment *_functionEnvironment, node *_functi func (self *_runtime) Call(function *_object, this Value, argumentList []Value) (returnValue Value) { _functionEnvironment := self.EnterFunctionExecutionContext(function, this) defer func(){ + // TODO Catch any errant break/continue, etc. here? + // They should never get here, but we want to be + // very vocal if they do. self.LeaveExecutionContext(); if caught := recover(); caught != nil { if result, ok := caught.(_result); ok {