Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1151)

Unified Diff: test/mjsunit/es6/tail-call-megatest.js

Issue 1780043004: [crankshaft] Fixing ES6 tail call elimination. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebasing Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/mjsunit/es6/tail-call.js ('k') | test/mjsunit/es6/tail-call-megatest-shard0.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/es6/tail-call-megatest.js
diff --git a/test/mjsunit/es6/tail-call-megatest.js b/test/mjsunit/es6/tail-call-megatest.js
index ea2cdd4aa4749dbd822848792224e87efc258f78..1de8ec6c8e9b54a6ec69024ba1879589c03aba8c 100644
--- a/test/mjsunit/es6/tail-call-megatest.js
+++ b/test/mjsunit/es6/tail-call-megatest.js
@@ -3,8 +3,6 @@
// found in the LICENSE file.
// Flags: --allow-natives-syntax --harmony-tailcalls
-// TODO(v8:4698), TODO(ishell): support these cases.
-// Flags: --turbo --nostress-opt
Error.prepareStackTrace = (error,stack) => {
@@ -59,6 +57,19 @@ function run_tests(shard) {
}
var check_arguments = check_arguments_template("expected_args");
+ function deopt_template(deopt_mode) {
+ switch(deopt_mode) {
+ case "none":
+ return " // Don't deoptimize";
+ case "f":
+ case "g":
+ case "test":
+ return ` %DeoptimizeFunction(${deopt_mode});`;
+ default:
+ assertUnreachable();
+ }
+ }
+
var f_cfg_sloppy = {
func_name: 'f',
source_template: function(cfg) {
@@ -66,7 +77,7 @@ function run_tests(shard) {
: "global";
var do_checks = [
` assertEquals_(${receiver}, this);`,
- ` assertEquals_(undefined, new.target);`,
+ ` ${!cfg.check_new_target ? "// " : ""}assertEquals_(undefined, new.target);`,
check_arguments,
` checkStackTrace_([f, test]);`,
].join("\n");
@@ -74,9 +85,10 @@ function run_tests(shard) {
var lines = [
`function f(a) {`,
` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` counter++;`,
` var expected_args = [${cfg.f_args}];`,
do_checks,
- ` %DeoptimizeNow();`,
+ deopt_template(cfg.deopt_mode),
do_checks,
` return 42;`,
`}`,
@@ -92,7 +104,7 @@ function run_tests(shard) {
: "undefined";
var do_checks = [
` assertEquals_(${receiver}, this);`,
- ` assertEquals_(undefined, new.target);`,
+ ` ${!cfg.check_new_target ? "// " : ""}assertEquals_(undefined, new.target);`,
check_arguments,
` checkStackTrace_([f, test]);`,
].join("\n");
@@ -101,9 +113,10 @@ function run_tests(shard) {
`function f(a) {`,
` "use strict";`,
` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` counter++;`,
` var expected_args = [${cfg.f_args}];`,
do_checks,
- ` %DeoptimizeNow();`,
+ deopt_template(cfg.deopt_mode),
do_checks,
` return 42;`,
`}`,
@@ -119,7 +132,7 @@ function run_tests(shard) {
: "global";
var do_checks = [
` assertEquals_(${receiver}, this);`,
- ` assertEquals_(undefined, new.target);`,
+ ` ${!cfg.check_new_target ? "// " : ""}assertEquals_(undefined, new.target);`,
check_arguments,
` checkStackTrace_([f, test]);`,
].join("\n");
@@ -127,9 +140,10 @@ function run_tests(shard) {
var lines = [
`function f(a) {`,
` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` counter++;`,
` var expected_args = [${cfg.f_args}];`,
do_checks,
- ` %DeoptimizeNow();`,
+ deopt_template(cfg.deopt_mode),
do_checks,
` return 42;`,
`}`,
@@ -144,7 +158,7 @@ function run_tests(shard) {
source_template: function(cfg) {
var do_checks = [
` assertEquals_(receiver, this);`,
- ` assertEquals_(undefined, new.target);`,
+ ` ${!cfg.check_new_target ? "// " : ""}assertEquals_(undefined, new.target);`,
check_arguments,
` checkStackTrace_([f, test]);`,
].join("\n");
@@ -153,9 +167,10 @@ function run_tests(shard) {
`function f(a) {`,
` "use strict";`,
` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` counter++;`,
` var expected_args = [${cfg.f_args}];`,
do_checks,
- ` %DeoptimizeNow();`,
+ deopt_template(cfg.deopt_mode),
do_checks,
` return 42;`,
`}`,
@@ -173,7 +188,7 @@ function run_tests(shard) {
: "global";
var do_checks = [
` assertEquals_(${receiver}, this);`,
- ` assertEquals_(undefined, new.target);`,
+ ` ${!cfg.check_new_target ? "// " : ""}assertEquals_(undefined, new.target);`,
check_arguments,
` checkStackTrace_([f, test]);`,
].join("\n");
@@ -181,9 +196,10 @@ function run_tests(shard) {
var lines = [
`function f(a) {`,
` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` counter++;`,
` var expected_args = [${cfg.f_args}];`,
do_checks,
- ` %DeoptimizeNow();`,
+ deopt_template(cfg.deopt_mode),
do_checks,
` return 42;`,
`}`,
@@ -210,6 +226,23 @@ function run_tests(shard) {
};
+ var g_cfg_reflect_apply = {
+ receiver: "the_receiver",
+ source_template: function(cfg) {
+ var lines = [
+ `function g(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.g_inlinable)}`,
+ ` var expected_args = [${cfg.g_args}];`,
+ check_arguments,
+ ` return Reflect.apply(${cfg.f_name}, the_receiver, [${cfg.f_args}]);`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+
var g_cfg_function_apply = {
receiver: "the_receiver",
source_template: function(cfg) {
@@ -282,6 +315,7 @@ function run_tests(shard) {
` var undefined = void 0;`,
` var global = Function('return this')();`,
` var the_receiver = {receiver: 1};`,
+ ` var counter = 0;`,
``,
` // Don't inline helper functions`,
` %NeverOptimizeFunction(assertEquals);`,
@@ -293,13 +327,12 @@ function run_tests(shard) {
` "use strict";`,
` assertEquals_(42, g(${cfg.g_args}));`,
` }`,
- ` ${cfg.f_inlinable ? "%SetForceInlineFlag(f)" : ""};`,
- ` ${cfg.g_inlinable ? "%SetForceInlineFlag(g)" : ""};`,
` ${"test();".repeat(cfg.test_warmup_count)}`,
+ ` ${cfg.f_inlinable ? "%SetForceInlineFlag(f)" : "%OptimizeFunctionOnNextCall(f)"};`,
+ ` ${cfg.g_inlinable ? "%SetForceInlineFlag(g)" : "%OptimizeFunctionOnNextCall(g)"};`,
` %OptimizeFunctionOnNextCall(test);`,
- ` %OptimizeFunctionOnNextCall(f);`,
- ` %OptimizeFunctionOnNextCall(g);`,
` test();`,
+ ` assertEquals(${1 + cfg.test_warmup_count}, counter);`,
`})();`,
``,
];
@@ -311,6 +344,9 @@ function run_tests(shard) {
var g_args_variants = ["", "10", "10, 20"];
var f_inlinable_variants = [true, false];
var g_inlinable_variants = [true, false];
+ // This is to avoid bailing out because of referencing new.target.
+ var check_new_target_variants = [true, false];
+ var deopt_mode_variants = ["none", "f", "g", "test"];
var f_variants = [
f_cfg_sloppy,
f_cfg_strict,
@@ -320,42 +356,51 @@ function run_tests(shard) {
];
var g_variants = [
g_cfg_normal,
- g_cfg_function_call,
+ g_cfg_reflect_apply,
g_cfg_function_apply,
g_cfg_function_apply_arguments_object,
+ g_cfg_function_call,
];
var test_warmup_counts = [0, 1, 2];
var iter = 0;
+ var tests_executed = 0;
if (shard !== undefined) {
print("Running shard #" + shard);
}
f_variants.forEach((f_cfg) => {
- g_variants.forEach((g_cfg) => {
- f_args_variants.forEach((f_args) => {
- g_args_variants.forEach((g_args) => {
- f_inlinable_variants.forEach((f_inlinable) => {
- g_inlinable_variants.forEach((g_inlinable) => {
- test_warmup_counts.forEach((test_warmup_count) => {
- if (shard !== undefined && (iter++) % SHARDS_COUNT != shard) {
- print("skipping...");
- return;
- }
- var cfg = {
- f_source_template: f_cfg.source_template,
- f_inlinable,
- f_args,
- f_name: f_cfg.func_name,
- f_receiver: g_cfg.receiver,
- g_source_template: g_cfg.source_template,
- g_inlinable,
- g_args,
- test_warmup_count,
- };
- var source = test_template(cfg);
- print("====================");
- print(source);
- eval(source);
+ check_new_target_variants.forEach((check_new_target) => {
+ deopt_mode_variants.forEach((deopt_mode) => {
+ g_variants.forEach((g_cfg) => {
+ f_args_variants.forEach((f_args) => {
+ g_args_variants.forEach((g_args) => {
+ f_inlinable_variants.forEach((f_inlinable) => {
+ g_inlinable_variants.forEach((g_inlinable) => {
+ test_warmup_counts.forEach((test_warmup_count) => {
+ if (shard !== undefined && (iter++) % SHARDS_COUNT != shard) {
+ print("skipping...");
+ return;
+ }
+ tests_executed++;
+ var cfg = {
+ f_source_template: f_cfg.source_template,
+ f_inlinable,
+ f_args,
+ f_name: f_cfg.func_name,
+ f_receiver: g_cfg.receiver,
+ g_source_template: g_cfg.source_template,
+ g_inlinable,
+ g_args,
+ test_warmup_count,
+ check_new_target,
+ deopt_mode,
+ };
+ var source = test_template(cfg);
+ print("====================");
+ print(source);
+ eval(source);
+ });
+ });
});
});
});
@@ -363,6 +408,7 @@ function run_tests(shard) {
});
});
});
+ print("Number of tests executed: " + tests_executed);
}
// Uncomment to run all the tests at once or use shard runners.
« no previous file with comments | « test/mjsunit/es6/tail-call.js ('k') | test/mjsunit/es6/tail-call-megatest-shard0.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698