OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <utility> | 5 #include <utility> |
6 | 6 |
7 #include "src/compilation-info.h" | 7 #include "src/compilation-info.h" |
8 #include "src/compiler/pipeline.h" | 8 #include "src/compiler/pipeline.h" |
9 #include "src/execution.h" | 9 #include "src/execution.h" |
10 #include "src/handles.h" | 10 #include "src/handles.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 } | 67 } |
68 | 68 |
69 private: | 69 private: |
70 Isolate* isolate_; | 70 Isolate* isolate_; |
71 Handle<JSFunction> function_; | 71 Handle<JSFunction> function_; |
72 }; | 72 }; |
73 | 73 |
74 | 74 |
75 class BytecodeGraphTester { | 75 class BytecodeGraphTester { |
76 public: | 76 public: |
77 BytecodeGraphTester(Isolate* isolate, Zone* zone, const char* script, | 77 BytecodeGraphTester(Isolate* isolate, const char* script, |
78 const char* filter = kFunctionName) | 78 const char* filter = kFunctionName) |
79 : isolate_(isolate), zone_(zone), script_(script) { | 79 : isolate_(isolate), script_(script) { |
80 i::FLAG_ignition = true; | 80 i::FLAG_ignition = true; |
81 i::FLAG_always_opt = false; | 81 i::FLAG_always_opt = false; |
82 i::FLAG_allow_natives_syntax = true; | 82 i::FLAG_allow_natives_syntax = true; |
83 i::FLAG_loop_assignment_analysis = false; | 83 i::FLAG_loop_assignment_analysis = false; |
84 } | 84 } |
85 virtual ~BytecodeGraphTester() {} | 85 virtual ~BytecodeGraphTester() {} |
86 | 86 |
87 template <class... A> | 87 template <class... A> |
88 BytecodeGraphCallable<A...> GetCallable( | 88 BytecodeGraphCallable<A...> GetCallable( |
89 const char* functionName = kFunctionName) { | 89 const char* functionName = kFunctionName) { |
(...skipping 11 matching lines...) Expand all Loading... |
101 CHECK(!try_catch.Message().IsEmpty()); | 101 CHECK(!try_catch.Message().IsEmpty()); |
102 return try_catch.Message(); | 102 return try_catch.Message(); |
103 } | 103 } |
104 | 104 |
105 static Handle<Object> NewObject(const char* script) { | 105 static Handle<Object> NewObject(const char* script) { |
106 return v8::Utils::OpenHandle(*CompileRun(script)); | 106 return v8::Utils::OpenHandle(*CompileRun(script)); |
107 } | 107 } |
108 | 108 |
109 private: | 109 private: |
110 Isolate* isolate_; | 110 Isolate* isolate_; |
111 Zone* zone_; | |
112 const char* script_; | 111 const char* script_; |
113 | 112 |
114 Handle<JSFunction> GetFunction(const char* functionName) { | 113 Handle<JSFunction> GetFunction(const char* functionName) { |
115 CompileRun(script_); | 114 CompileRun(script_); |
116 Local<Function> api_function = Local<Function>::Cast( | 115 Local<Function> api_function = Local<Function>::Cast( |
117 CcTest::global() | 116 CcTest::global() |
118 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str(functionName)) | 117 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str(functionName)) |
119 .ToLocalChecked()); | 118 .ToLocalChecked()); |
120 Handle<JSFunction> function = | 119 Handle<JSFunction> function = |
121 Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function)); | 120 Handle<JSFunction>::cast(v8::Utils::OpenHandle(*api_function)); |
122 CHECK(function->shared()->HasBytecodeArray()); | 121 CHECK(function->shared()->HasBytecodeArray()); |
123 | 122 |
124 // TODO(mstarzinger): We should be able to prime CompilationInfo without | 123 // TODO(mstarzinger): We should be able to prime CompilationInfo without |
125 // having to instantiate a ParseInfo first. Fix this! | 124 // having to instantiate a ParseInfo first. Fix this! |
126 ParseInfo parse_info(zone_, handle(function->shared())); | 125 ParseInfo parse_info(handle(function->shared())); |
127 | 126 |
128 CompilationInfo compilation_info(&parse_info, function); | 127 CompilationInfo compilation_info(&parse_info, function); |
129 compilation_info.SetOptimizing(); | 128 compilation_info.SetOptimizing(); |
130 compilation_info.MarkAsDeoptimizationEnabled(); | 129 compilation_info.MarkAsDeoptimizationEnabled(); |
131 compilation_info.MarkAsOptimizeFromBytecode(); | 130 compilation_info.MarkAsOptimizeFromBytecode(); |
132 Handle<Code> code = Pipeline::GenerateCodeForTesting(&compilation_info); | 131 Handle<Code> code = Pipeline::GenerateCodeForTesting(&compilation_info); |
133 function->ReplaceCode(*code); | 132 function->ReplaceCode(*code); |
134 | 133 |
135 return function; | 134 return function; |
136 } | 135 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 CHECK_GE(i, 0); | 179 CHECK_GE(i, 0); |
181 CHECK_LT(i, N); | 180 CHECK_LT(i, N); |
182 return return_value_and_parameters[1 + i]; | 181 return return_value_and_parameters[1 + i]; |
183 } | 182 } |
184 }; | 183 }; |
185 | 184 |
186 | 185 |
187 TEST(BytecodeGraphBuilderReturnStatements) { | 186 TEST(BytecodeGraphBuilderReturnStatements) { |
188 HandleAndZoneScope scope; | 187 HandleAndZoneScope scope; |
189 Isolate* isolate = scope.main_isolate(); | 188 Isolate* isolate = scope.main_isolate(); |
190 Zone* zone = scope.main_zone(); | |
191 Factory* factory = isolate->factory(); | 189 Factory* factory = isolate->factory(); |
192 | 190 |
193 ExpectedSnippet<0> snippets[] = { | 191 ExpectedSnippet<0> snippets[] = { |
194 {"return;", {factory->undefined_value()}}, | 192 {"return;", {factory->undefined_value()}}, |
195 {"return null;", {factory->null_value()}}, | 193 {"return null;", {factory->null_value()}}, |
196 {"return true;", {factory->true_value()}}, | 194 {"return true;", {factory->true_value()}}, |
197 {"return false;", {factory->false_value()}}, | 195 {"return false;", {factory->false_value()}}, |
198 {"return 0;", {factory->NewNumberFromInt(0)}}, | 196 {"return 0;", {factory->NewNumberFromInt(0)}}, |
199 {"return +1;", {factory->NewNumberFromInt(1)}}, | 197 {"return +1;", {factory->NewNumberFromInt(1)}}, |
200 {"return -1;", {factory->NewNumberFromInt(-1)}}, | 198 {"return -1;", {factory->NewNumberFromInt(-1)}}, |
201 {"return +127;", {factory->NewNumberFromInt(127)}}, | 199 {"return +127;", {factory->NewNumberFromInt(127)}}, |
202 {"return -128;", {factory->NewNumberFromInt(-128)}}, | 200 {"return -128;", {factory->NewNumberFromInt(-128)}}, |
203 {"return 0.001;", {factory->NewNumber(0.001)}}, | 201 {"return 0.001;", {factory->NewNumber(0.001)}}, |
204 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}}, | 202 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}}, |
205 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}}, | 203 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}}, |
206 {"return '';", {factory->NewStringFromStaticChars("")}}, | 204 {"return '';", {factory->NewStringFromStaticChars("")}}, |
207 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}}, | 205 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}}, |
208 {"return NaN;", {factory->nan_value()}}}; | 206 {"return NaN;", {factory->nan_value()}}}; |
209 | 207 |
210 for (size_t i = 0; i < arraysize(snippets); i++) { | 208 for (size_t i = 0; i < arraysize(snippets); i++) { |
211 ScopedVector<char> script(1024); | 209 ScopedVector<char> script(1024); |
212 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 210 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
213 snippets[i].code_snippet, kFunctionName); | 211 snippets[i].code_snippet, kFunctionName); |
214 | 212 |
215 BytecodeGraphTester tester(isolate, zone, script.start()); | 213 BytecodeGraphTester tester(isolate, script.start()); |
216 auto callable = tester.GetCallable<>(); | 214 auto callable = tester.GetCallable<>(); |
217 Handle<Object> return_value = callable().ToHandleChecked(); | 215 Handle<Object> return_value = callable().ToHandleChecked(); |
218 CHECK(return_value->SameValue(*snippets[i].return_value())); | 216 CHECK(return_value->SameValue(*snippets[i].return_value())); |
219 } | 217 } |
220 } | 218 } |
221 | 219 |
222 | 220 |
223 TEST(BytecodeGraphBuilderPrimitiveExpressions) { | 221 TEST(BytecodeGraphBuilderPrimitiveExpressions) { |
224 HandleAndZoneScope scope; | 222 HandleAndZoneScope scope; |
225 Isolate* isolate = scope.main_isolate(); | 223 Isolate* isolate = scope.main_isolate(); |
226 Zone* zone = scope.main_zone(); | |
227 Factory* factory = isolate->factory(); | 224 Factory* factory = isolate->factory(); |
228 | 225 |
229 ExpectedSnippet<0> snippets[] = { | 226 ExpectedSnippet<0> snippets[] = { |
230 {"return 1 + 1;", {factory->NewNumberFromInt(2)}}, | 227 {"return 1 + 1;", {factory->NewNumberFromInt(2)}}, |
231 {"return 20 - 30;", {factory->NewNumberFromInt(-10)}}, | 228 {"return 20 - 30;", {factory->NewNumberFromInt(-10)}}, |
232 {"return 4 * 100;", {factory->NewNumberFromInt(400)}}, | 229 {"return 4 * 100;", {factory->NewNumberFromInt(400)}}, |
233 {"return 100 / 5;", {factory->NewNumberFromInt(20)}}, | 230 {"return 100 / 5;", {factory->NewNumberFromInt(20)}}, |
234 {"return 25 % 7;", {factory->NewNumberFromInt(4)}}, | 231 {"return 25 % 7;", {factory->NewNumberFromInt(4)}}, |
235 }; | 232 }; |
236 | 233 |
237 for (size_t i = 0; i < arraysize(snippets); i++) { | 234 for (size_t i = 0; i < arraysize(snippets); i++) { |
238 ScopedVector<char> script(1024); | 235 ScopedVector<char> script(1024); |
239 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 236 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
240 snippets[i].code_snippet, kFunctionName); | 237 snippets[i].code_snippet, kFunctionName); |
241 | 238 |
242 BytecodeGraphTester tester(isolate, zone, script.start()); | 239 BytecodeGraphTester tester(isolate, script.start()); |
243 auto callable = tester.GetCallable<>(); | 240 auto callable = tester.GetCallable<>(); |
244 Handle<Object> return_value = callable().ToHandleChecked(); | 241 Handle<Object> return_value = callable().ToHandleChecked(); |
245 CHECK(return_value->SameValue(*snippets[i].return_value())); | 242 CHECK(return_value->SameValue(*snippets[i].return_value())); |
246 } | 243 } |
247 } | 244 } |
248 | 245 |
249 | 246 |
250 TEST(BytecodeGraphBuilderTwoParameterTests) { | 247 TEST(BytecodeGraphBuilderTwoParameterTests) { |
251 HandleAndZoneScope scope; | 248 HandleAndZoneScope scope; |
252 Isolate* isolate = scope.main_isolate(); | 249 Isolate* isolate = scope.main_isolate(); |
253 Zone* zone = scope.main_zone(); | |
254 Factory* factory = isolate->factory(); | 250 Factory* factory = isolate->factory(); |
255 | 251 |
256 ExpectedSnippet<2> snippets[] = { | 252 ExpectedSnippet<2> snippets[] = { |
257 // Integers | 253 // Integers |
258 {"return p1 + p2;", | 254 {"return p1 + p2;", |
259 {factory->NewNumberFromInt(-70), factory->NewNumberFromInt(3), | 255 {factory->NewNumberFromInt(-70), factory->NewNumberFromInt(3), |
260 factory->NewNumberFromInt(-73)}}, | 256 factory->NewNumberFromInt(-73)}}, |
261 {"return p1 + p2 + 3;", | 257 {"return p1 + p2 + 3;", |
262 {factory->NewNumberFromInt(1139044), factory->NewNumberFromInt(300), | 258 {factory->NewNumberFromInt(1139044), factory->NewNumberFromInt(300), |
263 factory->NewNumberFromInt(1138741)}}, | 259 factory->NewNumberFromInt(1138741)}}, |
(...skipping 26 matching lines...) Expand all Loading... |
290 {"return p1 + p2;", | 286 {"return p1 + p2;", |
291 {factory->NewStringFromStaticChars("abcdef"), | 287 {factory->NewStringFromStaticChars("abcdef"), |
292 factory->NewStringFromStaticChars("abc"), | 288 factory->NewStringFromStaticChars("abc"), |
293 factory->NewStringFromStaticChars("def")}}}; | 289 factory->NewStringFromStaticChars("def")}}}; |
294 | 290 |
295 for (size_t i = 0; i < arraysize(snippets); i++) { | 291 for (size_t i = 0; i < arraysize(snippets); i++) { |
296 ScopedVector<char> script(1024); | 292 ScopedVector<char> script(1024); |
297 SNPrintF(script, "function %s(p1, p2) { %s }\n%s(0, 0);", kFunctionName, | 293 SNPrintF(script, "function %s(p1, p2) { %s }\n%s(0, 0);", kFunctionName, |
298 snippets[i].code_snippet, kFunctionName); | 294 snippets[i].code_snippet, kFunctionName); |
299 | 295 |
300 BytecodeGraphTester tester(isolate, zone, script.start()); | 296 BytecodeGraphTester tester(isolate, script.start()); |
301 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 297 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
302 Handle<Object> return_value = | 298 Handle<Object> return_value = |
303 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 299 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
304 .ToHandleChecked(); | 300 .ToHandleChecked(); |
305 CHECK(return_value->SameValue(*snippets[i].return_value())); | 301 CHECK(return_value->SameValue(*snippets[i].return_value())); |
306 } | 302 } |
307 } | 303 } |
308 | 304 |
309 | 305 |
310 TEST(BytecodeGraphBuilderNamedLoad) { | 306 TEST(BytecodeGraphBuilderNamedLoad) { |
311 HandleAndZoneScope scope; | 307 HandleAndZoneScope scope; |
312 Isolate* isolate = scope.main_isolate(); | 308 Isolate* isolate = scope.main_isolate(); |
313 Zone* zone = scope.main_zone(); | |
314 Factory* factory = isolate->factory(); | 309 Factory* factory = isolate->factory(); |
315 | 310 |
316 ExpectedSnippet<1> snippets[] = { | 311 ExpectedSnippet<1> snippets[] = { |
317 {"return p1.val;", | 312 {"return p1.val;", |
318 {factory->NewNumberFromInt(10), | 313 {factory->NewNumberFromInt(10), |
319 BytecodeGraphTester::NewObject("({val : 10})")}}, | 314 BytecodeGraphTester::NewObject("({val : 10})")}}, |
320 {"return p1[\"name\"];", | 315 {"return p1[\"name\"];", |
321 {factory->NewStringFromStaticChars("abc"), | 316 {factory->NewStringFromStaticChars("abc"), |
322 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, | 317 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, |
323 {"'use strict'; return p1.val;", | 318 {"'use strict'; return p1.val;", |
(...skipping 10 matching lines...) Expand all Loading... |
334 "return p1.name;\n", | 329 "return p1.name;\n", |
335 {factory->NewStringFromStaticChars("abc"), | 330 {factory->NewStringFromStaticChars("abc"), |
336 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, | 331 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, |
337 }; | 332 }; |
338 | 333 |
339 for (size_t i = 0; i < arraysize(snippets); i++) { | 334 for (size_t i = 0; i < arraysize(snippets); i++) { |
340 ScopedVector<char> script(2048); | 335 ScopedVector<char> script(2048); |
341 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 336 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
342 snippets[i].code_snippet, kFunctionName); | 337 snippets[i].code_snippet, kFunctionName); |
343 | 338 |
344 BytecodeGraphTester tester(isolate, zone, script.start()); | 339 BytecodeGraphTester tester(isolate, script.start()); |
345 auto callable = tester.GetCallable<Handle<Object>>(); | 340 auto callable = tester.GetCallable<Handle<Object>>(); |
346 Handle<Object> return_value = | 341 Handle<Object> return_value = |
347 callable(snippets[i].parameter(0)).ToHandleChecked(); | 342 callable(snippets[i].parameter(0)).ToHandleChecked(); |
348 CHECK(return_value->SameValue(*snippets[i].return_value())); | 343 CHECK(return_value->SameValue(*snippets[i].return_value())); |
349 } | 344 } |
350 } | 345 } |
351 | 346 |
352 | 347 |
353 TEST(BytecodeGraphBuilderKeyedLoad) { | 348 TEST(BytecodeGraphBuilderKeyedLoad) { |
354 HandleAndZoneScope scope; | 349 HandleAndZoneScope scope; |
355 Isolate* isolate = scope.main_isolate(); | 350 Isolate* isolate = scope.main_isolate(); |
356 Zone* zone = scope.main_zone(); | |
357 Factory* factory = isolate->factory(); | 351 Factory* factory = isolate->factory(); |
358 | 352 |
359 ExpectedSnippet<2> snippets[] = { | 353 ExpectedSnippet<2> snippets[] = { |
360 {"return p1[p2];", | 354 {"return p1[p2];", |
361 {factory->NewNumberFromInt(10), | 355 {factory->NewNumberFromInt(10), |
362 BytecodeGraphTester::NewObject("({val : 10})"), | 356 BytecodeGraphTester::NewObject("({val : 10})"), |
363 factory->NewStringFromStaticChars("val")}}, | 357 factory->NewStringFromStaticChars("val")}}, |
364 {"return p1[100];", | 358 {"return p1[100];", |
365 {factory->NewStringFromStaticChars("abc"), | 359 {factory->NewStringFromStaticChars("abc"), |
366 BytecodeGraphTester::NewObject("({100 : 'abc'})"), | 360 BytecodeGraphTester::NewObject("({100 : 'abc'})"), |
(...skipping 23 matching lines...) Expand all Loading... |
390 {factory->NewStringFromStaticChars("abc"), | 384 {factory->NewStringFromStaticChars("abc"), |
391 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), | 385 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), |
392 factory->NewNumberFromInt(100)}}, | 386 factory->NewNumberFromInt(100)}}, |
393 }; | 387 }; |
394 | 388 |
395 for (size_t i = 0; i < arraysize(snippets); i++) { | 389 for (size_t i = 0; i < arraysize(snippets); i++) { |
396 ScopedVector<char> script(2048); | 390 ScopedVector<char> script(2048); |
397 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0);", kFunctionName, | 391 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0);", kFunctionName, |
398 snippets[i].code_snippet, kFunctionName); | 392 snippets[i].code_snippet, kFunctionName); |
399 | 393 |
400 BytecodeGraphTester tester(isolate, zone, script.start()); | 394 BytecodeGraphTester tester(isolate, script.start()); |
401 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 395 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
402 Handle<Object> return_value = | 396 Handle<Object> return_value = |
403 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 397 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
404 .ToHandleChecked(); | 398 .ToHandleChecked(); |
405 CHECK(return_value->SameValue(*snippets[i].return_value())); | 399 CHECK(return_value->SameValue(*snippets[i].return_value())); |
406 } | 400 } |
407 } | 401 } |
408 | 402 |
409 void TestBytecodeGraphBuilderNamedStore(size_t shard) { | 403 void TestBytecodeGraphBuilderNamedStore(size_t shard) { |
410 HandleAndZoneScope scope; | 404 HandleAndZoneScope scope; |
411 Isolate* isolate = scope.main_isolate(); | 405 Isolate* isolate = scope.main_isolate(); |
412 Zone* zone = scope.main_zone(); | |
413 Factory* factory = isolate->factory(); | 406 Factory* factory = isolate->factory(); |
414 | 407 |
415 ExpectedSnippet<1> snippets[] = { | 408 ExpectedSnippet<1> snippets[] = { |
416 {"return p1.val = 20;", | 409 {"return p1.val = 20;", |
417 {factory->NewNumberFromInt(20), | 410 {factory->NewNumberFromInt(20), |
418 BytecodeGraphTester::NewObject("({val : 10})")}}, | 411 BytecodeGraphTester::NewObject("({val : 10})")}}, |
419 {"p1.type = 'int'; return p1.type;", | 412 {"p1.type = 'int'; return p1.type;", |
420 {factory->NewStringFromStaticChars("int"), | 413 {factory->NewStringFromStaticChars("int"), |
421 BytecodeGraphTester::NewObject("({val : 10})")}}, | 414 BytecodeGraphTester::NewObject("({val : 10})")}}, |
422 {"p1.name = 'def'; return p1[\"name\"];", | 415 {"p1.name = 'def'; return p1[\"name\"];", |
(...skipping 17 matching lines...) Expand all Loading... |
440 {factory->NewStringFromStaticChars("def"), | 433 {factory->NewStringFromStaticChars("def"), |
441 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, | 434 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, |
442 }; | 435 }; |
443 | 436 |
444 for (size_t i = 0; i < arraysize(snippets); i++) { | 437 for (size_t i = 0; i < arraysize(snippets); i++) { |
445 if ((i % 2) != shard) continue; | 438 if ((i % 2) != shard) continue; |
446 ScopedVector<char> script(3072); | 439 ScopedVector<char> script(3072); |
447 SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName, | 440 SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName, |
448 snippets[i].code_snippet, kFunctionName); | 441 snippets[i].code_snippet, kFunctionName); |
449 | 442 |
450 BytecodeGraphTester tester(isolate, zone, script.start()); | 443 BytecodeGraphTester tester(isolate, script.start()); |
451 auto callable = tester.GetCallable<Handle<Object>>(); | 444 auto callable = tester.GetCallable<Handle<Object>>(); |
452 Handle<Object> return_value = | 445 Handle<Object> return_value = |
453 callable(snippets[i].parameter(0)).ToHandleChecked(); | 446 callable(snippets[i].parameter(0)).ToHandleChecked(); |
454 CHECK(return_value->SameValue(*snippets[i].return_value())); | 447 CHECK(return_value->SameValue(*snippets[i].return_value())); |
455 } | 448 } |
456 } | 449 } |
457 | 450 |
458 SHARD_TEST_BY_2(BytecodeGraphBuilderNamedStore) | 451 SHARD_TEST_BY_2(BytecodeGraphBuilderNamedStore) |
459 | 452 |
460 void TestBytecodeGraphBuilderKeyedStore(size_t shard) { | 453 void TestBytecodeGraphBuilderKeyedStore(size_t shard) { |
461 HandleAndZoneScope scope; | 454 HandleAndZoneScope scope; |
462 Isolate* isolate = scope.main_isolate(); | 455 Isolate* isolate = scope.main_isolate(); |
463 Zone* zone = scope.main_zone(); | |
464 Factory* factory = isolate->factory(); | 456 Factory* factory = isolate->factory(); |
465 | 457 |
466 ExpectedSnippet<2> snippets[] = { | 458 ExpectedSnippet<2> snippets[] = { |
467 {"p1[p2] = 20; return p1[p2];", | 459 {"p1[p2] = 20; return p1[p2];", |
468 {factory->NewNumberFromInt(20), | 460 {factory->NewNumberFromInt(20), |
469 BytecodeGraphTester::NewObject("({val : 10})"), | 461 BytecodeGraphTester::NewObject("({val : 10})"), |
470 factory->NewStringFromStaticChars("val")}}, | 462 factory->NewStringFromStaticChars("val")}}, |
471 {"return p1[100] = 'def';", | 463 {"return p1[100] = 'def';", |
472 {factory->NewStringFromStaticChars("def"), | 464 {factory->NewStringFromStaticChars("def"), |
473 BytecodeGraphTester::NewObject("({100 : 'abc'})"), | 465 BytecodeGraphTester::NewObject("({100 : 'abc'})"), |
(...skipping 25 matching lines...) Expand all Loading... |
499 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), | 491 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), |
500 factory->NewNumberFromInt(100)}}, | 492 factory->NewNumberFromInt(100)}}, |
501 }; | 493 }; |
502 | 494 |
503 for (size_t i = 0; i < arraysize(snippets); i++) { | 495 for (size_t i = 0; i < arraysize(snippets); i++) { |
504 if ((i % 2) != shard) continue; | 496 if ((i % 2) != shard) continue; |
505 ScopedVector<char> script(2048); | 497 ScopedVector<char> script(2048); |
506 SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName, | 498 SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName, |
507 snippets[i].code_snippet, kFunctionName); | 499 snippets[i].code_snippet, kFunctionName); |
508 | 500 |
509 BytecodeGraphTester tester(isolate, zone, script.start()); | 501 BytecodeGraphTester tester(isolate, script.start()); |
510 auto callable = tester.GetCallable<Handle<Object>>(); | 502 auto callable = tester.GetCallable<Handle<Object>>(); |
511 Handle<Object> return_value = | 503 Handle<Object> return_value = |
512 callable(snippets[i].parameter(0)).ToHandleChecked(); | 504 callable(snippets[i].parameter(0)).ToHandleChecked(); |
513 CHECK(return_value->SameValue(*snippets[i].return_value())); | 505 CHECK(return_value->SameValue(*snippets[i].return_value())); |
514 } | 506 } |
515 } | 507 } |
516 | 508 |
517 SHARD_TEST_BY_2(BytecodeGraphBuilderKeyedStore) | 509 SHARD_TEST_BY_2(BytecodeGraphBuilderKeyedStore) |
518 | 510 |
519 TEST(BytecodeGraphBuilderPropertyCall) { | 511 TEST(BytecodeGraphBuilderPropertyCall) { |
520 HandleAndZoneScope scope; | 512 HandleAndZoneScope scope; |
521 Isolate* isolate = scope.main_isolate(); | 513 Isolate* isolate = scope.main_isolate(); |
522 Zone* zone = scope.main_zone(); | |
523 Factory* factory = isolate->factory(); | 514 Factory* factory = isolate->factory(); |
524 | 515 |
525 ExpectedSnippet<1> snippets[] = { | 516 ExpectedSnippet<1> snippets[] = { |
526 {"return p1.func();", | 517 {"return p1.func();", |
527 {factory->NewNumberFromInt(25), | 518 {factory->NewNumberFromInt(25), |
528 BytecodeGraphTester::NewObject("({func() { return 25; }})")}}, | 519 BytecodeGraphTester::NewObject("({func() { return 25; }})")}}, |
529 {"return p1.func('abc');", | 520 {"return p1.func('abc');", |
530 {factory->NewStringFromStaticChars("abc"), | 521 {factory->NewStringFromStaticChars("abc"), |
531 BytecodeGraphTester::NewObject("({func(a) { return a; }})")}}, | 522 BytecodeGraphTester::NewObject("({func(a) { return a; }})")}}, |
532 {"return p1.func(1, 2, 3, 4, 5, 6, 7, 8);", | 523 {"return p1.func(1, 2, 3, 4, 5, 6, 7, 8);", |
533 {factory->NewNumberFromInt(36), | 524 {factory->NewNumberFromInt(36), |
534 BytecodeGraphTester::NewObject( | 525 BytecodeGraphTester::NewObject( |
535 "({func(a, b, c, d, e, f, g, h) {\n" | 526 "({func(a, b, c, d, e, f, g, h) {\n" |
536 " return a + b + c + d + e + f + g + h;}})")}}, | 527 " return a + b + c + d + e + f + g + h;}})")}}, |
537 }; | 528 }; |
538 | 529 |
539 for (size_t i = 0; i < arraysize(snippets); i++) { | 530 for (size_t i = 0; i < arraysize(snippets); i++) { |
540 ScopedVector<char> script(2048); | 531 ScopedVector<char> script(2048); |
541 SNPrintF(script, "function %s(p1) { %s };\n%s({func() {}});", kFunctionName, | 532 SNPrintF(script, "function %s(p1) { %s };\n%s({func() {}});", kFunctionName, |
542 snippets[i].code_snippet, kFunctionName); | 533 snippets[i].code_snippet, kFunctionName); |
543 | 534 |
544 BytecodeGraphTester tester(isolate, zone, script.start()); | 535 BytecodeGraphTester tester(isolate, script.start()); |
545 auto callable = tester.GetCallable<Handle<Object>>(); | 536 auto callable = tester.GetCallable<Handle<Object>>(); |
546 Handle<Object> return_value = | 537 Handle<Object> return_value = |
547 callable(snippets[i].parameter(0)).ToHandleChecked(); | 538 callable(snippets[i].parameter(0)).ToHandleChecked(); |
548 CHECK(return_value->SameValue(*snippets[i].return_value())); | 539 CHECK(return_value->SameValue(*snippets[i].return_value())); |
549 } | 540 } |
550 } | 541 } |
551 | 542 |
552 | 543 |
553 TEST(BytecodeGraphBuilderCallNew) { | 544 TEST(BytecodeGraphBuilderCallNew) { |
554 HandleAndZoneScope scope; | 545 HandleAndZoneScope scope; |
555 Isolate* isolate = scope.main_isolate(); | 546 Isolate* isolate = scope.main_isolate(); |
556 Zone* zone = scope.main_zone(); | |
557 Factory* factory = isolate->factory(); | 547 Factory* factory = isolate->factory(); |
558 | 548 |
559 ExpectedSnippet<0> snippets[] = { | 549 ExpectedSnippet<0> snippets[] = { |
560 {"function counter() { this.count = 20; }\n" | 550 {"function counter() { this.count = 20; }\n" |
561 "function f() {\n" | 551 "function f() {\n" |
562 " var c = new counter();\n" | 552 " var c = new counter();\n" |
563 " return c.count;\n" | 553 " return c.count;\n" |
564 "}; f()", | 554 "}; f()", |
565 {factory->NewNumberFromInt(20)}}, | 555 {factory->NewNumberFromInt(20)}}, |
566 {"function counter(arg0) { this.count = 17; this.x = arg0; }\n" | 556 {"function counter(arg0) { this.count = 17; this.x = arg0; }\n" |
567 "function f() {\n" | 557 "function f() {\n" |
568 " var c = new counter(6);\n" | 558 " var c = new counter(6);\n" |
569 " return c.count + c.x;\n" | 559 " return c.count + c.x;\n" |
570 "}; f()", | 560 "}; f()", |
571 {factory->NewNumberFromInt(23)}}, | 561 {factory->NewNumberFromInt(23)}}, |
572 {"function counter(arg0, arg1) {\n" | 562 {"function counter(arg0, arg1) {\n" |
573 " this.count = 17; this.x = arg0; this.y = arg1;\n" | 563 " this.count = 17; this.x = arg0; this.y = arg1;\n" |
574 "}\n" | 564 "}\n" |
575 "function f() {\n" | 565 "function f() {\n" |
576 " var c = new counter(3, 5);\n" | 566 " var c = new counter(3, 5);\n" |
577 " return c.count + c.x + c.y;\n" | 567 " return c.count + c.x + c.y;\n" |
578 "}; f()", | 568 "}; f()", |
579 {factory->NewNumberFromInt(25)}}, | 569 {factory->NewNumberFromInt(25)}}, |
580 }; | 570 }; |
581 | 571 |
582 for (size_t i = 0; i < arraysize(snippets); i++) { | 572 for (size_t i = 0; i < arraysize(snippets); i++) { |
583 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 573 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
584 auto callable = tester.GetCallable<>(); | 574 auto callable = tester.GetCallable<>(); |
585 Handle<Object> return_value = callable().ToHandleChecked(); | 575 Handle<Object> return_value = callable().ToHandleChecked(); |
586 CHECK(return_value->SameValue(*snippets[i].return_value())); | 576 CHECK(return_value->SameValue(*snippets[i].return_value())); |
587 } | 577 } |
588 } | 578 } |
589 | 579 |
590 | 580 |
591 TEST(BytecodeGraphBuilderCreateClosure) { | 581 TEST(BytecodeGraphBuilderCreateClosure) { |
592 HandleAndZoneScope scope; | 582 HandleAndZoneScope scope; |
593 Isolate* isolate = scope.main_isolate(); | 583 Isolate* isolate = scope.main_isolate(); |
594 Zone* zone = scope.main_zone(); | |
595 Factory* factory = isolate->factory(); | 584 Factory* factory = isolate->factory(); |
596 | 585 |
597 ExpectedSnippet<0> snippets[] = { | 586 ExpectedSnippet<0> snippets[] = { |
598 {"function f() {\n" | 587 {"function f() {\n" |
599 " function counter() { this.count = 20; }\n" | 588 " function counter() { this.count = 20; }\n" |
600 " var c = new counter();\n" | 589 " var c = new counter();\n" |
601 " return c.count;\n" | 590 " return c.count;\n" |
602 "}; f()", | 591 "}; f()", |
603 {factory->NewNumberFromInt(20)}}, | 592 {factory->NewNumberFromInt(20)}}, |
604 {"function f() {\n" | 593 {"function f() {\n" |
605 " function counter(arg0) { this.count = 17; this.x = arg0; }\n" | 594 " function counter(arg0) { this.count = 17; this.x = arg0; }\n" |
606 " var c = new counter(6);\n" | 595 " var c = new counter(6);\n" |
607 " return c.count + c.x;\n" | 596 " return c.count + c.x;\n" |
608 "}; f()", | 597 "}; f()", |
609 {factory->NewNumberFromInt(23)}}, | 598 {factory->NewNumberFromInt(23)}}, |
610 {"function f() {\n" | 599 {"function f() {\n" |
611 " function counter(arg0, arg1) {\n" | 600 " function counter(arg0, arg1) {\n" |
612 " this.count = 17; this.x = arg0; this.y = arg1;\n" | 601 " this.count = 17; this.x = arg0; this.y = arg1;\n" |
613 " }\n" | 602 " }\n" |
614 " var c = new counter(3, 5);\n" | 603 " var c = new counter(3, 5);\n" |
615 " return c.count + c.x + c.y;\n" | 604 " return c.count + c.x + c.y;\n" |
616 "}; f()", | 605 "}; f()", |
617 {factory->NewNumberFromInt(25)}}, | 606 {factory->NewNumberFromInt(25)}}, |
618 }; | 607 }; |
619 | 608 |
620 for (size_t i = 0; i < arraysize(snippets); i++) { | 609 for (size_t i = 0; i < arraysize(snippets); i++) { |
621 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 610 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
622 auto callable = tester.GetCallable<>(); | 611 auto callable = tester.GetCallable<>(); |
623 Handle<Object> return_value = callable().ToHandleChecked(); | 612 Handle<Object> return_value = callable().ToHandleChecked(); |
624 CHECK(return_value->SameValue(*snippets[i].return_value())); | 613 CHECK(return_value->SameValue(*snippets[i].return_value())); |
625 } | 614 } |
626 } | 615 } |
627 | 616 |
628 | 617 |
629 TEST(BytecodeGraphBuilderCallRuntime) { | 618 TEST(BytecodeGraphBuilderCallRuntime) { |
630 HandleAndZoneScope scope; | 619 HandleAndZoneScope scope; |
631 Isolate* isolate = scope.main_isolate(); | 620 Isolate* isolate = scope.main_isolate(); |
632 Zone* zone = scope.main_zone(); | |
633 Factory* factory = isolate->factory(); | 621 Factory* factory = isolate->factory(); |
634 | 622 |
635 ExpectedSnippet<1> snippets[] = { | 623 ExpectedSnippet<1> snippets[] = { |
636 {"function f(arg0) { return %MaxSmi(); }\nf()", | 624 {"function f(arg0) { return %MaxSmi(); }\nf()", |
637 {factory->NewNumberFromInt(Smi::kMaxValue), factory->undefined_value()}}, | 625 {factory->NewNumberFromInt(Smi::kMaxValue), factory->undefined_value()}}, |
638 {"function f(arg0) { return %IsArray(arg0) }\nf(undefined)", | 626 {"function f(arg0) { return %IsArray(arg0) }\nf(undefined)", |
639 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, | 627 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, |
640 {"function f(arg0) { return %Add(arg0, 2) }\nf(1)", | 628 {"function f(arg0) { return %Add(arg0, 2) }\nf(1)", |
641 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(3)}}, | 629 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(3)}}, |
642 {"function f(arg0) { return %spread_arguments(arg0).length }\nf([])", | 630 {"function f(arg0) { return %spread_arguments(arg0).length }\nf([])", |
643 {factory->NewNumberFromInt(3), | 631 {factory->NewNumberFromInt(3), |
644 BytecodeGraphTester::NewObject("[1, 2, 3]")}}, | 632 BytecodeGraphTester::NewObject("[1, 2, 3]")}}, |
645 }; | 633 }; |
646 | 634 |
647 for (size_t i = 0; i < arraysize(snippets); i++) { | 635 for (size_t i = 0; i < arraysize(snippets); i++) { |
648 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 636 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
649 auto callable = tester.GetCallable<Handle<Object>>(); | 637 auto callable = tester.GetCallable<Handle<Object>>(); |
650 Handle<Object> return_value = | 638 Handle<Object> return_value = |
651 callable(snippets[i].parameter(0)).ToHandleChecked(); | 639 callable(snippets[i].parameter(0)).ToHandleChecked(); |
652 CHECK(return_value->SameValue(*snippets[i].return_value())); | 640 CHECK(return_value->SameValue(*snippets[i].return_value())); |
653 } | 641 } |
654 } | 642 } |
655 | 643 |
656 TEST(BytecodeGraphBuilderInvokeIntrinsic) { | 644 TEST(BytecodeGraphBuilderInvokeIntrinsic) { |
657 HandleAndZoneScope scope; | 645 HandleAndZoneScope scope; |
658 Isolate* isolate = scope.main_isolate(); | 646 Isolate* isolate = scope.main_isolate(); |
659 Zone* zone = scope.main_zone(); | |
660 Factory* factory = isolate->factory(); | 647 Factory* factory = isolate->factory(); |
661 | 648 |
662 ExpectedSnippet<1> snippets[] = { | 649 ExpectedSnippet<1> snippets[] = { |
663 {"function f(arg0) { return %_IsJSReceiver(arg0); }\nf()", | 650 {"function f(arg0) { return %_IsJSReceiver(arg0); }\nf()", |
664 {factory->false_value(), factory->NewNumberFromInt(1)}}, | 651 {factory->false_value(), factory->NewNumberFromInt(1)}}, |
665 {"function f(arg0) { return %_IsArray(arg0) }\nf(undefined)", | 652 {"function f(arg0) { return %_IsArray(arg0) }\nf(undefined)", |
666 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, | 653 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, |
667 }; | 654 }; |
668 | 655 |
669 for (size_t i = 0; i < arraysize(snippets); i++) { | 656 for (size_t i = 0; i < arraysize(snippets); i++) { |
670 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 657 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
671 auto callable = tester.GetCallable<Handle<Object>>(); | 658 auto callable = tester.GetCallable<Handle<Object>>(); |
672 Handle<Object> return_value = | 659 Handle<Object> return_value = |
673 callable(snippets[i].parameter(0)).ToHandleChecked(); | 660 callable(snippets[i].parameter(0)).ToHandleChecked(); |
674 CHECK(return_value->SameValue(*snippets[i].return_value())); | 661 CHECK(return_value->SameValue(*snippets[i].return_value())); |
675 } | 662 } |
676 } | 663 } |
677 | 664 |
678 void TestBytecodeGraphBuilderGlobals(size_t shard) { | 665 void TestBytecodeGraphBuilderGlobals(size_t shard) { |
679 HandleAndZoneScope scope; | 666 HandleAndZoneScope scope; |
680 Isolate* isolate = scope.main_isolate(); | 667 Isolate* isolate = scope.main_isolate(); |
681 Zone* zone = scope.main_zone(); | |
682 Factory* factory = isolate->factory(); | 668 Factory* factory = isolate->factory(); |
683 | 669 |
684 ExpectedSnippet<0> snippets[] = { | 670 ExpectedSnippet<0> snippets[] = { |
685 {"var global = 321;\n function f() { return global; };\n f();", | 671 {"var global = 321;\n function f() { return global; };\n f();", |
686 {factory->NewNumberFromInt(321)}}, | 672 {factory->NewNumberFromInt(321)}}, |
687 {"var global = 321;\n" | 673 {"var global = 321;\n" |
688 "function f() { global = 123; return global };\n f();", | 674 "function f() { global = 123; return global };\n f();", |
689 {factory->NewNumberFromInt(123)}}, | 675 {factory->NewNumberFromInt(123)}}, |
690 {"var global = function() { return 'abc'};\n" | 676 {"var global = function() { return 'abc'};\n" |
691 "function f() { return global(); };\n f();", | 677 "function f() { return global(); };\n f();", |
(...skipping 18 matching lines...) Expand all Loading... |
710 {factory->NewStringFromStaticChars("xyz")}}, | 696 {factory->NewStringFromStaticChars("xyz")}}, |
711 {"function f() { return typeof(undeclared_var); }\n; f();\n", | 697 {"function f() { return typeof(undeclared_var); }\n; f();\n", |
712 {factory->NewStringFromStaticChars("undefined")}}, | 698 {factory->NewStringFromStaticChars("undefined")}}, |
713 {"var defined_var = 10; function f() { return typeof(defined_var); }\n; " | 699 {"var defined_var = 10; function f() { return typeof(defined_var); }\n; " |
714 "f();\n", | 700 "f();\n", |
715 {factory->NewStringFromStaticChars("number")}}, | 701 {factory->NewStringFromStaticChars("number")}}, |
716 }; | 702 }; |
717 | 703 |
718 for (size_t i = 0; i < arraysize(snippets); i++) { | 704 for (size_t i = 0; i < arraysize(snippets); i++) { |
719 if ((i % 2) != shard) continue; | 705 if ((i % 2) != shard) continue; |
720 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 706 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
721 auto callable = tester.GetCallable<>(); | 707 auto callable = tester.GetCallable<>(); |
722 Handle<Object> return_value = callable().ToHandleChecked(); | 708 Handle<Object> return_value = callable().ToHandleChecked(); |
723 CHECK(return_value->SameValue(*snippets[i].return_value())); | 709 CHECK(return_value->SameValue(*snippets[i].return_value())); |
724 } | 710 } |
725 } | 711 } |
726 | 712 |
727 SHARD_TEST_BY_2(BytecodeGraphBuilderGlobals) | 713 SHARD_TEST_BY_2(BytecodeGraphBuilderGlobals) |
728 | 714 |
729 TEST(BytecodeGraphBuilderToObject) { | 715 TEST(BytecodeGraphBuilderToObject) { |
730 // TODO(mythria): tests for ToObject. Needs ForIn. | 716 // TODO(mythria): tests for ToObject. Needs ForIn. |
731 } | 717 } |
732 | 718 |
733 | 719 |
734 TEST(BytecodeGraphBuilderToName) { | 720 TEST(BytecodeGraphBuilderToName) { |
735 HandleAndZoneScope scope; | 721 HandleAndZoneScope scope; |
736 Isolate* isolate = scope.main_isolate(); | 722 Isolate* isolate = scope.main_isolate(); |
737 Zone* zone = scope.main_zone(); | |
738 Factory* factory = isolate->factory(); | 723 Factory* factory = isolate->factory(); |
739 | 724 |
740 ExpectedSnippet<0> snippets[] = { | 725 ExpectedSnippet<0> snippets[] = { |
741 {"var a = 'val'; var obj = {[a] : 10}; return obj.val;", | 726 {"var a = 'val'; var obj = {[a] : 10}; return obj.val;", |
742 {factory->NewNumberFromInt(10)}}, | 727 {factory->NewNumberFromInt(10)}}, |
743 {"var a = 20; var obj = {[a] : 10}; return obj['20'];", | 728 {"var a = 20; var obj = {[a] : 10}; return obj['20'];", |
744 {factory->NewNumberFromInt(10)}}, | 729 {factory->NewNumberFromInt(10)}}, |
745 {"var a = 20; var obj = {[a] : 10}; return obj[20];", | 730 {"var a = 20; var obj = {[a] : 10}; return obj[20];", |
746 {factory->NewNumberFromInt(10)}}, | 731 {factory->NewNumberFromInt(10)}}, |
747 {"var a = {val:23}; var obj = {[a] : 10}; return obj[a];", | 732 {"var a = {val:23}; var obj = {[a] : 10}; return obj[a];", |
(...skipping 12 matching lines...) Expand all Loading... |
760 "var obj = {[a] : 10};\n" | 745 "var obj = {[a] : 10};\n" |
761 "return obj.x;", | 746 "return obj.x;", |
762 {factory->NewNumberFromInt(10)}}, | 747 {factory->NewNumberFromInt(10)}}, |
763 }; | 748 }; |
764 | 749 |
765 for (size_t i = 0; i < arraysize(snippets); i++) { | 750 for (size_t i = 0; i < arraysize(snippets); i++) { |
766 ScopedVector<char> script(1024); | 751 ScopedVector<char> script(1024); |
767 SNPrintF(script, "function %s() { %s }\n%s({});", kFunctionName, | 752 SNPrintF(script, "function %s() { %s }\n%s({});", kFunctionName, |
768 snippets[i].code_snippet, kFunctionName); | 753 snippets[i].code_snippet, kFunctionName); |
769 | 754 |
770 BytecodeGraphTester tester(isolate, zone, script.start()); | 755 BytecodeGraphTester tester(isolate, script.start()); |
771 auto callable = tester.GetCallable<>(); | 756 auto callable = tester.GetCallable<>(); |
772 Handle<Object> return_value = callable().ToHandleChecked(); | 757 Handle<Object> return_value = callable().ToHandleChecked(); |
773 CHECK(return_value->SameValue(*snippets[i].return_value())); | 758 CHECK(return_value->SameValue(*snippets[i].return_value())); |
774 } | 759 } |
775 } | 760 } |
776 | 761 |
777 | 762 |
778 TEST(BytecodeGraphBuilderLogicalNot) { | 763 TEST(BytecodeGraphBuilderLogicalNot) { |
779 HandleAndZoneScope scope; | 764 HandleAndZoneScope scope; |
780 Isolate* isolate = scope.main_isolate(); | 765 Isolate* isolate = scope.main_isolate(); |
781 Zone* zone = scope.main_zone(); | |
782 Factory* factory = isolate->factory(); | 766 Factory* factory = isolate->factory(); |
783 | 767 |
784 ExpectedSnippet<1> snippets[] = { | 768 ExpectedSnippet<1> snippets[] = { |
785 {"return !p1;", | 769 {"return !p1;", |
786 {factory->false_value(), | 770 {factory->false_value(), |
787 BytecodeGraphTester::NewObject("({val : 10})")}}, | 771 BytecodeGraphTester::NewObject("({val : 10})")}}, |
788 {"return !p1;", {factory->true_value(), factory->NewNumberFromInt(0)}}, | 772 {"return !p1;", {factory->true_value(), factory->NewNumberFromInt(0)}}, |
789 {"return !p1;", {factory->true_value(), factory->undefined_value()}}, | 773 {"return !p1;", {factory->true_value(), factory->undefined_value()}}, |
790 {"return !p1;", {factory->false_value(), factory->NewNumberFromInt(10)}}, | 774 {"return !p1;", {factory->false_value(), factory->NewNumberFromInt(10)}}, |
791 {"return !p1;", {factory->false_value(), factory->true_value()}}, | 775 {"return !p1;", {factory->false_value(), factory->true_value()}}, |
792 {"return !p1;", | 776 {"return !p1;", |
793 {factory->false_value(), factory->NewStringFromStaticChars("abc")}}, | 777 {factory->false_value(), factory->NewStringFromStaticChars("abc")}}, |
794 }; | 778 }; |
795 | 779 |
796 for (size_t i = 0; i < arraysize(snippets); i++) { | 780 for (size_t i = 0; i < arraysize(snippets); i++) { |
797 ScopedVector<char> script(1024); | 781 ScopedVector<char> script(1024); |
798 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 782 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
799 snippets[i].code_snippet, kFunctionName); | 783 snippets[i].code_snippet, kFunctionName); |
800 | 784 |
801 BytecodeGraphTester tester(isolate, zone, script.start()); | 785 BytecodeGraphTester tester(isolate, script.start()); |
802 auto callable = tester.GetCallable<Handle<Object>>(); | 786 auto callable = tester.GetCallable<Handle<Object>>(); |
803 Handle<Object> return_value = | 787 Handle<Object> return_value = |
804 callable(snippets[i].parameter(0)).ToHandleChecked(); | 788 callable(snippets[i].parameter(0)).ToHandleChecked(); |
805 CHECK(return_value->SameValue(*snippets[i].return_value())); | 789 CHECK(return_value->SameValue(*snippets[i].return_value())); |
806 } | 790 } |
807 } | 791 } |
808 | 792 |
809 | 793 |
810 TEST(BytecodeGraphBuilderTypeOf) { | 794 TEST(BytecodeGraphBuilderTypeOf) { |
811 HandleAndZoneScope scope; | 795 HandleAndZoneScope scope; |
812 Isolate* isolate = scope.main_isolate(); | 796 Isolate* isolate = scope.main_isolate(); |
813 Zone* zone = scope.main_zone(); | |
814 Factory* factory = isolate->factory(); | 797 Factory* factory = isolate->factory(); |
815 | 798 |
816 ExpectedSnippet<1> snippets[] = { | 799 ExpectedSnippet<1> snippets[] = { |
817 {"return typeof p1;", | 800 {"return typeof p1;", |
818 {factory->NewStringFromStaticChars("object"), | 801 {factory->NewStringFromStaticChars("object"), |
819 BytecodeGraphTester::NewObject("({val : 10})")}}, | 802 BytecodeGraphTester::NewObject("({val : 10})")}}, |
820 {"return typeof p1;", | 803 {"return typeof p1;", |
821 {factory->NewStringFromStaticChars("undefined"), | 804 {factory->NewStringFromStaticChars("undefined"), |
822 factory->undefined_value()}}, | 805 factory->undefined_value()}}, |
823 {"return typeof p1;", | 806 {"return typeof p1;", |
824 {factory->NewStringFromStaticChars("number"), | 807 {factory->NewStringFromStaticChars("number"), |
825 factory->NewNumberFromInt(10)}}, | 808 factory->NewNumberFromInt(10)}}, |
826 {"return typeof p1;", | 809 {"return typeof p1;", |
827 {factory->NewStringFromStaticChars("boolean"), factory->true_value()}}, | 810 {factory->NewStringFromStaticChars("boolean"), factory->true_value()}}, |
828 {"return typeof p1;", | 811 {"return typeof p1;", |
829 {factory->NewStringFromStaticChars("string"), | 812 {factory->NewStringFromStaticChars("string"), |
830 factory->NewStringFromStaticChars("abc")}}, | 813 factory->NewStringFromStaticChars("abc")}}, |
831 }; | 814 }; |
832 | 815 |
833 for (size_t i = 0; i < arraysize(snippets); i++) { | 816 for (size_t i = 0; i < arraysize(snippets); i++) { |
834 ScopedVector<char> script(1024); | 817 ScopedVector<char> script(1024); |
835 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 818 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
836 snippets[i].code_snippet, kFunctionName); | 819 snippets[i].code_snippet, kFunctionName); |
837 | 820 |
838 BytecodeGraphTester tester(isolate, zone, script.start()); | 821 BytecodeGraphTester tester(isolate, script.start()); |
839 auto callable = tester.GetCallable<Handle<Object>>(); | 822 auto callable = tester.GetCallable<Handle<Object>>(); |
840 Handle<Object> return_value = | 823 Handle<Object> return_value = |
841 callable(snippets[i].parameter(0)).ToHandleChecked(); | 824 callable(snippets[i].parameter(0)).ToHandleChecked(); |
842 CHECK(return_value->SameValue(*snippets[i].return_value())); | 825 CHECK(return_value->SameValue(*snippets[i].return_value())); |
843 } | 826 } |
844 } | 827 } |
845 | 828 |
846 | 829 |
847 TEST(BytecodeGraphBuilderCountOperation) { | 830 TEST(BytecodeGraphBuilderCountOperation) { |
848 HandleAndZoneScope scope; | 831 HandleAndZoneScope scope; |
849 Isolate* isolate = scope.main_isolate(); | 832 Isolate* isolate = scope.main_isolate(); |
850 Zone* zone = scope.main_zone(); | |
851 Factory* factory = isolate->factory(); | 833 Factory* factory = isolate->factory(); |
852 | 834 |
853 ExpectedSnippet<1> snippets[] = { | 835 ExpectedSnippet<1> snippets[] = { |
854 {"return ++p1;", | 836 {"return ++p1;", |
855 {factory->NewNumberFromInt(11), factory->NewNumberFromInt(10)}}, | 837 {factory->NewNumberFromInt(11), factory->NewNumberFromInt(10)}}, |
856 {"return p1++;", | 838 {"return p1++;", |
857 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, | 839 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, |
858 {"return p1++ + 10;", | 840 {"return p1++ + 10;", |
859 {factory->NewHeapNumber(15.23), factory->NewHeapNumber(5.23)}}, | 841 {factory->NewHeapNumber(15.23), factory->NewHeapNumber(5.23)}}, |
860 {"return 20 + ++p1;", | 842 {"return 20 + ++p1;", |
(...skipping 21 matching lines...) Expand all Loading... |
882 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, | 864 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, |
883 {"return ++p1;", | 865 {"return ++p1;", |
884 {factory->nan_value(), factory->NewStringFromStaticChars("String")}}, | 866 {factory->nan_value(), factory->NewStringFromStaticChars("String")}}, |
885 }; | 867 }; |
886 | 868 |
887 for (size_t i = 0; i < arraysize(snippets); i++) { | 869 for (size_t i = 0; i < arraysize(snippets); i++) { |
888 ScopedVector<char> script(1024); | 870 ScopedVector<char> script(1024); |
889 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 871 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
890 snippets[i].code_snippet, kFunctionName); | 872 snippets[i].code_snippet, kFunctionName); |
891 | 873 |
892 BytecodeGraphTester tester(isolate, zone, script.start()); | 874 BytecodeGraphTester tester(isolate, script.start()); |
893 auto callable = tester.GetCallable<Handle<Object>>(); | 875 auto callable = tester.GetCallable<Handle<Object>>(); |
894 Handle<Object> return_value = | 876 Handle<Object> return_value = |
895 callable(snippets[i].parameter(0)).ToHandleChecked(); | 877 callable(snippets[i].parameter(0)).ToHandleChecked(); |
896 CHECK(return_value->SameValue(*snippets[i].return_value())); | 878 CHECK(return_value->SameValue(*snippets[i].return_value())); |
897 } | 879 } |
898 } | 880 } |
899 | 881 |
900 | 882 |
901 TEST(BytecodeGraphBuilderDelete) { | 883 TEST(BytecodeGraphBuilderDelete) { |
902 HandleAndZoneScope scope; | 884 HandleAndZoneScope scope; |
903 Isolate* isolate = scope.main_isolate(); | 885 Isolate* isolate = scope.main_isolate(); |
904 Zone* zone = scope.main_zone(); | |
905 Factory* factory = isolate->factory(); | 886 Factory* factory = isolate->factory(); |
906 | 887 |
907 ExpectedSnippet<1> snippets[] = { | 888 ExpectedSnippet<1> snippets[] = { |
908 {"return delete p1.val;", | 889 {"return delete p1.val;", |
909 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, | 890 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, |
910 {"delete p1.val; return p1.val;", | 891 {"delete p1.val; return p1.val;", |
911 {factory->undefined_value(), | 892 {factory->undefined_value(), |
912 BytecodeGraphTester::NewObject("({val : 10})")}}, | 893 BytecodeGraphTester::NewObject("({val : 10})")}}, |
913 {"delete p1.name; return p1.val;", | 894 {"delete p1.name; return p1.val;", |
914 {factory->NewNumberFromInt(10), | 895 {factory->NewNumberFromInt(10), |
915 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, | 896 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, |
916 {"'use strict'; return delete p1.val;", | 897 {"'use strict'; return delete p1.val;", |
917 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, | 898 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, |
918 {"'use strict'; delete p1.val; return p1.val;", | 899 {"'use strict'; delete p1.val; return p1.val;", |
919 {factory->undefined_value(), | 900 {factory->undefined_value(), |
920 BytecodeGraphTester::NewObject("({val : 10})")}}, | 901 BytecodeGraphTester::NewObject("({val : 10})")}}, |
921 {"'use strict'; delete p1.name; return p1.val;", | 902 {"'use strict'; delete p1.name; return p1.val;", |
922 {factory->NewNumberFromInt(10), | 903 {factory->NewNumberFromInt(10), |
923 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, | 904 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, |
924 }; | 905 }; |
925 | 906 |
926 for (size_t i = 0; i < arraysize(snippets); i++) { | 907 for (size_t i = 0; i < arraysize(snippets); i++) { |
927 ScopedVector<char> script(1024); | 908 ScopedVector<char> script(1024); |
928 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 909 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
929 snippets[i].code_snippet, kFunctionName); | 910 snippets[i].code_snippet, kFunctionName); |
930 | 911 |
931 BytecodeGraphTester tester(isolate, zone, script.start()); | 912 BytecodeGraphTester tester(isolate, script.start()); |
932 auto callable = tester.GetCallable<Handle<Object>>(); | 913 auto callable = tester.GetCallable<Handle<Object>>(); |
933 Handle<Object> return_value = | 914 Handle<Object> return_value = |
934 callable(snippets[i].parameter(0)).ToHandleChecked(); | 915 callable(snippets[i].parameter(0)).ToHandleChecked(); |
935 CHECK(return_value->SameValue(*snippets[i].return_value())); | 916 CHECK(return_value->SameValue(*snippets[i].return_value())); |
936 } | 917 } |
937 } | 918 } |
938 | 919 |
939 | 920 |
940 TEST(BytecodeGraphBuilderDeleteGlobal) { | 921 TEST(BytecodeGraphBuilderDeleteGlobal) { |
941 HandleAndZoneScope scope; | 922 HandleAndZoneScope scope; |
942 Isolate* isolate = scope.main_isolate(); | 923 Isolate* isolate = scope.main_isolate(); |
943 Zone* zone = scope.main_zone(); | |
944 Factory* factory = isolate->factory(); | 924 Factory* factory = isolate->factory(); |
945 | 925 |
946 ExpectedSnippet<0> snippets[] = { | 926 ExpectedSnippet<0> snippets[] = { |
947 {"var obj = {val : 10, type : 'int'};" | 927 {"var obj = {val : 10, type : 'int'};" |
948 "function f() {return delete obj;};", | 928 "function f() {return delete obj;};", |
949 {factory->false_value()}}, | 929 {factory->false_value()}}, |
950 {"function f() {return delete this;};", {factory->true_value()}}, | 930 {"function f() {return delete this;};", {factory->true_value()}}, |
951 {"var obj = {val : 10, type : 'int'};" | 931 {"var obj = {val : 10, type : 'int'};" |
952 "function f() {return delete obj.val;};", | 932 "function f() {return delete obj.val;};", |
953 {factory->true_value()}}, | 933 {factory->true_value()}}, |
(...skipping 20 matching lines...) Expand all Loading... |
974 " function inner() { return obj[1]; };" | 954 " function inner() { return obj[1]; };" |
975 " return delete obj[1];" | 955 " return delete obj[1];" |
976 "}", | 956 "}", |
977 {factory->true_value()}}, | 957 {factory->true_value()}}, |
978 }; | 958 }; |
979 | 959 |
980 for (size_t i = 0; i < arraysize(snippets); i++) { | 960 for (size_t i = 0; i < arraysize(snippets); i++) { |
981 ScopedVector<char> script(1024); | 961 ScopedVector<char> script(1024); |
982 SNPrintF(script, "%s %s({});", snippets[i].code_snippet, kFunctionName); | 962 SNPrintF(script, "%s %s({});", snippets[i].code_snippet, kFunctionName); |
983 | 963 |
984 BytecodeGraphTester tester(isolate, zone, script.start()); | 964 BytecodeGraphTester tester(isolate, script.start()); |
985 auto callable = tester.GetCallable<>(); | 965 auto callable = tester.GetCallable<>(); |
986 Handle<Object> return_value = callable().ToHandleChecked(); | 966 Handle<Object> return_value = callable().ToHandleChecked(); |
987 CHECK(return_value->SameValue(*snippets[i].return_value())); | 967 CHECK(return_value->SameValue(*snippets[i].return_value())); |
988 } | 968 } |
989 } | 969 } |
990 | 970 |
991 | 971 |
992 TEST(BytecodeGraphBuilderDeleteLookupSlot) { | 972 TEST(BytecodeGraphBuilderDeleteLookupSlot) { |
993 HandleAndZoneScope scope; | 973 HandleAndZoneScope scope; |
994 Isolate* isolate = scope.main_isolate(); | 974 Isolate* isolate = scope.main_isolate(); |
995 Zone* zone = scope.main_zone(); | |
996 Factory* factory = isolate->factory(); | 975 Factory* factory = isolate->factory(); |
997 | 976 |
998 // TODO(mythria): Add more tests when we have support for LdaLookupSlot. | 977 // TODO(mythria): Add more tests when we have support for LdaLookupSlot. |
999 const char* function_prologue = "var f;" | 978 const char* function_prologue = "var f;" |
1000 "var x = 1;" | 979 "var x = 1;" |
1001 "y = 10;" | 980 "y = 10;" |
1002 "var obj = {val:10};" | 981 "var obj = {val:10};" |
1003 "var z = 30;" | 982 "var z = 30;" |
1004 "function f1() {" | 983 "function f1() {" |
1005 " var z = 20;" | 984 " var z = 20;" |
1006 " eval(\"function t() {"; | 985 " eval(\"function t() {"; |
1007 const char* function_epilogue = " }; f = t; t();\");" | 986 const char* function_epilogue = " }; f = t; t();\");" |
1008 "}" | 987 "}" |
1009 "f1();"; | 988 "f1();"; |
1010 | 989 |
1011 ExpectedSnippet<0> snippets[] = { | 990 ExpectedSnippet<0> snippets[] = { |
1012 {"return delete y;", {factory->true_value()}}, | 991 {"return delete y;", {factory->true_value()}}, |
1013 {"return delete z;", {factory->false_value()}}, | 992 {"return delete z;", {factory->false_value()}}, |
1014 }; | 993 }; |
1015 | 994 |
1016 for (size_t i = 0; i < arraysize(snippets); i++) { | 995 for (size_t i = 0; i < arraysize(snippets); i++) { |
1017 ScopedVector<char> script(1024); | 996 ScopedVector<char> script(1024); |
1018 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 997 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
1019 function_epilogue); | 998 function_epilogue); |
1020 | 999 |
1021 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1000 BytecodeGraphTester tester(isolate, script.start(), "t"); |
1022 auto callable = tester.GetCallable<>(); | 1001 auto callable = tester.GetCallable<>(); |
1023 Handle<Object> return_value = callable().ToHandleChecked(); | 1002 Handle<Object> return_value = callable().ToHandleChecked(); |
1024 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1003 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1025 } | 1004 } |
1026 } | 1005 } |
1027 | 1006 |
1028 | 1007 |
1029 TEST(BytecodeGraphBuilderLookupSlot) { | 1008 TEST(BytecodeGraphBuilderLookupSlot) { |
1030 HandleAndZoneScope scope; | 1009 HandleAndZoneScope scope; |
1031 Isolate* isolate = scope.main_isolate(); | 1010 Isolate* isolate = scope.main_isolate(); |
1032 Zone* zone = scope.main_zone(); | |
1033 Factory* factory = isolate->factory(); | 1011 Factory* factory = isolate->factory(); |
1034 | 1012 |
1035 const char* function_prologue = "var f;" | 1013 const char* function_prologue = "var f;" |
1036 "var x = 12;" | 1014 "var x = 12;" |
1037 "y = 10;" | 1015 "y = 10;" |
1038 "var obj = {val:3.1414};" | 1016 "var obj = {val:3.1414};" |
1039 "var z = 30;" | 1017 "var z = 30;" |
1040 "function f1() {" | 1018 "function f1() {" |
1041 " var z = 20;" | 1019 " var z = 20;" |
1042 " eval(\"function t() {"; | 1020 " eval(\"function t() {"; |
1043 const char* function_epilogue = " }; f = t; t();\");" | 1021 const char* function_epilogue = " }; f = t; t();\");" |
1044 "}" | 1022 "}" |
1045 "f1();"; | 1023 "f1();"; |
1046 | 1024 |
1047 ExpectedSnippet<0> snippets[] = { | 1025 ExpectedSnippet<0> snippets[] = { |
1048 {"return x;", {factory->NewNumber(12)}}, | 1026 {"return x;", {factory->NewNumber(12)}}, |
1049 {"return obj.val;", {factory->NewNumber(3.1414)}}, | 1027 {"return obj.val;", {factory->NewNumber(3.1414)}}, |
1050 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, | 1028 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, |
1051 {"return typeof dummy;", | 1029 {"return typeof dummy;", |
1052 {factory->NewStringFromStaticChars("undefined")}}, | 1030 {factory->NewStringFromStaticChars("undefined")}}, |
1053 {"x = 23; return x;", {factory->NewNumber(23)}}, | 1031 {"x = 23; return x;", {factory->NewNumber(23)}}, |
1054 {"'use strict'; obj.val = 23.456; return obj.val;", | 1032 {"'use strict'; obj.val = 23.456; return obj.val;", |
1055 {factory->NewNumber(23.456)}}}; | 1033 {factory->NewNumber(23.456)}}}; |
1056 | 1034 |
1057 for (size_t i = 0; i < arraysize(snippets); i++) { | 1035 for (size_t i = 0; i < arraysize(snippets); i++) { |
1058 ScopedVector<char> script(1024); | 1036 ScopedVector<char> script(1024); |
1059 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1037 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
1060 function_epilogue); | 1038 function_epilogue); |
1061 | 1039 |
1062 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1040 BytecodeGraphTester tester(isolate, script.start(), "t"); |
1063 auto callable = tester.GetCallable<>(); | 1041 auto callable = tester.GetCallable<>(); |
1064 Handle<Object> return_value = callable().ToHandleChecked(); | 1042 Handle<Object> return_value = callable().ToHandleChecked(); |
1065 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1043 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1066 } | 1044 } |
1067 } | 1045 } |
1068 | 1046 |
1069 TEST(BytecodeGraphBuilderLookupContextSlot) { | 1047 TEST(BytecodeGraphBuilderLookupContextSlot) { |
1070 HandleAndZoneScope scope; | 1048 HandleAndZoneScope scope; |
1071 Isolate* isolate = scope.main_isolate(); | 1049 Isolate* isolate = scope.main_isolate(); |
1072 Zone* zone = scope.main_zone(); | |
1073 Factory* factory = isolate->factory(); | 1050 Factory* factory = isolate->factory(); |
1074 | 1051 |
1075 // Testing with eval called in the current context. | 1052 // Testing with eval called in the current context. |
1076 const char* inner_eval_prologue = "var x = 0; function inner() {"; | 1053 const char* inner_eval_prologue = "var x = 0; function inner() {"; |
1077 const char* inner_eval_epilogue = "}; return inner();"; | 1054 const char* inner_eval_epilogue = "}; return inner();"; |
1078 | 1055 |
1079 ExpectedSnippet<0> inner_eval_snippets[] = { | 1056 ExpectedSnippet<0> inner_eval_snippets[] = { |
1080 {"eval(''); return x;", {factory->NewNumber(0)}}, | 1057 {"eval(''); return x;", {factory->NewNumber(0)}}, |
1081 {"eval('var x = 1'); return x;", {factory->NewNumber(1)}}, | 1058 {"eval('var x = 1'); return x;", {factory->NewNumber(1)}}, |
1082 {"'use strict'; eval('var x = 1'); return x;", {factory->NewNumber(0)}}}; | 1059 {"'use strict'; eval('var x = 1'); return x;", {factory->NewNumber(0)}}}; |
1083 | 1060 |
1084 for (size_t i = 0; i < arraysize(inner_eval_snippets); i++) { | 1061 for (size_t i = 0; i < arraysize(inner_eval_snippets); i++) { |
1085 ScopedVector<char> script(1024); | 1062 ScopedVector<char> script(1024); |
1086 SNPrintF(script, "function %s(p1) { %s %s %s } ; %s() ;", kFunctionName, | 1063 SNPrintF(script, "function %s(p1) { %s %s %s } ; %s() ;", kFunctionName, |
1087 inner_eval_prologue, inner_eval_snippets[i].code_snippet, | 1064 inner_eval_prologue, inner_eval_snippets[i].code_snippet, |
1088 inner_eval_epilogue, kFunctionName); | 1065 inner_eval_epilogue, kFunctionName); |
1089 | 1066 |
1090 BytecodeGraphTester tester(isolate, zone, script.start()); | 1067 BytecodeGraphTester tester(isolate, script.start()); |
1091 auto callable = tester.GetCallable<>(); | 1068 auto callable = tester.GetCallable<>(); |
1092 Handle<Object> return_value = callable().ToHandleChecked(); | 1069 Handle<Object> return_value = callable().ToHandleChecked(); |
1093 CHECK(return_value->SameValue(*inner_eval_snippets[i].return_value())); | 1070 CHECK(return_value->SameValue(*inner_eval_snippets[i].return_value())); |
1094 } | 1071 } |
1095 | 1072 |
1096 // Testing with eval called in a parent context. | 1073 // Testing with eval called in a parent context. |
1097 const char* outer_eval_prologue = ""; | 1074 const char* outer_eval_prologue = ""; |
1098 const char* outer_eval_epilogue = | 1075 const char* outer_eval_epilogue = |
1099 "function inner() { return x; }; return inner();"; | 1076 "function inner() { return x; }; return inner();"; |
1100 | 1077 |
1101 ExpectedSnippet<0> outer_eval_snippets[] = { | 1078 ExpectedSnippet<0> outer_eval_snippets[] = { |
1102 {"var x = 0; eval('');", {factory->NewNumber(0)}}, | 1079 {"var x = 0; eval('');", {factory->NewNumber(0)}}, |
1103 {"var x = 0; eval('var x = 1');", {factory->NewNumber(1)}}, | 1080 {"var x = 0; eval('var x = 1');", {factory->NewNumber(1)}}, |
1104 {"'use strict'; var x = 0; eval('var x = 1');", {factory->NewNumber(0)}}}; | 1081 {"'use strict'; var x = 0; eval('var x = 1');", {factory->NewNumber(0)}}}; |
1105 | 1082 |
1106 for (size_t i = 0; i < arraysize(outer_eval_snippets); i++) { | 1083 for (size_t i = 0; i < arraysize(outer_eval_snippets); i++) { |
1107 ScopedVector<char> script(1024); | 1084 ScopedVector<char> script(1024); |
1108 SNPrintF(script, "function %s() { %s %s %s } ; %s() ;", kFunctionName, | 1085 SNPrintF(script, "function %s() { %s %s %s } ; %s() ;", kFunctionName, |
1109 outer_eval_prologue, outer_eval_snippets[i].code_snippet, | 1086 outer_eval_prologue, outer_eval_snippets[i].code_snippet, |
1110 outer_eval_epilogue, kFunctionName); | 1087 outer_eval_epilogue, kFunctionName); |
1111 | 1088 |
1112 BytecodeGraphTester tester(isolate, zone, script.start()); | 1089 BytecodeGraphTester tester(isolate, script.start()); |
1113 auto callable = tester.GetCallable<>(); | 1090 auto callable = tester.GetCallable<>(); |
1114 Handle<Object> return_value = callable().ToHandleChecked(); | 1091 Handle<Object> return_value = callable().ToHandleChecked(); |
1115 CHECK(return_value->SameValue(*outer_eval_snippets[i].return_value())); | 1092 CHECK(return_value->SameValue(*outer_eval_snippets[i].return_value())); |
1116 } | 1093 } |
1117 } | 1094 } |
1118 | 1095 |
1119 TEST(BytecodeGraphBuilderLookupGlobalSlot) { | 1096 TEST(BytecodeGraphBuilderLookupGlobalSlot) { |
1120 HandleAndZoneScope scope; | 1097 HandleAndZoneScope scope; |
1121 Isolate* isolate = scope.main_isolate(); | 1098 Isolate* isolate = scope.main_isolate(); |
1122 Zone* zone = scope.main_zone(); | |
1123 Factory* factory = isolate->factory(); | 1099 Factory* factory = isolate->factory(); |
1124 | 1100 |
1125 // Testing with eval called in the current context. | 1101 // Testing with eval called in the current context. |
1126 const char* inner_eval_prologue = "x = 0; function inner() {"; | 1102 const char* inner_eval_prologue = "x = 0; function inner() {"; |
1127 const char* inner_eval_epilogue = "}; return inner();"; | 1103 const char* inner_eval_epilogue = "}; return inner();"; |
1128 | 1104 |
1129 ExpectedSnippet<0> inner_eval_snippets[] = { | 1105 ExpectedSnippet<0> inner_eval_snippets[] = { |
1130 {"eval(''); return x;", {factory->NewNumber(0)}}, | 1106 {"eval(''); return x;", {factory->NewNumber(0)}}, |
1131 {"eval('var x = 1'); return x;", {factory->NewNumber(1)}}, | 1107 {"eval('var x = 1'); return x;", {factory->NewNumber(1)}}, |
1132 {"'use strict'; eval('var x = 1'); return x;", {factory->NewNumber(0)}}}; | 1108 {"'use strict'; eval('var x = 1'); return x;", {factory->NewNumber(0)}}}; |
1133 | 1109 |
1134 for (size_t i = 0; i < arraysize(inner_eval_snippets); i++) { | 1110 for (size_t i = 0; i < arraysize(inner_eval_snippets); i++) { |
1135 ScopedVector<char> script(1024); | 1111 ScopedVector<char> script(1024); |
1136 SNPrintF(script, "function %s(p1) { %s %s %s } ; %s() ;", kFunctionName, | 1112 SNPrintF(script, "function %s(p1) { %s %s %s } ; %s() ;", kFunctionName, |
1137 inner_eval_prologue, inner_eval_snippets[i].code_snippet, | 1113 inner_eval_prologue, inner_eval_snippets[i].code_snippet, |
1138 inner_eval_epilogue, kFunctionName); | 1114 inner_eval_epilogue, kFunctionName); |
1139 | 1115 |
1140 BytecodeGraphTester tester(isolate, zone, script.start()); | 1116 BytecodeGraphTester tester(isolate, script.start()); |
1141 auto callable = tester.GetCallable<>(); | 1117 auto callable = tester.GetCallable<>(); |
1142 Handle<Object> return_value = callable().ToHandleChecked(); | 1118 Handle<Object> return_value = callable().ToHandleChecked(); |
1143 CHECK(return_value->SameValue(*inner_eval_snippets[i].return_value())); | 1119 CHECK(return_value->SameValue(*inner_eval_snippets[i].return_value())); |
1144 } | 1120 } |
1145 | 1121 |
1146 // Testing with eval called in a parent context. | 1122 // Testing with eval called in a parent context. |
1147 const char* outer_eval_prologue = ""; | 1123 const char* outer_eval_prologue = ""; |
1148 const char* outer_eval_epilogue = | 1124 const char* outer_eval_epilogue = |
1149 "function inner() { return x; }; return inner();"; | 1125 "function inner() { return x; }; return inner();"; |
1150 | 1126 |
1151 ExpectedSnippet<0> outer_eval_snippets[] = { | 1127 ExpectedSnippet<0> outer_eval_snippets[] = { |
1152 {"x = 0; eval('');", {factory->NewNumber(0)}}, | 1128 {"x = 0; eval('');", {factory->NewNumber(0)}}, |
1153 {"x = 0; eval('var x = 1');", {factory->NewNumber(1)}}, | 1129 {"x = 0; eval('var x = 1');", {factory->NewNumber(1)}}, |
1154 {"'use strict'; x = 0; eval('var x = 1');", {factory->NewNumber(0)}}}; | 1130 {"'use strict'; x = 0; eval('var x = 1');", {factory->NewNumber(0)}}}; |
1155 | 1131 |
1156 for (size_t i = 0; i < arraysize(outer_eval_snippets); i++) { | 1132 for (size_t i = 0; i < arraysize(outer_eval_snippets); i++) { |
1157 ScopedVector<char> script(1024); | 1133 ScopedVector<char> script(1024); |
1158 SNPrintF(script, "function %s() { %s %s %s } ; %s() ;", kFunctionName, | 1134 SNPrintF(script, "function %s() { %s %s %s } ; %s() ;", kFunctionName, |
1159 outer_eval_prologue, outer_eval_snippets[i].code_snippet, | 1135 outer_eval_prologue, outer_eval_snippets[i].code_snippet, |
1160 outer_eval_epilogue, kFunctionName); | 1136 outer_eval_epilogue, kFunctionName); |
1161 | 1137 |
1162 BytecodeGraphTester tester(isolate, zone, script.start()); | 1138 BytecodeGraphTester tester(isolate, script.start()); |
1163 auto callable = tester.GetCallable<>(); | 1139 auto callable = tester.GetCallable<>(); |
1164 Handle<Object> return_value = callable().ToHandleChecked(); | 1140 Handle<Object> return_value = callable().ToHandleChecked(); |
1165 CHECK(return_value->SameValue(*outer_eval_snippets[i].return_value())); | 1141 CHECK(return_value->SameValue(*outer_eval_snippets[i].return_value())); |
1166 } | 1142 } |
1167 } | 1143 } |
1168 | 1144 |
1169 TEST(BytecodeGraphBuilderLookupSlotWide) { | 1145 TEST(BytecodeGraphBuilderLookupSlotWide) { |
1170 HandleAndZoneScope scope; | 1146 HandleAndZoneScope scope; |
1171 Isolate* isolate = scope.main_isolate(); | 1147 Isolate* isolate = scope.main_isolate(); |
1172 Zone* zone = scope.main_zone(); | |
1173 Factory* factory = isolate->factory(); | 1148 Factory* factory = isolate->factory(); |
1174 | 1149 |
1175 const char* function_prologue = | 1150 const char* function_prologue = |
1176 "var f;" | 1151 "var f;" |
1177 "var x = 12;" | 1152 "var x = 12;" |
1178 "y = 10;" | 1153 "y = 10;" |
1179 "var obj = {val:3.1414};" | 1154 "var obj = {val:3.1414};" |
1180 "var z = 30;" | 1155 "var z = 30;" |
1181 "function f1() {" | 1156 "function f1() {" |
1182 " var z = 20;" | 1157 " var z = 20;" |
(...skipping 11 matching lines...) Expand all Loading... |
1194 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x = 23;", | 1169 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x = 23;", |
1195 {factory->NewNumber(23)}}, | 1170 {factory->NewNumber(23)}}, |
1196 {"'use strict';" REPEAT_256(SPACE, "y = 2.3;") "return obj.val = 23.456;", | 1171 {"'use strict';" REPEAT_256(SPACE, "y = 2.3;") "return obj.val = 23.456;", |
1197 {factory->NewNumber(23.456)}}}; | 1172 {factory->NewNumber(23.456)}}}; |
1198 | 1173 |
1199 for (size_t i = 0; i < arraysize(snippets); i++) { | 1174 for (size_t i = 0; i < arraysize(snippets); i++) { |
1200 ScopedVector<char> script(3072); | 1175 ScopedVector<char> script(3072); |
1201 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1176 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
1202 function_epilogue); | 1177 function_epilogue); |
1203 | 1178 |
1204 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1179 BytecodeGraphTester tester(isolate, script.start(), "t"); |
1205 auto callable = tester.GetCallable<>(); | 1180 auto callable = tester.GetCallable<>(); |
1206 Handle<Object> return_value = callable().ToHandleChecked(); | 1181 Handle<Object> return_value = callable().ToHandleChecked(); |
1207 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1182 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1208 } | 1183 } |
1209 } | 1184 } |
1210 | 1185 |
1211 | 1186 |
1212 TEST(BytecodeGraphBuilderCallLookupSlot) { | 1187 TEST(BytecodeGraphBuilderCallLookupSlot) { |
1213 HandleAndZoneScope scope; | 1188 HandleAndZoneScope scope; |
1214 Isolate* isolate = scope.main_isolate(); | 1189 Isolate* isolate = scope.main_isolate(); |
1215 Zone* zone = scope.main_zone(); | |
1216 | 1190 |
1217 ExpectedSnippet<0> snippets[] = { | 1191 ExpectedSnippet<0> snippets[] = { |
1218 {"g = function(){ return 2 }; eval(''); return g();", | 1192 {"g = function(){ return 2 }; eval(''); return g();", |
1219 {handle(Smi::FromInt(2), isolate)}}, | 1193 {handle(Smi::FromInt(2), isolate)}}, |
1220 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n" | 1194 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n" |
1221 "return g();", | 1195 "return g();", |
1222 {handle(Smi::FromInt(3), isolate)}}, | 1196 {handle(Smi::FromInt(3), isolate)}}, |
1223 {"g = { x: function(){ return this.y }, y: 20 };\n" | 1197 {"g = { x: function(){ return this.y }, y: 20 };\n" |
1224 "eval('g = { x: g.x, y: 30 }');\n" | 1198 "eval('g = { x: g.x, y: 30 }');\n" |
1225 "return g.x();", | 1199 "return g.x();", |
1226 {handle(Smi::FromInt(30), isolate)}}, | 1200 {handle(Smi::FromInt(30), isolate)}}, |
1227 }; | 1201 }; |
1228 | 1202 |
1229 for (size_t i = 0; i < arraysize(snippets); i++) { | 1203 for (size_t i = 0; i < arraysize(snippets); i++) { |
1230 ScopedVector<char> script(1024); | 1204 ScopedVector<char> script(1024); |
1231 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1205 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1232 snippets[i].code_snippet, kFunctionName); | 1206 snippets[i].code_snippet, kFunctionName); |
1233 BytecodeGraphTester tester(isolate, zone, script.start()); | 1207 BytecodeGraphTester tester(isolate, script.start()); |
1234 auto callable = tester.GetCallable<>(); | 1208 auto callable = tester.GetCallable<>(); |
1235 Handle<Object> return_value = callable().ToHandleChecked(); | 1209 Handle<Object> return_value = callable().ToHandleChecked(); |
1236 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1210 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1237 } | 1211 } |
1238 } | 1212 } |
1239 | 1213 |
1240 | 1214 |
1241 TEST(BytecodeGraphBuilderEval) { | 1215 TEST(BytecodeGraphBuilderEval) { |
1242 HandleAndZoneScope scope; | 1216 HandleAndZoneScope scope; |
1243 Isolate* isolate = scope.main_isolate(); | 1217 Isolate* isolate = scope.main_isolate(); |
1244 Zone* zone = scope.main_zone(); | |
1245 Factory* factory = isolate->factory(); | 1218 Factory* factory = isolate->factory(); |
1246 | 1219 |
1247 ExpectedSnippet<0> snippets[] = { | 1220 ExpectedSnippet<0> snippets[] = { |
1248 {"return eval('1;');", {handle(Smi::FromInt(1), isolate)}}, | 1221 {"return eval('1;');", {handle(Smi::FromInt(1), isolate)}}, |
1249 {"return eval('100 * 20;');", {handle(Smi::FromInt(2000), isolate)}}, | 1222 {"return eval('100 * 20;');", {handle(Smi::FromInt(2000), isolate)}}, |
1250 {"var x = 10; return eval('x + 20;');", | 1223 {"var x = 10; return eval('x + 20;');", |
1251 {handle(Smi::FromInt(30), isolate)}}, | 1224 {handle(Smi::FromInt(30), isolate)}}, |
1252 {"var x = 10; eval('x = 33;'); return x;", | 1225 {"var x = 10; eval('x = 33;'); return x;", |
1253 {handle(Smi::FromInt(33), isolate)}}, | 1226 {handle(Smi::FromInt(33), isolate)}}, |
1254 {"'use strict'; var x = 20; var z = 0;\n" | 1227 {"'use strict'; var x = 20; var z = 0;\n" |
(...skipping 20 matching lines...) Expand all Loading... |
1275 {"var x = {}; eval('var x = 10;'); return typeof x;", | 1248 {"var x = {}; eval('var x = 10;'); return typeof x;", |
1276 {factory->NewStringFromStaticChars("number")}}, | 1249 {factory->NewStringFromStaticChars("number")}}, |
1277 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", | 1250 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", |
1278 {factory->NewStringFromStaticChars("object")}}, | 1251 {factory->NewStringFromStaticChars("object")}}, |
1279 }; | 1252 }; |
1280 | 1253 |
1281 for (size_t i = 0; i < arraysize(snippets); i++) { | 1254 for (size_t i = 0; i < arraysize(snippets); i++) { |
1282 ScopedVector<char> script(1024); | 1255 ScopedVector<char> script(1024); |
1283 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1256 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1284 snippets[i].code_snippet, kFunctionName); | 1257 snippets[i].code_snippet, kFunctionName); |
1285 BytecodeGraphTester tester(isolate, zone, script.start()); | 1258 BytecodeGraphTester tester(isolate, script.start()); |
1286 auto callable = tester.GetCallable<>(); | 1259 auto callable = tester.GetCallable<>(); |
1287 Handle<Object> return_value = callable().ToHandleChecked(); | 1260 Handle<Object> return_value = callable().ToHandleChecked(); |
1288 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1261 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1289 } | 1262 } |
1290 } | 1263 } |
1291 | 1264 |
1292 | 1265 |
1293 TEST(BytecodeGraphBuilderEvalParams) { | 1266 TEST(BytecodeGraphBuilderEvalParams) { |
1294 HandleAndZoneScope scope; | 1267 HandleAndZoneScope scope; |
1295 Isolate* isolate = scope.main_isolate(); | 1268 Isolate* isolate = scope.main_isolate(); |
1296 Zone* zone = scope.main_zone(); | |
1297 | 1269 |
1298 ExpectedSnippet<1> snippets[] = { | 1270 ExpectedSnippet<1> snippets[] = { |
1299 {"var x = 10; return eval('x + p1;');", | 1271 {"var x = 10; return eval('x + p1;');", |
1300 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, | 1272 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
1301 {"var x = 10; eval('p1 = x;'); return p1;", | 1273 {"var x = 10; eval('p1 = x;'); return p1;", |
1302 {handle(Smi::FromInt(10), isolate), handle(Smi::FromInt(20), isolate)}}, | 1274 {handle(Smi::FromInt(10), isolate), handle(Smi::FromInt(20), isolate)}}, |
1303 {"var a = 10;" | 1275 {"var a = 10;" |
1304 "function inner() { return eval('a + p1;');}" | 1276 "function inner() { return eval('a + p1;');}" |
1305 "return inner();", | 1277 "return inner();", |
1306 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, | 1278 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
1307 }; | 1279 }; |
1308 | 1280 |
1309 for (size_t i = 0; i < arraysize(snippets); i++) { | 1281 for (size_t i = 0; i < arraysize(snippets); i++) { |
1310 ScopedVector<char> script(1024); | 1282 ScopedVector<char> script(1024); |
1311 SNPrintF(script, "function %s(p1) { %s }\n%s(0);", kFunctionName, | 1283 SNPrintF(script, "function %s(p1) { %s }\n%s(0);", kFunctionName, |
1312 snippets[i].code_snippet, kFunctionName); | 1284 snippets[i].code_snippet, kFunctionName); |
1313 BytecodeGraphTester tester(isolate, zone, script.start()); | 1285 BytecodeGraphTester tester(isolate, script.start()); |
1314 auto callable = tester.GetCallable<Handle<Object>>(); | 1286 auto callable = tester.GetCallable<Handle<Object>>(); |
1315 Handle<Object> return_value = | 1287 Handle<Object> return_value = |
1316 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1288 callable(snippets[i].parameter(0)).ToHandleChecked(); |
1317 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1289 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1318 } | 1290 } |
1319 } | 1291 } |
1320 | 1292 |
1321 | 1293 |
1322 TEST(BytecodeGraphBuilderEvalGlobal) { | 1294 TEST(BytecodeGraphBuilderEvalGlobal) { |
1323 HandleAndZoneScope scope; | 1295 HandleAndZoneScope scope; |
1324 Isolate* isolate = scope.main_isolate(); | 1296 Isolate* isolate = scope.main_isolate(); |
1325 Zone* zone = scope.main_zone(); | |
1326 Factory* factory = isolate->factory(); | 1297 Factory* factory = isolate->factory(); |
1327 | 1298 |
1328 ExpectedSnippet<0> snippets[] = { | 1299 ExpectedSnippet<0> snippets[] = { |
1329 {"function add_global() { eval('function f() { z = 33; }; f()'); };" | 1300 {"function add_global() { eval('function f() { z = 33; }; f()'); };" |
1330 "function f() { add_global(); return z; }; f();", | 1301 "function f() { add_global(); return z; }; f();", |
1331 {handle(Smi::FromInt(33), isolate)}}, | 1302 {handle(Smi::FromInt(33), isolate)}}, |
1332 {"function add_global() {\n" | 1303 {"function add_global() {\n" |
1333 " eval('\"use strict\"; function f() { y = 33; };" | 1304 " eval('\"use strict\"; function f() { y = 33; };" |
1334 " try { f() } catch(e) {}');\n" | 1305 " try { f() } catch(e) {}');\n" |
1335 "}\n" | 1306 "}\n" |
1336 "function f() { add_global(); return typeof y; } f();", | 1307 "function f() { add_global(); return typeof y; } f();", |
1337 {factory->NewStringFromStaticChars("undefined")}}, | 1308 {factory->NewStringFromStaticChars("undefined")}}, |
1338 }; | 1309 }; |
1339 | 1310 |
1340 for (size_t i = 0; i < arraysize(snippets); i++) { | 1311 for (size_t i = 0; i < arraysize(snippets); i++) { |
1341 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 1312 BytecodeGraphTester tester(isolate, snippets[i].code_snippet); |
1342 auto callable = tester.GetCallable<>(); | 1313 auto callable = tester.GetCallable<>(); |
1343 Handle<Object> return_value = callable().ToHandleChecked(); | 1314 Handle<Object> return_value = callable().ToHandleChecked(); |
1344 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1315 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1345 } | 1316 } |
1346 } | 1317 } |
1347 | 1318 |
1348 | 1319 |
1349 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, | 1320 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, |
1350 Handle<Object> rhs_value) { | 1321 Handle<Object> rhs_value) { |
1351 switch (opcode) { | 1322 switch (opcode) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1393 default: | 1364 default: |
1394 UNREACHABLE(); | 1365 UNREACHABLE(); |
1395 return ""; | 1366 return ""; |
1396 } | 1367 } |
1397 } | 1368 } |
1398 | 1369 |
1399 | 1370 |
1400 TEST(BytecodeGraphBuilderCompare) { | 1371 TEST(BytecodeGraphBuilderCompare) { |
1401 HandleAndZoneScope scope; | 1372 HandleAndZoneScope scope; |
1402 Isolate* isolate = scope.main_isolate(); | 1373 Isolate* isolate = scope.main_isolate(); |
1403 Zone* zone = scope.main_zone(); | |
1404 Factory* factory = isolate->factory(); | 1374 Factory* factory = isolate->factory(); |
1405 Handle<Object> lhs_values[] = { | 1375 Handle<Object> lhs_values[] = { |
1406 factory->NewNumberFromInt(10), factory->NewHeapNumber(3.45), | 1376 factory->NewNumberFromInt(10), factory->NewHeapNumber(3.45), |
1407 factory->NewStringFromStaticChars("abc"), | 1377 factory->NewStringFromStaticChars("abc"), |
1408 factory->NewNumberFromInt(SMI_MAX), factory->NewNumberFromInt(SMI_MIN)}; | 1378 factory->NewNumberFromInt(SMI_MAX), factory->NewNumberFromInt(SMI_MIN)}; |
1409 Handle<Object> rhs_values[] = {factory->NewNumberFromInt(10), | 1379 Handle<Object> rhs_values[] = {factory->NewNumberFromInt(10), |
1410 factory->NewStringFromStaticChars("10"), | 1380 factory->NewStringFromStaticChars("10"), |
1411 factory->NewNumberFromInt(20), | 1381 factory->NewNumberFromInt(20), |
1412 factory->NewStringFromStaticChars("abc"), | 1382 factory->NewStringFromStaticChars("abc"), |
1413 factory->NewHeapNumber(3.45), | 1383 factory->NewHeapNumber(3.45), |
1414 factory->NewNumberFromInt(SMI_MAX), | 1384 factory->NewNumberFromInt(SMI_MAX), |
1415 factory->NewNumberFromInt(SMI_MIN)}; | 1385 factory->NewNumberFromInt(SMI_MIN)}; |
1416 | 1386 |
1417 for (size_t i = 0; i < arraysize(kCompareOperators); i++) { | 1387 for (size_t i = 0; i < arraysize(kCompareOperators); i++) { |
1418 ScopedVector<char> script(1024); | 1388 ScopedVector<char> script(1024); |
1419 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, | 1389 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, |
1420 get_code_snippet(kCompareOperators[i]), kFunctionName); | 1390 get_code_snippet(kCompareOperators[i]), kFunctionName); |
1421 | 1391 |
1422 BytecodeGraphTester tester(isolate, zone, script.start()); | 1392 BytecodeGraphTester tester(isolate, script.start()); |
1423 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 1393 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
1424 for (size_t j = 0; j < arraysize(lhs_values); j++) { | 1394 for (size_t j = 0; j < arraysize(lhs_values); j++) { |
1425 for (size_t k = 0; k < arraysize(rhs_values); k++) { | 1395 for (size_t k = 0; k < arraysize(rhs_values); k++) { |
1426 Handle<Object> return_value = | 1396 Handle<Object> return_value = |
1427 callable(lhs_values[j], rhs_values[k]).ToHandleChecked(); | 1397 callable(lhs_values[j], rhs_values[k]).ToHandleChecked(); |
1428 bool result = get_compare_result(kCompareOperators[i], lhs_values[j], | 1398 bool result = get_compare_result(kCompareOperators[i], lhs_values[j], |
1429 rhs_values[k]); | 1399 rhs_values[k]); |
1430 CHECK(return_value->SameValue(*factory->ToBoolean(result))); | 1400 CHECK(return_value->SameValue(*factory->ToBoolean(result))); |
1431 } | 1401 } |
1432 } | 1402 } |
1433 } | 1403 } |
1434 } | 1404 } |
1435 | 1405 |
1436 | 1406 |
1437 TEST(BytecodeGraphBuilderTestIn) { | 1407 TEST(BytecodeGraphBuilderTestIn) { |
1438 HandleAndZoneScope scope; | 1408 HandleAndZoneScope scope; |
1439 Isolate* isolate = scope.main_isolate(); | 1409 Isolate* isolate = scope.main_isolate(); |
1440 Zone* zone = scope.main_zone(); | |
1441 Factory* factory = isolate->factory(); | 1410 Factory* factory = isolate->factory(); |
1442 | 1411 |
1443 ExpectedSnippet<2> snippets[] = { | 1412 ExpectedSnippet<2> snippets[] = { |
1444 {"return p2 in p1;", | 1413 {"return p2 in p1;", |
1445 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})"), | 1414 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})"), |
1446 factory->NewStringFromStaticChars("val")}}, | 1415 factory->NewStringFromStaticChars("val")}}, |
1447 {"return p2 in p1;", | 1416 {"return p2 in p1;", |
1448 {factory->true_value(), BytecodeGraphTester::NewObject("[]"), | 1417 {factory->true_value(), BytecodeGraphTester::NewObject("[]"), |
1449 factory->NewStringFromStaticChars("length")}}, | 1418 factory->NewStringFromStaticChars("length")}}, |
1450 {"return p2 in p1;", | 1419 {"return p2 in p1;", |
(...skipping 15 matching lines...) Expand all Loading... |
1466 {factory->false_value(), | 1435 {factory->false_value(), |
1467 BytecodeGraphTester::NewObject("({10 : 'val'})"), | 1436 BytecodeGraphTester::NewObject("({10 : 'val'})"), |
1468 factory->NewNumberFromInt(1)}}, | 1437 factory->NewNumberFromInt(1)}}, |
1469 }; | 1438 }; |
1470 | 1439 |
1471 for (size_t i = 0; i < arraysize(snippets); i++) { | 1440 for (size_t i = 0; i < arraysize(snippets); i++) { |
1472 ScopedVector<char> script(1024); | 1441 ScopedVector<char> script(1024); |
1473 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, | 1442 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, |
1474 snippets[i].code_snippet, kFunctionName); | 1443 snippets[i].code_snippet, kFunctionName); |
1475 | 1444 |
1476 BytecodeGraphTester tester(isolate, zone, script.start()); | 1445 BytecodeGraphTester tester(isolate, script.start()); |
1477 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 1446 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
1478 Handle<Object> return_value = | 1447 Handle<Object> return_value = |
1479 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 1448 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
1480 .ToHandleChecked(); | 1449 .ToHandleChecked(); |
1481 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1450 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1482 } | 1451 } |
1483 } | 1452 } |
1484 | 1453 |
1485 | 1454 |
1486 TEST(BytecodeGraphBuilderTestInstanceOf) { | 1455 TEST(BytecodeGraphBuilderTestInstanceOf) { |
1487 HandleAndZoneScope scope; | 1456 HandleAndZoneScope scope; |
1488 Isolate* isolate = scope.main_isolate(); | 1457 Isolate* isolate = scope.main_isolate(); |
1489 Zone* zone = scope.main_zone(); | |
1490 Factory* factory = isolate->factory(); | 1458 Factory* factory = isolate->factory(); |
1491 | 1459 |
1492 ExpectedSnippet<1> snippets[] = { | 1460 ExpectedSnippet<1> snippets[] = { |
1493 {"return p1 instanceof Object;", | 1461 {"return p1 instanceof Object;", |
1494 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, | 1462 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, |
1495 {"return p1 instanceof String;", | 1463 {"return p1 instanceof String;", |
1496 {factory->false_value(), factory->NewStringFromStaticChars("string")}}, | 1464 {factory->false_value(), factory->NewStringFromStaticChars("string")}}, |
1497 {"var cons = function() {};" | 1465 {"var cons = function() {};" |
1498 "var obj = new cons();" | 1466 "var obj = new cons();" |
1499 "return obj instanceof cons;", | 1467 "return obj instanceof cons;", |
1500 {factory->true_value(), factory->undefined_value()}}, | 1468 {factory->true_value(), factory->undefined_value()}}, |
1501 }; | 1469 }; |
1502 | 1470 |
1503 for (size_t i = 0; i < arraysize(snippets); i++) { | 1471 for (size_t i = 0; i < arraysize(snippets); i++) { |
1504 ScopedVector<char> script(1024); | 1472 ScopedVector<char> script(1024); |
1505 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 1473 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
1506 snippets[i].code_snippet, kFunctionName); | 1474 snippets[i].code_snippet, kFunctionName); |
1507 | 1475 |
1508 BytecodeGraphTester tester(isolate, zone, script.start()); | 1476 BytecodeGraphTester tester(isolate, script.start()); |
1509 auto callable = tester.GetCallable<Handle<Object>>(); | 1477 auto callable = tester.GetCallable<Handle<Object>>(); |
1510 Handle<Object> return_value = | 1478 Handle<Object> return_value = |
1511 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1479 callable(snippets[i].parameter(0)).ToHandleChecked(); |
1512 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1480 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1513 } | 1481 } |
1514 } | 1482 } |
1515 | 1483 |
1516 TEST(BytecodeGraphBuilderTryCatch) { | 1484 TEST(BytecodeGraphBuilderTryCatch) { |
1517 HandleAndZoneScope scope; | 1485 HandleAndZoneScope scope; |
1518 Isolate* isolate = scope.main_isolate(); | 1486 Isolate* isolate = scope.main_isolate(); |
1519 Zone* zone = scope.main_zone(); | |
1520 | 1487 |
1521 ExpectedSnippet<0> snippets[] = { | 1488 ExpectedSnippet<0> snippets[] = { |
1522 {"var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;", | 1489 {"var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;", |
1523 {handle(Smi::FromInt(2), isolate)}}, | 1490 {handle(Smi::FromInt(2), isolate)}}, |
1524 {"var a; try { undef.x } catch(e) { a = 2 }; return a;", | 1491 {"var a; try { undef.x } catch(e) { a = 2 }; return a;", |
1525 {handle(Smi::FromInt(2), isolate)}}, | 1492 {handle(Smi::FromInt(2), isolate)}}, |
1526 {"var a; try { throw 1 } catch(e) { a = e + 2 }; return a;", | 1493 {"var a; try { throw 1 } catch(e) { a = e + 2 }; return a;", |
1527 {handle(Smi::FromInt(3), isolate)}}, | 1494 {handle(Smi::FromInt(3), isolate)}}, |
1528 {"var a; try { throw 1 } catch(e) { a = e + 2 };" | 1495 {"var a; try { throw 1 } catch(e) { a = e + 2 };" |
1529 " try { throw a } catch(e) { a = e + 3 }; return a;", | 1496 " try { throw a } catch(e) { a = e + 3 }; return a;", |
1530 {handle(Smi::FromInt(6), isolate)}}, | 1497 {handle(Smi::FromInt(6), isolate)}}, |
1531 }; | 1498 }; |
1532 | 1499 |
1533 for (size_t i = 0; i < arraysize(snippets); i++) { | 1500 for (size_t i = 0; i < arraysize(snippets); i++) { |
1534 ScopedVector<char> script(1024); | 1501 ScopedVector<char> script(1024); |
1535 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1502 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1536 snippets[i].code_snippet, kFunctionName); | 1503 snippets[i].code_snippet, kFunctionName); |
1537 | 1504 |
1538 BytecodeGraphTester tester(isolate, zone, script.start()); | 1505 BytecodeGraphTester tester(isolate, script.start()); |
1539 auto callable = tester.GetCallable<>(); | 1506 auto callable = tester.GetCallable<>(); |
1540 Handle<Object> return_value = callable().ToHandleChecked(); | 1507 Handle<Object> return_value = callable().ToHandleChecked(); |
1541 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1508 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1542 } | 1509 } |
1543 } | 1510 } |
1544 | 1511 |
1545 TEST(BytecodeGraphBuilderTryFinally1) { | 1512 TEST(BytecodeGraphBuilderTryFinally1) { |
1546 HandleAndZoneScope scope; | 1513 HandleAndZoneScope scope; |
1547 Isolate* isolate = scope.main_isolate(); | 1514 Isolate* isolate = scope.main_isolate(); |
1548 Zone* zone = scope.main_zone(); | |
1549 | 1515 |
1550 ExpectedSnippet<0> snippets[] = { | 1516 ExpectedSnippet<0> snippets[] = { |
1551 {"var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;", | 1517 {"var a = 1; try { a = a + 1; } finally { a = a + 2; }; return a;", |
1552 {handle(Smi::FromInt(4), isolate)}}, | 1518 {handle(Smi::FromInt(4), isolate)}}, |
1553 {"var a = 1; try { a = 2; return 23; } finally { a = 3 }; return a;", | 1519 {"var a = 1; try { a = 2; return 23; } finally { a = 3 }; return a;", |
1554 {handle(Smi::FromInt(23), isolate)}}, | 1520 {handle(Smi::FromInt(23), isolate)}}, |
1555 {"var a = 1; try { a = 2; throw 23; } finally { return a; };", | 1521 {"var a = 1; try { a = 2; throw 23; } finally { return a; };", |
1556 {handle(Smi::FromInt(2), isolate)}}, | 1522 {handle(Smi::FromInt(2), isolate)}}, |
1557 {"var a = 1; for (var i = 10; i < 20; i += 5) {" | 1523 {"var a = 1; for (var i = 10; i < 20; i += 5) {" |
1558 " try { a = 2; break; } finally { a = 3; }" | 1524 " try { a = 2; break; } finally { a = 3; }" |
1559 "} return a + i;", | 1525 "} return a + i;", |
1560 {handle(Smi::FromInt(13), isolate)}}, | 1526 {handle(Smi::FromInt(13), isolate)}}, |
1561 {"var a = 1; for (var i = 10; i < 20; i += 5) {" | 1527 {"var a = 1; for (var i = 10; i < 20; i += 5) {" |
1562 " try { a = 2; continue; } finally { a = 3; }" | 1528 " try { a = 2; continue; } finally { a = 3; }" |
1563 "} return a + i;", | 1529 "} return a + i;", |
1564 {handle(Smi::FromInt(23), isolate)}}, | 1530 {handle(Smi::FromInt(23), isolate)}}, |
1565 {"var a = 1; try { a = 2;" | 1531 {"var a = 1; try { a = 2;" |
1566 " try { a = 3; throw 23; } finally { a = 4; }" | 1532 " try { a = 3; throw 23; } finally { a = 4; }" |
1567 "} catch(e) { a = a + e; } return a;", | 1533 "} catch(e) { a = a + e; } return a;", |
1568 {handle(Smi::FromInt(27), isolate)}}, | 1534 {handle(Smi::FromInt(27), isolate)}}, |
1569 }; | 1535 }; |
1570 | 1536 |
1571 for (size_t i = 0; i < arraysize(snippets); i++) { | 1537 for (size_t i = 0; i < arraysize(snippets); i++) { |
1572 ScopedVector<char> script(1024); | 1538 ScopedVector<char> script(1024); |
1573 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1539 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1574 snippets[i].code_snippet, kFunctionName); | 1540 snippets[i].code_snippet, kFunctionName); |
1575 | 1541 |
1576 BytecodeGraphTester tester(isolate, zone, script.start()); | 1542 BytecodeGraphTester tester(isolate, script.start()); |
1577 auto callable = tester.GetCallable<>(); | 1543 auto callable = tester.GetCallable<>(); |
1578 Handle<Object> return_value = callable().ToHandleChecked(); | 1544 Handle<Object> return_value = callable().ToHandleChecked(); |
1579 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1545 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1580 } | 1546 } |
1581 } | 1547 } |
1582 | 1548 |
1583 TEST(BytecodeGraphBuilderTryFinally2) { | 1549 TEST(BytecodeGraphBuilderTryFinally2) { |
1584 HandleAndZoneScope scope; | 1550 HandleAndZoneScope scope; |
1585 Isolate* isolate = scope.main_isolate(); | 1551 Isolate* isolate = scope.main_isolate(); |
1586 Zone* zone = scope.main_zone(); | |
1587 | 1552 |
1588 ExpectedSnippet<0, const char*> snippets[] = { | 1553 ExpectedSnippet<0, const char*> snippets[] = { |
1589 {"var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;", | 1554 {"var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;", |
1590 {"Uncaught 23"}}, | 1555 {"Uncaught 23"}}, |
1591 {"var a = 1; try { a = 2; throw 23; } finally { throw 42; };", | 1556 {"var a = 1; try { a = 2; throw 23; } finally { throw 42; };", |
1592 {"Uncaught 42"}}, | 1557 {"Uncaught 42"}}, |
1593 }; | 1558 }; |
1594 | 1559 |
1595 for (size_t i = 0; i < arraysize(snippets); i++) { | 1560 for (size_t i = 0; i < arraysize(snippets); i++) { |
1596 ScopedVector<char> script(1024); | 1561 ScopedVector<char> script(1024); |
1597 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1562 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1598 snippets[i].code_snippet, kFunctionName); | 1563 snippets[i].code_snippet, kFunctionName); |
1599 | 1564 |
1600 BytecodeGraphTester tester(isolate, zone, script.start()); | 1565 BytecodeGraphTester tester(isolate, script.start()); |
1601 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 1566 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
1602 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); | 1567 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); |
1603 CHECK( | 1568 CHECK( |
1604 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 1569 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
1605 .FromJust()); | 1570 .FromJust()); |
1606 } | 1571 } |
1607 } | 1572 } |
1608 | 1573 |
1609 TEST(BytecodeGraphBuilderThrow) { | 1574 TEST(BytecodeGraphBuilderThrow) { |
1610 HandleAndZoneScope scope; | 1575 HandleAndZoneScope scope; |
1611 Isolate* isolate = scope.main_isolate(); | 1576 Isolate* isolate = scope.main_isolate(); |
1612 Zone* zone = scope.main_zone(); | |
1613 | 1577 |
1614 // TODO(mythria): Add more tests when real try-catch and deoptimization | 1578 // TODO(mythria): Add more tests when real try-catch and deoptimization |
1615 // information are supported. | 1579 // information are supported. |
1616 ExpectedSnippet<0, const char*> snippets[] = { | 1580 ExpectedSnippet<0, const char*> snippets[] = { |
1617 {"throw undefined;", {"Uncaught undefined"}}, | 1581 {"throw undefined;", {"Uncaught undefined"}}, |
1618 {"throw 1;", {"Uncaught 1"}}, | 1582 {"throw 1;", {"Uncaught 1"}}, |
1619 {"throw 'Error';", {"Uncaught Error"}}, | 1583 {"throw 'Error';", {"Uncaught Error"}}, |
1620 {"throw 'Error1'; throw 'Error2'", {"Uncaught Error1"}}, | 1584 {"throw 'Error1'; throw 'Error2'", {"Uncaught Error1"}}, |
1621 {"var a = true; if (a) { throw 'Error'; }", {"Uncaught Error"}}, | 1585 {"var a = true; if (a) { throw 'Error'; }", {"Uncaught Error"}}, |
1622 }; | 1586 }; |
1623 | 1587 |
1624 for (size_t i = 0; i < arraysize(snippets); i++) { | 1588 for (size_t i = 0; i < arraysize(snippets); i++) { |
1625 ScopedVector<char> script(1024); | 1589 ScopedVector<char> script(1024); |
1626 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1590 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1627 snippets[i].code_snippet, kFunctionName); | 1591 snippets[i].code_snippet, kFunctionName); |
1628 | 1592 |
1629 BytecodeGraphTester tester(isolate, zone, script.start()); | 1593 BytecodeGraphTester tester(isolate, script.start()); |
1630 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 1594 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
1631 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); | 1595 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); |
1632 CHECK( | 1596 CHECK( |
1633 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 1597 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
1634 .FromJust()); | 1598 .FromJust()); |
1635 } | 1599 } |
1636 } | 1600 } |
1637 | 1601 |
1638 | 1602 |
1639 TEST(BytecodeGraphBuilderContext) { | 1603 TEST(BytecodeGraphBuilderContext) { |
1640 HandleAndZoneScope scope; | 1604 HandleAndZoneScope scope; |
1641 Isolate* isolate = scope.main_isolate(); | 1605 Isolate* isolate = scope.main_isolate(); |
1642 Zone* zone = scope.main_zone(); | |
1643 Factory* factory = isolate->factory(); | 1606 Factory* factory = isolate->factory(); |
1644 | 1607 |
1645 ExpectedSnippet<0> snippets[] = { | 1608 ExpectedSnippet<0> snippets[] = { |
1646 {"var x = 'outer';" | 1609 {"var x = 'outer';" |
1647 "function f() {" | 1610 "function f() {" |
1648 " 'use strict';" | 1611 " 'use strict';" |
1649 " {" | 1612 " {" |
1650 " let x = 'inner';" | 1613 " let x = 'inner';" |
1651 " (function() {x});" | 1614 " (function() {x});" |
1652 " }" | 1615 " }" |
(...skipping 27 matching lines...) Expand all Loading... |
1680 " return(innerMostFunc() + x);" | 1643 " return(innerMostFunc() + x);" |
1681 "}" | 1644 "}" |
1682 "f();", | 1645 "f();", |
1683 {factory->NewStringFromStaticChars("innermost inner_changed outer")}}, | 1646 {factory->NewStringFromStaticChars("innermost inner_changed outer")}}, |
1684 }; | 1647 }; |
1685 | 1648 |
1686 for (size_t i = 0; i < arraysize(snippets); i++) { | 1649 for (size_t i = 0; i < arraysize(snippets); i++) { |
1687 ScopedVector<char> script(1024); | 1650 ScopedVector<char> script(1024); |
1688 SNPrintF(script, "%s", snippets[i].code_snippet); | 1651 SNPrintF(script, "%s", snippets[i].code_snippet); |
1689 | 1652 |
1690 BytecodeGraphTester tester(isolate, zone, script.start(), "f"); | 1653 BytecodeGraphTester tester(isolate, script.start(), "f"); |
1691 auto callable = tester.GetCallable<>("f"); | 1654 auto callable = tester.GetCallable<>("f"); |
1692 Handle<Object> return_value = callable().ToHandleChecked(); | 1655 Handle<Object> return_value = callable().ToHandleChecked(); |
1693 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1656 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1694 } | 1657 } |
1695 } | 1658 } |
1696 | 1659 |
1697 | 1660 |
1698 TEST(BytecodeGraphBuilderLoadContext) { | 1661 TEST(BytecodeGraphBuilderLoadContext) { |
1699 HandleAndZoneScope scope; | 1662 HandleAndZoneScope scope; |
1700 Isolate* isolate = scope.main_isolate(); | 1663 Isolate* isolate = scope.main_isolate(); |
1701 Zone* zone = scope.main_zone(); | |
1702 Factory* factory = isolate->factory(); | 1664 Factory* factory = isolate->factory(); |
1703 | 1665 |
1704 ExpectedSnippet<1> snippets[] = { | 1666 ExpectedSnippet<1> snippets[] = { |
1705 {"function Outer() {" | 1667 {"function Outer() {" |
1706 " var outerVar = 2;" | 1668 " var outerVar = 2;" |
1707 " function Inner(innerArg) {" | 1669 " function Inner(innerArg) {" |
1708 " this.innerFunc = function () {" | 1670 " this.innerFunc = function () {" |
1709 " return outerVar * innerArg;" | 1671 " return outerVar * innerArg;" |
1710 " };" | 1672 " };" |
1711 " };" | 1673 " };" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 " }" | 1707 " }" |
1746 "}" | 1708 "}" |
1747 "var f = new testOuter(10).testinnerFunc;" | 1709 "var f = new testOuter(10).testinnerFunc;" |
1748 "f(0);", | 1710 "f(0);", |
1749 {factory->NewNumberFromInt(24), factory->NewNumberFromInt(4)}}}; | 1711 {factory->NewNumberFromInt(24), factory->NewNumberFromInt(4)}}}; |
1750 | 1712 |
1751 for (size_t i = 0; i < arraysize(snippets); i++) { | 1713 for (size_t i = 0; i < arraysize(snippets); i++) { |
1752 ScopedVector<char> script(1024); | 1714 ScopedVector<char> script(1024); |
1753 SNPrintF(script, "%s", snippets[i].code_snippet); | 1715 SNPrintF(script, "%s", snippets[i].code_snippet); |
1754 | 1716 |
1755 BytecodeGraphTester tester(isolate, zone, script.start(), "*"); | 1717 BytecodeGraphTester tester(isolate, script.start(), "*"); |
1756 auto callable = tester.GetCallable<Handle<Object>>("f"); | 1718 auto callable = tester.GetCallable<Handle<Object>>("f"); |
1757 Handle<Object> return_value = | 1719 Handle<Object> return_value = |
1758 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1720 callable(snippets[i].parameter(0)).ToHandleChecked(); |
1759 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1721 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1760 } | 1722 } |
1761 } | 1723 } |
1762 | 1724 |
1763 | 1725 |
1764 TEST(BytecodeGraphBuilderCreateArgumentsNoParameters) { | 1726 TEST(BytecodeGraphBuilderCreateArgumentsNoParameters) { |
1765 HandleAndZoneScope scope; | 1727 HandleAndZoneScope scope; |
1766 Isolate* isolate = scope.main_isolate(); | 1728 Isolate* isolate = scope.main_isolate(); |
1767 Zone* zone = scope.main_zone(); | |
1768 Factory* factory = isolate->factory(); | 1729 Factory* factory = isolate->factory(); |
1769 | 1730 |
1770 ExpectedSnippet<0> snippets[] = { | 1731 ExpectedSnippet<0> snippets[] = { |
1771 {"function f() {return arguments[0];}", {factory->undefined_value()}}, | 1732 {"function f() {return arguments[0];}", {factory->undefined_value()}}, |
1772 {"function f(a) {return arguments[0];}", {factory->undefined_value()}}, | 1733 {"function f(a) {return arguments[0];}", {factory->undefined_value()}}, |
1773 {"function f() {'use strict'; return arguments[0];}", | 1734 {"function f() {'use strict'; return arguments[0];}", |
1774 {factory->undefined_value()}}, | 1735 {factory->undefined_value()}}, |
1775 {"function f(a) {'use strict'; return arguments[0];}", | 1736 {"function f(a) {'use strict'; return arguments[0];}", |
1776 {factory->undefined_value()}}, | 1737 {factory->undefined_value()}}, |
1777 {"function f(...restArgs) {return restArgs[0];}", | 1738 {"function f(...restArgs) {return restArgs[0];}", |
1778 {factory->undefined_value()}}, | 1739 {factory->undefined_value()}}, |
1779 {"function f(a, ...restArgs) {return restArgs[0];}", | 1740 {"function f(a, ...restArgs) {return restArgs[0];}", |
1780 {factory->undefined_value()}}, | 1741 {factory->undefined_value()}}, |
1781 }; | 1742 }; |
1782 | 1743 |
1783 for (size_t i = 0; i < arraysize(snippets); i++) { | 1744 for (size_t i = 0; i < arraysize(snippets); i++) { |
1784 ScopedVector<char> script(1024); | 1745 ScopedVector<char> script(1024); |
1785 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1746 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
1786 | 1747 |
1787 BytecodeGraphTester tester(isolate, zone, script.start()); | 1748 BytecodeGraphTester tester(isolate, script.start()); |
1788 auto callable = tester.GetCallable<>(); | 1749 auto callable = tester.GetCallable<>(); |
1789 Handle<Object> return_value = callable().ToHandleChecked(); | 1750 Handle<Object> return_value = callable().ToHandleChecked(); |
1790 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1751 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1791 } | 1752 } |
1792 } | 1753 } |
1793 | 1754 |
1794 | 1755 |
1795 TEST(BytecodeGraphBuilderCreateArguments) { | 1756 TEST(BytecodeGraphBuilderCreateArguments) { |
1796 HandleAndZoneScope scope; | 1757 HandleAndZoneScope scope; |
1797 Isolate* isolate = scope.main_isolate(); | 1758 Isolate* isolate = scope.main_isolate(); |
1798 Zone* zone = scope.main_zone(); | |
1799 Factory* factory = isolate->factory(); | 1759 Factory* factory = isolate->factory(); |
1800 | 1760 |
1801 ExpectedSnippet<3> snippets[] = { | 1761 ExpectedSnippet<3> snippets[] = { |
1802 {"function f(a, b, c) {return arguments[0];}", | 1762 {"function f(a, b, c) {return arguments[0];}", |
1803 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(1), | 1763 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(1), |
1804 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1764 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1805 {"function f(a, b, c) {return arguments[3];}", | 1765 {"function f(a, b, c) {return arguments[3];}", |
1806 {factory->undefined_value(), factory->NewNumberFromInt(1), | 1766 {factory->undefined_value(), factory->NewNumberFromInt(1), |
1807 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1767 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1808 {"function f(a, b, c) { b = c; return arguments[1];}", | 1768 {"function f(a, b, c) { b = c; return arguments[1];}", |
(...skipping 11 matching lines...) Expand all Loading... |
1820 {"function inline_func(a, b) { return arguments[0] }" | 1780 {"function inline_func(a, b) { return arguments[0] }" |
1821 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", | 1781 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", |
1822 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), | 1782 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
1823 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, | 1783 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, |
1824 }; | 1784 }; |
1825 | 1785 |
1826 for (size_t i = 0; i < arraysize(snippets); i++) { | 1786 for (size_t i = 0; i < arraysize(snippets); i++) { |
1827 ScopedVector<char> script(1024); | 1787 ScopedVector<char> script(1024); |
1828 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1788 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
1829 | 1789 |
1830 BytecodeGraphTester tester(isolate, zone, script.start()); | 1790 BytecodeGraphTester tester(isolate, script.start()); |
1831 auto callable = | 1791 auto callable = |
1832 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1792 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
1833 Handle<Object> return_value = | 1793 Handle<Object> return_value = |
1834 callable(snippets[i].parameter(0), snippets[i].parameter(1), | 1794 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
1835 snippets[i].parameter(2)) | 1795 snippets[i].parameter(2)) |
1836 .ToHandleChecked(); | 1796 .ToHandleChecked(); |
1837 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1797 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1838 } | 1798 } |
1839 } | 1799 } |
1840 | 1800 |
1841 TEST(BytecodeGraphBuilderCreateRestArguments) { | 1801 TEST(BytecodeGraphBuilderCreateRestArguments) { |
1842 HandleAndZoneScope scope; | 1802 HandleAndZoneScope scope; |
1843 Isolate* isolate = scope.main_isolate(); | 1803 Isolate* isolate = scope.main_isolate(); |
1844 Zone* zone = scope.main_zone(); | |
1845 Factory* factory = isolate->factory(); | 1804 Factory* factory = isolate->factory(); |
1846 | 1805 |
1847 ExpectedSnippet<3> snippets[] = { | 1806 ExpectedSnippet<3> snippets[] = { |
1848 {"function f(...restArgs) {return restArgs[0];}", | 1807 {"function f(...restArgs) {return restArgs[0];}", |
1849 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(1), | 1808 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(1), |
1850 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1809 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1851 {"function f(a, b, ...restArgs) {return restArgs[0];}", | 1810 {"function f(a, b, ...restArgs) {return restArgs[0];}", |
1852 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), | 1811 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
1853 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1812 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1854 {"function f(a, b, ...restArgs) {return arguments[2];}", | 1813 {"function f(a, b, ...restArgs) {return arguments[2];}", |
1855 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), | 1814 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
1856 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1815 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1857 {"function f(a, ...restArgs) { return restArgs[2];}", | 1816 {"function f(a, ...restArgs) { return restArgs[2];}", |
1858 {factory->undefined_value(), factory->NewNumberFromInt(1), | 1817 {factory->undefined_value(), factory->NewNumberFromInt(1), |
1859 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1818 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1860 {"function f(a, ...restArgs) { return arguments[0] + restArgs[1];}", | 1819 {"function f(a, ...restArgs) { return arguments[0] + restArgs[1];}", |
1861 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(1), | 1820 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(1), |
1862 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1821 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
1863 {"function inline_func(a, ...restArgs) { return restArgs[0] }" | 1822 {"function inline_func(a, ...restArgs) { return restArgs[0] }" |
1864 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", | 1823 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", |
1865 {factory->NewNumberFromInt(31), factory->NewNumberFromInt(1), | 1824 {factory->NewNumberFromInt(31), factory->NewNumberFromInt(1), |
1866 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, | 1825 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, |
1867 }; | 1826 }; |
1868 | 1827 |
1869 for (size_t i = 0; i < arraysize(snippets); i++) { | 1828 for (size_t i = 0; i < arraysize(snippets); i++) { |
1870 ScopedVector<char> script(1024); | 1829 ScopedVector<char> script(1024); |
1871 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1830 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
1872 | 1831 |
1873 BytecodeGraphTester tester(isolate, zone, script.start()); | 1832 BytecodeGraphTester tester(isolate, script.start()); |
1874 auto callable = | 1833 auto callable = |
1875 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1834 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
1876 Handle<Object> return_value = | 1835 Handle<Object> return_value = |
1877 callable(snippets[i].parameter(0), snippets[i].parameter(1), | 1836 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
1878 snippets[i].parameter(2)) | 1837 snippets[i].parameter(2)) |
1879 .ToHandleChecked(); | 1838 .ToHandleChecked(); |
1880 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1839 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1881 } | 1840 } |
1882 } | 1841 } |
1883 | 1842 |
1884 TEST(BytecodeGraphBuilderRegExpLiterals) { | 1843 TEST(BytecodeGraphBuilderRegExpLiterals) { |
1885 HandleAndZoneScope scope; | 1844 HandleAndZoneScope scope; |
1886 Isolate* isolate = scope.main_isolate(); | 1845 Isolate* isolate = scope.main_isolate(); |
1887 Zone* zone = scope.main_zone(); | |
1888 Factory* factory = isolate->factory(); | 1846 Factory* factory = isolate->factory(); |
1889 | 1847 |
1890 ExpectedSnippet<0> snippets[] = { | 1848 ExpectedSnippet<0> snippets[] = { |
1891 {"return /abd/.exec('cccabbdd');", {factory->null_value()}}, | 1849 {"return /abd/.exec('cccabbdd');", {factory->null_value()}}, |
1892 {"return /ab+d/.exec('cccabbdd')[0];", | 1850 {"return /ab+d/.exec('cccabbdd')[0];", |
1893 {factory->NewStringFromStaticChars("abbd")}}, | 1851 {factory->NewStringFromStaticChars("abbd")}}, |
1894 {"var a = 3.1414;" | 1852 {"var a = 3.1414;" |
1895 REPEAT_256(SPACE, "a = 3.1414;") | 1853 REPEAT_256(SPACE, "a = 3.1414;") |
1896 "return /ab+d/.exec('cccabbdd')[0];", | 1854 "return /ab+d/.exec('cccabbdd')[0];", |
1897 {factory->NewStringFromStaticChars("abbd")}}, | 1855 {factory->NewStringFromStaticChars("abbd")}}, |
1898 {"return /ab+d/.exec('cccabbdd')[1];", {factory->undefined_value()}}, | 1856 {"return /ab+d/.exec('cccabbdd')[1];", {factory->undefined_value()}}, |
1899 {"return /AbC/i.exec('ssaBC')[0];", | 1857 {"return /AbC/i.exec('ssaBC')[0];", |
1900 {factory->NewStringFromStaticChars("aBC")}}, | 1858 {factory->NewStringFromStaticChars("aBC")}}, |
1901 {"return 'ssaBC'.match(/AbC/i)[0];", | 1859 {"return 'ssaBC'.match(/AbC/i)[0];", |
1902 {factory->NewStringFromStaticChars("aBC")}}, | 1860 {factory->NewStringFromStaticChars("aBC")}}, |
1903 {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];", | 1861 {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];", |
1904 {factory->NewStringFromStaticChars("AbC")}}, | 1862 {factory->NewStringFromStaticChars("AbC")}}, |
1905 }; | 1863 }; |
1906 | 1864 |
1907 for (size_t i = 0; i < arraysize(snippets); i++) { | 1865 for (size_t i = 0; i < arraysize(snippets); i++) { |
1908 ScopedVector<char> script(4096); | 1866 ScopedVector<char> script(4096); |
1909 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1867 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1910 snippets[i].code_snippet, kFunctionName); | 1868 snippets[i].code_snippet, kFunctionName); |
1911 | 1869 |
1912 BytecodeGraphTester tester(isolate, zone, script.start()); | 1870 BytecodeGraphTester tester(isolate, script.start()); |
1913 auto callable = tester.GetCallable<>(); | 1871 auto callable = tester.GetCallable<>(); |
1914 Handle<Object> return_value = callable().ToHandleChecked(); | 1872 Handle<Object> return_value = callable().ToHandleChecked(); |
1915 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1873 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1916 } | 1874 } |
1917 } | 1875 } |
1918 | 1876 |
1919 | 1877 |
1920 TEST(BytecodeGraphBuilderArrayLiterals) { | 1878 TEST(BytecodeGraphBuilderArrayLiterals) { |
1921 HandleAndZoneScope scope; | 1879 HandleAndZoneScope scope; |
1922 Isolate* isolate = scope.main_isolate(); | 1880 Isolate* isolate = scope.main_isolate(); |
1923 Zone* zone = scope.main_zone(); | |
1924 Factory* factory = isolate->factory(); | 1881 Factory* factory = isolate->factory(); |
1925 | 1882 |
1926 ExpectedSnippet<0> snippets[] = { | 1883 ExpectedSnippet<0> snippets[] = { |
1927 {"return [][0];", {factory->undefined_value()}}, | 1884 {"return [][0];", {factory->undefined_value()}}, |
1928 {"return [1, 3, 2][1];", {factory->NewNumberFromInt(3)}}, | 1885 {"return [1, 3, 2][1];", {factory->NewNumberFromInt(3)}}, |
1929 {"var a;" REPEAT_256(SPACE, "a = 9.87;") "return [1, 3, 2][1];", | 1886 {"var a;" REPEAT_256(SPACE, "a = 9.87;") "return [1, 3, 2][1];", |
1930 {factory->NewNumberFromInt(3)}}, | 1887 {factory->NewNumberFromInt(3)}}, |
1931 {"return ['a', 'b', 'c'][2];", {factory->NewStringFromStaticChars("c")}}, | 1888 {"return ['a', 'b', 'c'][2];", {factory->NewStringFromStaticChars("c")}}, |
1932 {"var a = 100; return [a, a++, a + 2, a + 3][2];", | 1889 {"var a = 100; return [a, a++, a + 2, a + 3][2];", |
1933 {factory->NewNumberFromInt(103)}}, | 1890 {factory->NewNumberFromInt(103)}}, |
1934 {"var a = 100; return [a, ++a, a + 2, a + 3][1];", | 1891 {"var a = 100; return [a, ++a, a + 2, a + 3][1];", |
1935 {factory->NewNumberFromInt(101)}}, | 1892 {factory->NewNumberFromInt(101)}}, |
1936 {"var a = 9.2;" | 1893 {"var a = 9.2;" |
1937 REPEAT_256(SPACE, "a = 9.34;") | 1894 REPEAT_256(SPACE, "a = 9.34;") |
1938 "return [a, ++a, a + 2, a + 3][2];", | 1895 "return [a, ++a, a + 2, a + 3][2];", |
1939 {factory->NewHeapNumber(12.34)}}, | 1896 {factory->NewHeapNumber(12.34)}}, |
1940 {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];", | 1897 {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];", |
1941 {factory->NewStringFromStaticChars("a")}}, | 1898 {factory->NewStringFromStaticChars("a")}}, |
1942 {"var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];", | 1899 {"var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];", |
1943 {factory->NewStringFromStaticChars("test")}}, | 1900 {factory->NewStringFromStaticChars("test")}}, |
1944 {"var t = 't'; return [[t, t + 'est'], [1 + t]][1][0];", | 1901 {"var t = 't'; return [[t, t + 'est'], [1 + t]][1][0];", |
1945 {factory->NewStringFromStaticChars("1t")}}}; | 1902 {factory->NewStringFromStaticChars("1t")}}}; |
1946 | 1903 |
1947 for (size_t i = 0; i < arraysize(snippets); i++) { | 1904 for (size_t i = 0; i < arraysize(snippets); i++) { |
1948 ScopedVector<char> script(4096); | 1905 ScopedVector<char> script(4096); |
1949 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1906 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
1950 snippets[i].code_snippet, kFunctionName); | 1907 snippets[i].code_snippet, kFunctionName); |
1951 | 1908 |
1952 BytecodeGraphTester tester(isolate, zone, script.start()); | 1909 BytecodeGraphTester tester(isolate, script.start()); |
1953 auto callable = tester.GetCallable<>(); | 1910 auto callable = tester.GetCallable<>(); |
1954 Handle<Object> return_value = callable().ToHandleChecked(); | 1911 Handle<Object> return_value = callable().ToHandleChecked(); |
1955 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1912 CHECK(return_value->SameValue(*snippets[i].return_value())); |
1956 } | 1913 } |
1957 } | 1914 } |
1958 | 1915 |
1959 | 1916 |
1960 TEST(BytecodeGraphBuilderObjectLiterals) { | 1917 TEST(BytecodeGraphBuilderObjectLiterals) { |
1961 HandleAndZoneScope scope; | 1918 HandleAndZoneScope scope; |
1962 Isolate* isolate = scope.main_isolate(); | 1919 Isolate* isolate = scope.main_isolate(); |
1963 Zone* zone = scope.main_zone(); | |
1964 Factory* factory = isolate->factory(); | 1920 Factory* factory = isolate->factory(); |
1965 | 1921 |
1966 ExpectedSnippet<0> snippets[] = { | 1922 ExpectedSnippet<0> snippets[] = { |
1967 {"return { }.name;", {factory->undefined_value()}}, | 1923 {"return { }.name;", {factory->undefined_value()}}, |
1968 {"return { name: 'string', val: 9.2 }.name;", | 1924 {"return { name: 'string', val: 9.2 }.name;", |
1969 {factory->NewStringFromStaticChars("string")}}, | 1925 {factory->NewStringFromStaticChars("string")}}, |
1970 {"var a;\n" | 1926 {"var a;\n" |
1971 REPEAT_256(SPACE, "a = 1.23;\n") | 1927 REPEAT_256(SPACE, "a = 1.23;\n") |
1972 "return { name: 'string', val: 9.2 }.name;", | 1928 "return { name: 'string', val: 9.2 }.name;", |
1973 {factory->NewStringFromStaticChars("string")}}, | 1929 {factory->NewStringFromStaticChars("string")}}, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2006 {factory->NewStringFromStaticChars("proto_str")}}, | 1962 {factory->NewStringFromStaticChars("proto_str")}}, |
2007 {"var n = 'name';\n" | 1963 {"var n = 'name';\n" |
2008 "return { [n]: 'val', get a() { return 987 } }['a'];", | 1964 "return { [n]: 'val', get a() { return 987 } }['a'];", |
2009 {factory->NewNumberFromInt(987)}}, | 1965 {factory->NewNumberFromInt(987)}}, |
2010 }; | 1966 }; |
2011 | 1967 |
2012 for (size_t i = 0; i < arraysize(snippets); i++) { | 1968 for (size_t i = 0; i < arraysize(snippets); i++) { |
2013 ScopedVector<char> script(4096); | 1969 ScopedVector<char> script(4096); |
2014 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1970 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2015 snippets[i].code_snippet, kFunctionName); | 1971 snippets[i].code_snippet, kFunctionName); |
2016 BytecodeGraphTester tester(isolate, zone, script.start()); | 1972 BytecodeGraphTester tester(isolate, script.start()); |
2017 auto callable = tester.GetCallable<>(); | 1973 auto callable = tester.GetCallable<>(); |
2018 Handle<Object> return_value = callable().ToHandleChecked(); | 1974 Handle<Object> return_value = callable().ToHandleChecked(); |
2019 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1975 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2020 } | 1976 } |
2021 } | 1977 } |
2022 | 1978 |
2023 | 1979 |
2024 TEST(BytecodeGraphBuilderIf) { | 1980 TEST(BytecodeGraphBuilderIf) { |
2025 HandleAndZoneScope scope; | 1981 HandleAndZoneScope scope; |
2026 Isolate* isolate = scope.main_isolate(); | 1982 Isolate* isolate = scope.main_isolate(); |
2027 Zone* zone = scope.main_zone(); | |
2028 Factory* factory = isolate->factory(); | 1983 Factory* factory = isolate->factory(); |
2029 | 1984 |
2030 ExpectedSnippet<1> snippets[] = { | 1985 ExpectedSnippet<1> snippets[] = { |
2031 {"if (p1 > 1) return 1;\n" | 1986 {"if (p1 > 1) return 1;\n" |
2032 "return -1;", | 1987 "return -1;", |
2033 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, | 1988 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, |
2034 {"if (p1 > 1) return 1;\n" | 1989 {"if (p1 > 1) return 1;\n" |
2035 "return -1;", | 1990 "return -1;", |
2036 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(1)}}, | 1991 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(1)}}, |
2037 {"if (p1 > 1) { return 1; } else { return -1; }", | 1992 {"if (p1 > 1) { return 1; } else { return -1; }", |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2115 "function f1() {x}" | 2070 "function f1() {x}" |
2116 "return x + c;", | 2071 "return x + c;", |
2117 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(-1)}}, | 2072 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(-1)}}, |
2118 }; | 2073 }; |
2119 | 2074 |
2120 for (size_t i = 0; i < arraysize(snippets); i++) { | 2075 for (size_t i = 0; i < arraysize(snippets); i++) { |
2121 ScopedVector<char> script(2048); | 2076 ScopedVector<char> script(2048); |
2122 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2077 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
2123 snippets[i].code_snippet, kFunctionName); | 2078 snippets[i].code_snippet, kFunctionName); |
2124 | 2079 |
2125 BytecodeGraphTester tester(isolate, zone, script.start()); | 2080 BytecodeGraphTester tester(isolate, script.start()); |
2126 auto callable = tester.GetCallable<Handle<Object>>(); | 2081 auto callable = tester.GetCallable<Handle<Object>>(); |
2127 Handle<Object> return_value = | 2082 Handle<Object> return_value = |
2128 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2083 callable(snippets[i].parameter(0)).ToHandleChecked(); |
2129 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2084 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2130 } | 2085 } |
2131 } | 2086 } |
2132 | 2087 |
2133 | 2088 |
2134 TEST(BytecodeGraphBuilderConditionalOperator) { | 2089 TEST(BytecodeGraphBuilderConditionalOperator) { |
2135 HandleAndZoneScope scope; | 2090 HandleAndZoneScope scope; |
2136 Isolate* isolate = scope.main_isolate(); | 2091 Isolate* isolate = scope.main_isolate(); |
2137 Zone* zone = scope.main_zone(); | |
2138 Factory* factory = isolate->factory(); | 2092 Factory* factory = isolate->factory(); |
2139 | 2093 |
2140 ExpectedSnippet<1> snippets[] = { | 2094 ExpectedSnippet<1> snippets[] = { |
2141 {"return (p1 > 1) ? 1 : -1;", | 2095 {"return (p1 > 1) ? 1 : -1;", |
2142 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, | 2096 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, |
2143 {"return (p1 > 1) ? 1 : -1;", | 2097 {"return (p1 > 1) ? 1 : -1;", |
2144 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(0)}}, | 2098 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(0)}}, |
2145 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", | 2099 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", |
2146 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(2)}}, | 2100 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(2)}}, |
2147 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", | 2101 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", |
2148 {factory->NewNumberFromInt(-10), factory->NewNumberFromInt(20)}}, | 2102 {factory->NewNumberFromInt(-10), factory->NewNumberFromInt(20)}}, |
2149 }; | 2103 }; |
2150 | 2104 |
2151 for (size_t i = 0; i < arraysize(snippets); i++) { | 2105 for (size_t i = 0; i < arraysize(snippets); i++) { |
2152 ScopedVector<char> script(2048); | 2106 ScopedVector<char> script(2048); |
2153 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2107 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
2154 snippets[i].code_snippet, kFunctionName); | 2108 snippets[i].code_snippet, kFunctionName); |
2155 | 2109 |
2156 BytecodeGraphTester tester(isolate, zone, script.start()); | 2110 BytecodeGraphTester tester(isolate, script.start()); |
2157 auto callable = tester.GetCallable<Handle<Object>>(); | 2111 auto callable = tester.GetCallable<Handle<Object>>(); |
2158 Handle<Object> return_value = | 2112 Handle<Object> return_value = |
2159 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2113 callable(snippets[i].parameter(0)).ToHandleChecked(); |
2160 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2114 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2161 } | 2115 } |
2162 } | 2116 } |
2163 | 2117 |
2164 | 2118 |
2165 TEST(BytecodeGraphBuilderSwitch) { | 2119 TEST(BytecodeGraphBuilderSwitch) { |
2166 HandleAndZoneScope scope; | 2120 HandleAndZoneScope scope; |
2167 Isolate* isolate = scope.main_isolate(); | 2121 Isolate* isolate = scope.main_isolate(); |
2168 Zone* zone = scope.main_zone(); | |
2169 Factory* factory = isolate->factory(); | 2122 Factory* factory = isolate->factory(); |
2170 | 2123 |
2171 const char* switch_code = | 2124 const char* switch_code = |
2172 "switch (p1) {\n" | 2125 "switch (p1) {\n" |
2173 " case 1: return 0;\n" | 2126 " case 1: return 0;\n" |
2174 " case 2: return 1;\n" | 2127 " case 2: return 1;\n" |
2175 " case 3:\n" | 2128 " case 3:\n" |
2176 " case 4: return 2;\n" | 2129 " case 4: return 2;\n" |
2177 " case 9: break;\n" | 2130 " case 9: break;\n" |
2178 " default: return 3;\n" | 2131 " default: return 3;\n" |
(...skipping 15 matching lines...) Expand all Loading... |
2194 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(5)}}, | 2147 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(5)}}, |
2195 {switch_code, | 2148 {switch_code, |
2196 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(6)}}, | 2149 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(6)}}, |
2197 }; | 2150 }; |
2198 | 2151 |
2199 for (size_t i = 0; i < arraysize(snippets); i++) { | 2152 for (size_t i = 0; i < arraysize(snippets); i++) { |
2200 ScopedVector<char> script(2048); | 2153 ScopedVector<char> script(2048); |
2201 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2154 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
2202 snippets[i].code_snippet, kFunctionName); | 2155 snippets[i].code_snippet, kFunctionName); |
2203 | 2156 |
2204 BytecodeGraphTester tester(isolate, zone, script.start()); | 2157 BytecodeGraphTester tester(isolate, script.start()); |
2205 auto callable = tester.GetCallable<Handle<Object>>(); | 2158 auto callable = tester.GetCallable<Handle<Object>>(); |
2206 Handle<Object> return_value = | 2159 Handle<Object> return_value = |
2207 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2160 callable(snippets[i].parameter(0)).ToHandleChecked(); |
2208 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2161 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2209 } | 2162 } |
2210 } | 2163 } |
2211 | 2164 |
2212 TEST(BytecodeGraphBuilderSwitchMerge) { | 2165 TEST(BytecodeGraphBuilderSwitchMerge) { |
2213 HandleAndZoneScope scope; | 2166 HandleAndZoneScope scope; |
2214 Isolate* isolate = scope.main_isolate(); | 2167 Isolate* isolate = scope.main_isolate(); |
2215 Zone* zone = scope.main_zone(); | |
2216 Factory* factory = isolate->factory(); | 2168 Factory* factory = isolate->factory(); |
2217 | 2169 |
2218 const char* switch_code = | 2170 const char* switch_code = |
2219 "var x = 10;" | 2171 "var x = 10;" |
2220 "switch (p1) {\n" | 2172 "switch (p1) {\n" |
2221 " case 1: x = 0;\n" | 2173 " case 1: x = 0;\n" |
2222 " case 2: x = 1;\n" | 2174 " case 2: x = 1;\n" |
2223 " case 3:\n" | 2175 " case 3:\n" |
2224 " case 4: x = 2; break;\n" | 2176 " case 4: x = 2; break;\n" |
2225 " case 5: x = 3;\n" | 2177 " case 5: x = 3;\n" |
(...skipping 17 matching lines...) Expand all Loading... |
2243 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(9)}}, | 2195 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(9)}}, |
2244 {switch_code, | 2196 {switch_code, |
2245 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(6)}}, | 2197 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(6)}}, |
2246 }; | 2198 }; |
2247 | 2199 |
2248 for (size_t i = 0; i < arraysize(snippets); i++) { | 2200 for (size_t i = 0; i < arraysize(snippets); i++) { |
2249 ScopedVector<char> script(2048); | 2201 ScopedVector<char> script(2048); |
2250 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2202 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
2251 snippets[i].code_snippet, kFunctionName); | 2203 snippets[i].code_snippet, kFunctionName); |
2252 | 2204 |
2253 BytecodeGraphTester tester(isolate, zone, script.start()); | 2205 BytecodeGraphTester tester(isolate, script.start()); |
2254 auto callable = tester.GetCallable<Handle<Object>>(); | 2206 auto callable = tester.GetCallable<Handle<Object>>(); |
2255 Handle<Object> return_value = | 2207 Handle<Object> return_value = |
2256 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2208 callable(snippets[i].parameter(0)).ToHandleChecked(); |
2257 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2209 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2258 } | 2210 } |
2259 } | 2211 } |
2260 | 2212 |
2261 TEST(BytecodeGraphBuilderNestedSwitch) { | 2213 TEST(BytecodeGraphBuilderNestedSwitch) { |
2262 HandleAndZoneScope scope; | 2214 HandleAndZoneScope scope; |
2263 Isolate* isolate = scope.main_isolate(); | 2215 Isolate* isolate = scope.main_isolate(); |
2264 Zone* zone = scope.main_zone(); | |
2265 Factory* factory = isolate->factory(); | 2216 Factory* factory = isolate->factory(); |
2266 | 2217 |
2267 const char* switch_code = | 2218 const char* switch_code = |
2268 "switch (p1) {\n" | 2219 "switch (p1) {\n" |
2269 " case 0: {" | 2220 " case 0: {" |
2270 " switch (p2) { case 0: return 0; case 1: return 1; case 2: break; }\n" | 2221 " switch (p2) { case 0: return 0; case 1: return 1; case 2: break; }\n" |
2271 " return -1;" | 2222 " return -1;" |
2272 " }\n" | 2223 " }\n" |
2273 " case 1: {" | 2224 " case 1: {" |
2274 " switch (p2) { case 0: return 2; case 1: return 3; }\n" | 2225 " switch (p2) { case 0: return 2; case 1: return 3; }\n" |
(...skipping 27 matching lines...) Expand all Loading... |
2302 {switch_code, | 2253 {switch_code, |
2303 {factory->NewNumberFromInt(-2), factory->NewNumberFromInt(2), | 2254 {factory->NewNumberFromInt(-2), factory->NewNumberFromInt(2), |
2304 factory->NewNumberFromInt(0)}}, | 2255 factory->NewNumberFromInt(0)}}, |
2305 }; | 2256 }; |
2306 | 2257 |
2307 for (size_t i = 0; i < arraysize(snippets); i++) { | 2258 for (size_t i = 0; i < arraysize(snippets); i++) { |
2308 ScopedVector<char> script(2048); | 2259 ScopedVector<char> script(2048); |
2309 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0, 0);", kFunctionName, | 2260 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0, 0);", kFunctionName, |
2310 snippets[i].code_snippet, kFunctionName); | 2261 snippets[i].code_snippet, kFunctionName); |
2311 | 2262 |
2312 BytecodeGraphTester tester(isolate, zone, script.start()); | 2263 BytecodeGraphTester tester(isolate, script.start()); |
2313 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 2264 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
2314 Handle<Object> return_value = | 2265 Handle<Object> return_value = |
2315 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 2266 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
2316 .ToHandleChecked(); | 2267 .ToHandleChecked(); |
2317 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2268 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2318 } | 2269 } |
2319 } | 2270 } |
2320 | 2271 |
2321 | 2272 |
2322 TEST(BytecodeGraphBuilderBreakableBlocks) { | 2273 TEST(BytecodeGraphBuilderBreakableBlocks) { |
2323 HandleAndZoneScope scope; | 2274 HandleAndZoneScope scope; |
2324 Isolate* isolate = scope.main_isolate(); | 2275 Isolate* isolate = scope.main_isolate(); |
2325 Zone* zone = scope.main_zone(); | |
2326 Factory* factory = isolate->factory(); | 2276 Factory* factory = isolate->factory(); |
2327 | 2277 |
2328 ExpectedSnippet<0> snippets[] = { | 2278 ExpectedSnippet<0> snippets[] = { |
2329 {"var x = 0;\n" | 2279 {"var x = 0;\n" |
2330 "my_heart: {\n" | 2280 "my_heart: {\n" |
2331 " x = x + 1;\n" | 2281 " x = x + 1;\n" |
2332 " break my_heart;\n" | 2282 " break my_heart;\n" |
2333 " x = x + 2;\n" | 2283 " x = x + 2;\n" |
2334 "}\n" | 2284 "}\n" |
2335 "return x;\n", | 2285 "return x;\n", |
2336 {factory->NewNumberFromInt(1)}}, | 2286 {factory->NewNumberFromInt(1)}}, |
2337 {"var sum = 0;\n" | 2287 {"var sum = 0;\n" |
2338 "outta_here: {\n" | 2288 "outta_here: {\n" |
2339 " for (var x = 0; x < 10; ++x) {\n" | 2289 " for (var x = 0; x < 10; ++x) {\n" |
2340 " for (var y = 0; y < 3; ++y) {\n" | 2290 " for (var y = 0; y < 3; ++y) {\n" |
2341 " ++sum;\n" | 2291 " ++sum;\n" |
2342 " if (x + y == 12) { break outta_here; }\n" | 2292 " if (x + y == 12) { break outta_here; }\n" |
2343 " }\n" | 2293 " }\n" |
2344 " }\n" | 2294 " }\n" |
2345 "}\n" | 2295 "}\n" |
2346 "return sum;", | 2296 "return sum;", |
2347 {factory->NewNumber(30)}}, | 2297 {factory->NewNumber(30)}}, |
2348 }; | 2298 }; |
2349 | 2299 |
2350 for (size_t i = 0; i < arraysize(snippets); i++) { | 2300 for (size_t i = 0; i < arraysize(snippets); i++) { |
2351 ScopedVector<char> script(1024); | 2301 ScopedVector<char> script(1024); |
2352 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2302 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2353 snippets[i].code_snippet, kFunctionName); | 2303 snippets[i].code_snippet, kFunctionName); |
2354 | 2304 |
2355 BytecodeGraphTester tester(isolate, zone, script.start()); | 2305 BytecodeGraphTester tester(isolate, script.start()); |
2356 auto callable = tester.GetCallable<>(); | 2306 auto callable = tester.GetCallable<>(); |
2357 Handle<Object> return_value = callable().ToHandleChecked(); | 2307 Handle<Object> return_value = callable().ToHandleChecked(); |
2358 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2308 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2359 } | 2309 } |
2360 } | 2310 } |
2361 | 2311 |
2362 | 2312 |
2363 TEST(BytecodeGraphBuilderWhile) { | 2313 TEST(BytecodeGraphBuilderWhile) { |
2364 HandleAndZoneScope scope; | 2314 HandleAndZoneScope scope; |
2365 Isolate* isolate = scope.main_isolate(); | 2315 Isolate* isolate = scope.main_isolate(); |
2366 Zone* zone = scope.main_zone(); | |
2367 Factory* factory = isolate->factory(); | 2316 Factory* factory = isolate->factory(); |
2368 | 2317 |
2369 ExpectedSnippet<0> snippets[] = { | 2318 ExpectedSnippet<0> snippets[] = { |
2370 {"var x = 1; while (x < 1) { x *= 100; } return x;", | 2319 {"var x = 1; while (x < 1) { x *= 100; } return x;", |
2371 {factory->NewNumberFromInt(1)}}, | 2320 {factory->NewNumberFromInt(1)}}, |
2372 {"var x = 1, y = 0; while (x < 7) { y += x * x; x += 1; } return y;", | 2321 {"var x = 1, y = 0; while (x < 7) { y += x * x; x += 1; } return y;", |
2373 {factory->NewNumberFromInt(91)}}, | 2322 {factory->NewNumberFromInt(91)}}, |
2374 {"var x = 1; while (true) { x += 1; if (x == 10) break; } return x;", | 2323 {"var x = 1; while (true) { x += 1; if (x == 10) break; } return x;", |
2375 {factory->NewNumberFromInt(10)}}, | 2324 {factory->NewNumberFromInt(10)}}, |
2376 {"var x = 1; while (false) { x += 1; } return x;", | 2325 {"var x = 1; while (false) { x += 1; } return x;", |
(...skipping 17 matching lines...) Expand all Loading... |
2394 " if (x == 4) break;\n" | 2343 " if (x == 4) break;\n" |
2395 "}\n" | 2344 "}\n" |
2396 "return y;", | 2345 "return y;", |
2397 {factory->NewNumberFromInt(16)}}}; | 2346 {factory->NewNumberFromInt(16)}}}; |
2398 | 2347 |
2399 for (size_t i = 0; i < arraysize(snippets); i++) { | 2348 for (size_t i = 0; i < arraysize(snippets); i++) { |
2400 ScopedVector<char> script(1024); | 2349 ScopedVector<char> script(1024); |
2401 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2350 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2402 snippets[i].code_snippet, kFunctionName); | 2351 snippets[i].code_snippet, kFunctionName); |
2403 | 2352 |
2404 BytecodeGraphTester tester(isolate, zone, script.start()); | 2353 BytecodeGraphTester tester(isolate, script.start()); |
2405 auto callable = tester.GetCallable<>(); | 2354 auto callable = tester.GetCallable<>(); |
2406 Handle<Object> return_value = callable().ToHandleChecked(); | 2355 Handle<Object> return_value = callable().ToHandleChecked(); |
2407 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2356 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2408 } | 2357 } |
2409 } | 2358 } |
2410 | 2359 |
2411 | 2360 |
2412 TEST(BytecodeGraphBuilderDo) { | 2361 TEST(BytecodeGraphBuilderDo) { |
2413 HandleAndZoneScope scope; | 2362 HandleAndZoneScope scope; |
2414 Isolate* isolate = scope.main_isolate(); | 2363 Isolate* isolate = scope.main_isolate(); |
2415 Zone* zone = scope.main_zone(); | |
2416 Factory* factory = isolate->factory(); | 2364 Factory* factory = isolate->factory(); |
2417 | 2365 |
2418 ExpectedSnippet<0> snippets[] = { | 2366 ExpectedSnippet<0> snippets[] = { |
2419 {"var x = 1; do { x *= 100; } while (x < 100); return x;", | 2367 {"var x = 1; do { x *= 100; } while (x < 100); return x;", |
2420 {factory->NewNumberFromInt(100)}}, | 2368 {factory->NewNumberFromInt(100)}}, |
2421 {"var x = 1; do { x = x * x + 1; } while (x < 7) return x;", | 2369 {"var x = 1; do { x = x * x + 1; } while (x < 7) return x;", |
2422 {factory->NewNumberFromInt(26)}}, | 2370 {factory->NewNumberFromInt(26)}}, |
2423 {"var x = 1; do { x += 1; } while (false); return x;", | 2371 {"var x = 1; do { x += 1; } while (false); return x;", |
2424 {factory->NewNumberFromInt(2)}}, | 2372 {factory->NewNumberFromInt(2)}}, |
2425 {"var x = 1, y = 0;\n" | 2373 {"var x = 1, y = 0;\n" |
(...skipping 17 matching lines...) Expand all Loading... |
2443 " } while (x < 1)\n" | 2391 " } while (x < 1)\n" |
2444 "} while (sum < 3)\n" | 2392 "} while (sum < 3)\n" |
2445 "return sum;", | 2393 "return sum;", |
2446 {factory->NewNumber(3)}}}; | 2394 {factory->NewNumber(3)}}}; |
2447 | 2395 |
2448 for (size_t i = 0; i < arraysize(snippets); i++) { | 2396 for (size_t i = 0; i < arraysize(snippets); i++) { |
2449 ScopedVector<char> script(1024); | 2397 ScopedVector<char> script(1024); |
2450 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2398 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2451 snippets[i].code_snippet, kFunctionName); | 2399 snippets[i].code_snippet, kFunctionName); |
2452 | 2400 |
2453 BytecodeGraphTester tester(isolate, zone, script.start()); | 2401 BytecodeGraphTester tester(isolate, script.start()); |
2454 auto callable = tester.GetCallable<>(); | 2402 auto callable = tester.GetCallable<>(); |
2455 Handle<Object> return_value = callable().ToHandleChecked(); | 2403 Handle<Object> return_value = callable().ToHandleChecked(); |
2456 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2404 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2457 } | 2405 } |
2458 } | 2406 } |
2459 | 2407 |
2460 | 2408 |
2461 TEST(BytecodeGraphBuilderFor) { | 2409 TEST(BytecodeGraphBuilderFor) { |
2462 HandleAndZoneScope scope; | 2410 HandleAndZoneScope scope; |
2463 Isolate* isolate = scope.main_isolate(); | 2411 Isolate* isolate = scope.main_isolate(); |
2464 Zone* zone = scope.main_zone(); | |
2465 Factory* factory = isolate->factory(); | 2412 Factory* factory = isolate->factory(); |
2466 | 2413 |
2467 ExpectedSnippet<0> snippets[] = { | 2414 ExpectedSnippet<0> snippets[] = { |
2468 {"for (var x = 0;; x = 2 * x + 1) { if (x > 10) return x; }", | 2415 {"for (var x = 0;; x = 2 * x + 1) { if (x > 10) return x; }", |
2469 {factory->NewNumberFromInt(15)}}, | 2416 {factory->NewNumberFromInt(15)}}, |
2470 {"for (var x = 0; true; x = 2 * x + 1) { if (x > 100) return x; }", | 2417 {"for (var x = 0; true; x = 2 * x + 1) { if (x > 100) return x; }", |
2471 {factory->NewNumberFromInt(127)}}, | 2418 {factory->NewNumberFromInt(127)}}, |
2472 {"for (var x = 0; false; x = 2 * x + 1) { if (x > 100) return x; } " | 2419 {"for (var x = 0; false; x = 2 * x + 1) { if (x > 100) return x; } " |
2473 "return 0;", | 2420 "return 0;", |
2474 {factory->NewNumberFromInt(0)}}, | 2421 {factory->NewNumberFromInt(0)}}, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2537 "}\n" | 2484 "}\n" |
2538 "return sum;", | 2485 "return sum;", |
2539 {factory->NewNumberFromInt(50)}}, | 2486 {factory->NewNumberFromInt(50)}}, |
2540 }; | 2487 }; |
2541 | 2488 |
2542 for (size_t i = 0; i < arraysize(snippets); i++) { | 2489 for (size_t i = 0; i < arraysize(snippets); i++) { |
2543 ScopedVector<char> script(1024); | 2490 ScopedVector<char> script(1024); |
2544 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2491 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2545 snippets[i].code_snippet, kFunctionName); | 2492 snippets[i].code_snippet, kFunctionName); |
2546 | 2493 |
2547 BytecodeGraphTester tester(isolate, zone, script.start()); | 2494 BytecodeGraphTester tester(isolate, script.start()); |
2548 auto callable = tester.GetCallable<>(); | 2495 auto callable = tester.GetCallable<>(); |
2549 Handle<Object> return_value = callable().ToHandleChecked(); | 2496 Handle<Object> return_value = callable().ToHandleChecked(); |
2550 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2497 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2551 } | 2498 } |
2552 } | 2499 } |
2553 | 2500 |
2554 | 2501 |
2555 TEST(BytecodeGraphBuilderForIn) { | 2502 TEST(BytecodeGraphBuilderForIn) { |
2556 HandleAndZoneScope scope; | 2503 HandleAndZoneScope scope; |
2557 Isolate* isolate = scope.main_isolate(); | 2504 Isolate* isolate = scope.main_isolate(); |
2558 Zone* zone = scope.main_zone(); | |
2559 Factory* factory = isolate->factory(); | 2505 Factory* factory = isolate->factory(); |
2560 ExpectedSnippet<0> snippets[] = { | 2506 ExpectedSnippet<0> snippets[] = { |
2561 {"var sum = 0;\n" | 2507 {"var sum = 0;\n" |
2562 "var empty = null;\n" | 2508 "var empty = null;\n" |
2563 "for (var x in empty) { sum++; }\n" | 2509 "for (var x in empty) { sum++; }\n" |
2564 "return sum;", | 2510 "return sum;", |
2565 {factory->NewNumberFromInt(0)}}, | 2511 {factory->NewNumberFromInt(0)}}, |
2566 {"var sum = 100;\n" | 2512 {"var sum = 100;\n" |
2567 "var empty = 1;\n" | 2513 "var empty = 1;\n" |
2568 "for (var x in empty) { sum++; }\n" | 2514 "for (var x in empty) { sum++; }\n" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 "}\n" | 2555 "}\n" |
2610 "return sum;", | 2556 "return sum;", |
2611 {factory->NewNumberFromInt(6)}}, | 2557 {factory->NewNumberFromInt(6)}}, |
2612 }; | 2558 }; |
2613 | 2559 |
2614 for (size_t i = 0; i < arraysize(snippets); i++) { | 2560 for (size_t i = 0; i < arraysize(snippets); i++) { |
2615 ScopedVector<char> script(1024); | 2561 ScopedVector<char> script(1024); |
2616 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2562 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2617 snippets[i].code_snippet, kFunctionName); | 2563 snippets[i].code_snippet, kFunctionName); |
2618 | 2564 |
2619 BytecodeGraphTester tester(isolate, zone, script.start()); | 2565 BytecodeGraphTester tester(isolate, script.start()); |
2620 auto callable = tester.GetCallable<>(); | 2566 auto callable = tester.GetCallable<>(); |
2621 Handle<Object> return_value = callable().ToHandleChecked(); | 2567 Handle<Object> return_value = callable().ToHandleChecked(); |
2622 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2568 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2623 } | 2569 } |
2624 } | 2570 } |
2625 | 2571 |
2626 | 2572 |
2627 TEST(BytecodeGraphBuilderForOf) { | 2573 TEST(BytecodeGraphBuilderForOf) { |
2628 HandleAndZoneScope scope; | 2574 HandleAndZoneScope scope; |
2629 Isolate* isolate = scope.main_isolate(); | 2575 Isolate* isolate = scope.main_isolate(); |
2630 Zone* zone = scope.main_zone(); | |
2631 Factory* factory = isolate->factory(); | 2576 Factory* factory = isolate->factory(); |
2632 ExpectedSnippet<0> snippets[] = { | 2577 ExpectedSnippet<0> snippets[] = { |
2633 {" var r = 0;\n" | 2578 {" var r = 0;\n" |
2634 " for (var a of [0,6,7,9]) { r += a; }\n" | 2579 " for (var a of [0,6,7,9]) { r += a; }\n" |
2635 " return r;\n", | 2580 " return r;\n", |
2636 {handle(Smi::FromInt(22), isolate)}}, | 2581 {handle(Smi::FromInt(22), isolate)}}, |
2637 {" var r = '';\n" | 2582 {" var r = '';\n" |
2638 " for (var a of 'foobar') { r = a + r; }\n" | 2583 " for (var a of 'foobar') { r = a + r; }\n" |
2639 " return r;\n", | 2584 " return r;\n", |
2640 {factory->NewStringFromStaticChars("raboof")}}, | 2585 {factory->NewStringFromStaticChars("raboof")}}, |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2702 " for (a of obj) { r += a }\n" | 2647 " for (a of obj) { r += a }\n" |
2703 " return r;\n", | 2648 " return r;\n", |
2704 {factory->NewStringFromStaticChars("dcba")}}, | 2649 {factory->NewStringFromStaticChars("dcba")}}, |
2705 }; | 2650 }; |
2706 | 2651 |
2707 for (size_t i = 0; i < arraysize(snippets); i++) { | 2652 for (size_t i = 0; i < arraysize(snippets); i++) { |
2708 ScopedVector<char> script(1024); | 2653 ScopedVector<char> script(1024); |
2709 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2654 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2710 snippets[i].code_snippet, kFunctionName); | 2655 snippets[i].code_snippet, kFunctionName); |
2711 | 2656 |
2712 BytecodeGraphTester tester(isolate, zone, script.start()); | 2657 BytecodeGraphTester tester(isolate, script.start()); |
2713 auto callable = tester.GetCallable<>(); | 2658 auto callable = tester.GetCallable<>(); |
2714 Handle<Object> return_value = callable().ToHandleChecked(); | 2659 Handle<Object> return_value = callable().ToHandleChecked(); |
2715 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2660 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2716 } | 2661 } |
2717 } | 2662 } |
2718 | 2663 |
2719 void TestJumpWithConstantsAndWideConstants(size_t shard) { | 2664 void TestJumpWithConstantsAndWideConstants(size_t shard) { |
2720 const int kStep = 46; | 2665 const int kStep = 46; |
2721 int start = static_cast<int>(7 + 17 * shard); | 2666 int start = static_cast<int>(7 + 17 * shard); |
2722 for (int constants = start; constants < 300; constants += kStep) { | 2667 for (int constants = start; constants < 300; constants += kStep) { |
(...skipping 16 matching lines...) Expand all Loading... |
2739 script_os << " }\n"; | 2684 script_os << " }\n"; |
2740 script_os << " return i;\n"; | 2685 script_os << " return i;\n"; |
2741 script_os << "}\n"; | 2686 script_os << "}\n"; |
2742 script_os << kFunctionName << "(0);\n"; | 2687 script_os << kFunctionName << "(0);\n"; |
2743 std::string script(script_os.str()); | 2688 std::string script(script_os.str()); |
2744 | 2689 |
2745 HandleAndZoneScope scope; | 2690 HandleAndZoneScope scope; |
2746 auto isolate = scope.main_isolate(); | 2691 auto isolate = scope.main_isolate(); |
2747 auto factory = isolate->factory(); | 2692 auto factory = isolate->factory(); |
2748 auto zone = scope.main_zone(); | 2693 auto zone = scope.main_zone(); |
2749 BytecodeGraphTester tester(isolate, zone, script.c_str()); | 2694 BytecodeGraphTester tester(isolate, script.c_str()); |
2750 auto callable = tester.GetCallable<Handle<Object>>(); | 2695 auto callable = tester.GetCallable<Handle<Object>>(); |
2751 for (int a = 0; a < 3; a++) { | 2696 for (int a = 0; a < 3; a++) { |
2752 Handle<Object> return_val = | 2697 Handle<Object> return_val = |
2753 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); | 2698 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); |
2754 static const int results[] = {11, 12, 2}; | 2699 static const int results[] = {11, 12, 2}; |
2755 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); | 2700 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); |
2756 } | 2701 } |
2757 } | 2702 } |
2758 } | 2703 } |
2759 | 2704 |
2760 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants) | 2705 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants) |
2761 | 2706 |
2762 TEST(BytecodeGraphBuilderDoExpressions) { | 2707 TEST(BytecodeGraphBuilderDoExpressions) { |
2763 bool old_flag = FLAG_harmony_do_expressions; | 2708 bool old_flag = FLAG_harmony_do_expressions; |
2764 FLAG_harmony_do_expressions = true; | 2709 FLAG_harmony_do_expressions = true; |
2765 HandleAndZoneScope scope; | 2710 HandleAndZoneScope scope; |
2766 Isolate* isolate = scope.main_isolate(); | 2711 Isolate* isolate = scope.main_isolate(); |
2767 Zone* zone = scope.main_zone(); | |
2768 Factory* factory = isolate->factory(); | 2712 Factory* factory = isolate->factory(); |
2769 ExpectedSnippet<0> snippets[] = { | 2713 ExpectedSnippet<0> snippets[] = { |
2770 {"var a = do {}; return a;", {factory->undefined_value()}}, | 2714 {"var a = do {}; return a;", {factory->undefined_value()}}, |
2771 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, | 2715 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, |
2772 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, | 2716 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, |
2773 {"var a = do { var x = 100; x++; }; return a;", | 2717 {"var a = do { var x = 100; x++; }; return a;", |
2774 {handle(Smi::FromInt(100), isolate)}}, | 2718 {handle(Smi::FromInt(100), isolate)}}, |
2775 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};" | 2719 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};" |
2776 "return i;", | 2720 "return i;", |
2777 {handle(Smi::FromInt(3), isolate)}}, | 2721 {handle(Smi::FromInt(3), isolate)}}, |
2778 }; | 2722 }; |
2779 | 2723 |
2780 for (size_t i = 0; i < arraysize(snippets); i++) { | 2724 for (size_t i = 0; i < arraysize(snippets); i++) { |
2781 ScopedVector<char> script(1024); | 2725 ScopedVector<char> script(1024); |
2782 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2726 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2783 snippets[i].code_snippet, kFunctionName); | 2727 snippets[i].code_snippet, kFunctionName); |
2784 | 2728 |
2785 BytecodeGraphTester tester(isolate, zone, script.start()); | 2729 BytecodeGraphTester tester(isolate, script.start()); |
2786 auto callable = tester.GetCallable<>(); | 2730 auto callable = tester.GetCallable<>(); |
2787 Handle<Object> return_value = callable().ToHandleChecked(); | 2731 Handle<Object> return_value = callable().ToHandleChecked(); |
2788 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2732 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2789 } | 2733 } |
2790 | 2734 |
2791 FLAG_harmony_do_expressions = old_flag; | 2735 FLAG_harmony_do_expressions = old_flag; |
2792 } | 2736 } |
2793 | 2737 |
2794 TEST(BytecodeGraphBuilderWithStatement) { | 2738 TEST(BytecodeGraphBuilderWithStatement) { |
2795 HandleAndZoneScope scope; | 2739 HandleAndZoneScope scope; |
2796 Isolate* isolate = scope.main_isolate(); | 2740 Isolate* isolate = scope.main_isolate(); |
2797 Zone* zone = scope.main_zone(); | |
2798 | 2741 |
2799 ExpectedSnippet<0> snippets[] = { | 2742 ExpectedSnippet<0> snippets[] = { |
2800 {"with({x:42}) return x;", {handle(Smi::FromInt(42), isolate)}}, | 2743 {"with({x:42}) return x;", {handle(Smi::FromInt(42), isolate)}}, |
2801 {"with({}) { var y = 10; return y;}", | 2744 {"with({}) { var y = 10; return y;}", |
2802 {handle(Smi::FromInt(10), isolate)}}, | 2745 {handle(Smi::FromInt(10), isolate)}}, |
2803 {"var y = {x:42};" | 2746 {"var y = {x:42};" |
2804 " function inner() {" | 2747 " function inner() {" |
2805 " var x = 20;" | 2748 " var x = 20;" |
2806 " with(y) return x;" | 2749 " with(y) return x;" |
2807 "}" | 2750 "}" |
2808 "return inner();", | 2751 "return inner();", |
2809 {handle(Smi::FromInt(42), isolate)}}, | 2752 {handle(Smi::FromInt(42), isolate)}}, |
2810 {"var y = {x:42};" | 2753 {"var y = {x:42};" |
2811 " function inner(o) {" | 2754 " function inner(o) {" |
2812 " var x = 20;" | 2755 " var x = 20;" |
2813 " with(o) return x;" | 2756 " with(o) return x;" |
2814 "}" | 2757 "}" |
2815 "return inner(y);", | 2758 "return inner(y);", |
2816 {handle(Smi::FromInt(42), isolate)}}, | 2759 {handle(Smi::FromInt(42), isolate)}}, |
2817 }; | 2760 }; |
2818 | 2761 |
2819 for (size_t i = 0; i < arraysize(snippets); i++) { | 2762 for (size_t i = 0; i < arraysize(snippets); i++) { |
2820 ScopedVector<char> script(1024); | 2763 ScopedVector<char> script(1024); |
2821 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2764 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2822 snippets[i].code_snippet, kFunctionName); | 2765 snippets[i].code_snippet, kFunctionName); |
2823 | 2766 |
2824 BytecodeGraphTester tester(isolate, zone, script.start()); | 2767 BytecodeGraphTester tester(isolate, script.start()); |
2825 auto callable = tester.GetCallable<>(); | 2768 auto callable = tester.GetCallable<>(); |
2826 Handle<Object> return_value = callable().ToHandleChecked(); | 2769 Handle<Object> return_value = callable().ToHandleChecked(); |
2827 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2770 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2828 } | 2771 } |
2829 } | 2772 } |
2830 | 2773 |
2831 TEST(BytecodeGraphBuilderConstDeclaration) { | 2774 TEST(BytecodeGraphBuilderConstDeclaration) { |
2832 HandleAndZoneScope scope; | 2775 HandleAndZoneScope scope; |
2833 Isolate* isolate = scope.main_isolate(); | 2776 Isolate* isolate = scope.main_isolate(); |
2834 Zone* zone = scope.main_zone(); | |
2835 Factory* factory = isolate->factory(); | 2777 Factory* factory = isolate->factory(); |
2836 | 2778 |
2837 ExpectedSnippet<0> snippets[] = { | 2779 ExpectedSnippet<0> snippets[] = { |
2838 {"const x = 3; return x;", {handle(Smi::FromInt(3), isolate)}}, | 2780 {"const x = 3; return x;", {handle(Smi::FromInt(3), isolate)}}, |
2839 {"let x = 10; x = x + 20; return x;", | 2781 {"let x = 10; x = x + 20; return x;", |
2840 {handle(Smi::FromInt(30), isolate)}}, | 2782 {handle(Smi::FromInt(30), isolate)}}, |
2841 {"let x = 10; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, | 2783 {"let x = 10; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, |
2842 {"let x; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, | 2784 {"let x; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, |
2843 {"let x; return x;", {factory->undefined_value()}}, | 2785 {"let x; return x;", {factory->undefined_value()}}, |
2844 {"var x = 10; { let x = 30; } return x;", | 2786 {"var x = 10; { let x = 30; } return x;", |
(...skipping 16 matching lines...) Expand all Loading... |
2861 "return a;\n", | 2803 "return a;\n", |
2862 {handle(Smi::FromInt(55), isolate)}}, | 2804 {handle(Smi::FromInt(55), isolate)}}, |
2863 }; | 2805 }; |
2864 | 2806 |
2865 // Tests for sloppy mode. | 2807 // Tests for sloppy mode. |
2866 for (size_t i = 0; i < arraysize(snippets); i++) { | 2808 for (size_t i = 0; i < arraysize(snippets); i++) { |
2867 ScopedVector<char> script(1024); | 2809 ScopedVector<char> script(1024); |
2868 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2810 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2869 snippets[i].code_snippet, kFunctionName); | 2811 snippets[i].code_snippet, kFunctionName); |
2870 | 2812 |
2871 BytecodeGraphTester tester(isolate, zone, script.start()); | 2813 BytecodeGraphTester tester(isolate, script.start()); |
2872 auto callable = tester.GetCallable<>(); | 2814 auto callable = tester.GetCallable<>(); |
2873 Handle<Object> return_value = callable().ToHandleChecked(); | 2815 Handle<Object> return_value = callable().ToHandleChecked(); |
2874 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2816 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2875 } | 2817 } |
2876 | 2818 |
2877 // Tests for strict mode. | 2819 // Tests for strict mode. |
2878 for (size_t i = 0; i < arraysize(snippets); i++) { | 2820 for (size_t i = 0; i < arraysize(snippets); i++) { |
2879 ScopedVector<char> script(1024); | 2821 ScopedVector<char> script(1024); |
2880 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, | 2822 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, |
2881 snippets[i].code_snippet, kFunctionName); | 2823 snippets[i].code_snippet, kFunctionName); |
2882 | 2824 |
2883 BytecodeGraphTester tester(isolate, zone, script.start()); | 2825 BytecodeGraphTester tester(isolate, script.start()); |
2884 auto callable = tester.GetCallable<>(); | 2826 auto callable = tester.GetCallable<>(); |
2885 Handle<Object> return_value = callable().ToHandleChecked(); | 2827 Handle<Object> return_value = callable().ToHandleChecked(); |
2886 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2828 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2887 } | 2829 } |
2888 } | 2830 } |
2889 | 2831 |
2890 TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) { | 2832 TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) { |
2891 HandleAndZoneScope scope; | 2833 HandleAndZoneScope scope; |
2892 Isolate* isolate = scope.main_isolate(); | 2834 Isolate* isolate = scope.main_isolate(); |
2893 Zone* zone = scope.main_zone(); | |
2894 Factory* factory = isolate->factory(); | 2835 Factory* factory = isolate->factory(); |
2895 | 2836 |
2896 ExpectedSnippet<0> snippets[] = { | 2837 ExpectedSnippet<0> snippets[] = { |
2897 {"const x = 3; function f1() {return x;}; return x;", | 2838 {"const x = 3; function f1() {return x;}; return x;", |
2898 {handle(Smi::FromInt(3), isolate)}}, | 2839 {handle(Smi::FromInt(3), isolate)}}, |
2899 {"let x = 10; x = x + 20; function f1() {return x;}; return x;", | 2840 {"let x = 10; x = x + 20; function f1() {return x;}; return x;", |
2900 {handle(Smi::FromInt(30), isolate)}}, | 2841 {handle(Smi::FromInt(30), isolate)}}, |
2901 {"let x; x = 20; function f1() {return x;}; return x;", | 2842 {"let x; x = 20; function f1() {return x;}; return x;", |
2902 {handle(Smi::FromInt(20), isolate)}}, | 2843 {handle(Smi::FromInt(20), isolate)}}, |
2903 {"let x; function f1() {return x;}; return x;", | 2844 {"let x; function f1() {return x;}; return x;", |
2904 {factory->undefined_value()}}, | 2845 {factory->undefined_value()}}, |
2905 }; | 2846 }; |
2906 | 2847 |
2907 // Tests for sloppy mode. | 2848 // Tests for sloppy mode. |
2908 for (size_t i = 0; i < arraysize(snippets); i++) { | 2849 for (size_t i = 0; i < arraysize(snippets); i++) { |
2909 ScopedVector<char> script(1024); | 2850 ScopedVector<char> script(1024); |
2910 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2851 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
2911 snippets[i].code_snippet, kFunctionName); | 2852 snippets[i].code_snippet, kFunctionName); |
2912 | 2853 |
2913 BytecodeGraphTester tester(isolate, zone, script.start()); | 2854 BytecodeGraphTester tester(isolate, script.start()); |
2914 auto callable = tester.GetCallable<>(); | 2855 auto callable = tester.GetCallable<>(); |
2915 Handle<Object> return_value = callable().ToHandleChecked(); | 2856 Handle<Object> return_value = callable().ToHandleChecked(); |
2916 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2857 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2917 } | 2858 } |
2918 | 2859 |
2919 // Tests for strict mode. | 2860 // Tests for strict mode. |
2920 for (size_t i = 0; i < arraysize(snippets); i++) { | 2861 for (size_t i = 0; i < arraysize(snippets); i++) { |
2921 ScopedVector<char> script(1024); | 2862 ScopedVector<char> script(1024); |
2922 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, | 2863 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, |
2923 snippets[i].code_snippet, kFunctionName); | 2864 snippets[i].code_snippet, kFunctionName); |
2924 | 2865 |
2925 BytecodeGraphTester tester(isolate, zone, script.start()); | 2866 BytecodeGraphTester tester(isolate, script.start()); |
2926 auto callable = tester.GetCallable<>(); | 2867 auto callable = tester.GetCallable<>(); |
2927 Handle<Object> return_value = callable().ToHandleChecked(); | 2868 Handle<Object> return_value = callable().ToHandleChecked(); |
2928 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2869 CHECK(return_value->SameValue(*snippets[i].return_value())); |
2929 } | 2870 } |
2930 } | 2871 } |
2931 | 2872 |
2932 TEST(BytecodeGraphBuilderConstInLookupContextChain) { | 2873 TEST(BytecodeGraphBuilderConstInLookupContextChain) { |
2933 HandleAndZoneScope scope; | 2874 HandleAndZoneScope scope; |
2934 Isolate* isolate = scope.main_isolate(); | 2875 Isolate* isolate = scope.main_isolate(); |
2935 Zone* zone = scope.main_zone(); | |
2936 | 2876 |
2937 const char* prologue = | 2877 const char* prologue = |
2938 "function OuterMost() {\n" | 2878 "function OuterMost() {\n" |
2939 " const outerConst = 10;\n" | 2879 " const outerConst = 10;\n" |
2940 " let outerLet = 20;\n" | 2880 " let outerLet = 20;\n" |
2941 " function Outer() {\n" | 2881 " function Outer() {\n" |
2942 " function Inner() {\n" | 2882 " function Inner() {\n" |
2943 " this.innerFunc = function() { "; | 2883 " this.innerFunc = function() { "; |
2944 const char* epilogue = | 2884 const char* epilogue = |
2945 " }\n" | 2885 " }\n" |
(...skipping 17 matching lines...) Expand all Loading... |
2963 {"var outerConst = 50; return outerConst;", | 2903 {"var outerConst = 50; return outerConst;", |
2964 {handle(Smi::FromInt(50), isolate)}}, | 2904 {handle(Smi::FromInt(50), isolate)}}, |
2965 {"try { outerConst = 30 } catch(e) { return -1; }", | 2905 {"try { outerConst = 30 } catch(e) { return -1; }", |
2966 {handle(Smi::FromInt(-1), isolate)}}}; | 2906 {handle(Smi::FromInt(-1), isolate)}}}; |
2967 | 2907 |
2968 for (size_t i = 0; i < arraysize(const_decl); i++) { | 2908 for (size_t i = 0; i < arraysize(const_decl); i++) { |
2969 ScopedVector<char> script(1024); | 2909 ScopedVector<char> script(1024); |
2970 SNPrintF(script, "%s %s %s", prologue, const_decl[i].code_snippet, | 2910 SNPrintF(script, "%s %s %s", prologue, const_decl[i].code_snippet, |
2971 epilogue); | 2911 epilogue); |
2972 | 2912 |
2973 BytecodeGraphTester tester(isolate, zone, script.start(), "*"); | 2913 BytecodeGraphTester tester(isolate, script.start(), "*"); |
2974 auto callable = tester.GetCallable<>(); | 2914 auto callable = tester.GetCallable<>(); |
2975 Handle<Object> return_value = callable().ToHandleChecked(); | 2915 Handle<Object> return_value = callable().ToHandleChecked(); |
2976 CHECK(return_value->SameValue(*const_decl[i].return_value())); | 2916 CHECK(return_value->SameValue(*const_decl[i].return_value())); |
2977 } | 2917 } |
2978 } | 2918 } |
2979 | 2919 |
2980 TEST(BytecodeGraphBuilderIllegalConstDeclaration) { | 2920 TEST(BytecodeGraphBuilderIllegalConstDeclaration) { |
2981 HandleAndZoneScope scope; | 2921 HandleAndZoneScope scope; |
2982 Isolate* isolate = scope.main_isolate(); | 2922 Isolate* isolate = scope.main_isolate(); |
2983 Zone* zone = scope.main_zone(); | |
2984 | 2923 |
2985 ExpectedSnippet<0, const char*> illegal_const_decl[] = { | 2924 ExpectedSnippet<0, const char*> illegal_const_decl[] = { |
2986 {"const x = x = 10 + 3; return x;", | 2925 {"const x = x = 10 + 3; return x;", |
2987 {"Uncaught ReferenceError: x is not defined"}}, | 2926 {"Uncaught ReferenceError: x is not defined"}}, |
2988 {"const x = 10; x = 20; return x;", | 2927 {"const x = 10; x = 20; return x;", |
2989 {"Uncaught TypeError: Assignment to constant variable."}}, | 2928 {"Uncaught TypeError: Assignment to constant variable."}}, |
2990 {"const x = 10; { x = 20; } return x;", | 2929 {"const x = 10; { x = 20; } return x;", |
2991 {"Uncaught TypeError: Assignment to constant variable."}}, | 2930 {"Uncaught TypeError: Assignment to constant variable."}}, |
2992 {"const x = 10; eval('x = 20;'); return x;", | 2931 {"const x = 10; eval('x = 20;'); return x;", |
2993 {"Uncaught TypeError: Assignment to constant variable."}}, | 2932 {"Uncaught TypeError: Assignment to constant variable."}}, |
2994 {"let x = x + 10; return x;", | 2933 {"let x = x + 10; return x;", |
2995 {"Uncaught ReferenceError: x is not defined"}}, | 2934 {"Uncaught ReferenceError: x is not defined"}}, |
2996 {"'use strict'; (function f1() { f1 = 123; })() ", | 2935 {"'use strict'; (function f1() { f1 = 123; })() ", |
2997 {"Uncaught TypeError: Assignment to constant variable."}}, | 2936 {"Uncaught TypeError: Assignment to constant variable."}}, |
2998 }; | 2937 }; |
2999 | 2938 |
3000 // Tests for sloppy mode. | 2939 // Tests for sloppy mode. |
3001 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { | 2940 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { |
3002 ScopedVector<char> script(1024); | 2941 ScopedVector<char> script(1024); |
3003 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2942 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
3004 illegal_const_decl[i].code_snippet, kFunctionName); | 2943 illegal_const_decl[i].code_snippet, kFunctionName); |
3005 | 2944 |
3006 BytecodeGraphTester tester(isolate, zone, script.start()); | 2945 BytecodeGraphTester tester(isolate, script.start()); |
3007 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 2946 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
3008 v8::Local<v8::String> expected_string = | 2947 v8::Local<v8::String> expected_string = |
3009 v8_str(illegal_const_decl[i].return_value()); | 2948 v8_str(illegal_const_decl[i].return_value()); |
3010 CHECK( | 2949 CHECK( |
3011 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 2950 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
3012 .FromJust()); | 2951 .FromJust()); |
3013 } | 2952 } |
3014 | 2953 |
3015 // Tests for strict mode. | 2954 // Tests for strict mode. |
3016 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { | 2955 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { |
3017 ScopedVector<char> script(1024); | 2956 ScopedVector<char> script(1024); |
3018 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, | 2957 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, |
3019 illegal_const_decl[i].code_snippet, kFunctionName); | 2958 illegal_const_decl[i].code_snippet, kFunctionName); |
3020 | 2959 |
3021 BytecodeGraphTester tester(isolate, zone, script.start()); | 2960 BytecodeGraphTester tester(isolate, script.start()); |
3022 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 2961 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
3023 v8::Local<v8::String> expected_string = | 2962 v8::Local<v8::String> expected_string = |
3024 v8_str(illegal_const_decl[i].return_value()); | 2963 v8_str(illegal_const_decl[i].return_value()); |
3025 CHECK( | 2964 CHECK( |
3026 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 2965 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
3027 .FromJust()); | 2966 .FromJust()); |
3028 } | 2967 } |
3029 } | 2968 } |
3030 | 2969 |
3031 static int debug_break_count = 0; | 2970 static int debug_break_count = 0; |
3032 static void DebugEventCounter(const v8::Debug::EventDetails& event_details) { | 2971 static void DebugEventCounter(const v8::Debug::EventDetails& event_details) { |
3033 if (event_details.GetEvent() == v8::Break) debug_break_count++; | 2972 if (event_details.GetEvent() == v8::Break) debug_break_count++; |
3034 } | 2973 } |
3035 | 2974 |
3036 TEST(BytecodeGraphBuilderDebuggerStatement) { | 2975 TEST(BytecodeGraphBuilderDebuggerStatement) { |
3037 HandleAndZoneScope scope; | 2976 HandleAndZoneScope scope; |
3038 Isolate* isolate = scope.main_isolate(); | 2977 Isolate* isolate = scope.main_isolate(); |
3039 Zone* zone = scope.main_zone(); | |
3040 | 2978 |
3041 v8::Debug::SetDebugEventListener(CcTest::isolate(), DebugEventCounter); | 2979 v8::Debug::SetDebugEventListener(CcTest::isolate(), DebugEventCounter); |
3042 | 2980 |
3043 ExpectedSnippet<0> snippet = { | 2981 ExpectedSnippet<0> snippet = { |
3044 "function f() {" | 2982 "function f() {" |
3045 " debugger;" | 2983 " debugger;" |
3046 "}" | 2984 "}" |
3047 "f();", | 2985 "f();", |
3048 {isolate->factory()->undefined_value()}}; | 2986 {isolate->factory()->undefined_value()}}; |
3049 | 2987 |
3050 BytecodeGraphTester tester(isolate, zone, snippet.code_snippet); | 2988 BytecodeGraphTester tester(isolate, snippet.code_snippet); |
3051 auto callable = tester.GetCallable<>(); | 2989 auto callable = tester.GetCallable<>(); |
3052 Handle<Object> return_value = callable().ToHandleChecked(); | 2990 Handle<Object> return_value = callable().ToHandleChecked(); |
3053 | 2991 |
3054 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); | 2992 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); |
3055 CHECK(return_value.is_identical_to(snippet.return_value())); | 2993 CHECK(return_value.is_identical_to(snippet.return_value())); |
3056 CHECK_EQ(2, debug_break_count); | 2994 CHECK_EQ(2, debug_break_count); |
3057 } | 2995 } |
3058 | 2996 |
3059 } // namespace compiler | 2997 } // namespace compiler |
3060 } // namespace internal | 2998 } // namespace internal |
3061 } // namespace v8 | 2999 } // namespace v8 |
OLD | NEW |