5dc2d6f6c5
Split BytecodeGenerator::VisitSuspend into two pieces, one for building the suspension code and one for resumption (these are split into separate Build methods for convenience). Each gets its own RegisterAllocationScope, which allows us to reduce the register file size of the empty generator by 1. For consistency, rename VisitGeneratorPrologue() to BuildGeneratorPrologue() to match the names of the two newly-created methods. This relands the patch originally committed in98927ea51b
, as the test failure due to that change was a code flushing bug. Code flushing was disabled inde4a4095cf
. R=rmcilroy@chromium.org Bug: v8:6379 Change-Id: Ifb4deafea99693c0a4e8646cf4e9884c7374cfc6 Reviewed-on: https://chromium-review.googlesource.com/508814 Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Commit-Queue: Adam Klein <adamk@chromium.org> Cr-Commit-Position: refs/heads/master@{#45406}
271 lines
4.8 KiB
Plaintext
271 lines
4.8 KiB
Plaintext
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 |C|of []) {}
|
|
for (var k |C|of |_|[1]) |_|k;
|
|
var a = |_|[];
|
|
for (var k |C|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|}
|
|
|
|
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|}
|
|
|
|
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|}
|
|
|
|
|