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

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

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

Powered by Google App Engine
This is Rietveld 408576698