diff --git a/src/evaluate.ts b/src/evaluate.ts index 80e3aa3b..15c1a015 100644 --- a/src/evaluate.ts +++ b/src/evaluate.ts @@ -712,7 +712,9 @@ const visitors: EvaluateMap = { if (Signal.isBreak(result)) { break; } else if (Signal.isContinue(result)) { - continue; + // SwitchStatement can not use continue keyword + // but it can continue parent loop, like for, for-in, for-of, while + return result; } else if (Signal.isReturn(result)) { return result; } diff --git a/test/ecma5/switch/SwitchStatement.test.ts b/test/ecma5/switch/SwitchStatement.test.ts index 6cbebc29..b71c6e8c 100644 --- a/test/ecma5/switch/SwitchStatement.test.ts +++ b/test/ecma5/switch/SwitchStatement.test.ts @@ -54,3 +54,34 @@ module.exports = t; t.deepEqual(func("axetroy"), "hi axetroy"); t.deepEqual(func("aa"), "hello world"); }); + +test("SwitchStatement with continue", t => { + const sandbox: any = vm.createContext({}); + + const func: any = vm.runInContext( + ` +function t(type) { + const result = []; + let i = 0; + while (i < 5) { + i++; + switch (type + "") { + case "0": + continue; + } + result.push(i); + } + return result; +} + +module.exports = t; + `, + sandbox + ); + + // t.deepEqual(func(1), [1, 2, 3, 4, 5]); + // t.deepEqual(func(2), [1, 2, 3, 4, 5]); + + // the will loop will be continue + t.deepEqual(func(0), []); +});