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

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

Issue 1711863002: [es6] Fixed POSSIBLY_EVAL_CALL tail calls handling in Full codegen. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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 | « src/full-codegen/x87/full-codegen-x87.cc ('k') | no next file » | 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 f85773eb476b7ba400315f19f608fa2f558c5d64..005796195a84cdf319d71ee0bf1b3e145967c232 100644
--- a/test/mjsunit/es6/tail-call-megatest.js
+++ b/test/mjsunit/es6/tail-call-megatest.js
@@ -4,7 +4,6 @@
// Flags: --allow-natives-syntax --harmony-tailcalls --no-turbo-inlining
-"use strict";
Error.prepareStackTrace = (error,stack) => {
error.strace = stack;
@@ -46,76 +45,178 @@ function ident_source(source, ident) {
return ident + source.replace(/\n/gi, "\n" + ident);
}
+var global = Function('return this')();
+var the_receiver = {receiver: 1};
function run_tests() {
-
- function f_template_normal(f_inlinable, f_args) {
- var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT;
- var lines = [
- `function f(a) {`,
- ` ${f_comment}`,
- ` assertEquals(undefined, this);`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([f, test]);`,
- ` %DeoptimizeNow();`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([f, test]);`,
- ` return 42;`,
- `}`,
- ];
- return lines.join("\n");
+ function inlinable_comment(inlinable) {
+ return inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT;
}
- function f_template_bound(f_inlinable, f_args) {
- var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT;
- var lines = [
- `function ff(a) {`,
- ` ${f_comment}`,
- ` assertEquals(153, this.a);`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([ff, test]);`,
- ` %DeoptimizeNow();`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([ff, test]);`,
- ` return 42;`,
- `}`,
- `var f = ff.bind({a: 153});`,
- ];
- return lines.join("\n");
- }
+ var f_cfg_sloppy = {
+ func_name: 'f',
+ source_template: function(cfg) {
+ var receiver = cfg.f_receiver != undefined ? cfg.f_receiver
+ : "global";
+ var lines = [
+ `function f(a) {`,
+ ` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` assertEquals(${receiver}, this);`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` %DeoptimizeNow();`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` return 42;`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
- function f_template_proxy(f_inlinable, f_args) {
- var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT;
- var lines = [
- `function ff(a) {`,
- ` ${f_comment}`,
- ` assertEquals(undefined, this);`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([f, test]);`,
- ` %DeoptimizeNow();`,
- ` CheckArguments([${f_args}], arguments);`,
- ` CheckStackTrace([f, test]);`,
- ` return 42;`,
- `}`,
- `var f = new Proxy(ff, {});`,
- ];
- return lines.join("\n");
- }
+ var f_cfg_strict = {
+ func_name: 'f',
+ source_template: function(cfg) {
+ var receiver = cfg.f_receiver != undefined ? cfg.f_receiver
+ : "undefined";
+ var lines = [
+ `function f(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` assertEquals(${receiver}, this);`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` %DeoptimizeNow();`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` return 42;`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
- function g_template(g_inlinable, f_args, g_args) {
- var g_comment = g_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT;
- var lines = [
- `function g(a) {`,
- ` ${g_comment}`,
- ` CheckArguments([${g_args}], arguments);`,
- ` return f(${f_args});`,
- `}`,
- ];
- return lines.join("\n");
- }
+ var f_cfg_possibly_eval = {
+ func_name: 'eval',
+ source_template: function(cfg) {
+ var receiver = cfg.f_receiver != undefined ? cfg.f_receiver
+ : "global";
+ var lines = [
+ `function f(a) {`,
+ ` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` assertEquals(${receiver}, this);`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` %DeoptimizeNow();`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` return 42;`,
+ `}`,
+ `var eval = f;`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+ var f_cfg_bound = {
+ func_name: 'bound',
+ source_template: function(cfg) {
+ var lines = [
+ `function f(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` assertEquals(receiver, this);`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` %DeoptimizeNow();`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` return 42;`,
+ `}`,
+ `var receiver = {a: 153};`,
+ `var bound = f.bind(receiver);`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+ var f_cfg_proxy = {
+ func_name: 'p',
+ source_template: function(cfg) {
+ var receiver = cfg.f_receiver != undefined ? cfg.f_receiver
+ : "global";
+ var lines = [
+ `function f(a) {`,
+ ` ${inlinable_comment(cfg.f_inlinable)}`,
+ ` assertEquals(${receiver}, this);`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` %DeoptimizeNow();`,
+ ` CheckArguments([${cfg.f_args}], arguments);`,
+ ` CheckStackTrace([f, test]);`,
+ ` return 42;`,
+ `}`,
+ `var p = new Proxy(f, {});`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+ var g_cfg_normal = {
+ receiver: undefined,
+ source_template: function(cfg) {
+ var lines = [
+ `function g(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.g_inlinable)}`,
+ ` CheckArguments([${cfg.g_args}], arguments);`,
+ ` return ${cfg.f_name}(${cfg.f_args});`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+
+ var g_cfg_function_apply = {
+ receiver: "the_receiver",
+ source_template: function(cfg) {
+ var lines = [
+ `function g(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.g_inlinable)}`,
+ ` CheckArguments([${cfg.g_args}], arguments);`,
+ ` return ${cfg.f_name}.apply(the_receiver, [${cfg.f_args}]);`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
- function test_template(f_source, g_source, g_args,
- f_inlinable, g_inlinable) {
+
+ var g_cfg_function_call = {
+ receiver: "the_receiver",
+ source_template: function(cfg) {
+ var f_args = "the_receiver";
+ if (cfg.f_args !== "") f_args += ", ";
+ f_args += cfg.f_args;
+
+ var lines = [
+ `function g(a) {`,
+ ` "use strict";`,
+ ` ${inlinable_comment(cfg.g_inlinable)}`,
+ ` CheckArguments([${cfg.g_args}], arguments);`,
+ ` return ${cfg.f_name}.call(${f_args});`,
+ `}`,
+ ];
+ return lines.join("\n");
+ },
+ };
+
+
+ function test_template(cfg) {
+ var f_source = cfg.f_source_template(cfg);
+ var g_source = cfg.g_source_template(cfg);
f_source = ident_source(f_source, 2);
g_source = ident_source(g_source, 2);
@@ -124,15 +225,15 @@ function run_tests() {
f_source,
g_source,
` function test() {`,
- ` assertEquals(42, g(${g_args}));`,
+ ` "use strict";`,
+ ` assertEquals(42, g(${cfg.g_args}));`,
` }`,
- ` ${f_inlinable ? "%SetForceInlineFlag(f)" : ""};`,
- ` ${g_inlinable ? "%SetForceInlineFlag(g)" : ""};`,
+ ` ${cfg.f_inlinable ? "%SetForceInlineFlag(f)" : ""};`,
+ ` ${cfg.g_inlinable ? "%SetForceInlineFlag(g)" : ""};`,
``,
` test();`,
` %OptimizeFunctionOnNextCall(test);`,
- ` try { %OptimizeFunctionOnNextCall(f); } catch(e) {}`,
- ` try { %OptimizeFunctionOnNextCall(ff); } catch(e) {}`,
+ ` %OptimizeFunctionOnNextCall(f);`,
` %OptimizeFunctionOnNextCall(g);`,
` test();`,
`})();`,
@@ -148,23 +249,39 @@ function run_tests() {
var f_inlinable_variants = [/*true,*/ false];
var g_inlinable_variants = [true, false];
var f_variants = [
- f_template_normal,
- f_template_bound,
- f_template_proxy
+ f_cfg_sloppy,
+ f_cfg_strict,
+ f_cfg_bound,
+ f_cfg_proxy,
+ f_cfg_possibly_eval,
+ ];
+ var g_variants = [
+ g_cfg_normal,
+ g_cfg_function_call,
+ g_cfg_function_apply,
];
- f_variants.forEach((f_template) => {
- f_args_variants.forEach((f_args) => {
- g_args_variants.forEach((g_args) => {
- f_inlinable_variants.forEach((f_inlinable) => {
- g_inlinable_variants.forEach((g_inlinable) => {
- var f_source = f_template(f_inlinable, f_args);
- var g_source = g_template(g_inlinable, f_args, g_args);
- var source = test_template(f_source, g_source, g_args,
- f_inlinable, g_inlinable);
- print("====================");
- print(source);
- eval(source);
+ 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) => {
+ 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,
+ };
+ var source = test_template(cfg);
+ print("====================");
+ print(source);
+ eval(source);
+ });
});
});
});
« no previous file with comments | « src/full-codegen/x87/full-codegen-x87.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698