Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <utility> | 5 #include <utility> |
| 6 | 6 |
| 7 #include "src/compiler/pipeline.h" | 7 #include "src/compiler/pipeline.h" |
| 8 #include "src/execution.h" | 8 #include "src/execution.h" |
| 9 #include "src/handles.h" | 9 #include "src/handles.h" |
| 10 #include "src/interpreter/bytecode-array-builder.h" | 10 #include "src/interpreter/bytecode-array-builder.h" |
| 11 #include "src/interpreter/interpreter.h" | 11 #include "src/interpreter/interpreter.h" |
| 12 #include "src/parsing/parser.h" | 12 #include "src/parsing/parser.h" |
| 13 #include "test/cctest/cctest.h" | 13 #include "test/cctest/cctest.h" |
| 14 | 14 |
| 15 namespace v8 { | 15 namespace v8 { |
| 16 namespace internal { | 16 namespace internal { |
| 17 namespace compiler { | 17 namespace compiler { |
| 18 | 18 |
| 19 #define SHARD_TEST_BY_2(x) \ | |
| 20 TEST(x##_0) { Test##x(0); } \ | |
| 21 TEST(x##_1) { Test##x(1); } | |
| 22 #define SHARD_TEST_BY_4(x) \ | |
| 23 TEST(x##_0) { Test##x(0); } \ | |
| 24 TEST(x##_1) { Test##x(1); } \ | |
| 25 TEST(x##_2) { Test##x(2); } \ | |
| 26 TEST(x##_3) { Test##x(3); } | |
| 19 | 27 |
| 20 static const char kFunctionName[] = "f"; | 28 static const char kFunctionName[] = "f"; |
| 21 | 29 |
| 22 static const Token::Value kCompareOperators[] = { | 30 static const Token::Value kCompareOperators[] = { |
| 23 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT, | 31 Token::Value::EQ, Token::Value::NE, Token::Value::EQ_STRICT, |
| 24 Token::Value::NE_STRICT, Token::Value::LT, Token::Value::LTE, | 32 Token::Value::NE_STRICT, Token::Value::LT, Token::Value::LTE, |
| 25 Token::Value::GT, Token::Value::GTE}; | 33 Token::Value::GT, Token::Value::GTE}; |
| 26 | 34 |
| 27 static const int SMI_MAX = (1 << 30) - 1; | 35 static const int SMI_MAX = (1 << 30) - 1; |
| 28 static const int SMI_MIN = -(1 << 30); | 36 static const int SMI_MIN = -(1 << 30); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 {"return -1;", {factory->NewNumberFromInt(-1)}}, | 206 {"return -1;", {factory->NewNumberFromInt(-1)}}, |
| 199 {"return +127;", {factory->NewNumberFromInt(127)}}, | 207 {"return +127;", {factory->NewNumberFromInt(127)}}, |
| 200 {"return -128;", {factory->NewNumberFromInt(-128)}}, | 208 {"return -128;", {factory->NewNumberFromInt(-128)}}, |
| 201 {"return 0.001;", {factory->NewNumber(0.001)}}, | 209 {"return 0.001;", {factory->NewNumber(0.001)}}, |
| 202 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}}, | 210 {"return 3.7e-60;", {factory->NewNumber(3.7e-60)}}, |
| 203 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}}, | 211 {"return -3.7e60;", {factory->NewNumber(-3.7e60)}}, |
| 204 {"return '';", {factory->NewStringFromStaticChars("")}}, | 212 {"return '';", {factory->NewStringFromStaticChars("")}}, |
| 205 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}}, | 213 {"return 'catfood';", {factory->NewStringFromStaticChars("catfood")}}, |
| 206 {"return NaN;", {factory->nan_value()}}}; | 214 {"return NaN;", {factory->nan_value()}}}; |
| 207 | 215 |
| 208 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 216 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 209 for (size_t i = 0; i < num_snippets; i++) { | |
| 210 ScopedVector<char> script(1024); | 217 ScopedVector<char> script(1024); |
| 211 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 218 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 212 snippets[i].code_snippet, kFunctionName); | 219 snippets[i].code_snippet, kFunctionName); |
| 213 | 220 |
| 214 BytecodeGraphTester tester(isolate, zone, script.start()); | 221 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 215 auto callable = tester.GetCallable<>(); | 222 auto callable = tester.GetCallable<>(); |
| 216 Handle<Object> return_value = callable().ToHandleChecked(); | 223 Handle<Object> return_value = callable().ToHandleChecked(); |
| 217 CHECK(return_value->SameValue(*snippets[i].return_value())); | 224 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 218 } | 225 } |
| 219 } | 226 } |
| 220 | 227 |
| 221 | 228 |
| 222 TEST(BytecodeGraphBuilderPrimitiveExpressions) { | 229 TEST(BytecodeGraphBuilderPrimitiveExpressions) { |
| 223 HandleAndZoneScope scope; | 230 HandleAndZoneScope scope; |
| 224 Isolate* isolate = scope.main_isolate(); | 231 Isolate* isolate = scope.main_isolate(); |
| 225 Zone* zone = scope.main_zone(); | 232 Zone* zone = scope.main_zone(); |
| 226 Factory* factory = isolate->factory(); | 233 Factory* factory = isolate->factory(); |
| 227 | 234 |
| 228 ExpectedSnippet<0> snippets[] = { | 235 ExpectedSnippet<0> snippets[] = { |
| 229 {"return 1 + 1;", {factory->NewNumberFromInt(2)}}, | 236 {"return 1 + 1;", {factory->NewNumberFromInt(2)}}, |
| 230 {"return 20 - 30;", {factory->NewNumberFromInt(-10)}}, | 237 {"return 20 - 30;", {factory->NewNumberFromInt(-10)}}, |
| 231 {"return 4 * 100;", {factory->NewNumberFromInt(400)}}, | 238 {"return 4 * 100;", {factory->NewNumberFromInt(400)}}, |
| 232 {"return 100 / 5;", {factory->NewNumberFromInt(20)}}, | 239 {"return 100 / 5;", {factory->NewNumberFromInt(20)}}, |
| 233 {"return 25 % 7;", {factory->NewNumberFromInt(4)}}, | 240 {"return 25 % 7;", {factory->NewNumberFromInt(4)}}, |
| 234 }; | 241 }; |
| 235 | 242 |
| 236 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 243 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 237 for (size_t i = 0; i < num_snippets; i++) { | |
| 238 ScopedVector<char> script(1024); | 244 ScopedVector<char> script(1024); |
| 239 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 245 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 240 snippets[i].code_snippet, kFunctionName); | 246 snippets[i].code_snippet, kFunctionName); |
| 241 | 247 |
| 242 BytecodeGraphTester tester(isolate, zone, script.start()); | 248 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 243 auto callable = tester.GetCallable<>(); | 249 auto callable = tester.GetCallable<>(); |
| 244 Handle<Object> return_value = callable().ToHandleChecked(); | 250 Handle<Object> return_value = callable().ToHandleChecked(); |
| 245 CHECK(return_value->SameValue(*snippets[i].return_value())); | 251 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 246 } | 252 } |
| 247 } | 253 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 285 factory->NewHeapNumber(6.666)}}, | 291 factory->NewHeapNumber(6.666)}}, |
| 286 {"return p1 / p2;", | 292 {"return p1 / p2;", |
| 287 {factory->NewHeapNumber(2.25), factory->NewHeapNumber(9), | 293 {factory->NewHeapNumber(2.25), factory->NewHeapNumber(9), |
| 288 factory->NewHeapNumber(4)}}, | 294 factory->NewHeapNumber(4)}}, |
| 289 // Strings | 295 // Strings |
| 290 {"return p1 + p2;", | 296 {"return p1 + p2;", |
| 291 {factory->NewStringFromStaticChars("abcdef"), | 297 {factory->NewStringFromStaticChars("abcdef"), |
| 292 factory->NewStringFromStaticChars("abc"), | 298 factory->NewStringFromStaticChars("abc"), |
| 293 factory->NewStringFromStaticChars("def")}}}; | 299 factory->NewStringFromStaticChars("def")}}}; |
| 294 | 300 |
| 295 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 301 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 296 for (size_t i = 0; i < num_snippets; i++) { | |
| 297 ScopedVector<char> script(1024); | 302 ScopedVector<char> script(1024); |
| 298 SNPrintF(script, "function %s(p1, p2) { %s }\n%s(0, 0);", kFunctionName, | 303 SNPrintF(script, "function %s(p1, p2) { %s }\n%s(0, 0);", kFunctionName, |
| 299 snippets[i].code_snippet, kFunctionName); | 304 snippets[i].code_snippet, kFunctionName); |
| 300 | 305 |
| 301 BytecodeGraphTester tester(isolate, zone, script.start()); | 306 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 302 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 307 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
| 303 Handle<Object> return_value = | 308 Handle<Object> return_value = |
| 304 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 309 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
| 305 .ToHandleChecked(); | 310 .ToHandleChecked(); |
| 306 CHECK(return_value->SameValue(*snippets[i].return_value())); | 311 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 330 {"var b;\n" REPEAT_127(SPACE, " b = p1.name; ") " return p1.name;\n", | 335 {"var b;\n" REPEAT_127(SPACE, " b = p1.name; ") " return p1.name;\n", |
| 331 {factory->NewStringFromStaticChars("abc"), | 336 {factory->NewStringFromStaticChars("abc"), |
| 332 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, | 337 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, |
| 333 {"'use strict'; var b;\n" | 338 {"'use strict'; var b;\n" |
| 334 REPEAT_127(SPACE, " b = p1.name; ") | 339 REPEAT_127(SPACE, " b = p1.name; ") |
| 335 "return p1.name;\n", | 340 "return p1.name;\n", |
| 336 {factory->NewStringFromStaticChars("abc"), | 341 {factory->NewStringFromStaticChars("abc"), |
| 337 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, | 342 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, |
| 338 }; | 343 }; |
| 339 | 344 |
| 340 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 345 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 341 for (size_t i = 0; i < num_snippets; i++) { | |
| 342 ScopedVector<char> script(2048); | 346 ScopedVector<char> script(2048); |
| 343 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 347 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
| 344 snippets[i].code_snippet, kFunctionName); | 348 snippets[i].code_snippet, kFunctionName); |
| 345 | 349 |
| 346 BytecodeGraphTester tester(isolate, zone, script.start()); | 350 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 347 auto callable = tester.GetCallable<Handle<Object>>(); | 351 auto callable = tester.GetCallable<Handle<Object>>(); |
| 348 Handle<Object> return_value = | 352 Handle<Object> return_value = |
| 349 callable(snippets[i].parameter(0)).ToHandleChecked(); | 353 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 350 CHECK(return_value->SameValue(*snippets[i].return_value())); | 354 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 351 } | 355 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 387 {factory->NewStringFromStaticChars("abc"), | 391 {factory->NewStringFromStaticChars("abc"), |
| 388 BytecodeGraphTester::NewObject("({100 : 'abc'})"), | 392 BytecodeGraphTester::NewObject("({100 : 'abc'})"), |
| 389 factory->NewNumberFromInt(100)}}, | 393 factory->NewNumberFromInt(100)}}, |
| 390 {"'use strict'; var b;\n" REPEAT_127(SPACE, | 394 {"'use strict'; var b;\n" REPEAT_127(SPACE, |
| 391 " b = p1[p2]; ") "return p1[p2];\n", | 395 " b = p1[p2]; ") "return p1[p2];\n", |
| 392 {factory->NewStringFromStaticChars("abc"), | 396 {factory->NewStringFromStaticChars("abc"), |
| 393 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), | 397 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), |
| 394 factory->NewNumberFromInt(100)}}, | 398 factory->NewNumberFromInt(100)}}, |
| 395 }; | 399 }; |
| 396 | 400 |
| 397 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 401 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 398 for (size_t i = 0; i < num_snippets; i++) { | |
| 399 ScopedVector<char> script(2048); | 402 ScopedVector<char> script(2048); |
| 400 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0);", kFunctionName, | 403 SNPrintF(script, "function %s(p1, p2) { %s };\n%s(0);", kFunctionName, |
| 401 snippets[i].code_snippet, kFunctionName); | 404 snippets[i].code_snippet, kFunctionName); |
| 402 | 405 |
| 403 BytecodeGraphTester tester(isolate, zone, script.start()); | 406 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 404 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 407 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
| 405 Handle<Object> return_value = | 408 Handle<Object> return_value = |
| 406 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 409 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
| 407 .ToHandleChecked(); | 410 .ToHandleChecked(); |
| 408 CHECK(return_value->SameValue(*snippets[i].return_value())); | 411 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 409 } | 412 } |
| 410 } | 413 } |
| 411 | 414 |
| 412 | 415 void TestBytecodeGraphBuilderNamedStore(size_t shard) { |
| 413 TEST(BytecodeGraphBuilderNamedStore) { | |
| 414 HandleAndZoneScope scope; | 416 HandleAndZoneScope scope; |
| 415 Isolate* isolate = scope.main_isolate(); | 417 Isolate* isolate = scope.main_isolate(); |
| 416 Zone* zone = scope.main_zone(); | 418 Zone* zone = scope.main_zone(); |
| 417 Factory* factory = isolate->factory(); | 419 Factory* factory = isolate->factory(); |
| 418 | 420 |
| 419 ExpectedSnippet<1> snippets[] = { | 421 ExpectedSnippet<1> snippets[] = { |
| 420 {"return p1.val = 20;", | 422 {"return p1.val = 20;", |
| 421 {factory->NewNumberFromInt(20), | 423 {factory->NewNumberFromInt(20), |
| 422 BytecodeGraphTester::NewObject("({val : 10})")}}, | 424 BytecodeGraphTester::NewObject("({val : 10})")}}, |
| 423 {"p1.type = 'int'; return p1.type;", | 425 {"p1.type = 'int'; return p1.type;", |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 438 {"var b = 'abc';\n" REPEAT_127( | 440 {"var b = 'abc';\n" REPEAT_127( |
| 439 SPACE, " p1.name = b; ") " p1.name = 'def'; return p1.name;\n", | 441 SPACE, " p1.name = b; ") " p1.name = 'def'; return p1.name;\n", |
| 440 {factory->NewStringFromStaticChars("def"), | 442 {factory->NewStringFromStaticChars("def"), |
| 441 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, | 443 BytecodeGraphTester::NewObject("({name : 'abc'})")}}, |
| 442 {"'use strict'; var b = 'def';\n" REPEAT_127( | 444 {"'use strict'; var b = 'def';\n" REPEAT_127( |
| 443 SPACE, " p1.name = 'abc'; ") "p1.name = b; return p1.name;\n", | 445 SPACE, " p1.name = 'abc'; ") "p1.name = b; return p1.name;\n", |
| 444 {factory->NewStringFromStaticChars("def"), | 446 {factory->NewStringFromStaticChars("def"), |
| 445 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, | 447 BytecodeGraphTester::NewObject("({ name : 'abc'})")}}, |
| 446 }; | 448 }; |
| 447 | 449 |
| 448 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 450 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 449 for (size_t i = 0; i < num_snippets; i++) { | 451 if ((i % 2) != shard) continue; |
| 450 ScopedVector<char> script(3072); | 452 ScopedVector<char> script(3072); |
| 451 SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName, | 453 SNPrintF(script, "function %s(p1) { %s };\n%s({});", kFunctionName, |
| 452 snippets[i].code_snippet, kFunctionName); | 454 snippets[i].code_snippet, kFunctionName); |
| 453 | 455 |
| 454 BytecodeGraphTester tester(isolate, zone, script.start()); | 456 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 455 auto callable = tester.GetCallable<Handle<Object>>(); | 457 auto callable = tester.GetCallable<Handle<Object>>(); |
| 456 Handle<Object> return_value = | 458 Handle<Object> return_value = |
| 457 callable(snippets[i].parameter(0)).ToHandleChecked(); | 459 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 458 CHECK(return_value->SameValue(*snippets[i].return_value())); | 460 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 459 } | 461 } |
| 460 } | 462 } |
| 461 | 463 |
| 464 SHARD_TEST_BY_2(BytecodeGraphBuilderNamedStore) | |
| 462 | 465 |
| 463 TEST(BytecodeGraphBuilderKeyedStore) { | 466 void TestBytecodeGraphBuilderKeyedStore(size_t shard) { |
| 464 HandleAndZoneScope scope; | 467 HandleAndZoneScope scope; |
| 465 Isolate* isolate = scope.main_isolate(); | 468 Isolate* isolate = scope.main_isolate(); |
| 466 Zone* zone = scope.main_zone(); | 469 Zone* zone = scope.main_zone(); |
| 467 Factory* factory = isolate->factory(); | 470 Factory* factory = isolate->factory(); |
| 468 | 471 |
| 469 ExpectedSnippet<2> snippets[] = { | 472 ExpectedSnippet<2> snippets[] = { |
| 470 {"p1[p2] = 20; return p1[p2];", | 473 {"p1[p2] = 20; return p1[p2];", |
| 471 {factory->NewNumberFromInt(20), | 474 {factory->NewNumberFromInt(20), |
| 472 BytecodeGraphTester::NewObject("({val : 10})"), | 475 BytecodeGraphTester::NewObject("({val : 10})"), |
| 473 factory->NewStringFromStaticChars("val")}}, | 476 factory->NewStringFromStaticChars("val")}}, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 496 {factory->NewStringFromStaticChars("def"), | 499 {factory->NewStringFromStaticChars("def"), |
| 497 BytecodeGraphTester::NewObject("({100 : 'abc'})"), | 500 BytecodeGraphTester::NewObject("({100 : 'abc'})"), |
| 498 factory->NewNumberFromInt(100)}}, | 501 factory->NewNumberFromInt(100)}}, |
| 499 {"'use strict'; var b;\n" REPEAT_127( | 502 {"'use strict'; var b;\n" REPEAT_127( |
| 500 SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n", | 503 SPACE, " b = p1[p2]; ") " p1[p2] = 'def'; return p1[p2];\n", |
| 501 {factory->NewStringFromStaticChars("def"), | 504 {factory->NewStringFromStaticChars("def"), |
| 502 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), | 505 BytecodeGraphTester::NewObject("({ 100 : 'abc'})"), |
| 503 factory->NewNumberFromInt(100)}}, | 506 factory->NewNumberFromInt(100)}}, |
| 504 }; | 507 }; |
| 505 | 508 |
| 506 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 509 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 507 for (size_t i = 0; i < num_snippets; i++) { | 510 if ((i % 2) != shard) continue; |
| 508 ScopedVector<char> script(2048); | 511 ScopedVector<char> script(2048); |
| 509 SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName, | 512 SNPrintF(script, "function %s(p1, p2) { %s };\n%s({});", kFunctionName, |
| 510 snippets[i].code_snippet, kFunctionName); | 513 snippets[i].code_snippet, kFunctionName); |
| 511 | 514 |
| 512 BytecodeGraphTester tester(isolate, zone, script.start()); | 515 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 513 auto callable = tester.GetCallable<Handle<Object>>(); | 516 auto callable = tester.GetCallable<Handle<Object>>(); |
| 514 Handle<Object> return_value = | 517 Handle<Object> return_value = |
| 515 callable(snippets[i].parameter(0)).ToHandleChecked(); | 518 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 516 CHECK(return_value->SameValue(*snippets[i].return_value())); | 519 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 517 } | 520 } |
| 518 } | 521 } |
| 519 | 522 |
| 523 SHARD_TEST_BY_2(BytecodeGraphBuilderKeyedStore) | |
| 520 | 524 |
| 521 TEST(BytecodeGraphBuilderPropertyCall) { | 525 TEST(BytecodeGraphBuilderPropertyCall) { |
| 522 HandleAndZoneScope scope; | 526 HandleAndZoneScope scope; |
| 523 Isolate* isolate = scope.main_isolate(); | 527 Isolate* isolate = scope.main_isolate(); |
| 524 Zone* zone = scope.main_zone(); | 528 Zone* zone = scope.main_zone(); |
| 525 Factory* factory = isolate->factory(); | 529 Factory* factory = isolate->factory(); |
| 526 | 530 |
| 527 ExpectedSnippet<1> snippets[] = { | 531 ExpectedSnippet<1> snippets[] = { |
| 528 {"return p1.func();", | 532 {"return p1.func();", |
| 529 {factory->NewNumberFromInt(25), | 533 {factory->NewNumberFromInt(25), |
| 530 BytecodeGraphTester::NewObject("({func() { return 25; }})")}}, | 534 BytecodeGraphTester::NewObject("({func() { return 25; }})")}}, |
| 531 {"return p1.func('abc');", | 535 {"return p1.func('abc');", |
| 532 {factory->NewStringFromStaticChars("abc"), | 536 {factory->NewStringFromStaticChars("abc"), |
| 533 BytecodeGraphTester::NewObject("({func(a) { return a; }})")}}, | 537 BytecodeGraphTester::NewObject("({func(a) { return a; }})")}}, |
| 534 {"return p1.func(1, 2, 3, 4, 5, 6, 7, 8);", | 538 {"return p1.func(1, 2, 3, 4, 5, 6, 7, 8);", |
| 535 {factory->NewNumberFromInt(36), | 539 {factory->NewNumberFromInt(36), |
| 536 BytecodeGraphTester::NewObject( | 540 BytecodeGraphTester::NewObject( |
| 537 "({func(a, b, c, d, e, f, g, h) {\n" | 541 "({func(a, b, c, d, e, f, g, h) {\n" |
| 538 " return a + b + c + d + e + f + g + h;}})")}}, | 542 " return a + b + c + d + e + f + g + h;}})")}}, |
| 539 }; | 543 }; |
| 540 | 544 |
| 541 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 545 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 542 for (size_t i = 0; i < num_snippets; i++) { | |
| 543 ScopedVector<char> script(2048); | 546 ScopedVector<char> script(2048); |
| 544 SNPrintF(script, "function %s(p1) { %s };\n%s({func() {}});", kFunctionName, | 547 SNPrintF(script, "function %s(p1) { %s };\n%s({func() {}});", kFunctionName, |
| 545 snippets[i].code_snippet, kFunctionName); | 548 snippets[i].code_snippet, kFunctionName); |
| 546 | 549 |
| 547 BytecodeGraphTester tester(isolate, zone, script.start()); | 550 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 548 auto callable = tester.GetCallable<Handle<Object>>(); | 551 auto callable = tester.GetCallable<Handle<Object>>(); |
| 549 Handle<Object> return_value = | 552 Handle<Object> return_value = |
| 550 callable(snippets[i].parameter(0)).ToHandleChecked(); | 553 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 551 CHECK(return_value->SameValue(*snippets[i].return_value())); | 554 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 552 } | 555 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 575 {"function counter(arg0, arg1) {\n" | 578 {"function counter(arg0, arg1) {\n" |
| 576 " this.count = 17; this.x = arg0; this.y = arg1;\n" | 579 " this.count = 17; this.x = arg0; this.y = arg1;\n" |
| 577 "}\n" | 580 "}\n" |
| 578 "function f() {\n" | 581 "function f() {\n" |
| 579 " var c = new counter(3, 5);\n" | 582 " var c = new counter(3, 5);\n" |
| 580 " return c.count + c.x + c.y;\n" | 583 " return c.count + c.x + c.y;\n" |
| 581 "}; f()", | 584 "}; f()", |
| 582 {factory->NewNumberFromInt(25)}}, | 585 {factory->NewNumberFromInt(25)}}, |
| 583 }; | 586 }; |
| 584 | 587 |
| 585 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 588 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 586 for (size_t i = 0; i < num_snippets; i++) { | |
| 587 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 589 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 588 auto callable = tester.GetCallable<>(); | 590 auto callable = tester.GetCallable<>(); |
| 589 Handle<Object> return_value = callable().ToHandleChecked(); | 591 Handle<Object> return_value = callable().ToHandleChecked(); |
| 590 CHECK(return_value->SameValue(*snippets[i].return_value())); | 592 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 591 } | 593 } |
| 592 } | 594 } |
| 593 | 595 |
| 594 | 596 |
| 595 TEST(BytecodeGraphBuilderCreateClosure) { | 597 TEST(BytecodeGraphBuilderCreateClosure) { |
| 596 HandleAndZoneScope scope; | 598 HandleAndZoneScope scope; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 614 {"function f() {\n" | 616 {"function f() {\n" |
| 615 " function counter(arg0, arg1) {\n" | 617 " function counter(arg0, arg1) {\n" |
| 616 " this.count = 17; this.x = arg0; this.y = arg1;\n" | 618 " this.count = 17; this.x = arg0; this.y = arg1;\n" |
| 617 " }\n" | 619 " }\n" |
| 618 " var c = new counter(3, 5);\n" | 620 " var c = new counter(3, 5);\n" |
| 619 " return c.count + c.x + c.y;\n" | 621 " return c.count + c.x + c.y;\n" |
| 620 "}; f()", | 622 "}; f()", |
| 621 {factory->NewNumberFromInt(25)}}, | 623 {factory->NewNumberFromInt(25)}}, |
| 622 }; | 624 }; |
| 623 | 625 |
| 624 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 626 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 625 for (size_t i = 0; i < num_snippets; i++) { | |
| 626 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 627 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 627 auto callable = tester.GetCallable<>(); | 628 auto callable = tester.GetCallable<>(); |
| 628 Handle<Object> return_value = callable().ToHandleChecked(); | 629 Handle<Object> return_value = callable().ToHandleChecked(); |
| 629 CHECK(return_value->SameValue(*snippets[i].return_value())); | 630 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 630 } | 631 } |
| 631 } | 632 } |
| 632 | 633 |
| 633 | 634 |
| 634 TEST(BytecodeGraphBuilderCallRuntime) { | 635 TEST(BytecodeGraphBuilderCallRuntime) { |
| 635 HandleAndZoneScope scope; | 636 HandleAndZoneScope scope; |
| 636 Isolate* isolate = scope.main_isolate(); | 637 Isolate* isolate = scope.main_isolate(); |
| 637 Zone* zone = scope.main_zone(); | 638 Zone* zone = scope.main_zone(); |
| 638 Factory* factory = isolate->factory(); | 639 Factory* factory = isolate->factory(); |
| 639 | 640 |
| 640 ExpectedSnippet<1> snippets[] = { | 641 ExpectedSnippet<1> snippets[] = { |
| 641 {"function f(arg0) { return %MaxSmi(); }\nf()", | 642 {"function f(arg0) { return %MaxSmi(); }\nf()", |
| 642 {factory->NewNumberFromInt(Smi::kMaxValue), factory->undefined_value()}}, | 643 {factory->NewNumberFromInt(Smi::kMaxValue), factory->undefined_value()}}, |
| 643 {"function f(arg0) { return %IsArray(arg0) }\nf(undefined)", | 644 {"function f(arg0) { return %IsArray(arg0) }\nf(undefined)", |
| 644 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, | 645 {factory->true_value(), BytecodeGraphTester::NewObject("[1, 2, 3]")}}, |
| 645 {"function f(arg0) { return %Add(arg0, 2) }\nf(1)", | 646 {"function f(arg0) { return %Add(arg0, 2) }\nf(1)", |
| 646 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(3)}}, | 647 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(3)}}, |
| 647 {"function f(arg0) { return %spread_arguments(arg0).length }\nf([])", | 648 {"function f(arg0) { return %spread_arguments(arg0).length }\nf([])", |
| 648 {factory->NewNumberFromInt(3), | 649 {factory->NewNumberFromInt(3), |
| 649 BytecodeGraphTester::NewObject("[1, 2, 3]")}}, | 650 BytecodeGraphTester::NewObject("[1, 2, 3]")}}, |
| 650 }; | 651 }; |
| 651 | 652 |
| 652 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 653 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 653 for (size_t i = 0; i < num_snippets; i++) { | |
| 654 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 654 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 655 auto callable = tester.GetCallable<Handle<Object>>(); | 655 auto callable = tester.GetCallable<Handle<Object>>(); |
| 656 Handle<Object> return_value = | 656 Handle<Object> return_value = |
| 657 callable(snippets[i].parameter(0)).ToHandleChecked(); | 657 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 658 CHECK(return_value->SameValue(*snippets[i].return_value())); | 658 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 659 } | 659 } |
| 660 } | 660 } |
| 661 | 661 |
| 662 | 662 void TestBytecodeGraphBuilderGlobals(size_t shard) { |
| 663 TEST(BytecodeGraphBuilderGlobals) { | |
| 664 HandleAndZoneScope scope; | 663 HandleAndZoneScope scope; |
| 665 Isolate* isolate = scope.main_isolate(); | 664 Isolate* isolate = scope.main_isolate(); |
| 666 Zone* zone = scope.main_zone(); | 665 Zone* zone = scope.main_zone(); |
| 667 Factory* factory = isolate->factory(); | 666 Factory* factory = isolate->factory(); |
| 668 | 667 |
| 669 ExpectedSnippet<0> snippets[] = { | 668 ExpectedSnippet<0> snippets[] = { |
| 670 {"var global = 321;\n function f() { return global; };\n f();", | 669 {"var global = 321;\n function f() { return global; };\n f();", |
| 671 {factory->NewNumberFromInt(321)}}, | 670 {factory->NewNumberFromInt(321)}}, |
| 672 {"var global = 321;\n" | 671 {"var global = 321;\n" |
| 673 "function f() { global = 123; return global };\n f();", | 672 "function f() { global = 123; return global };\n f();", |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 693 SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return " | 692 SPACE, " var b = global_obj.name;\n") "global = 'xyz'; return " |
| 694 "global };\n f();\n", | 693 "global };\n f();\n", |
| 695 {factory->NewStringFromStaticChars("xyz")}}, | 694 {factory->NewStringFromStaticChars("xyz")}}, |
| 696 {"function f() { return typeof(undeclared_var); }\n; f();\n", | 695 {"function f() { return typeof(undeclared_var); }\n; f();\n", |
| 697 {factory->NewStringFromStaticChars("undefined")}}, | 696 {factory->NewStringFromStaticChars("undefined")}}, |
| 698 {"var defined_var = 10; function f() { return typeof(defined_var); }\n; " | 697 {"var defined_var = 10; function f() { return typeof(defined_var); }\n; " |
| 699 "f();\n", | 698 "f();\n", |
| 700 {factory->NewStringFromStaticChars("number")}}, | 699 {factory->NewStringFromStaticChars("number")}}, |
| 701 }; | 700 }; |
| 702 | 701 |
| 703 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 702 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 704 for (size_t i = 0; i < num_snippets; i++) { | 703 if ((i % 2) != shard) continue; |
| 705 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 704 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 706 auto callable = tester.GetCallable<>(); | 705 auto callable = tester.GetCallable<>(); |
| 707 Handle<Object> return_value = callable().ToHandleChecked(); | 706 Handle<Object> return_value = callable().ToHandleChecked(); |
| 708 CHECK(return_value->SameValue(*snippets[i].return_value())); | 707 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 709 } | 708 } |
| 710 } | 709 } |
| 711 | 710 |
| 711 SHARD_TEST_BY_2(BytecodeGraphBuilderGlobals) | |
| 712 | 712 |
| 713 TEST(BytecodeGraphBuilderToObject) { | 713 TEST(BytecodeGraphBuilderToObject) { |
| 714 // TODO(mythria): tests for ToObject. Needs ForIn. | 714 // TODO(mythria): tests for ToObject. Needs ForIn. |
| 715 } | 715 } |
| 716 | 716 |
| 717 | 717 |
| 718 TEST(BytecodeGraphBuilderToName) { | 718 TEST(BytecodeGraphBuilderToName) { |
| 719 HandleAndZoneScope scope; | 719 HandleAndZoneScope scope; |
| 720 Isolate* isolate = scope.main_isolate(); | 720 Isolate* isolate = scope.main_isolate(); |
| 721 Zone* zone = scope.main_zone(); | 721 Zone* zone = scope.main_zone(); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 739 {"var a = {valueOf : function() { return 'x'}};\n" | 739 {"var a = {valueOf : function() { return 'x'}};\n" |
| 740 "var obj = {[a] : 10};\n" | 740 "var obj = {[a] : 10};\n" |
| 741 "return obj.x;", | 741 "return obj.x;", |
| 742 {factory->undefined_value()}}, | 742 {factory->undefined_value()}}, |
| 743 {"var a = {[Symbol.toPrimitive] : function() { return 'x'}};\n" | 743 {"var a = {[Symbol.toPrimitive] : function() { return 'x'}};\n" |
| 744 "var obj = {[a] : 10};\n" | 744 "var obj = {[a] : 10};\n" |
| 745 "return obj.x;", | 745 "return obj.x;", |
| 746 {factory->NewNumberFromInt(10)}}, | 746 {factory->NewNumberFromInt(10)}}, |
| 747 }; | 747 }; |
| 748 | 748 |
| 749 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 749 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 750 for (size_t i = 0; i < num_snippets; i++) { | |
| 751 ScopedVector<char> script(1024); | 750 ScopedVector<char> script(1024); |
| 752 SNPrintF(script, "function %s() { %s }\n%s({});", kFunctionName, | 751 SNPrintF(script, "function %s() { %s }\n%s({});", kFunctionName, |
| 753 snippets[i].code_snippet, kFunctionName); | 752 snippets[i].code_snippet, kFunctionName); |
| 754 | 753 |
| 755 BytecodeGraphTester tester(isolate, zone, script.start()); | 754 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 756 auto callable = tester.GetCallable<>(); | 755 auto callable = tester.GetCallable<>(); |
| 757 Handle<Object> return_value = callable().ToHandleChecked(); | 756 Handle<Object> return_value = callable().ToHandleChecked(); |
| 758 CHECK(return_value->SameValue(*snippets[i].return_value())); | 757 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 759 } | 758 } |
| 760 } | 759 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 771 {factory->false_value(), | 770 {factory->false_value(), |
| 772 BytecodeGraphTester::NewObject("({val : 10})")}}, | 771 BytecodeGraphTester::NewObject("({val : 10})")}}, |
| 773 {"return !p1;", {factory->true_value(), factory->NewNumberFromInt(0)}}, | 772 {"return !p1;", {factory->true_value(), factory->NewNumberFromInt(0)}}, |
| 774 {"return !p1;", {factory->true_value(), factory->undefined_value()}}, | 773 {"return !p1;", {factory->true_value(), factory->undefined_value()}}, |
| 775 {"return !p1;", {factory->false_value(), factory->NewNumberFromInt(10)}}, | 774 {"return !p1;", {factory->false_value(), factory->NewNumberFromInt(10)}}, |
| 776 {"return !p1;", {factory->false_value(), factory->true_value()}}, | 775 {"return !p1;", {factory->false_value(), factory->true_value()}}, |
| 777 {"return !p1;", | 776 {"return !p1;", |
| 778 {factory->false_value(), factory->NewStringFromStaticChars("abc")}}, | 777 {factory->false_value(), factory->NewStringFromStaticChars("abc")}}, |
| 779 }; | 778 }; |
| 780 | 779 |
| 781 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 780 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 782 for (size_t i = 0; i < num_snippets; i++) { | |
| 783 ScopedVector<char> script(1024); | 781 ScopedVector<char> script(1024); |
| 784 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 782 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
| 785 snippets[i].code_snippet, kFunctionName); | 783 snippets[i].code_snippet, kFunctionName); |
| 786 | 784 |
| 787 BytecodeGraphTester tester(isolate, zone, script.start()); | 785 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 788 auto callable = tester.GetCallable<Handle<Object>>(); | 786 auto callable = tester.GetCallable<Handle<Object>>(); |
| 789 Handle<Object> return_value = | 787 Handle<Object> return_value = |
| 790 callable(snippets[i].parameter(0)).ToHandleChecked(); | 788 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 791 CHECK(return_value->SameValue(*snippets[i].return_value())); | 789 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 792 } | 790 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 809 {"return typeof p1;", | 807 {"return typeof p1;", |
| 810 {factory->NewStringFromStaticChars("number"), | 808 {factory->NewStringFromStaticChars("number"), |
| 811 factory->NewNumberFromInt(10)}}, | 809 factory->NewNumberFromInt(10)}}, |
| 812 {"return typeof p1;", | 810 {"return typeof p1;", |
| 813 {factory->NewStringFromStaticChars("boolean"), factory->true_value()}}, | 811 {factory->NewStringFromStaticChars("boolean"), factory->true_value()}}, |
| 814 {"return typeof p1;", | 812 {"return typeof p1;", |
| 815 {factory->NewStringFromStaticChars("string"), | 813 {factory->NewStringFromStaticChars("string"), |
| 816 factory->NewStringFromStaticChars("abc")}}, | 814 factory->NewStringFromStaticChars("abc")}}, |
| 817 }; | 815 }; |
| 818 | 816 |
| 819 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 817 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 820 for (size_t i = 0; i < num_snippets; i++) { | |
| 821 ScopedVector<char> script(1024); | 818 ScopedVector<char> script(1024); |
| 822 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 819 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
| 823 snippets[i].code_snippet, kFunctionName); | 820 snippets[i].code_snippet, kFunctionName); |
| 824 | 821 |
| 825 BytecodeGraphTester tester(isolate, zone, script.start()); | 822 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 826 auto callable = tester.GetCallable<Handle<Object>>(); | 823 auto callable = tester.GetCallable<Handle<Object>>(); |
| 827 Handle<Object> return_value = | 824 Handle<Object> return_value = |
| 828 callable(snippets[i].parameter(0)).ToHandleChecked(); | 825 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 829 CHECK(return_value->SameValue(*snippets[i].return_value())); | 826 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 830 } | 827 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 864 {factory->NewNumberFromInt(11), | 861 {factory->NewNumberFromInt(11), |
| 865 BytecodeGraphTester::NewObject("({1 : 10})")}}, | 862 BytecodeGraphTester::NewObject("({1 : 10})")}}, |
| 866 {" function inner() { return p1 } return --p1;", | 863 {" function inner() { return p1 } return --p1;", |
| 867 {factory->NewNumberFromInt(9), factory->NewNumberFromInt(10)}}, | 864 {factory->NewNumberFromInt(9), factory->NewNumberFromInt(10)}}, |
| 868 {" function inner() { return p1 } return p1--;", | 865 {" function inner() { return p1 } return p1--;", |
| 869 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, | 866 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(10)}}, |
| 870 {"return ++p1;", | 867 {"return ++p1;", |
| 871 {factory->nan_value(), factory->NewStringFromStaticChars("String")}}, | 868 {factory->nan_value(), factory->NewStringFromStaticChars("String")}}, |
| 872 }; | 869 }; |
| 873 | 870 |
| 874 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 871 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 875 for (size_t i = 0; i < num_snippets; i++) { | |
| 876 ScopedVector<char> script(1024); | 872 ScopedVector<char> script(1024); |
| 877 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 873 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
| 878 snippets[i].code_snippet, kFunctionName); | 874 snippets[i].code_snippet, kFunctionName); |
| 879 | 875 |
| 880 BytecodeGraphTester tester(isolate, zone, script.start()); | 876 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 881 auto callable = tester.GetCallable<Handle<Object>>(); | 877 auto callable = tester.GetCallable<Handle<Object>>(); |
| 882 Handle<Object> return_value = | 878 Handle<Object> return_value = |
| 883 callable(snippets[i].parameter(0)).ToHandleChecked(); | 879 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 884 CHECK(return_value->SameValue(*snippets[i].return_value())); | 880 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 885 } | 881 } |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 904 {"'use strict'; return delete p1.val;", | 900 {"'use strict'; return delete p1.val;", |
| 905 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, | 901 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, |
| 906 {"'use strict'; delete p1.val; return p1.val;", | 902 {"'use strict'; delete p1.val; return p1.val;", |
| 907 {factory->undefined_value(), | 903 {factory->undefined_value(), |
| 908 BytecodeGraphTester::NewObject("({val : 10})")}}, | 904 BytecodeGraphTester::NewObject("({val : 10})")}}, |
| 909 {"'use strict'; delete p1.name; return p1.val;", | 905 {"'use strict'; delete p1.name; return p1.val;", |
| 910 {factory->NewNumberFromInt(10), | 906 {factory->NewNumberFromInt(10), |
| 911 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, | 907 BytecodeGraphTester::NewObject("({val : 10, name:'abc'})")}}, |
| 912 }; | 908 }; |
| 913 | 909 |
| 914 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 910 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 915 for (size_t i = 0; i < num_snippets; i++) { | |
| 916 ScopedVector<char> script(1024); | 911 ScopedVector<char> script(1024); |
| 917 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 912 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
| 918 snippets[i].code_snippet, kFunctionName); | 913 snippets[i].code_snippet, kFunctionName); |
| 919 | 914 |
| 920 BytecodeGraphTester tester(isolate, zone, script.start()); | 915 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 921 auto callable = tester.GetCallable<Handle<Object>>(); | 916 auto callable = tester.GetCallable<Handle<Object>>(); |
| 922 Handle<Object> return_value = | 917 Handle<Object> return_value = |
| 923 callable(snippets[i].parameter(0)).ToHandleChecked(); | 918 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 924 CHECK(return_value->SameValue(*snippets[i].return_value())); | 919 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 925 } | 920 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 959 "function f() { delete obj[1]; return obj[2];};", | 954 "function f() { delete obj[1]; return obj[2];};", |
| 960 {factory->NewNumberFromInt(20)}}, | 955 {factory->NewNumberFromInt(20)}}, |
| 961 {"function f() {" | 956 {"function f() {" |
| 962 " var obj = {1 : 10, 2 : 20};" | 957 " var obj = {1 : 10, 2 : 20};" |
| 963 " function inner() { return obj[1]; };" | 958 " function inner() { return obj[1]; };" |
| 964 " return delete obj[1];" | 959 " return delete obj[1];" |
| 965 "}", | 960 "}", |
| 966 {factory->true_value()}}, | 961 {factory->true_value()}}, |
| 967 }; | 962 }; |
| 968 | 963 |
| 969 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 964 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 970 for (size_t i = 0; i < num_snippets; i++) { | |
| 971 ScopedVector<char> script(1024); | 965 ScopedVector<char> script(1024); |
| 972 SNPrintF(script, "%s %s({});", snippets[i].code_snippet, kFunctionName); | 966 SNPrintF(script, "%s %s({});", snippets[i].code_snippet, kFunctionName); |
| 973 | 967 |
| 974 BytecodeGraphTester tester(isolate, zone, script.start()); | 968 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 975 auto callable = tester.GetCallable<>(); | 969 auto callable = tester.GetCallable<>(); |
| 976 Handle<Object> return_value = callable().ToHandleChecked(); | 970 Handle<Object> return_value = callable().ToHandleChecked(); |
| 977 CHECK(return_value->SameValue(*snippets[i].return_value())); | 971 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 978 } | 972 } |
| 979 } | 973 } |
| 980 | 974 |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 996 " eval(\"function t() {"; | 990 " eval(\"function t() {"; |
| 997 const char* function_epilogue = " }; f = t; t();\");" | 991 const char* function_epilogue = " }; f = t; t();\");" |
| 998 "}" | 992 "}" |
| 999 "f1();"; | 993 "f1();"; |
| 1000 | 994 |
| 1001 ExpectedSnippet<0> snippets[] = { | 995 ExpectedSnippet<0> snippets[] = { |
| 1002 {"return delete y;", {factory->true_value()}}, | 996 {"return delete y;", {factory->true_value()}}, |
| 1003 {"return delete z;", {factory->false_value()}}, | 997 {"return delete z;", {factory->false_value()}}, |
| 1004 }; | 998 }; |
| 1005 | 999 |
| 1006 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1000 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1007 for (size_t i = 0; i < num_snippets; i++) { | |
| 1008 ScopedVector<char> script(1024); | 1001 ScopedVector<char> script(1024); |
| 1009 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1002 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
| 1010 function_epilogue); | 1003 function_epilogue); |
| 1011 | 1004 |
| 1012 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1005 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
| 1013 auto callable = tester.GetCallable<>(); | 1006 auto callable = tester.GetCallable<>(); |
| 1014 Handle<Object> return_value = callable().ToHandleChecked(); | 1007 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1015 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1008 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1016 } | 1009 } |
| 1017 } | 1010 } |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1038 ExpectedSnippet<0> snippets[] = { | 1031 ExpectedSnippet<0> snippets[] = { |
| 1039 {"return x;", {factory->NewNumber(12)}}, | 1032 {"return x;", {factory->NewNumber(12)}}, |
| 1040 {"return obj.val;", {factory->NewNumber(3.1414)}}, | 1033 {"return obj.val;", {factory->NewNumber(3.1414)}}, |
| 1041 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, | 1034 {"return typeof x;", {factory->NewStringFromStaticChars("number")}}, |
| 1042 {"return typeof dummy;", | 1035 {"return typeof dummy;", |
| 1043 {factory->NewStringFromStaticChars("undefined")}}, | 1036 {factory->NewStringFromStaticChars("undefined")}}, |
| 1044 {"x = 23; return x;", {factory->NewNumber(23)}}, | 1037 {"x = 23; return x;", {factory->NewNumber(23)}}, |
| 1045 {"'use strict'; obj.val = 23.456; return obj.val;", | 1038 {"'use strict'; obj.val = 23.456; return obj.val;", |
| 1046 {factory->NewNumber(23.456)}}}; | 1039 {factory->NewNumber(23.456)}}}; |
| 1047 | 1040 |
| 1048 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1041 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1049 for (size_t i = 0; i < num_snippets; i++) { | |
| 1050 ScopedVector<char> script(1024); | 1042 ScopedVector<char> script(1024); |
| 1051 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1043 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
| 1052 function_epilogue); | 1044 function_epilogue); |
| 1053 | 1045 |
| 1054 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1046 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
| 1055 auto callable = tester.GetCallable<>(); | 1047 auto callable = tester.GetCallable<>(); |
| 1056 Handle<Object> return_value = callable().ToHandleChecked(); | 1048 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1057 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1049 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1058 } | 1050 } |
| 1059 } | 1051 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1082 ExpectedSnippet<0> snippets[] = { | 1074 ExpectedSnippet<0> snippets[] = { |
| 1083 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x;", | 1075 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x;", |
| 1084 {factory->NewNumber(12)}}, | 1076 {factory->NewNumber(12)}}, |
| 1085 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return typeof x;", | 1077 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return typeof x;", |
| 1086 {factory->NewStringFromStaticChars("number")}}, | 1078 {factory->NewStringFromStaticChars("number")}}, |
| 1087 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x = 23;", | 1079 {"var y = 2.3;" REPEAT_256(SPACE, "y = 2.3;") "return x = 23;", |
| 1088 {factory->NewNumber(23)}}, | 1080 {factory->NewNumber(23)}}, |
| 1089 {"'use strict';" REPEAT_256(SPACE, "y = 2.3;") "return obj.val = 23.456;", | 1081 {"'use strict';" REPEAT_256(SPACE, "y = 2.3;") "return obj.val = 23.456;", |
| 1090 {factory->NewNumber(23.456)}}}; | 1082 {factory->NewNumber(23.456)}}}; |
| 1091 | 1083 |
| 1092 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1084 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1093 for (size_t i = 0; i < num_snippets; i++) { | |
| 1094 ScopedVector<char> script(3072); | 1085 ScopedVector<char> script(3072); |
| 1095 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, | 1086 SNPrintF(script, "%s %s %s", function_prologue, snippets[i].code_snippet, |
| 1096 function_epilogue); | 1087 function_epilogue); |
| 1097 | 1088 |
| 1098 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); | 1089 BytecodeGraphTester tester(isolate, zone, script.start(), "t"); |
| 1099 auto callable = tester.GetCallable<>(); | 1090 auto callable = tester.GetCallable<>(); |
| 1100 Handle<Object> return_value = callable().ToHandleChecked(); | 1091 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1101 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1092 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1102 } | 1093 } |
| 1103 } | 1094 } |
| 1104 | 1095 |
| 1105 | 1096 |
| 1106 TEST(BytecodeGraphBuilderCallLookupSlot) { | 1097 TEST(BytecodeGraphBuilderCallLookupSlot) { |
| 1107 HandleAndZoneScope scope; | 1098 HandleAndZoneScope scope; |
| 1108 Isolate* isolate = scope.main_isolate(); | 1099 Isolate* isolate = scope.main_isolate(); |
| 1109 Zone* zone = scope.main_zone(); | 1100 Zone* zone = scope.main_zone(); |
| 1110 | 1101 |
| 1111 ExpectedSnippet<0> snippets[] = { | 1102 ExpectedSnippet<0> snippets[] = { |
| 1112 {"g = function(){ return 2 }; eval(''); return g();", | 1103 {"g = function(){ return 2 }; eval(''); return g();", |
| 1113 {handle(Smi::FromInt(2), isolate)}}, | 1104 {handle(Smi::FromInt(2), isolate)}}, |
| 1114 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n" | 1105 {"g = function(){ return 2 }; eval('g = function() {return 3}');\n" |
| 1115 "return g();", | 1106 "return g();", |
| 1116 {handle(Smi::FromInt(3), isolate)}}, | 1107 {handle(Smi::FromInt(3), isolate)}}, |
| 1117 {"g = { x: function(){ return this.y }, y: 20 };\n" | 1108 {"g = { x: function(){ return this.y }, y: 20 };\n" |
| 1118 "eval('g = { x: g.x, y: 30 }');\n" | 1109 "eval('g = { x: g.x, y: 30 }');\n" |
| 1119 "return g.x();", | 1110 "return g.x();", |
| 1120 {handle(Smi::FromInt(30), isolate)}}, | 1111 {handle(Smi::FromInt(30), isolate)}}, |
| 1121 }; | 1112 }; |
| 1122 | 1113 |
| 1123 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1114 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1124 for (size_t i = 0; i < num_snippets; i++) { | |
| 1125 ScopedVector<char> script(1024); | 1115 ScopedVector<char> script(1024); |
| 1126 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1116 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1127 snippets[i].code_snippet, kFunctionName); | 1117 snippets[i].code_snippet, kFunctionName); |
| 1128 BytecodeGraphTester tester(isolate, zone, script.start()); | 1118 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1129 auto callable = tester.GetCallable<>(); | 1119 auto callable = tester.GetCallable<>(); |
| 1130 Handle<Object> return_value = callable().ToHandleChecked(); | 1120 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1131 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1121 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1132 } | 1122 } |
| 1133 } | 1123 } |
| 1134 | 1124 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1166 {"'use strict'; eval('var y = 10;'); return typeof unallocated;", | 1156 {"'use strict'; eval('var y = 10;'); return typeof unallocated;", |
| 1167 {factory->NewStringFromStaticChars("undefined")}}, | 1157 {factory->NewStringFromStaticChars("undefined")}}, |
| 1168 {"eval('var x = 10;'); return typeof x;", | 1158 {"eval('var x = 10;'); return typeof x;", |
| 1169 {factory->NewStringFromStaticChars("number")}}, | 1159 {factory->NewStringFromStaticChars("number")}}, |
| 1170 {"var x = {}; eval('var x = 10;'); return typeof x;", | 1160 {"var x = {}; eval('var x = 10;'); return typeof x;", |
| 1171 {factory->NewStringFromStaticChars("number")}}, | 1161 {factory->NewStringFromStaticChars("number")}}, |
| 1172 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", | 1162 {"'use strict'; var x = {}; eval('var x = 10;'); return typeof x;", |
| 1173 {factory->NewStringFromStaticChars("object")}}, | 1163 {factory->NewStringFromStaticChars("object")}}, |
| 1174 }; | 1164 }; |
| 1175 | 1165 |
| 1176 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1166 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1177 for (size_t i = 0; i < num_snippets; i++) { | |
| 1178 ScopedVector<char> script(1024); | 1167 ScopedVector<char> script(1024); |
| 1179 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1168 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1180 snippets[i].code_snippet, kFunctionName); | 1169 snippets[i].code_snippet, kFunctionName); |
| 1181 BytecodeGraphTester tester(isolate, zone, script.start()); | 1170 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1182 auto callable = tester.GetCallable<>(); | 1171 auto callable = tester.GetCallable<>(); |
| 1183 Handle<Object> return_value = callable().ToHandleChecked(); | 1172 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1184 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1173 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1185 } | 1174 } |
| 1186 } | 1175 } |
| 1187 | 1176 |
| 1188 | 1177 |
| 1189 TEST(BytecodeGraphBuilderEvalParams) { | 1178 TEST(BytecodeGraphBuilderEvalParams) { |
| 1190 HandleAndZoneScope scope; | 1179 HandleAndZoneScope scope; |
| 1191 Isolate* isolate = scope.main_isolate(); | 1180 Isolate* isolate = scope.main_isolate(); |
| 1192 Zone* zone = scope.main_zone(); | 1181 Zone* zone = scope.main_zone(); |
| 1193 | 1182 |
| 1194 ExpectedSnippet<1> snippets[] = { | 1183 ExpectedSnippet<1> snippets[] = { |
| 1195 {"var x = 10; return eval('x + p1;');", | 1184 {"var x = 10; return eval('x + p1;');", |
| 1196 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, | 1185 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1197 {"var x = 10; eval('p1 = x;'); return p1;", | 1186 {"var x = 10; eval('p1 = x;'); return p1;", |
| 1198 {handle(Smi::FromInt(10), isolate), handle(Smi::FromInt(20), isolate)}}, | 1187 {handle(Smi::FromInt(10), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1199 {"var a = 10;" | 1188 {"var a = 10;" |
| 1200 "function inner() { return eval('a + p1;');}" | 1189 "function inner() { return eval('a + p1;');}" |
| 1201 "return inner();", | 1190 "return inner();", |
| 1202 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, | 1191 {handle(Smi::FromInt(30), isolate), handle(Smi::FromInt(20), isolate)}}, |
| 1203 }; | 1192 }; |
| 1204 | 1193 |
| 1205 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1194 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1206 for (size_t i = 0; i < num_snippets; i++) { | |
| 1207 ScopedVector<char> script(1024); | 1195 ScopedVector<char> script(1024); |
| 1208 SNPrintF(script, "function %s(p1) { %s }\n%s(0);", kFunctionName, | 1196 SNPrintF(script, "function %s(p1) { %s }\n%s(0);", kFunctionName, |
| 1209 snippets[i].code_snippet, kFunctionName); | 1197 snippets[i].code_snippet, kFunctionName); |
| 1210 BytecodeGraphTester tester(isolate, zone, script.start()); | 1198 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1211 auto callable = tester.GetCallable<Handle<Object>>(); | 1199 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1212 Handle<Object> return_value = | 1200 Handle<Object> return_value = |
| 1213 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1201 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 1214 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1202 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1215 } | 1203 } |
| 1216 } | 1204 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1227 "function f() { add_global(); return z; }; f();", | 1215 "function f() { add_global(); return z; }; f();", |
| 1228 {handle(Smi::FromInt(33), isolate)}}, | 1216 {handle(Smi::FromInt(33), isolate)}}, |
| 1229 {"function add_global() {\n" | 1217 {"function add_global() {\n" |
| 1230 " eval('\"use strict\"; function f() { y = 33; };" | 1218 " eval('\"use strict\"; function f() { y = 33; };" |
| 1231 " try { f() } catch(e) {}');\n" | 1219 " try { f() } catch(e) {}');\n" |
| 1232 "}\n" | 1220 "}\n" |
| 1233 "function f() { add_global(); return typeof y; } f();", | 1221 "function f() { add_global(); return typeof y; } f();", |
| 1234 {factory->NewStringFromStaticChars("undefined")}}, | 1222 {factory->NewStringFromStaticChars("undefined")}}, |
| 1235 }; | 1223 }; |
| 1236 | 1224 |
| 1237 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1225 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1238 for (size_t i = 0; i < num_snippets; i++) { | |
| 1239 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); | 1226 BytecodeGraphTester tester(isolate, zone, snippets[i].code_snippet); |
| 1240 auto callable = tester.GetCallable<>(); | 1227 auto callable = tester.GetCallable<>(); |
| 1241 Handle<Object> return_value = callable().ToHandleChecked(); | 1228 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1242 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1229 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1243 } | 1230 } |
| 1244 } | 1231 } |
| 1245 | 1232 |
| 1246 | 1233 |
| 1247 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, | 1234 bool get_compare_result(Token::Value opcode, Handle<Object> lhs_value, |
| 1248 Handle<Object> rhs_value) { | 1235 Handle<Object> rhs_value) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1359 factory->NewNumberFromInt(10)}}, | 1346 factory->NewNumberFromInt(10)}}, |
| 1360 {"return p2 in p1;", | 1347 {"return p2 in p1;", |
| 1361 {factory->true_value(), BytecodeGraphTester::NewObject("({10 : 'val'})"), | 1348 {factory->true_value(), BytecodeGraphTester::NewObject("({10 : 'val'})"), |
| 1362 factory->NewNumberFromInt(10)}}, | 1349 factory->NewNumberFromInt(10)}}, |
| 1363 {"return p2 in p1;", | 1350 {"return p2 in p1;", |
| 1364 {factory->false_value(), | 1351 {factory->false_value(), |
| 1365 BytecodeGraphTester::NewObject("({10 : 'val'})"), | 1352 BytecodeGraphTester::NewObject("({10 : 'val'})"), |
| 1366 factory->NewNumberFromInt(1)}}, | 1353 factory->NewNumberFromInt(1)}}, |
| 1367 }; | 1354 }; |
| 1368 | 1355 |
| 1369 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1356 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1370 for (size_t i = 0; i < num_snippets; i++) { | |
| 1371 ScopedVector<char> script(1024); | 1357 ScopedVector<char> script(1024); |
| 1372 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, | 1358 SNPrintF(script, "function %s(p1, p2) { %s }\n%s({}, {});", kFunctionName, |
| 1373 snippets[i].code_snippet, kFunctionName); | 1359 snippets[i].code_snippet, kFunctionName); |
| 1374 | 1360 |
| 1375 BytecodeGraphTester tester(isolate, zone, script.start()); | 1361 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1376 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); | 1362 auto callable = tester.GetCallable<Handle<Object>, Handle<Object>>(); |
| 1377 Handle<Object> return_value = | 1363 Handle<Object> return_value = |
| 1378 callable(snippets[i].parameter(0), snippets[i].parameter(1)) | 1364 callable(snippets[i].parameter(0), snippets[i].parameter(1)) |
| 1379 .ToHandleChecked(); | 1365 .ToHandleChecked(); |
| 1380 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1366 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1392 {"return p1 instanceof Object;", | 1378 {"return p1 instanceof Object;", |
| 1393 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, | 1379 {factory->true_value(), BytecodeGraphTester::NewObject("({val : 10})")}}, |
| 1394 {"return p1 instanceof String;", | 1380 {"return p1 instanceof String;", |
| 1395 {factory->false_value(), factory->NewStringFromStaticChars("string")}}, | 1381 {factory->false_value(), factory->NewStringFromStaticChars("string")}}, |
| 1396 {"var cons = function() {};" | 1382 {"var cons = function() {};" |
| 1397 "var obj = new cons();" | 1383 "var obj = new cons();" |
| 1398 "return obj instanceof cons;", | 1384 "return obj instanceof cons;", |
| 1399 {factory->true_value(), factory->undefined_value()}}, | 1385 {factory->true_value(), factory->undefined_value()}}, |
| 1400 }; | 1386 }; |
| 1401 | 1387 |
| 1402 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1388 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1403 for (size_t i = 0; i < num_snippets; i++) { | |
| 1404 ScopedVector<char> script(1024); | 1389 ScopedVector<char> script(1024); |
| 1405 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, | 1390 SNPrintF(script, "function %s(p1) { %s }\n%s({});", kFunctionName, |
| 1406 snippets[i].code_snippet, kFunctionName); | 1391 snippets[i].code_snippet, kFunctionName); |
| 1407 | 1392 |
| 1408 BytecodeGraphTester tester(isolate, zone, script.start()); | 1393 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1409 auto callable = tester.GetCallable<Handle<Object>>(); | 1394 auto callable = tester.GetCallable<Handle<Object>>(); |
| 1410 Handle<Object> return_value = | 1395 Handle<Object> return_value = |
| 1411 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1396 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 1412 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1397 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1413 } | 1398 } |
| 1414 } | 1399 } |
| 1415 | 1400 |
| 1416 TEST(BytecodeGraphBuilderTryCatch) { | 1401 TEST(BytecodeGraphBuilderTryCatch) { |
| 1417 HandleAndZoneScope scope; | 1402 HandleAndZoneScope scope; |
| 1418 Isolate* isolate = scope.main_isolate(); | 1403 Isolate* isolate = scope.main_isolate(); |
| 1419 Zone* zone = scope.main_zone(); | 1404 Zone* zone = scope.main_zone(); |
| 1420 | 1405 |
| 1421 ExpectedSnippet<0> snippets[] = { | 1406 ExpectedSnippet<0> snippets[] = { |
| 1422 {"var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;", | 1407 {"var a = 1; try { a = 2 } catch(e) { a = 3 }; return a;", |
| 1423 {handle(Smi::FromInt(2), isolate)}}, | 1408 {handle(Smi::FromInt(2), isolate)}}, |
| 1424 {"var a; try { undef.x } catch(e) { a = 2 }; return a;", | 1409 {"var a; try { undef.x } catch(e) { a = 2 }; return a;", |
| 1425 {handle(Smi::FromInt(2), isolate)}}, | 1410 {handle(Smi::FromInt(2), isolate)}}, |
| 1426 {"var a; try { throw 1 } catch(e) { a = e + 2 }; return a;", | 1411 {"var a; try { throw 1 } catch(e) { a = e + 2 }; return a;", |
| 1427 {handle(Smi::FromInt(3), isolate)}}, | 1412 {handle(Smi::FromInt(3), isolate)}}, |
| 1428 {"var a; try { throw 1 } catch(e) { a = e + 2 };" | 1413 {"var a; try { throw 1 } catch(e) { a = e + 2 };" |
| 1429 " try { throw a } catch(e) { a = e + 3 }; return a;", | 1414 " try { throw a } catch(e) { a = e + 3 }; return a;", |
| 1430 {handle(Smi::FromInt(6), isolate)}}, | 1415 {handle(Smi::FromInt(6), isolate)}}, |
| 1431 }; | 1416 }; |
| 1432 | 1417 |
| 1433 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1418 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1434 for (size_t i = 0; i < num_snippets; i++) { | |
| 1435 ScopedVector<char> script(1024); | 1419 ScopedVector<char> script(1024); |
| 1436 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1420 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1437 snippets[i].code_snippet, kFunctionName); | 1421 snippets[i].code_snippet, kFunctionName); |
| 1438 | 1422 |
| 1439 BytecodeGraphTester tester(isolate, zone, script.start()); | 1423 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1440 auto callable = tester.GetCallable<>(); | 1424 auto callable = tester.GetCallable<>(); |
| 1441 Handle<Object> return_value = callable().ToHandleChecked(); | 1425 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1442 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1426 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1443 } | 1427 } |
| 1444 } | 1428 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1462 {"var a = 1; for (var i = 10; i < 20; i += 5) {" | 1446 {"var a = 1; for (var i = 10; i < 20; i += 5) {" |
| 1463 " try { a = 2; continue; } finally { a = 3; }" | 1447 " try { a = 2; continue; } finally { a = 3; }" |
| 1464 "} return a + i;", | 1448 "} return a + i;", |
| 1465 {handle(Smi::FromInt(23), isolate)}}, | 1449 {handle(Smi::FromInt(23), isolate)}}, |
| 1466 {"var a = 1; try { a = 2;" | 1450 {"var a = 1; try { a = 2;" |
| 1467 " try { a = 3; throw 23; } finally { a = 4; }" | 1451 " try { a = 3; throw 23; } finally { a = 4; }" |
| 1468 "} catch(e) { a = a + e; } return a;", | 1452 "} catch(e) { a = a + e; } return a;", |
| 1469 {handle(Smi::FromInt(27), isolate)}}, | 1453 {handle(Smi::FromInt(27), isolate)}}, |
| 1470 }; | 1454 }; |
| 1471 | 1455 |
| 1472 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1456 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1473 for (size_t i = 0; i < num_snippets; i++) { | |
| 1474 ScopedVector<char> script(1024); | 1457 ScopedVector<char> script(1024); |
| 1475 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1458 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1476 snippets[i].code_snippet, kFunctionName); | 1459 snippets[i].code_snippet, kFunctionName); |
| 1477 | 1460 |
| 1478 BytecodeGraphTester tester(isolate, zone, script.start()); | 1461 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1479 auto callable = tester.GetCallable<>(); | 1462 auto callable = tester.GetCallable<>(); |
| 1480 Handle<Object> return_value = callable().ToHandleChecked(); | 1463 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1481 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1464 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1482 } | 1465 } |
| 1483 } | 1466 } |
| 1484 | 1467 |
| 1485 TEST(BytecodeGraphBuilderTryFinally2) { | 1468 TEST(BytecodeGraphBuilderTryFinally2) { |
| 1486 HandleAndZoneScope scope; | 1469 HandleAndZoneScope scope; |
| 1487 Isolate* isolate = scope.main_isolate(); | 1470 Isolate* isolate = scope.main_isolate(); |
| 1488 Zone* zone = scope.main_zone(); | 1471 Zone* zone = scope.main_zone(); |
| 1489 | 1472 |
| 1490 ExpectedSnippet<0, const char*> snippets[] = { | 1473 ExpectedSnippet<0, const char*> snippets[] = { |
| 1491 {"var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;", | 1474 {"var a = 1; try { a = 2; throw 23; } finally { a = 3 }; return a;", |
| 1492 {"Uncaught 23"}}, | 1475 {"Uncaught 23"}}, |
| 1493 {"var a = 1; try { a = 2; throw 23; } finally { throw 42; };", | 1476 {"var a = 1; try { a = 2; throw 23; } finally { throw 42; };", |
| 1494 {"Uncaught 42"}}, | 1477 {"Uncaught 42"}}, |
| 1495 }; | 1478 }; |
| 1496 | 1479 |
| 1497 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1480 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1498 for (size_t i = 0; i < num_snippets; i++) { | |
| 1499 ScopedVector<char> script(1024); | 1481 ScopedVector<char> script(1024); |
| 1500 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1482 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1501 snippets[i].code_snippet, kFunctionName); | 1483 snippets[i].code_snippet, kFunctionName); |
| 1502 | 1484 |
| 1503 BytecodeGraphTester tester(isolate, zone, script.start()); | 1485 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1504 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 1486 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
| 1505 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); | 1487 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); |
| 1506 CHECK( | 1488 CHECK( |
| 1507 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 1489 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
| 1508 .FromJust()); | 1490 .FromJust()); |
| 1509 } | 1491 } |
| 1510 } | 1492 } |
| 1511 | 1493 |
| 1512 TEST(BytecodeGraphBuilderThrow) { | 1494 TEST(BytecodeGraphBuilderThrow) { |
| 1513 HandleAndZoneScope scope; | 1495 HandleAndZoneScope scope; |
| 1514 Isolate* isolate = scope.main_isolate(); | 1496 Isolate* isolate = scope.main_isolate(); |
| 1515 Zone* zone = scope.main_zone(); | 1497 Zone* zone = scope.main_zone(); |
| 1516 | 1498 |
| 1517 // TODO(mythria): Add more tests when real try-catch and deoptimization | 1499 // TODO(mythria): Add more tests when real try-catch and deoptimization |
| 1518 // information are supported. | 1500 // information are supported. |
| 1519 ExpectedSnippet<0, const char*> snippets[] = { | 1501 ExpectedSnippet<0, const char*> snippets[] = { |
| 1520 {"throw undefined;", {"Uncaught undefined"}}, | 1502 {"throw undefined;", {"Uncaught undefined"}}, |
| 1521 {"throw 1;", {"Uncaught 1"}}, | 1503 {"throw 1;", {"Uncaught 1"}}, |
| 1522 {"throw 'Error';", {"Uncaught Error"}}, | 1504 {"throw 'Error';", {"Uncaught Error"}}, |
| 1523 {"throw 'Error1'; throw 'Error2'", {"Uncaught Error1"}}, | 1505 {"throw 'Error1'; throw 'Error2'", {"Uncaught Error1"}}, |
| 1524 {"var a = true; if (a) { throw 'Error'; }", {"Uncaught Error"}}, | 1506 {"var a = true; if (a) { throw 'Error'; }", {"Uncaught Error"}}, |
| 1525 }; | 1507 }; |
| 1526 | 1508 |
| 1527 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1509 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1528 for (size_t i = 0; i < num_snippets; i++) { | |
| 1529 ScopedVector<char> script(1024); | 1510 ScopedVector<char> script(1024); |
| 1530 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1511 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1531 snippets[i].code_snippet, kFunctionName); | 1512 snippets[i].code_snippet, kFunctionName); |
| 1532 | 1513 |
| 1533 BytecodeGraphTester tester(isolate, zone, script.start()); | 1514 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1534 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); | 1515 v8::Local<v8::String> message = tester.CheckThrowsReturnMessage()->Get(); |
| 1535 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); | 1516 v8::Local<v8::String> expected_string = v8_str(snippets[i].return_value()); |
| 1536 CHECK( | 1517 CHECK( |
| 1537 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) | 1518 message->Equals(CcTest::isolate()->GetCurrentContext(), expected_string) |
| 1538 .FromJust()); | 1519 .FromJust()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1580 " var innerMostFunc = function() {return x + innerFunc();};" | 1561 " var innerMostFunc = function() {return x + innerFunc();};" |
| 1581 " }" | 1562 " }" |
| 1582 " x = 'inner_changed ';" | 1563 " x = 'inner_changed ';" |
| 1583 " }" | 1564 " }" |
| 1584 " return(innerMostFunc() + x);" | 1565 " return(innerMostFunc() + x);" |
| 1585 "}" | 1566 "}" |
| 1586 "f();", | 1567 "f();", |
| 1587 {factory->NewStringFromStaticChars("innermost inner_changed outer")}}, | 1568 {factory->NewStringFromStaticChars("innermost inner_changed outer")}}, |
| 1588 }; | 1569 }; |
| 1589 | 1570 |
| 1590 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1571 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1591 for (size_t i = 0; i < num_snippets; i++) { | |
| 1592 ScopedVector<char> script(1024); | 1572 ScopedVector<char> script(1024); |
| 1593 SNPrintF(script, "%s", snippets[i].code_snippet); | 1573 SNPrintF(script, "%s", snippets[i].code_snippet); |
| 1594 | 1574 |
| 1595 BytecodeGraphTester tester(isolate, zone, script.start(), "f"); | 1575 BytecodeGraphTester tester(isolate, zone, script.start(), "f"); |
| 1596 auto callable = tester.GetCallable<>("f"); | 1576 auto callable = tester.GetCallable<>("f"); |
| 1597 Handle<Object> return_value = callable().ToHandleChecked(); | 1577 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1598 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1578 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1599 } | 1579 } |
| 1600 } | 1580 } |
| 1601 | 1581 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1646 {"function testOuter(outerArg) {" | 1626 {"function testOuter(outerArg) {" |
| 1647 " var outerVar = outerArg * 2;" | 1627 " var outerVar = outerArg * 2;" |
| 1648 " this.testinnerFunc = function testInner(innerArg) {" | 1628 " this.testinnerFunc = function testInner(innerArg) {" |
| 1649 " outerVar = outerVar + innerArg; return outerVar;" | 1629 " outerVar = outerVar + innerArg; return outerVar;" |
| 1650 " }" | 1630 " }" |
| 1651 "}" | 1631 "}" |
| 1652 "var f = new testOuter(10).testinnerFunc;" | 1632 "var f = new testOuter(10).testinnerFunc;" |
| 1653 "f(0);", | 1633 "f(0);", |
| 1654 {factory->NewNumberFromInt(24), factory->NewNumberFromInt(4)}}}; | 1634 {factory->NewNumberFromInt(24), factory->NewNumberFromInt(4)}}}; |
| 1655 | 1635 |
| 1656 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1636 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1657 for (size_t i = 0; i < num_snippets; i++) { | |
| 1658 ScopedVector<char> script(1024); | 1637 ScopedVector<char> script(1024); |
| 1659 SNPrintF(script, "%s", snippets[i].code_snippet); | 1638 SNPrintF(script, "%s", snippets[i].code_snippet); |
| 1660 | 1639 |
| 1661 BytecodeGraphTester tester(isolate, zone, script.start(), "*"); | 1640 BytecodeGraphTester tester(isolate, zone, script.start(), "*"); |
| 1662 auto callable = tester.GetCallable<Handle<Object>>("f"); | 1641 auto callable = tester.GetCallable<Handle<Object>>("f"); |
| 1663 Handle<Object> return_value = | 1642 Handle<Object> return_value = |
| 1664 callable(snippets[i].parameter(0)).ToHandleChecked(); | 1643 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 1665 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1644 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1666 } | 1645 } |
| 1667 } | 1646 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1679 {"function f() {'use strict'; return arguments[0];}", | 1658 {"function f() {'use strict'; return arguments[0];}", |
| 1680 {factory->undefined_value()}}, | 1659 {factory->undefined_value()}}, |
| 1681 {"function f(a) {'use strict'; return arguments[0];}", | 1660 {"function f(a) {'use strict'; return arguments[0];}", |
| 1682 {factory->undefined_value()}}, | 1661 {factory->undefined_value()}}, |
| 1683 {"function f(...restArgs) {return restArgs[0];}", | 1662 {"function f(...restArgs) {return restArgs[0];}", |
| 1684 {factory->undefined_value()}}, | 1663 {factory->undefined_value()}}, |
| 1685 {"function f(a, ...restArgs) {return restArgs[0];}", | 1664 {"function f(a, ...restArgs) {return restArgs[0];}", |
| 1686 {factory->undefined_value()}}, | 1665 {factory->undefined_value()}}, |
| 1687 }; | 1666 }; |
| 1688 | 1667 |
| 1689 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1668 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1690 for (size_t i = 0; i < num_snippets; i++) { | |
| 1691 ScopedVector<char> script(1024); | 1669 ScopedVector<char> script(1024); |
| 1692 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1670 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
| 1693 | 1671 |
| 1694 BytecodeGraphTester tester(isolate, zone, script.start()); | 1672 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1695 auto callable = tester.GetCallable<>(); | 1673 auto callable = tester.GetCallable<>(); |
| 1696 Handle<Object> return_value = callable().ToHandleChecked(); | 1674 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1697 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1675 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1698 } | 1676 } |
| 1699 } | 1677 } |
| 1700 | 1678 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1723 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1701 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1724 {"function f(a, b, c) {'use strict'; b = c; return arguments[1];}", | 1702 {"function f(a, b, c) {'use strict'; b = c; return arguments[1];}", |
| 1725 {factory->NewNumberFromInt(2), factory->NewNumberFromInt(1), | 1703 {factory->NewNumberFromInt(2), factory->NewNumberFromInt(1), |
| 1726 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1704 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1727 {"function inline_func(a, b) { return arguments[0] }" | 1705 {"function inline_func(a, b) { return arguments[0] }" |
| 1728 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", | 1706 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", |
| 1729 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), | 1707 {factory->NewNumberFromInt(3), factory->NewNumberFromInt(1), |
| 1730 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, | 1708 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, |
| 1731 }; | 1709 }; |
| 1732 | 1710 |
| 1733 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1711 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1734 for (size_t i = 0; i < num_snippets; i++) { | |
| 1735 ScopedVector<char> script(1024); | 1712 ScopedVector<char> script(1024); |
| 1736 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1713 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
| 1737 | 1714 |
| 1738 BytecodeGraphTester tester(isolate, zone, script.start()); | 1715 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1739 auto callable = | 1716 auto callable = |
| 1740 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1717 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
| 1741 Handle<Object> return_value = | 1718 Handle<Object> return_value = |
| 1742 callable(snippets[i].parameter(0), snippets[i].parameter(1), | 1719 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
| 1743 snippets[i].parameter(2)) | 1720 snippets[i].parameter(2)) |
| 1744 .ToHandleChecked(); | 1721 .ToHandleChecked(); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1767 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1744 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1768 {"function f(a, ...restArgs) { return arguments[0] + restArgs[1];}", | 1745 {"function f(a, ...restArgs) { return arguments[0] + restArgs[1];}", |
| 1769 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(1), | 1746 {factory->NewNumberFromInt(4), factory->NewNumberFromInt(1), |
| 1770 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, | 1747 factory->NewNumberFromInt(2), factory->NewNumberFromInt(3)}}, |
| 1771 {"function inline_func(a, ...restArgs) { return restArgs[0] }" | 1748 {"function inline_func(a, ...restArgs) { return restArgs[0] }" |
| 1772 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", | 1749 "function f(a, b, c) {return inline_func(b, c) + arguments[0];}", |
| 1773 {factory->NewNumberFromInt(31), factory->NewNumberFromInt(1), | 1750 {factory->NewNumberFromInt(31), factory->NewNumberFromInt(1), |
| 1774 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, | 1751 factory->NewNumberFromInt(2), factory->NewNumberFromInt(30)}}, |
| 1775 }; | 1752 }; |
| 1776 | 1753 |
| 1777 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1754 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1778 for (size_t i = 0; i < num_snippets; i++) { | |
| 1779 ScopedVector<char> script(1024); | 1755 ScopedVector<char> script(1024); |
| 1780 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); | 1756 SNPrintF(script, "%s\n%s();", snippets[i].code_snippet, kFunctionName); |
| 1781 | 1757 |
| 1782 BytecodeGraphTester tester(isolate, zone, script.start()); | 1758 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1783 auto callable = | 1759 auto callable = |
| 1784 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); | 1760 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); |
| 1785 Handle<Object> return_value = | 1761 Handle<Object> return_value = |
| 1786 callable(snippets[i].parameter(0), snippets[i].parameter(1), | 1762 callable(snippets[i].parameter(0), snippets[i].parameter(1), |
| 1787 snippets[i].parameter(2)) | 1763 snippets[i].parameter(2)) |
| 1788 .ToHandleChecked(); | 1764 .ToHandleChecked(); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1806 {factory->NewStringFromStaticChars("abbd")}}, | 1782 {factory->NewStringFromStaticChars("abbd")}}, |
| 1807 {"return /ab+d/.exec('cccabbdd')[1];", {factory->undefined_value()}}, | 1783 {"return /ab+d/.exec('cccabbdd')[1];", {factory->undefined_value()}}, |
| 1808 {"return /AbC/i.exec('ssaBC')[0];", | 1784 {"return /AbC/i.exec('ssaBC')[0];", |
| 1809 {factory->NewStringFromStaticChars("aBC")}}, | 1785 {factory->NewStringFromStaticChars("aBC")}}, |
| 1810 {"return 'ssaBC'.match(/AbC/i)[0];", | 1786 {"return 'ssaBC'.match(/AbC/i)[0];", |
| 1811 {factory->NewStringFromStaticChars("aBC")}}, | 1787 {factory->NewStringFromStaticChars("aBC")}}, |
| 1812 {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];", | 1788 {"return 'ssaBCtAbC'.match(/(AbC)/gi)[1];", |
| 1813 {factory->NewStringFromStaticChars("AbC")}}, | 1789 {factory->NewStringFromStaticChars("AbC")}}, |
| 1814 }; | 1790 }; |
| 1815 | 1791 |
| 1816 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1792 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1817 for (size_t i = 0; i < num_snippets; i++) { | |
| 1818 ScopedVector<char> script(4096); | 1793 ScopedVector<char> script(4096); |
| 1819 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1794 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1820 snippets[i].code_snippet, kFunctionName); | 1795 snippets[i].code_snippet, kFunctionName); |
| 1821 | 1796 |
| 1822 BytecodeGraphTester tester(isolate, zone, script.start()); | 1797 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1823 auto callable = tester.GetCallable<>(); | 1798 auto callable = tester.GetCallable<>(); |
| 1824 Handle<Object> return_value = callable().ToHandleChecked(); | 1799 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1825 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1800 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1826 } | 1801 } |
| 1827 } | 1802 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1847 REPEAT_256(SPACE, "a = 9.34;") | 1822 REPEAT_256(SPACE, "a = 9.34;") |
| 1848 "return [a, ++a, a + 2, a + 3][2];", | 1823 "return [a, ++a, a + 2, a + 3][2];", |
| 1849 {factory->NewHeapNumber(12.34)}}, | 1824 {factory->NewHeapNumber(12.34)}}, |
| 1850 {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];", | 1825 {"return [[1, 2, 3], ['a', 'b', 'c']][1][0];", |
| 1851 {factory->NewStringFromStaticChars("a")}}, | 1826 {factory->NewStringFromStaticChars("a")}}, |
| 1852 {"var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];", | 1827 {"var t = 't'; return [[t, t + 'est'], [1 + t]][0][1];", |
| 1853 {factory->NewStringFromStaticChars("test")}}, | 1828 {factory->NewStringFromStaticChars("test")}}, |
| 1854 {"var t = 't'; return [[t, t + 'est'], [1 + t]][1][0];", | 1829 {"var t = 't'; return [[t, t + 'est'], [1 + t]][1][0];", |
| 1855 {factory->NewStringFromStaticChars("1t")}}}; | 1830 {factory->NewStringFromStaticChars("1t")}}}; |
| 1856 | 1831 |
| 1857 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1832 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1858 for (size_t i = 0; i < num_snippets; i++) { | |
| 1859 ScopedVector<char> script(4096); | 1833 ScopedVector<char> script(4096); |
| 1860 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1834 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1861 snippets[i].code_snippet, kFunctionName); | 1835 snippets[i].code_snippet, kFunctionName); |
| 1862 | 1836 |
| 1863 BytecodeGraphTester tester(isolate, zone, script.start()); | 1837 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1864 auto callable = tester.GetCallable<>(); | 1838 auto callable = tester.GetCallable<>(); |
| 1865 Handle<Object> return_value = callable().ToHandleChecked(); | 1839 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1866 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1840 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1867 } | 1841 } |
| 1868 } | 1842 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1913 {factory->NewStringFromStaticChars("testing")}}, | 1887 {factory->NewStringFromStaticChars("testing")}}, |
| 1914 {"var a = 'proto_str';\n" | 1888 {"var a = 'proto_str';\n" |
| 1915 "var b = { [a]: 1, __proto__: { var : a } };\n" | 1889 "var b = { [a]: 1, __proto__: { var : a } };\n" |
| 1916 "return Object.getPrototypeOf(b).var", | 1890 "return Object.getPrototypeOf(b).var", |
| 1917 {factory->NewStringFromStaticChars("proto_str")}}, | 1891 {factory->NewStringFromStaticChars("proto_str")}}, |
| 1918 {"var n = 'name';\n" | 1892 {"var n = 'name';\n" |
| 1919 "return { [n]: 'val', get a() { return 987 } }['a'];", | 1893 "return { [n]: 'val', get a() { return 987 } }['a'];", |
| 1920 {factory->NewNumberFromInt(987)}}, | 1894 {factory->NewNumberFromInt(987)}}, |
| 1921 }; | 1895 }; |
| 1922 | 1896 |
| 1923 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 1897 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1924 for (size_t i = 0; i < num_snippets; i++) { | |
| 1925 ScopedVector<char> script(4096); | 1898 ScopedVector<char> script(4096); |
| 1926 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 1899 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 1927 snippets[i].code_snippet, kFunctionName); | 1900 snippets[i].code_snippet, kFunctionName); |
| 1928 BytecodeGraphTester tester(isolate, zone, script.start()); | 1901 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 1929 auto callable = tester.GetCallable<>(); | 1902 auto callable = tester.GetCallable<>(); |
| 1930 Handle<Object> return_value = callable().ToHandleChecked(); | 1903 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1931 CHECK(return_value->SameValue(*snippets[i].return_value())); | 1904 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 1932 } | 1905 } |
| 1933 } | 1906 } |
| 1934 | 1907 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2022 " x = 4; d = 2;" | 1995 " x = 4; d = 2;" |
| 2023 "} else {\n" | 1996 "} else {\n" |
| 2024 " d = 3;\n" | 1997 " d = 3;\n" |
| 2025 "}" | 1998 "}" |
| 2026 "x = d;" | 1999 "x = d;" |
| 2027 "function f1() {x}" | 2000 "function f1() {x}" |
| 2028 "return x + c;", | 2001 "return x + c;", |
| 2029 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(-1)}}, | 2002 {factory->NewNumberFromInt(5), factory->NewNumberFromInt(-1)}}, |
| 2030 }; | 2003 }; |
| 2031 | 2004 |
| 2032 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 2005 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2033 for (size_t i = 0; i < num_snippets; i++) { | |
| 2034 ScopedVector<char> script(2048); | 2006 ScopedVector<char> script(2048); |
| 2035 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2007 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
| 2036 snippets[i].code_snippet, kFunctionName); | 2008 snippets[i].code_snippet, kFunctionName); |
| 2037 | 2009 |
| 2038 BytecodeGraphTester tester(isolate, zone, script.start()); | 2010 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 2039 auto callable = tester.GetCallable<Handle<Object>>(); | 2011 auto callable = tester.GetCallable<Handle<Object>>(); |
| 2040 Handle<Object> return_value = | 2012 Handle<Object> return_value = |
| 2041 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2013 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 2042 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2014 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 2043 } | 2015 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2054 {"return (p1 > 1) ? 1 : -1;", | 2026 {"return (p1 > 1) ? 1 : -1;", |
| 2055 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, | 2027 {factory->NewNumberFromInt(1), factory->NewNumberFromInt(2)}}, |
| 2056 {"return (p1 > 1) ? 1 : -1;", | 2028 {"return (p1 > 1) ? 1 : -1;", |
| 2057 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(0)}}, | 2029 {factory->NewNumberFromInt(-1), factory->NewNumberFromInt(0)}}, |
| 2058 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", | 2030 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", |
| 2059 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(2)}}, | 2031 {factory->NewNumberFromInt(10), factory->NewNumberFromInt(2)}}, |
| 2060 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", | 2032 {"return (p1 > 50) ? 1 : ((p1 < 10) ? 10 : -10);", |
| 2061 {factory->NewNumberFromInt(-10), factory->NewNumberFromInt(20)}}, | 2033 {factory->NewNumberFromInt(-10), factory->NewNumberFromInt(20)}}, |
| 2062 }; | 2034 }; |
| 2063 | 2035 |
| 2064 size_t num_snippets = sizeof(snippets) / sizeof(snippets[0]); | 2036 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2065 for (size_t i = 0; i < num_snippets; i++) { | |
| 2066 ScopedVector<char> script(2048); | 2037 ScopedVector<char> script(2048); |
| 2067 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, | 2038 SNPrintF(script, "function %s(p1) { %s };\n%s(0);", kFunctionName, |
| 2068 snippets[i].code_snippet, kFunctionName); | 2039 snippets[i].code_snippet, kFunctionName); |
| 2069 | 2040 |
| 2070 BytecodeGraphTester tester(isolate, zone, script.start()); | 2041 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 2071 auto callable = tester.GetCallable<Handle<Object>>(); | 2042 auto callable = tester.GetCallable<Handle<Object>>(); |
| 2072 Handle<Object> return_value = | 2043 Handle<Object> return_value = |
| 2073 callable(snippets[i].parameter(0)).ToHandleChecked(); | 2044 callable(snippets[i].parameter(0)).ToHandleChecked(); |
| 2074 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2045 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 2075 } | 2046 } |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2598 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, | 2569 SNPrintF(script, "function %s() { %s }\n%s();", kFunctionName, |
| 2599 snippets[i].code_snippet, kFunctionName); | 2570 snippets[i].code_snippet, kFunctionName); |
| 2600 | 2571 |
| 2601 BytecodeGraphTester tester(isolate, zone, script.start()); | 2572 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 2602 auto callable = tester.GetCallable<>(); | 2573 auto callable = tester.GetCallable<>(); |
| 2603 Handle<Object> return_value = callable().ToHandleChecked(); | 2574 Handle<Object> return_value = callable().ToHandleChecked(); |
| 2604 CHECK(return_value->SameValue(*snippets[i].return_value())); | 2575 CHECK(return_value->SameValue(*snippets[i].return_value())); |
| 2605 } | 2576 } |
| 2606 } | 2577 } |
| 2607 | 2578 |
| 2608 | 2579 void TestJumpWithConstantsAndWideConstants(size_t shard) { |
| 2609 TEST(JumpWithConstantsAndWideConstants) { | 2580 const int kStep = 46; |
| 2610 const int kStep = 19; | 2581 int start = static_cast<int>(7 + 17 * shard); |
| 2611 int start = 7; | 2582 for (int constants = start; constants < 300; constants += kStep) { |
| 2612 for (int constants = start; constants < 256 + 3 * kStep; constants += kStep) { | |
| 2613 std::stringstream filler_os; | 2583 std::stringstream filler_os; |
| 2614 // Generate a string that consumes constant pool entries and | 2584 // Generate a string that consumes constant pool entries and |
| 2615 // spread out branch distances in script below. | 2585 // spread out branch distances in script below. |
| 2616 for (int i = 0; i < constants; i++) { | 2586 for (int i = 0; i < constants; i++) { |
| 2617 filler_os << "var x_ = 'x_" << i << "';\n"; | 2587 filler_os << "var x_ = 'x_" << i << "';\n"; |
| 2618 } | 2588 } |
| 2619 std::string filler(filler_os.str()); | 2589 std::string filler(filler_os.str()); |
| 2620 | 2590 |
| 2621 std::stringstream script_os; | 2591 std::stringstream script_os; |
| 2622 script_os << "function " << kFunctionName << "(a) {\n"; | 2592 script_os << "function " << kFunctionName << "(a) {\n"; |
| 2623 script_os << " " << filler; | 2593 script_os << " " << filler; |
| 2624 script_os << " for (var i = a; i < 2; i++) {\n"; | 2594 script_os << " for (var i = a; i < 2; i++) {\n"; |
| 2625 script_os << " " << filler; | 2595 script_os << " " << filler; |
| 2626 script_os << " if (i == 0) { " << filler << "i = 10; continue; }\n"; | 2596 script_os << " if (i == 0) { " << filler << "i = 10; continue; }\n"; |
| 2627 script_os << " else if (i == a) { " << filler << "i = 12; break; }\n"; | 2597 script_os << " else if (i == a) { " << filler << "i = 12; break; }\n"; |
| 2628 script_os << " else { " << filler << " }\n"; | 2598 script_os << " else { " << filler << " }\n"; |
| 2629 script_os << " }\n"; | 2599 script_os << " }\n"; |
| 2630 script_os << " return i;\n"; | 2600 script_os << " return i;\n"; |
| 2631 script_os << "}\n"; | 2601 script_os << "}\n"; |
| 2632 script_os << kFunctionName << "(0);\n"; | 2602 script_os << kFunctionName << "(0);\n"; |
| 2633 std::string script(script_os.str()); | 2603 std::string script(script_os.str()); |
| 2634 | 2604 |
| 2635 HandleAndZoneScope scope; | 2605 HandleAndZoneScope scope; |
| 2636 auto isolate = scope.main_isolate(); | 2606 auto isolate = scope.main_isolate(); |
| 2637 auto factory = isolate->factory(); | 2607 auto factory = isolate->factory(); |
| 2638 auto zone = scope.main_zone(); | 2608 auto zone = scope.main_zone(); |
| 2609 BytecodeGraphTester tester(isolate, zone, script.c_str()); | |
| 2610 auto callable = tester.GetCallable<Handle<Object>>(); | |
|
rmcilroy
2016/02/16 14:06:56
Thanks for spotting this.
| |
| 2639 for (int a = 0; a < 3; a++) { | 2611 for (int a = 0; a < 3; a++) { |
| 2640 BytecodeGraphTester tester(isolate, zone, script.c_str()); | |
| 2641 auto callable = tester.GetCallable<Handle<Object>>(); | |
| 2642 Handle<Object> return_val = | 2612 Handle<Object> return_val = |
| 2643 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); | 2613 callable(factory->NewNumberFromInt(a)).ToHandleChecked(); |
| 2644 static const int results[] = {11, 12, 2}; | 2614 static const int results[] = {11, 12, 2}; |
| 2645 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); | 2615 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), results[a]); |
| 2646 } | 2616 } |
| 2647 } | 2617 } |
| 2648 } | 2618 } |
| 2649 | 2619 |
| 2620 SHARD_TEST_BY_4(JumpWithConstantsAndWideConstants) | |
| 2621 | |
| 2650 TEST(BytecodeGraphBuilderDoExpressions) { | 2622 TEST(BytecodeGraphBuilderDoExpressions) { |
| 2651 bool old_flag = FLAG_harmony_do_expressions; | 2623 bool old_flag = FLAG_harmony_do_expressions; |
| 2652 FLAG_harmony_do_expressions = true; | 2624 FLAG_harmony_do_expressions = true; |
| 2653 HandleAndZoneScope scope; | 2625 HandleAndZoneScope scope; |
| 2654 Isolate* isolate = scope.main_isolate(); | 2626 Isolate* isolate = scope.main_isolate(); |
| 2655 Zone* zone = scope.main_zone(); | 2627 Zone* zone = scope.main_zone(); |
| 2656 Factory* factory = isolate->factory(); | 2628 Factory* factory = isolate->factory(); |
| 2657 ExpectedSnippet<0> snippets[] = { | 2629 ExpectedSnippet<0> snippets[] = { |
| 2658 {"var a = do {}; return a;", {factory->undefined_value()}}, | 2630 {"var a = do {}; return a;", {factory->undefined_value()}}, |
| 2659 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, | 2631 {"var a = do { var x = 100; }; return a;", {factory->undefined_value()}}, |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3003 | 2975 |
| 3004 BytecodeGraphTester tester(isolate, zone, script.start()); | 2976 BytecodeGraphTester tester(isolate, zone, script.start()); |
| 3005 auto callable = tester.GetCallable<>(); | 2977 auto callable = tester.GetCallable<>(); |
| 3006 Handle<Object> return_value = callable().ToHandleChecked(); | 2978 Handle<Object> return_value = callable().ToHandleChecked(); |
| 3007 CHECK(return_value->SameValue(*snippet.return_value())); | 2979 CHECK(return_value->SameValue(*snippet.return_value())); |
| 3008 } | 2980 } |
| 3009 | 2981 |
| 3010 } // namespace compiler | 2982 } // namespace compiler |
| 3011 } // namespace internal | 2983 } // namespace internal |
| 3012 } // namespace v8 | 2984 } // namespace v8 |
| OLD | NEW |