OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --allow-natives-syntax --harmony-tailcalls --no-turbo-inlining | |
6 | |
7 "use strict"; | |
8 | |
9 Error.prepareStackTrace = (error,stack) => { | |
10 error.strace = stack; | |
11 return error.message + "\n at " + stack.join("\n at "); | |
12 } | |
13 | |
14 | |
15 function CheckStackTrace(expected) { | |
16 var e = new Error(); | |
17 e.stack; // prepare stack trace | |
18 var stack = e.strace; | |
19 assertEquals("CheckStackTrace", stack[0].getFunctionName()); | |
20 for (var i = 0; i < expected.length; i++) { | |
21 assertEquals(expected[i].name, stack[i + 1].getFunctionName()); | |
22 } | |
23 // Don't inline. Don't inline. Don't inline. Don't inline. | |
24 // Don't inline. Don't inline. Don't inline. Don't inline. | |
25 // Don't inline. Don't inline. Don't inline. Don't inline. | |
26 // Don't inline. Don't inline. Don't inline. Don't inline. | |
27 // Don't inline. Don't inline. Don't inline. Don't inline. | |
28 // Don't inline. Don't inline. Don't inline. Don't inline. | |
29 // Don't inline. Don't inline. Don't inline. Don't inline. | |
30 // Don't inline. Don't inline. Don't inline. Don't inline. | |
31 // Don't inline. Don't inline. Don't inline. Don't inline. | |
32 // Don't inline. Don't inline. Don't inline. Don't inline. | |
33 // Don't inline. Don't inline. Don't inline. Don't inline. | |
34 // Don't inline. Don't inline. Don't inline. Don't inline. | |
35 // Don't inline. Don't inline. Don't inline. Don't inline. | |
36 // Don't inline. Don't inline. Don't inline. Don't inline. | |
37 // Don't inline. Don't inline. Don't inline. Don't inline. | |
38 // Don't inline. Don't inline. Don't inline. Don't inline. | |
Jarin
2016/02/18 09:08:08
Could not you use %NeverOptimizeFunction to preven
Igor Sheludko
2016/02/18 09:30:11
Good point. For utility functions it makes sense,
| |
39 } | |
40 | |
41 function CheckArguments(expected, args) { | |
42 args = Array.prototype.slice.call(args); | |
43 assertEquals(expected, args); | |
44 // Don't inline. Don't inline. Don't inline. Don't inline. | |
45 // Don't inline. Don't inline. Don't inline. Don't inline. | |
46 // Don't inline. Don't inline. Don't inline. Don't inline. | |
47 // Don't inline. Don't inline. Don't inline. Don't inline. | |
48 // Don't inline. Don't inline. Don't inline. Don't inline. | |
49 // Don't inline. Don't inline. Don't inline. Don't inline. | |
50 // Don't inline. Don't inline. Don't inline. Don't inline. | |
51 // Don't inline. Don't inline. Don't inline. Don't inline. | |
52 // Don't inline. Don't inline. Don't inline. Don't inline. | |
53 // Don't inline. Don't inline. Don't inline. Don't inline. | |
54 // Don't inline. Don't inline. Don't inline. Don't inline. | |
55 // Don't inline. Don't inline. Don't inline. Don't inline. | |
56 // Don't inline. Don't inline. Don't inline. Don't inline. | |
57 // Don't inline. Don't inline. Don't inline. Don't inline. | |
58 // Don't inline. Don't inline. Don't inline. Don't inline. | |
59 // Don't inline. Don't inline. Don't inline. Don't inline. | |
60 } | |
61 | |
62 | |
63 var CAN_INLINE_COMMENT = "// Let it be inlined."; | |
64 var DONT_INLINE_COMMENT = (function() { | |
65 var line = "// Don't inline. Don't inline. Don't inline. Don't inline."; | |
66 for (var i = 0; i < 4; i++) { | |
67 line += "\n " + line; | |
68 } | |
69 return line; | |
70 })(); | |
71 | |
72 | |
73 function ident_source(source, ident) { | |
74 ident = " ".repeat(ident); | |
75 return ident + source.replace(/\n/gi, "\n" + ident); | |
76 } | |
77 | |
78 | |
79 function run_tests() { | |
80 | |
81 function f_template_normal(f_inlinable, f_args) { | |
82 var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT; | |
83 var lines = [ | |
84 `function f(a) {`, | |
85 ` ${f_comment}`, | |
86 ` assertEquals(undefined, this);`, | |
87 ` CheckArguments([${f_args}], arguments);`, | |
88 ` CheckStackTrace([f, test]);`, | |
89 ` %DeoptimizeNow();`, | |
90 ` CheckArguments([${f_args}], arguments);`, | |
91 ` CheckStackTrace([f, test]);`, | |
92 ` return 42;`, | |
93 `}`, | |
94 ]; | |
95 return lines.join("\n"); | |
96 } | |
97 | |
98 function f_template_bound(f_inlinable, f_args) { | |
99 var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT; | |
100 var lines = [ | |
101 `function ff(a) {`, | |
102 ` ${f_comment}`, | |
103 ` assertEquals(153, this.a);`, | |
104 ` CheckArguments([${f_args}], arguments);`, | |
105 ` CheckStackTrace([ff, test]);`, | |
106 ` %DeoptimizeNow();`, | |
107 ` CheckArguments([${f_args}], arguments);`, | |
108 ` CheckStackTrace([ff, test]);`, | |
109 ` return 42;`, | |
110 `}`, | |
111 `var f = ff.bind({a: 153});`, | |
112 ]; | |
113 return lines.join("\n"); | |
114 } | |
115 | |
116 function f_template_proxy(f_inlinable, f_args) { | |
117 var f_comment = f_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT; | |
118 var lines = [ | |
119 `function ff(a) {`, | |
120 ` ${f_comment}`, | |
121 ` assertEquals(undefined, this);`, | |
122 ` CheckArguments([${f_args}], arguments);`, | |
123 ` CheckStackTrace([f, test]);`, | |
124 ` %DeoptimizeNow();`, | |
125 ` CheckArguments([${f_args}], arguments);`, | |
126 ` CheckStackTrace([f, test]);`, | |
127 ` return 42;`, | |
128 `}`, | |
129 `var f = new Proxy(ff, {});`, | |
130 ]; | |
131 return lines.join("\n"); | |
132 } | |
133 | |
134 function g_template(g_inlinable, f_args, g_args) { | |
135 var g_comment = g_inlinable ? CAN_INLINE_COMMENT : DONT_INLINE_COMMENT; | |
136 var lines = [ | |
137 `function g(a) {`, | |
138 ` ${g_comment}`, | |
139 ` CheckArguments([${g_args}], arguments);`, | |
140 ` return f(${f_args});`, | |
141 `}`, | |
142 ]; | |
143 return lines.join("\n"); | |
144 } | |
145 | |
146 function test_template(f_source, g_source, g_args, | |
147 f_inlinable, g_inlinable) { | |
148 f_source = ident_source(f_source, 2); | |
149 g_source = ident_source(g_source, 2); | |
150 | |
151 var lines = [ | |
152 `(function() {`, | |
153 f_source, | |
154 g_source, | |
155 ` function test() {`, | |
156 ` assertEquals(42, g(${g_args}));`, | |
157 ` }`, | |
158 ` ${f_inlinable ? "%SetForceInlineFlag(f)" : ""};`, | |
159 ` ${g_inlinable ? "%SetForceInlineFlag(g)" : ""};`, | |
160 ``, | |
161 ` test();`, | |
162 ` %OptimizeFunctionOnNextCall(test);`, | |
163 ` try { %OptimizeFunctionOnNextCall(f); } catch(e) {}`, | |
164 ` try { %OptimizeFunctionOnNextCall(ff); } catch(e) {}`, | |
165 ` %OptimizeFunctionOnNextCall(g);`, | |
166 ` test();`, | |
167 `})();`, | |
168 ``, | |
169 ]; | |
170 var source = lines.join("\n"); | |
171 return source; | |
172 } | |
173 | |
174 // TODO(v8:4698), TODO(ishell): support all commented cases. | |
175 var f_args_variants = ["", "1", "1, 2"]; | |
176 var g_args_variants = [/*"",*/ "10", /*"10, 20"*/]; | |
177 var f_inlinable_variants = [/*true,*/ false]; | |
178 var g_inlinable_variants = [true, false]; | |
179 var f_variants = [ | |
180 f_template_normal, | |
181 f_template_bound, | |
182 f_template_proxy | |
183 ]; | |
184 | |
185 f_variants.forEach((f_template) => { | |
186 f_args_variants.forEach((f_args) => { | |
187 g_args_variants.forEach((g_args) => { | |
188 f_inlinable_variants.forEach((f_inlinable) => { | |
189 g_inlinable_variants.forEach((g_inlinable) => { | |
190 var f_source = f_template(f_inlinable, f_args); | |
191 var g_source = g_template(g_inlinable, f_args, g_args); | |
192 var source = test_template(f_source, g_source, g_args, | |
193 f_inlinable, g_inlinable); | |
194 print("===================="); | |
195 print(source); | |
196 eval(source); | |
197 }); | |
198 }); | |
199 }); | |
200 }); | |
201 }); | |
202 } | |
203 | |
204 run_tests(); | |
OLD | NEW |