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