| Checks Debugger.getPossibleBreakpoints |
| // Copyright 2017 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| function testEval() { |
| |C|eval('// comment only'); |
| |C|eval('// comment only\n'); |
| |R|} |
| |
| // function without return |
| function procedure() { |
| var a = |_|1; |
| var b = |_|2; |
| |R|} |
| |
| function testProcedure() { |
| |C|procedure(); |
| |R|} |
| |
| function returnTrue() { |
| |_|return true;|R| |
| } |
| |
| function testIf() { |
| var a; |
| if (true) |_|a = true; |
| |_|if (!a) { |
| |_|a = true; |
| } else { |
| |_|a = false; |
| } |
| |_|if (|C|returnTrue()) { |
| |_|a = false; |
| } else { |
| |_|a = true; |
| } |
| |R|} |
| |
| function emptyFunction() {|R|} |
| |
| function testEmptyFunction() { |
| |C|emptyFunction(); |
| |R|} |
| |
| function twoArguments(a1, a2) { |
| |R|} |
| |
| function testCallArguments() { |
| |C|twoArguments(|C|emptyFunction(), |C|emptyFunction()); |
| |R|} |
| |
| function testNested() { |
| function nested1() { |
| function nested2() { |
| function nested3() { |
| |R|} |
| |C|nested3(); |
| |_|return;|R| |
| } |
| return |C|nested2();|R| |
| } |
| |C|nested1(); |
| |R|} |
| |
| function return42() { |
| |_|return 42;|R| |
| } |
| |
| function returnCall() { |
| |_|return |C|return42();|R| |
| } |
| |
| function testCallAtReturn() { |
| |_|return |C|returnCall();|R| |
| } |
| |
| function returnObject() { |
| |_|return ({ foo: () => |_|42|R| });|R| |
| } |
| |
| function testWith() { |
| |_|with (|C|returnObject()) { |
| |C|foo(); |
| } |
| |_|with({}) { |
| |_|return;|R| |
| } |
| } |
| |
| function testForLoop() { |
| for (var i = |_|0; i |_|< 1; ++|_|i) {} |
| for (var i = |_|0; i |_|< 1; ++|_|i) i; |
| for (var i = |_|0; i |_|< 0; ++|_|i) {} |
| |R|} |
| |
| function testForOfLoop() { |
| for (var |_|k of |_|[]) {} |
| for (var |_|k of |_|[1]) |_|k; |
| var a = |_|[]; |
| for (var |_|k of |_|a) {} |
| |R|} |
| |
| function testForInLoop() { |
| var o = |_|{}; |
| for (var |_|k in |_|o) {} |
| for (var |_|k in |_|o) |_|k; |
| for (var |_|k in |_|{ a:1 }) {} |
| for (var |_|k in |_|{ a:1 }) |_|k; |
| |R|} |
| |
| function testSimpleExpressions() { |
| 1 + 2 + 3; |
| var a = |_|1; |
| |_|++a; |
| |_|a--; |
| |R|} |
| |
| Object.defineProperty(this, 'getterFoo', { |
| get: () => |_|return42|R| |
| }); |
| |
| function testGetter() { |
| |C|getterFoo(); |
| |R|} |
| |
| var obj = { |
| foo: () => (|_|{ |
| boo: () => |_|return42|R| |
| })|R| |
| }; |
| |
| function testChainedCalls() { |
| |_|obj.|C|foo().|C|boo()|C|(); |
| |R|} |
| |
| function testChainedWithNative() { |
| |_|Array.|C|from([1]).|C|concat([2]).|C|map(v => v |_|* 2|R|); |
| |R|} |
| |
| function testPromiseThen() { |
| |_|return Promise.|C|resolve().|C|then(v => v |_|* 2|R|).|C|then(v => v |_|* 2|R|);|R| |
| } |
| |
| function testSwitch() { |
| for (var i = |_|0; i |_|< 3; ++|_|i) { |
| |_|switch(i) { |
| case 0: |_|continue; |
| case 1: |C|return42(); |_|break; |
| default: |_|return;|R| |
| } |
| } |
| |R|} |
| |
| function* idMaker() { |
| |_|yield 1; |
| |_|yield 2; |
| |_|yield 3; |
| |R|} |
| |
| function testGenerator() { |
| var gen = |C|idMaker(); |
| |C|return42(); |
| gen.|C|next().value; |
| |D|debugger; |
| gen.|C|next().value; |
| |C|return42(); |
| gen.|C|next().value; |
| |C|return42(); |
| gen.|C|next().value; |
| |R|} |
| |
| function throwException() { |
| |_|throw |C|new Error(); |
| } |
| |
| function testCaughtException() { |
| try { |
| |C|throwException() |
| } catch (e) { |
| |_|return;|R| |
| } |
| |R|} |
| |
| function testClasses() { |
| class Cat { |
| constructor(name) { |
| |_|this.name = name; |
| |R|} |
| |
| speak() { |
| |R|} |
| } |
| class Lion extends Cat { |
| constructor(name) { |
| |C|super(name); |
| |R|} |
| |
| speak() { |
| |_|super.|C|speak(); |
| |R|} |
| } |
| |C|new Lion().|C|speak(); |
| |R|} |
| |
| async function asyncFoo() { |
| |_|await Promise.|C|resolve().|C|then(v => v |_|* 2|R|); |
| |C|return42(); |
| |_|await |C|asyncBoo(); |
| |R|} |
| |
| async function asyncBoo() { |
| |_|await Promise.|C|resolve(); |
| |R|} |
| |
| async function testAsyncAwait() { |
| |_|await |C|asyncFoo(); |
| |_|await |C|awaitBoo(); |
| |R|} |
| |
| // TODO(kozyatinskiy): fix this. |
| async function testPromiseAsyncWithCode() { |
| var nextTest; |
| var testPromise = |C|new Promise(resolve => nextTest |_|= resolve|R|); |
| async function main() { |
| async function foo() { |
| var resolveNested; |
| var p = |C|new Promise(resolve => resolveNested |_|= resolve|R|); |
| |C|setTimeout(resolveNested, 0); |
| |_|await p; |
| |R|} |
| |C|setTimeout(returnCall, 0); |
| await |C|foo(); |
| await |C|foo(); |
| |C|nextTest(); |
| |R|} |
| |C|main(); |
| |_|return testPromise; |
| |R|} |
| |
| function returnFunction() { |
| |_|return returnObject;|R| |
| } |
| |
| async function testPromiseComplex() { |
| var nextTest; |
| var testPromise = |C|new Promise(resolve => nextTest |_|= resolve|R|); |
| async function main() { |
| async function foo() { |
| |_|await Promise.|C|resolve(); |
| |_|return 42; |
| |R|} |
| var x = |_|1; |
| var y = |_|2; |
| |C|returnFunction(|C|emptyFunction(), x++, --y, x => 2 |_|* x|R|, |C|returnCall())|C|().a = await |C|foo((a => 2 |_|*a|R|)|C|(5)); |
| |C|nextTest(); |
| |R|} |
| |C|main(); |
| |_|return testPromise; |
| |R|} |
| |
| function twiceDefined() { |
| return a + b; |
| } |
| |
| function twiceDefined() { |
| |_|return a + b;|R| |
| } |
| |
| |
| |