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

Side by Side Diff: test/cctest/compiler/test-run-bytecode-graph-builder.cc

Issue 2632123006: Reland: [Parse] ParseInfo owns the parsing Zone. (Closed)
Patch Set: Rebase Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 15 matching lines...) Expand all
2738 script_os << " else { " << filler << " }\n"; 2683 script_os << " else { " << filler << " }\n";
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 BytecodeGraphTester tester(isolate, script.c_str());
2749 BytecodeGraphTester tester(isolate, zone, script.c_str());
2750 auto callable = tester.GetCallable<Handle<Object>>(); 2694 auto callable = tester.GetCallable<Handle<Object>>();
2751 for (int a = 0; a < 3; a++) { 2695 for (int a = 0; a < 3; a++) {
2752 Handle<Object> return_val = 2696 Handle<Object> return_val =
2753 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); 2697 callable(factory->NewNumberFromInt(a)).ToHandleChecked();
2754 static const int results[] = {11, 12, 2}; 2698 static const int results[] = {11, 12, 2};
2755 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); 2699 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]);
2756 } 2700 }
2757 } 2701 }
2758 } 2702 }
2759 2703
2760 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants) 2704 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants)
2761 2705
2762 TEST(BytecodeGraphBuilderDoExpressions) { 2706 TEST(BytecodeGraphBuilderDoExpressions) {
2763 bool old_flag = FLAG_harmony_do_expressions; 2707 bool old_flag = FLAG_harmony_do_expressions;
2764 FLAG_harmony_do_expressions = true; 2708 FLAG_harmony_do_expressions = true;
2765 HandleAndZoneScope scope; 2709 HandleAndZoneScope scope;
2766 Isolate* isolate = scope.main_isolate(); 2710 Isolate* isolate = scope.main_isolate();
2767 Zone* zone = scope.main_zone();
2768 Factory* factory = isolate->factory(); 2711 Factory* factory = isolate->factory();
2769 ExpectedSnippet<0> snippets[] = { 2712 ExpectedSnippet<0> snippets[] = {
2770 {"var a = do {}; return a;", {factory->undefined_value()}}, 2713 {"var a = do {}; return a;", {factory->undefined_value()}},
2771 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, 2714 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}},
2772 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, 2715 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}},
2773 {"var a = do { var x = 100; x++; }; return a;", 2716 {"var a = do { var x = 100; x++; }; return a;",
2774 {handle(Smi::FromInt(100), isolate)}}, 2717 {handle(Smi::FromInt(100), isolate)}},
2775 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};" 2718 {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};"
2776 "return i;", 2719 "return i;",
2777 {handle(Smi::FromInt(3), isolate)}}, 2720 {handle(Smi::FromInt(3), isolate)}},
2778 }; 2721 };
2779 2722
2780 for (size_t i = 0; i < arraysize(snippets); i++) { 2723 for (size_t i = 0; i < arraysize(snippets); i++) {
2781 ScopedVector<char> script(1024); 2724 ScopedVector<char> script(1024);
2782 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 2725 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
2783 snippets[i].code_snippet, kFunctionName); 2726 snippets[i].code_snippet, kFunctionName);
2784 2727
2785 BytecodeGraphTester tester(isolate, zone, script.start()); 2728 BytecodeGraphTester tester(isolate, script.start());
2786 auto callable = tester.GetCallable<>(); 2729 auto callable = tester.GetCallable<>();
2787 Handle<Object> return_value = callable().ToHandleChecked(); 2730 Handle<Object> return_value = callable().ToHandleChecked();
2788 CHECK(return_value->SameValue(*snippets[i].return_value())); 2731 CHECK(return_value->SameValue(*snippets[i].return_value()));
2789 } 2732 }
2790 2733
2791 FLAG_harmony_do_expressions = old_flag; 2734 FLAG_harmony_do_expressions = old_flag;
2792 } 2735 }
2793 2736
2794 TEST(BytecodeGraphBuilderWithStatement) { 2737 TEST(BytecodeGraphBuilderWithStatement) {
2795 HandleAndZoneScope scope; 2738 HandleAndZoneScope scope;
2796 Isolate* isolate = scope.main_isolate(); 2739 Isolate* isolate = scope.main_isolate();
2797 Zone* zone = scope.main_zone();
2798 2740
2799 ExpectedSnippet<0> snippets[] = { 2741 ExpectedSnippet<0> snippets[] = {
2800 {"with({x:42}) return x;", {handle(Smi::FromInt(42), isolate)}}, 2742 {"with({x:42}) return x;", {handle(Smi::FromInt(42), isolate)}},
2801 {"with({}) { var y = 10; return y;}", 2743 {"with({}) { var y = 10; return y;}",
2802 {handle(Smi::FromInt(10), isolate)}}, 2744 {handle(Smi::FromInt(10), isolate)}},
2803 {"var y = {x:42};" 2745 {"var y = {x:42};"
2804 " function inner() {" 2746 " function inner() {"
2805 " var x = 20;" 2747 " var x = 20;"
2806 " with(y) return x;" 2748 " with(y) return x;"
2807 "}" 2749 "}"
2808 "return inner();", 2750 "return inner();",
2809 {handle(Smi::FromInt(42), isolate)}}, 2751 {handle(Smi::FromInt(42), isolate)}},
2810 {"var y = {x:42};" 2752 {"var y = {x:42};"
2811 " function inner(o) {" 2753 " function inner(o) {"
2812 " var x = 20;" 2754 " var x = 20;"
2813 " with(o) return x;" 2755 " with(o) return x;"
2814 "}" 2756 "}"
2815 "return inner(y);", 2757 "return inner(y);",
2816 {handle(Smi::FromInt(42), isolate)}}, 2758 {handle(Smi::FromInt(42), isolate)}},
2817 }; 2759 };
2818 2760
2819 for (size_t i = 0; i < arraysize(snippets); i++) { 2761 for (size_t i = 0; i < arraysize(snippets); i++) {
2820 ScopedVector<char> script(1024); 2762 ScopedVector<char> script(1024);
2821 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 2763 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
2822 snippets[i].code_snippet, kFunctionName); 2764 snippets[i].code_snippet, kFunctionName);
2823 2765
2824 BytecodeGraphTester tester(isolate, zone, script.start()); 2766 BytecodeGraphTester tester(isolate, script.start());
2825 auto callable = tester.GetCallable<>(); 2767 auto callable = tester.GetCallable<>();
2826 Handle<Object> return_value = callable().ToHandleChecked(); 2768 Handle<Object> return_value = callable().ToHandleChecked();
2827 CHECK(return_value->SameValue(*snippets[i].return_value())); 2769 CHECK(return_value->SameValue(*snippets[i].return_value()));
2828 } 2770 }
2829 } 2771 }
2830 2772
2831 TEST(BytecodeGraphBuilderConstDeclaration) { 2773 TEST(BytecodeGraphBuilderConstDeclaration) {
2832 HandleAndZoneScope scope; 2774 HandleAndZoneScope scope;
2833 Isolate* isolate = scope.main_isolate(); 2775 Isolate* isolate = scope.main_isolate();
2834 Zone* zone = scope.main_zone();
2835 Factory* factory = isolate->factory(); 2776 Factory* factory = isolate->factory();
2836 2777
2837 ExpectedSnippet<0> snippets[] = { 2778 ExpectedSnippet<0> snippets[] = {
2838 {"const x = 3; return x;", {handle(Smi::FromInt(3), isolate)}}, 2779 {"const x = 3; return x;", {handle(Smi::FromInt(3), isolate)}},
2839 {"let x = 10; x = x + 20; return x;", 2780 {"let x = 10; x = x + 20; return x;",
2840 {handle(Smi::FromInt(30), isolate)}}, 2781 {handle(Smi::FromInt(30), isolate)}},
2841 {"let x = 10; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, 2782 {"let x = 10; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}},
2842 {"let x; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}}, 2783 {"let x; x = 20; return x;", {handle(Smi::FromInt(20), isolate)}},
2843 {"let x; return x;", {factory->undefined_value()}}, 2784 {"let x; return x;", {factory->undefined_value()}},
2844 {"var x = 10; { let x = 30; } return x;", 2785 {"var x = 10; { let x = 30; } return x;",
(...skipping 16 matching lines...) Expand all
2861 "return a;\n", 2802 "return a;\n",
2862 {handle(Smi::FromInt(55), isolate)}}, 2803 {handle(Smi::FromInt(55), isolate)}},
2863 }; 2804 };
2864 2805
2865 // Tests for sloppy mode. 2806 // Tests for sloppy mode.
2866 for (size_t i = 0; i < arraysize(snippets); i++) { 2807 for (size_t i = 0; i < arraysize(snippets); i++) {
2867 ScopedVector<char> script(1024); 2808 ScopedVector<char> script(1024);
2868 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 2809 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
2869 snippets[i].code_snippet, kFunctionName); 2810 snippets[i].code_snippet, kFunctionName);
2870 2811
2871 BytecodeGraphTester tester(isolate, zone, script.start()); 2812 BytecodeGraphTester tester(isolate, script.start());
2872 auto callable = tester.GetCallable<>(); 2813 auto callable = tester.GetCallable<>();
2873 Handle<Object> return_value = callable().ToHandleChecked(); 2814 Handle<Object> return_value = callable().ToHandleChecked();
2874 CHECK(return_value->SameValue(*snippets[i].return_value())); 2815 CHECK(return_value->SameValue(*snippets[i].return_value()));
2875 } 2816 }
2876 2817
2877 // Tests for strict mode. 2818 // Tests for strict mode.
2878 for (size_t i = 0; i < arraysize(snippets); i++) { 2819 for (size_t i = 0; i < arraysize(snippets); i++) {
2879 ScopedVector<char> script(1024); 2820 ScopedVector<char> script(1024);
2880 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, 2821 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName,
2881 snippets[i].code_snippet, kFunctionName); 2822 snippets[i].code_snippet, kFunctionName);
2882 2823
2883 BytecodeGraphTester tester(isolate, zone, script.start()); 2824 BytecodeGraphTester tester(isolate, script.start());
2884 auto callable = tester.GetCallable<>(); 2825 auto callable = tester.GetCallable<>();
2885 Handle<Object> return_value = callable().ToHandleChecked(); 2826 Handle<Object> return_value = callable().ToHandleChecked();
2886 CHECK(return_value->SameValue(*snippets[i].return_value())); 2827 CHECK(return_value->SameValue(*snippets[i].return_value()));
2887 } 2828 }
2888 } 2829 }
2889 2830
2890 TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) { 2831 TEST(BytecodeGraphBuilderConstDeclarationLookupSlots) {
2891 HandleAndZoneScope scope; 2832 HandleAndZoneScope scope;
2892 Isolate* isolate = scope.main_isolate(); 2833 Isolate* isolate = scope.main_isolate();
2893 Zone* zone = scope.main_zone();
2894 Factory* factory = isolate->factory(); 2834 Factory* factory = isolate->factory();
2895 2835
2896 ExpectedSnippet<0> snippets[] = { 2836 ExpectedSnippet<0> snippets[] = {
2897 {"const x = 3; function f1() {return x;}; return x;", 2837 {"const x = 3; function f1() {return x;}; return x;",
2898 {handle(Smi::FromInt(3), isolate)}}, 2838 {handle(Smi::FromInt(3), isolate)}},
2899 {"let x = 10; x = x + 20; function f1() {return x;}; return x;", 2839 {"let x = 10; x = x + 20; function f1() {return x;}; return x;",
2900 {handle(Smi::FromInt(30), isolate)}}, 2840 {handle(Smi::FromInt(30), isolate)}},
2901 {"let x; x = 20; function f1() {return x;}; return x;", 2841 {"let x; x = 20; function f1() {return x;}; return x;",
2902 {handle(Smi::FromInt(20), isolate)}}, 2842 {handle(Smi::FromInt(20), isolate)}},
2903 {"let x; function f1() {return x;}; return x;", 2843 {"let x; function f1() {return x;}; return x;",
2904 {factory->undefined_value()}}, 2844 {factory->undefined_value()}},
2905 }; 2845 };
2906 2846
2907 // Tests for sloppy mode. 2847 // Tests for sloppy mode.
2908 for (size_t i = 0; i < arraysize(snippets); i++) { 2848 for (size_t i = 0; i < arraysize(snippets); i++) {
2909 ScopedVector<char> script(1024); 2849 ScopedVector<char> script(1024);
2910 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 2850 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
2911 snippets[i].code_snippet, kFunctionName); 2851 snippets[i].code_snippet, kFunctionName);
2912 2852
2913 BytecodeGraphTester tester(isolate, zone, script.start()); 2853 BytecodeGraphTester tester(isolate, script.start());
2914 auto callable = tester.GetCallable<>(); 2854 auto callable = tester.GetCallable<>();
2915 Handle<Object> return_value = callable().ToHandleChecked(); 2855 Handle<Object> return_value = callable().ToHandleChecked();
2916 CHECK(return_value->SameValue(*snippets[i].return_value())); 2856 CHECK(return_value->SameValue(*snippets[i].return_value()));
2917 } 2857 }
2918 2858
2919 // Tests for strict mode. 2859 // Tests for strict mode.
2920 for (size_t i = 0; i < arraysize(snippets); i++) { 2860 for (size_t i = 0; i < arraysize(snippets); i++) {
2921 ScopedVector<char> script(1024); 2861 ScopedVector<char> script(1024);
2922 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, 2862 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName,
2923 snippets[i].code_snippet, kFunctionName); 2863 snippets[i].code_snippet, kFunctionName);
2924 2864
2925 BytecodeGraphTester tester(isolate, zone, script.start()); 2865 BytecodeGraphTester tester(isolate, script.start());
2926 auto callable = tester.GetCallable<>(); 2866 auto callable = tester.GetCallable<>();
2927 Handle<Object> return_value = callable().ToHandleChecked(); 2867 Handle<Object> return_value = callable().ToHandleChecked();
2928 CHECK(return_value->SameValue(*snippets[i].return_value())); 2868 CHECK(return_value->SameValue(*snippets[i].return_value()));
2929 } 2869 }
2930 } 2870 }
2931 2871
2932 TEST(BytecodeGraphBuilderConstInLookupContextChain) { 2872 TEST(BytecodeGraphBuilderConstInLookupContextChain) {
2933 HandleAndZoneScope scope; 2873 HandleAndZoneScope scope;
2934 Isolate* isolate = scope.main_isolate(); 2874 Isolate* isolate = scope.main_isolate();
2935 Zone* zone = scope.main_zone();
2936 2875
2937 const char* prologue = 2876 const char* prologue =
2938 "function OuterMost() {\n" 2877 "function OuterMost() {\n"
2939 " const outerConst = 10;\n" 2878 " const outerConst = 10;\n"
2940 " let outerLet = 20;\n" 2879 " let outerLet = 20;\n"
2941 " function Outer() {\n" 2880 " function Outer() {\n"
2942 " function Inner() {\n" 2881 " function Inner() {\n"
2943 " this.innerFunc = function() { "; 2882 " this.innerFunc = function() { ";
2944 const char* epilogue = 2883 const char* epilogue =
2945 " }\n" 2884 " }\n"
(...skipping 17 matching lines...) Expand all
2963 {"var outerConst = 50; return outerConst;", 2902 {"var outerConst = 50; return outerConst;",
2964 {handle(Smi::FromInt(50), isolate)}}, 2903 {handle(Smi::FromInt(50), isolate)}},
2965 {"try { outerConst = 30 } catch(e) { return -1; }", 2904 {"try { outerConst = 30 } catch(e) { return -1; }",
2966 {handle(Smi::FromInt(-1), isolate)}}}; 2905 {handle(Smi::FromInt(-1), isolate)}}};
2967 2906
2968 for (size_t i = 0; i < arraysize(const_decl); i++) { 2907 for (size_t i = 0; i < arraysize(const_decl); i++) {
2969 ScopedVector<char> script(1024); 2908 ScopedVector<char> script(1024);
2970 SNPrintF(script, "%s %s %s", prologue, const_decl[i].code_snippet, 2909 SNPrintF(script, "%s %s %s", prologue, const_decl[i].code_snippet,
2971 epilogue); 2910 epilogue);
2972 2911
2973 BytecodeGraphTester tester(isolate, zone, script.start(), "*"); 2912 BytecodeGraphTester tester(isolate, script.start(), "*");
2974 auto callable = tester.GetCallable<>(); 2913 auto callable = tester.GetCallable<>();
2975 Handle<Object> return_value = callable().ToHandleChecked(); 2914 Handle<Object> return_value = callable().ToHandleChecked();
2976 CHECK(return_value->SameValue(*const_decl[i].return_value())); 2915 CHECK(return_value->SameValue(*const_decl[i].return_value()));
2977 } 2916 }
2978 } 2917 }
2979 2918
2980 TEST(BytecodeGraphBuilderIllegalConstDeclaration) { 2919 TEST(BytecodeGraphBuilderIllegalConstDeclaration) {
2981 HandleAndZoneScope scope; 2920 HandleAndZoneScope scope;
2982 Isolate* isolate = scope.main_isolate(); 2921 Isolate* isolate = scope.main_isolate();
2983 Zone* zone = scope.main_zone();
2984 2922
2985 ExpectedSnippet<0, const char*> illegal_const_decl[] = { 2923 ExpectedSnippet<0, const char*> illegal_const_decl[] = {
2986 {"const x = x = 10 + 3; return x;", 2924 {"const x = x = 10 + 3; return x;",
2987 {"Uncaught ReferenceError: x is not defined"}}, 2925 {"Uncaught ReferenceError: x is not defined"}},
2988 {"const x = 10; x = 20; return x;", 2926 {"const x = 10; x = 20; return x;",
2989 {"Uncaught TypeError: Assignment to constant variable."}}, 2927 {"Uncaught TypeError: Assignment to constant variable."}},
2990 {"const x = 10; { x = 20; } return x;", 2928 {"const x = 10; { x = 20; } return x;",
2991 {"Uncaught TypeError: Assignment to constant variable."}}, 2929 {"Uncaught TypeError: Assignment to constant variable."}},
2992 {"const x = 10; eval('x = 20;'); return x;", 2930 {"const x = 10; eval('x = 20;'); return x;",
2993 {"Uncaught TypeError: Assignment to constant variable."}}, 2931 {"Uncaught TypeError: Assignment to constant variable."}},
2994 {"let x = x + 10; return x;", 2932 {"let x = x + 10; return x;",
2995 {"Uncaught ReferenceError: x is not defined"}}, 2933 {"Uncaught ReferenceError: x is not defined"}},
2996 {"'use strict'; (function f1() { f1 = 123; })() ", 2934 {"'use strict'; (function f1() { f1 = 123; })() ",
2997 {"Uncaught TypeError: Assignment to constant variable."}}, 2935 {"Uncaught TypeError: Assignment to constant variable."}},
2998 }; 2936 };
2999 2937
3000 // Tests for sloppy mode. 2938 // Tests for sloppy mode.
3001 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { 2939 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) {
3002 ScopedVector<char> script(1024); 2940 ScopedVector<char> script(1024);
3003 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, 2941 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName,
3004 illegal_const_decl[i].code_snippet, kFunctionName); 2942 illegal_const_decl[i].code_snippet, kFunctionName);
3005 2943
3006 BytecodeGraphTester tester(isolate, zone, script.start()); 2944 BytecodeGraphTester tester(isolate, script.start());
3007 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); 2945 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
3008 v8::Local<v8::String> expected_string = 2946 v8::Local<v8::String> expected_string =
3009 v8_str(illegal_const_decl[i].return_value()); 2947 v8_str(illegal_const_decl[i].return_value());
3010 CHECK( 2948 CHECK(
3011 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) 2949 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
3012 .FromJust()); 2950 .FromJust());
3013 } 2951 }
3014 2952
3015 // Tests for strict mode. 2953 // Tests for strict mode.
3016 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) { 2954 for (size_t i = 0; i < arraysize(illegal_const_decl); i++) {
3017 ScopedVector<char> script(1024); 2955 ScopedVector<char> script(1024);
3018 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName, 2956 SNPrintF(script, "function %s() {'use strict'; %s }\n%s();", kFunctionName,
3019 illegal_const_decl[i].code_snippet, kFunctionName); 2957 illegal_const_decl[i].code_snippet, kFunctionName);
3020 2958
3021 BytecodeGraphTester tester(isolate, zone, script.start()); 2959 BytecodeGraphTester tester(isolate, script.start());
3022 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); 2960 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get();
3023 v8::Local<v8::String> expected_string = 2961 v8::Local<v8::String> expected_string =
3024 v8_str(illegal_const_decl[i].return_value()); 2962 v8_str(illegal_const_decl[i].return_value());
3025 CHECK( 2963 CHECK(
3026 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) 2964 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string)
3027 .FromJust()); 2965 .FromJust());
3028 } 2966 }
3029 } 2967 }
3030 2968
3031 static int debug_break_count = 0; 2969 static int debug_break_count = 0;
3032 static void DebugEventCounter(const v8::Debug::EventDetails& event_details) { 2970 static void DebugEventCounter(const v8::Debug::EventDetails& event_details) {
3033 if (event_details.GetEvent() == v8::Break) debug_break_count++; 2971 if (event_details.GetEvent() == v8::Break) debug_break_count++;
3034 } 2972 }
3035 2973
3036 TEST(BytecodeGraphBuilderDebuggerStatement) { 2974 TEST(BytecodeGraphBuilderDebuggerStatement) {
3037 HandleAndZoneScope scope; 2975 HandleAndZoneScope scope;
3038 Isolate* isolate = scope.main_isolate(); 2976 Isolate* isolate = scope.main_isolate();
3039 Zone* zone = scope.main_zone();
3040 2977
3041 v8::Debug::SetDebugEventListener(CcTest::isolate(), DebugEventCounter); 2978 v8::Debug::SetDebugEventListener(CcTest::isolate(), DebugEventCounter);
3042 2979
3043 ExpectedSnippet<0> snippet = { 2980 ExpectedSnippet<0> snippet = {
3044 "function f() {" 2981 "function f() {"
3045 " debugger;" 2982 " debugger;"
3046 "}" 2983 "}"
3047 "f();", 2984 "f();",
3048 {isolate->factory()->undefined_value()}}; 2985 {isolate->factory()->undefined_value()}};
3049 2986
3050 BytecodeGraphTester tester(isolate, zone, snippet.code_snippet); 2987 BytecodeGraphTester tester(isolate, snippet.code_snippet);
3051 auto callable = tester.GetCallable<>(); 2988 auto callable = tester.GetCallable<>();
3052 Handle<Object> return_value = callable().ToHandleChecked(); 2989 Handle<Object> return_value = callable().ToHandleChecked();
3053 2990
3054 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr); 2991 v8::Debug::SetDebugEventListener(CcTest::isolate(), nullptr);
3055 CHECK(return_value.is_identical_to(snippet.return_value())); 2992 CHECK(return_value.is_identical_to(snippet.return_value()));
3056 CHECK_EQ(2, debug_break_count); 2993 CHECK_EQ(2, debug_break_count);
3057 } 2994 }
3058 2995
3059 } // namespace compiler 2996 } // namespace compiler
3060 } // namespace internal 2997 } // namespace internal
3061 } // namespace v8 2998 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/compiler/test-loop-assignment-analysis.cc ('k') | test/cctest/parsing/test-preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698