Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/base/utils/random-number-generator.h" | 5 #include "src/base/utils/random-number-generator.h" |
| 6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
| 8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
| 9 #include "src/isolate.h" | 9 #include "src/isolate.h" |
| 10 #include "test/cctest/compiler/code-assembler-tester.h" | 10 #include "test/cctest/compiler/code-assembler-tester.h" |
| 11 #include "test/cctest/compiler/function-tester.h" | 11 #include "test/cctest/compiler/function-tester.h" |
| 12 | 12 |
| 13 namespace v8 { | 13 namespace v8 { |
| 14 namespace internal { | 14 namespace internal { |
| 15 | 15 |
| 16 using compiler::CodeAssemblerTester; | 16 using compiler::CodeAssemblerTester; |
| 17 using compiler::FunctionTester; | 17 using compiler::FunctionTester; |
| 18 using compiler::Node; | 18 using compiler::Node; |
| 19 using compiler::CodeAssemblerLabel; | |
| 20 using compiler::CodeAssemblerVariable; | |
| 21 using compiler::CodeAssemblerVariableList; | |
| 19 | 22 |
| 20 TEST(FixedArrayAccessSmiIndex) { | 23 TEST(FixedArrayAccessSmiIndex) { |
| 21 Isolate* isolate(CcTest::InitIsolateOnce()); | 24 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 22 CodeAssemblerTester data(isolate); | 25 CodeAssemblerTester data(isolate); |
| 23 CodeStubAssembler m(data.state()); | 26 CodeStubAssembler m(data.state()); |
| 24 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); | 27 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); |
| 25 array->set(4, Smi::FromInt(733)); | 28 array->set(4, Smi::FromInt(733)); |
| 26 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array), | 29 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array), |
| 27 m.SmiTag(m.Int32Constant(4)), 0, | 30 m.SmiTag(m.Int32Constant(4)), 0, |
| 28 CodeStubAssembler::SMI_PARAMETERS)); | 31 CodeStubAssembler::SMI_PARAMETERS)); |
| 29 Handle<Code> code = data.GenerateCode(); | 32 Handle<Code> code = data.GenerateCode(); |
| 30 FunctionTester ft(code); | 33 FunctionTester ft(code); |
| 31 MaybeHandle<Object> result = ft.Call(); | 34 MaybeHandle<Object> result = ft.Call(); |
| 32 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 35 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 33 } | 36 } |
| 34 | 37 |
| 35 TEST(LoadHeapNumberValue) { | 38 TEST(LoadHeapNumberValue) { |
| 36 Isolate* isolate(CcTest::InitIsolateOnce()); | 39 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 37 CodeAssemblerTester data(isolate); | 40 CodeAssemblerTester data(isolate); |
| 38 CodeStubAssembler m(data.state()); | 41 CodeStubAssembler m(data.state()); |
| 39 Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234); | 42 Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234); |
| 40 m.Return(m.SmiTag( | 43 m.Return(m.SmiFromWord32( |
| 41 m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number))))); | 44 m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number))))); |
| 42 Handle<Code> code = data.GenerateCode(); | 45 Handle<Code> code = data.GenerateCode(); |
| 43 FunctionTester ft(code); | 46 FunctionTester ft(code); |
| 44 MaybeHandle<Object> result = ft.Call(); | 47 MaybeHandle<Object> result = ft.Call(); |
| 45 CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 48 CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 46 } | 49 } |
| 47 | 50 |
| 48 TEST(LoadInstanceType) { | 51 TEST(LoadInstanceType) { |
| 49 Isolate* isolate(CcTest::InitIsolateOnce()); | 52 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 50 CodeAssemblerTester data(isolate); | 53 CodeAssemblerTester data(isolate); |
| 51 CodeStubAssembler m(data.state()); | 54 CodeStubAssembler m(data.state()); |
| 52 Handle<HeapObject> undefined = isolate->factory()->undefined_value(); | 55 Handle<HeapObject> undefined = isolate->factory()->undefined_value(); |
| 53 m.Return(m.SmiTag(m.LoadInstanceType(m.HeapConstant(undefined)))); | 56 m.Return(m.SmiFromWord32(m.LoadInstanceType(m.HeapConstant(undefined)))); |
| 54 Handle<Code> code = data.GenerateCode(); | 57 Handle<Code> code = data.GenerateCode(); |
| 55 FunctionTester ft(code); | 58 FunctionTester ft(code); |
| 56 MaybeHandle<Object> result = ft.Call(); | 59 MaybeHandle<Object> result = ft.Call(); |
| 57 CHECK_EQ(InstanceType::ODDBALL_TYPE, | 60 CHECK_EQ(InstanceType::ODDBALL_TYPE, |
| 58 Handle<Smi>::cast(result.ToHandleChecked())->value()); | 61 Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 59 } | 62 } |
| 60 | 63 |
| 61 TEST(DecodeWordFromWord32) { | 64 TEST(DecodeWordFromWord32) { |
| 62 Isolate* isolate(CcTest::InitIsolateOnce()); | 65 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 63 CodeAssemblerTester data(isolate); | 66 CodeAssemblerTester data(isolate); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 91 handle(Smi::FromInt(34), isolate)); | 94 handle(Smi::FromInt(34), isolate)); |
| 92 CHECK_EQ(57, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 95 CHECK_EQ(57, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 93 } | 96 } |
| 94 | 97 |
| 95 TEST(ComputeIntegerHash) { | 98 TEST(ComputeIntegerHash) { |
| 96 Isolate* isolate(CcTest::InitIsolateOnce()); | 99 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 97 const int kNumParams = 2; | 100 const int kNumParams = 2; |
| 98 CodeAssemblerTester data(isolate, kNumParams); | 101 CodeAssemblerTester data(isolate, kNumParams); |
| 99 CodeStubAssembler m(data.state()); | 102 CodeStubAssembler m(data.state()); |
| 100 m.Return(m.SmiFromWord32(m.ComputeIntegerHash( | 103 m.Return(m.SmiFromWord32(m.ComputeIntegerHash( |
| 101 m.SmiToWord32(m.Parameter(0)), m.SmiToWord32(m.Parameter(1))))); | 104 m.SmiUntag(m.Parameter(0)), m.SmiToWord32(m.Parameter(1))))); |
| 102 | 105 |
| 103 Handle<Code> code = data.GenerateCode(); | 106 Handle<Code> code = data.GenerateCode(); |
| 104 FunctionTester ft(code, kNumParams); | 107 FunctionTester ft(code, kNumParams); |
| 105 | 108 |
| 106 Handle<Smi> hash_seed = isolate->factory()->hash_seed(); | 109 Handle<Smi> hash_seed = isolate->factory()->hash_seed(); |
| 107 | 110 |
| 108 base::RandomNumberGenerator rand_gen(FLAG_random_seed); | 111 base::RandomNumberGenerator rand_gen(FLAG_random_seed); |
| 109 | 112 |
| 110 for (int i = 0; i < 1024; i++) { | 113 for (int i = 0; i < 1024; i++) { |
| 111 int k = rand_gen.NextInt(Smi::kMaxValue); | 114 int k = rand_gen.NextInt(Smi::kMaxValue); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 for (int i = 0; i < 4; ++i) { | 214 for (int i = 0; i < 4; ++i) { |
| 212 Handle<String> test = handle(String::cast(test_cases->get(i))); | 215 Handle<String> test = handle(String::cast(test_cases->get(i))); |
| 213 Handle<Object> result = ft.Call(test).ToHandleChecked(); | 216 Handle<Object> result = ft.Call(test).ToHandleChecked(); |
| 214 CHECK(result->IsString()); | 217 CHECK(result->IsString()); |
| 215 CHECK(Handle<String>::cast(result)->IsFlat()); | 218 CHECK(Handle<String>::cast(result)->IsFlat()); |
| 216 CHECK(String::Equals(Handle<String>::cast(result), expected)); | 219 CHECK(String::Equals(Handle<String>::cast(result), expected)); |
| 217 } | 220 } |
| 218 } | 221 } |
| 219 | 222 |
| 220 TEST(TryToName) { | 223 TEST(TryToName) { |
| 221 typedef CodeStubAssembler::Label Label; | 224 typedef CodeAssemblerLabel Label; |
| 222 typedef CodeStubAssembler::Variable Variable; | 225 typedef CodeAssemblerVariable Variable; |
| 223 Isolate* isolate(CcTest::InitIsolateOnce()); | 226 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 224 | 227 |
| 225 const int kNumParams = 3; | 228 const int kNumParams = 3; |
| 226 CodeAssemblerTester data(isolate, kNumParams); | 229 CodeAssemblerTester data(isolate, kNumParams); |
| 227 CodeStubAssembler m(data.state()); | 230 CodeStubAssembler m(data.state()); |
| 228 | 231 |
| 229 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; | 232 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; |
| 230 { | 233 { |
| 231 Node* key = m.Parameter(0); | 234 Node* key = m.Parameter(0); |
| 232 Node* expected_result = m.Parameter(1); | 235 Node* expected_result = m.Parameter(1); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 | 379 |
| 377 TEST(NameDictionaryEntryToIndex) { TestEntryToIndex<NameDictionary>(); } | 380 TEST(NameDictionaryEntryToIndex) { TestEntryToIndex<NameDictionary>(); } |
| 378 TEST(GlobalDictionaryEntryToIndex) { TestEntryToIndex<GlobalDictionary>(); } | 381 TEST(GlobalDictionaryEntryToIndex) { TestEntryToIndex<GlobalDictionary>(); } |
| 379 | 382 |
| 380 } // namespace | 383 } // namespace |
| 381 | 384 |
| 382 namespace { | 385 namespace { |
| 383 | 386 |
| 384 template <typename Dictionary> | 387 template <typename Dictionary> |
| 385 void TestNameDictionaryLookup() { | 388 void TestNameDictionaryLookup() { |
| 386 typedef CodeStubAssembler::Label Label; | 389 typedef CodeAssemblerLabel Label; |
| 387 typedef CodeStubAssembler::Variable Variable; | 390 typedef CodeAssemblerVariable Variable; |
| 388 Isolate* isolate(CcTest::InitIsolateOnce()); | 391 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 389 | 392 |
| 390 const int kNumParams = 4; | 393 const int kNumParams = 4; |
| 391 CodeAssemblerTester data(isolate, kNumParams); | 394 CodeAssemblerTester data(isolate, kNumParams); |
| 392 CodeStubAssembler m(data.state()); | 395 CodeStubAssembler m(data.state()); |
| 393 | 396 |
| 394 enum Result { kFound, kNotFound }; | 397 enum Result { kFound, kNotFound }; |
| 395 { | 398 { |
| 396 Node* dictionary = m.Parameter(0); | 399 Node* dictionary = m.Parameter(0); |
| 397 Node* unique_name = m.Parameter(1); | 400 Node* unique_name = m.Parameter(1); |
| 398 Node* expected_result = m.Parameter(2); | 401 Node* expected_result = m.Parameter(2); |
| 399 Node* expected_arg = m.Parameter(3); | 402 Node* expected_arg = m.Parameter(3); |
| 400 | 403 |
| 401 Label passed(&m), failed(&m); | 404 Label passed(&m), failed(&m); |
| 402 Label if_found(&m), if_not_found(&m); | 405 Label if_found(&m), if_not_found(&m); |
| 403 Variable var_name_index(&m, MachineType::PointerRepresentation()); | 406 Variable var_name_index(&m, MachineType::PointerRepresentation()); |
| 404 | 407 |
| 405 m.NameDictionaryLookup<Dictionary>(dictionary, unique_name, &if_found, | 408 m.NameDictionaryLookup<Dictionary>(dictionary, unique_name, &if_found, |
| 406 &var_name_index, &if_not_found); | 409 &var_name_index, &if_not_found); |
| 407 m.Bind(&if_found); | 410 m.Bind(&if_found); |
| 408 m.GotoUnless( | 411 m.GotoUnless( |
| 409 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kFound))), | 412 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kFound))), |
| 410 &failed); | 413 &failed); |
| 411 m.Branch(m.Word32Equal(m.SmiToWord32(expected_arg), var_name_index.value()), | 414 m.Branch(m.WordEqual(m.SmiUntag(expected_arg), var_name_index.value()), |
| 412 &passed, &failed); | 415 &passed, &failed); |
| 413 | 416 |
| 414 m.Bind(&if_not_found); | 417 m.Bind(&if_not_found); |
| 415 m.Branch( | 418 m.Branch( |
| 416 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), | 419 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), |
| 417 &passed, &failed); | 420 &passed, &failed); |
| 418 | 421 |
| 419 m.Bind(&passed); | 422 m.Bind(&passed); |
| 420 m.Return(m.BooleanConstant(true)); | 423 m.Return(m.BooleanConstant(true)); |
| 421 | 424 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 483 } // namespace | 486 } // namespace |
| 484 | 487 |
| 485 TEST(NameDictionaryLookup) { TestNameDictionaryLookup<NameDictionary>(); } | 488 TEST(NameDictionaryLookup) { TestNameDictionaryLookup<NameDictionary>(); } |
| 486 | 489 |
| 487 TEST(GlobalDictionaryLookup) { TestNameDictionaryLookup<GlobalDictionary>(); } | 490 TEST(GlobalDictionaryLookup) { TestNameDictionaryLookup<GlobalDictionary>(); } |
| 488 | 491 |
| 489 namespace { | 492 namespace { |
| 490 | 493 |
| 491 template <typename Dictionary> | 494 template <typename Dictionary> |
| 492 void TestNumberDictionaryLookup() { | 495 void TestNumberDictionaryLookup() { |
| 493 typedef CodeStubAssembler::Label Label; | 496 typedef CodeAssemblerLabel Label; |
| 494 typedef CodeStubAssembler::Variable Variable; | 497 typedef CodeAssemblerVariable Variable; |
| 495 Isolate* isolate(CcTest::InitIsolateOnce()); | 498 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 496 | 499 |
| 497 const int kNumParams = 4; | 500 const int kNumParams = 4; |
| 498 CodeAssemblerTester data(isolate, kNumParams); | 501 CodeAssemblerTester data(isolate, kNumParams); |
| 499 CodeStubAssembler m(data.state()); | 502 CodeStubAssembler m(data.state()); |
| 500 | 503 |
| 501 enum Result { kFound, kNotFound }; | 504 enum Result { kFound, kNotFound }; |
| 502 { | 505 { |
| 503 Node* dictionary = m.Parameter(0); | 506 Node* dictionary = m.Parameter(0); |
| 504 Node* key = m.SmiToWord32(m.Parameter(1)); | 507 Node* key = m.SmiUntag(m.Parameter(1)); |
| 505 Node* expected_result = m.Parameter(2); | 508 Node* expected_result = m.Parameter(2); |
| 506 Node* expected_arg = m.Parameter(3); | 509 Node* expected_arg = m.Parameter(3); |
| 507 | 510 |
| 508 Label passed(&m), failed(&m); | 511 Label passed(&m), failed(&m); |
| 509 Label if_found(&m), if_not_found(&m); | 512 Label if_found(&m), if_not_found(&m); |
| 510 Variable var_entry(&m, MachineType::PointerRepresentation()); | 513 Variable var_entry(&m, MachineType::PointerRepresentation()); |
| 511 | 514 |
| 512 m.NumberDictionaryLookup<Dictionary>(dictionary, key, &if_found, &var_entry, | 515 m.NumberDictionaryLookup<Dictionary>(dictionary, key, &if_found, &var_entry, |
| 513 &if_not_found); | 516 &if_not_found); |
| 514 m.Bind(&if_found); | 517 m.Bind(&if_found); |
| 515 m.GotoUnless( | 518 m.GotoUnless( |
| 516 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kFound))), | 519 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kFound))), |
| 517 &failed); | 520 &failed); |
| 518 m.Branch(m.Word32Equal(m.SmiToWord32(expected_arg), var_entry.value()), | 521 m.Branch(m.WordEqual(m.SmiUntag(expected_arg), var_entry.value()), &passed, |
| 519 &passed, &failed); | 522 &failed); |
| 520 | 523 |
| 521 m.Bind(&if_not_found); | 524 m.Bind(&if_not_found); |
| 522 m.Branch( | 525 m.Branch( |
| 523 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), | 526 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), |
| 524 &passed, &failed); | 527 &passed, &failed); |
| 525 | 528 |
| 526 m.Bind(&passed); | 529 m.Bind(&passed); |
| 527 m.Return(m.BooleanConstant(true)); | 530 m.Return(m.BooleanConstant(true)); |
| 528 | 531 |
| 529 m.Bind(&failed); | 532 m.Bind(&failed); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 JSObject::DefineAccessor(object, names[i], getter, setter, NONE).Check(); | 625 JSObject::DefineAccessor(object, names[i], getter, setter, NONE).Check(); |
| 623 } else { | 626 } else { |
| 624 JSObject::AddProperty(object, names[i], value, NONE); | 627 JSObject::AddProperty(object, names[i], value, NONE); |
| 625 } | 628 } |
| 626 } | 629 } |
| 627 } | 630 } |
| 628 | 631 |
| 629 } // namespace | 632 } // namespace |
| 630 | 633 |
| 631 TEST(TryHasOwnProperty) { | 634 TEST(TryHasOwnProperty) { |
| 632 typedef CodeStubAssembler::Label Label; | 635 typedef CodeAssemblerLabel Label; |
| 633 Isolate* isolate(CcTest::InitIsolateOnce()); | 636 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 634 | 637 |
| 635 const int kNumParams = 4; | 638 const int kNumParams = 4; |
| 636 CodeAssemblerTester data(isolate, kNumParams); | 639 CodeAssemblerTester data(isolate, kNumParams); |
| 637 CodeStubAssembler m(data.state()); | 640 CodeStubAssembler m(data.state()); |
| 638 | 641 |
| 639 enum Result { kFound, kNotFound, kBailout }; | 642 enum Result { kFound, kNotFound, kBailout }; |
| 640 { | 643 { |
| 641 Node* object = m.Parameter(0); | 644 Node* object = m.Parameter(0); |
| 642 Node* unique_name = m.Parameter(1); | 645 Node* unique_name = m.Parameter(1); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 807 } | 810 } |
| 808 | 811 |
| 809 { | 812 { |
| 810 Handle<JSObject> object = isolate->global_proxy(); | 813 Handle<JSObject> object = isolate->global_proxy(); |
| 811 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); | 814 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); |
| 812 ft.CheckTrue(object, names[0], expect_bailout); | 815 ft.CheckTrue(object, names[0], expect_bailout); |
| 813 } | 816 } |
| 814 } | 817 } |
| 815 | 818 |
| 816 TEST(TryGetOwnProperty) { | 819 TEST(TryGetOwnProperty) { |
| 817 typedef CodeStubAssembler::Label Label; | 820 typedef CodeAssemblerLabel Label; |
| 818 typedef CodeStubAssembler::Variable Variable; | 821 typedef CodeAssemblerVariable Variable; |
| 819 Isolate* isolate(CcTest::InitIsolateOnce()); | 822 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 820 Factory* factory = isolate->factory(); | 823 Factory* factory = isolate->factory(); |
| 821 | 824 |
| 822 const int kNumParams = 2; | 825 const int kNumParams = 2; |
| 823 CodeAssemblerTester data(isolate, kNumParams); | 826 CodeAssemblerTester data(isolate, kNumParams); |
| 824 CodeStubAssembler m(data.state()); | 827 CodeStubAssembler m(data.state()); |
| 825 | 828 |
| 826 Handle<Symbol> not_found_symbol = factory->NewSymbol(); | 829 Handle<Symbol> not_found_symbol = factory->NewSymbol(); |
| 827 Handle<Symbol> bailout_symbol = factory->NewSymbol(); | 830 Handle<Symbol> bailout_symbol = factory->NewSymbol(); |
| 828 { | 831 { |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1026 namespace { | 1029 namespace { |
| 1027 | 1030 |
| 1028 void AddElement(Handle<JSObject> object, uint32_t index, Handle<Object> value, | 1031 void AddElement(Handle<JSObject> object, uint32_t index, Handle<Object> value, |
| 1029 PropertyAttributes attributes = NONE) { | 1032 PropertyAttributes attributes = NONE) { |
| 1030 JSObject::AddDataElement(object, index, value, attributes).ToHandleChecked(); | 1033 JSObject::AddDataElement(object, index, value, attributes).ToHandleChecked(); |
| 1031 } | 1034 } |
| 1032 | 1035 |
| 1033 } // namespace | 1036 } // namespace |
| 1034 | 1037 |
| 1035 TEST(TryLookupElement) { | 1038 TEST(TryLookupElement) { |
| 1036 typedef CodeStubAssembler::Label Label; | 1039 typedef CodeAssemblerLabel Label; |
| 1037 Isolate* isolate(CcTest::InitIsolateOnce()); | 1040 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1038 | 1041 |
| 1039 const int kNumParams = 3; | 1042 const int kNumParams = 3; |
| 1040 CodeAssemblerTester data(isolate, kNumParams); | 1043 CodeAssemblerTester data(isolate, kNumParams); |
| 1041 CodeStubAssembler m(data.state()); | 1044 CodeStubAssembler m(data.state()); |
| 1042 | 1045 |
| 1043 enum Result { kFound, kNotFound, kBailout }; | 1046 enum Result { kFound, kNotFound, kBailout }; |
| 1044 { | 1047 { |
| 1045 Node* object = m.Parameter(0); | 1048 Node* object = m.Parameter(0); |
| 1046 Node* index = m.SmiToWord32(m.Parameter(1)); | 1049 Node* index = m.SmiUntag(m.Parameter(1)); |
| 1047 Node* expected_result = m.Parameter(2); | 1050 Node* expected_result = m.Parameter(2); |
| 1048 | 1051 |
| 1049 Label passed(&m), failed(&m); | 1052 Label passed(&m), failed(&m); |
| 1050 Label if_found(&m), if_not_found(&m), if_bailout(&m); | 1053 Label if_found(&m), if_not_found(&m), if_bailout(&m); |
| 1051 | 1054 |
| 1052 Node* map = m.LoadMap(object); | 1055 Node* map = m.LoadMap(object); |
| 1053 Node* instance_type = m.LoadMapInstanceType(map); | 1056 Node* instance_type = m.LoadMapInstanceType(map); |
| 1054 | 1057 |
| 1055 m.TryLookupElement(object, map, instance_type, index, &if_found, | 1058 m.TryLookupElement(object, map, instance_type, index, &if_found, |
| 1056 &if_not_found, &if_bailout); | 1059 &if_not_found, &if_bailout); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1212 ft.CheckTrue(object, smi0, expect_bailout); | 1215 ft.CheckTrue(object, smi0, expect_bailout); |
| 1213 } | 1216 } |
| 1214 | 1217 |
| 1215 { | 1218 { |
| 1216 Handle<JSObject> object = isolate->global_proxy(); | 1219 Handle<JSObject> object = isolate->global_proxy(); |
| 1217 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); | 1220 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); |
| 1218 ft.CheckTrue(object, smi0, expect_bailout); | 1221 ft.CheckTrue(object, smi0, expect_bailout); |
| 1219 } | 1222 } |
| 1220 } | 1223 } |
| 1221 | 1224 |
| 1222 TEST(DeferredCodePhiHints) { | |
|
Igor Sheludko
2016/12/14 15:45:37
I moved this whole red block to test-code-assemble
| |
| 1223 typedef compiler::Node Node; | |
| 1224 typedef CodeStubAssembler::Label Label; | |
| 1225 typedef CodeStubAssembler::Variable Variable; | |
| 1226 Isolate* isolate(CcTest::InitIsolateOnce()); | |
| 1227 CodeAssemblerTester data(isolate); | |
| 1228 CodeStubAssembler m(data.state()); | |
| 1229 Label block1(&m, Label::kDeferred); | |
| 1230 m.Goto(&block1); | |
| 1231 m.Bind(&block1); | |
| 1232 { | |
| 1233 Variable var_object(&m, MachineRepresentation::kTagged); | |
| 1234 Label loop(&m, &var_object); | |
| 1235 var_object.Bind(m.IntPtrConstant(0)); | |
| 1236 m.Goto(&loop); | |
| 1237 m.Bind(&loop); | |
| 1238 { | |
| 1239 Node* map = m.LoadMap(var_object.value()); | |
| 1240 var_object.Bind(map); | |
| 1241 m.Goto(&loop); | |
| 1242 } | |
| 1243 } | |
| 1244 CHECK(!data.GenerateCode().is_null()); | |
| 1245 } | |
| 1246 | |
| 1247 TEST(TestOutOfScopeVariable) { | |
| 1248 typedef CodeStubAssembler::Label Label; | |
| 1249 typedef CodeStubAssembler::Variable Variable; | |
| 1250 Isolate* isolate(CcTest::InitIsolateOnce()); | |
| 1251 CodeAssemblerTester data(isolate); | |
| 1252 CodeStubAssembler m(data.state()); | |
| 1253 Label block1(&m); | |
| 1254 Label block2(&m); | |
| 1255 Label block3(&m); | |
| 1256 Label block4(&m); | |
| 1257 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block1, &block4); | |
| 1258 m.Bind(&block4); | |
| 1259 { | |
| 1260 Variable var_object(&m, MachineRepresentation::kTagged); | |
| 1261 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block2, | |
| 1262 &block3); | |
| 1263 | |
| 1264 m.Bind(&block2); | |
| 1265 var_object.Bind(m.IntPtrConstant(55)); | |
| 1266 m.Goto(&block1); | |
| 1267 | |
| 1268 m.Bind(&block3); | |
| 1269 var_object.Bind(m.IntPtrConstant(66)); | |
| 1270 m.Goto(&block1); | |
| 1271 } | |
| 1272 m.Bind(&block1); | |
| 1273 CHECK(!data.GenerateCode().is_null()); | |
| 1274 } | |
| 1275 | |
| 1276 TEST(GotoIfException) { | |
| 1277 typedef CodeStubAssembler::Label Label; | |
| 1278 typedef CodeStubAssembler::Variable Variable; | |
| 1279 Isolate* isolate(CcTest::InitIsolateOnce()); | |
| 1280 | |
| 1281 const int kNumParams = 1; | |
| 1282 CodeAssemblerTester data(isolate, kNumParams); | |
| 1283 CodeStubAssembler m(data.state()); | |
| 1284 | |
| 1285 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | |
| 1286 Node* to_string_tag = | |
| 1287 m.HeapConstant(isolate->factory()->to_string_tag_symbol()); | |
| 1288 Variable exception(&m, MachineRepresentation::kTagged); | |
| 1289 | |
| 1290 Label exception_handler(&m); | |
| 1291 Callable to_string = CodeFactory::ToString(isolate); | |
| 1292 Node* string = m.CallStub(to_string, context, to_string_tag); | |
| 1293 m.GotoIfException(string, &exception_handler, &exception); | |
| 1294 m.Return(string); | |
| 1295 | |
| 1296 m.Bind(&exception_handler); | |
| 1297 m.Return(exception.value()); | |
| 1298 | |
| 1299 Handle<Code> code = data.GenerateCode(); | |
| 1300 CHECK(!code.is_null()); | |
| 1301 | |
| 1302 FunctionTester ft(code, kNumParams); | |
| 1303 Handle<Object> result = ft.Call().ToHandleChecked(); | |
| 1304 | |
| 1305 // Should be a TypeError. | |
| 1306 CHECK(result->IsJSObject()); | |
| 1307 | |
| 1308 Handle<Object> constructor = | |
| 1309 Object::GetPropertyOrElement(result, | |
| 1310 isolate->factory()->constructor_string()) | |
| 1311 .ToHandleChecked(); | |
| 1312 CHECK(constructor->SameValue(*isolate->type_error_function())); | |
| 1313 } | |
| 1314 | |
| 1315 TEST(GotoIfExceptionMultiple) { | |
| 1316 typedef CodeStubAssembler::Label Label; | |
| 1317 typedef CodeStubAssembler::Variable Variable; | |
| 1318 Isolate* isolate(CcTest::InitIsolateOnce()); | |
| 1319 | |
| 1320 const int kNumParams = 4; // receiver, first, second, third | |
| 1321 CodeAssemblerTester data(isolate, kNumParams); | |
| 1322 CodeStubAssembler m(data.state()); | |
| 1323 | |
| 1324 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | |
| 1325 Node* first_value = m.Parameter(0); | |
| 1326 Node* second_value = m.Parameter(1); | |
| 1327 Node* third_value = m.Parameter(2); | |
| 1328 | |
| 1329 Label exception_handler1(&m); | |
| 1330 Label exception_handler2(&m); | |
| 1331 Label exception_handler3(&m); | |
| 1332 Variable return_value(&m, MachineRepresentation::kWord32); | |
| 1333 Variable error(&m, MachineRepresentation::kTagged); | |
| 1334 | |
| 1335 return_value.Bind(m.Int32Constant(0)); | |
| 1336 | |
| 1337 // try { return ToString(param1) } catch (e) { ... } | |
| 1338 Callable to_string = CodeFactory::ToString(isolate); | |
| 1339 Node* string = m.CallStub(to_string, context, first_value); | |
| 1340 m.GotoIfException(string, &exception_handler1, &error); | |
| 1341 m.Return(string); | |
| 1342 | |
| 1343 // try { ToString(param2); return 7 } catch (e) { ... } | |
| 1344 m.Bind(&exception_handler1); | |
| 1345 return_value.Bind(m.Int32Constant(7)); | |
| 1346 error.Bind(m.UndefinedConstant()); | |
| 1347 string = m.CallStub(to_string, context, second_value); | |
| 1348 m.GotoIfException(string, &exception_handler2, &error); | |
| 1349 m.Return(m.SmiFromWord32(return_value.value())); | |
| 1350 | |
| 1351 // try { ToString(param3); return 7 & ~2; } catch (e) { return e; } | |
| 1352 m.Bind(&exception_handler2); | |
| 1353 // Return returnValue & ~2 | |
| 1354 error.Bind(m.UndefinedConstant()); | |
| 1355 string = m.CallStub(to_string, context, third_value); | |
| 1356 m.GotoIfException(string, &exception_handler3, &error); | |
| 1357 m.Return(m.SmiFromWord32( | |
| 1358 m.Word32And(return_value.value(), | |
| 1359 m.Word32Xor(m.Int32Constant(2), m.Int32Constant(-1))))); | |
| 1360 | |
| 1361 m.Bind(&exception_handler3); | |
| 1362 m.Return(error.value()); | |
| 1363 | |
| 1364 Handle<Code> code = data.GenerateCode(); | |
| 1365 CHECK(!code.is_null()); | |
| 1366 | |
| 1367 FunctionTester ft(code, kNumParams); | |
| 1368 | |
| 1369 Handle<Object> result; | |
| 1370 // First handler does not throw, returns result of first value. | |
| 1371 result = ft.Call(isolate->factory()->undefined_value(), | |
| 1372 isolate->factory()->to_string_tag_symbol()) | |
| 1373 .ToHandleChecked(); | |
| 1374 CHECK(String::cast(*result)->IsOneByteEqualTo(OneByteVector("undefined"))); | |
| 1375 | |
| 1376 // First handler returns a number. | |
| 1377 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | |
| 1378 isolate->factory()->undefined_value()) | |
| 1379 .ToHandleChecked(); | |
| 1380 CHECK_EQ(7, Smi::cast(*result)->value()); | |
| 1381 | |
| 1382 // First handler throws, second handler returns a number. | |
| 1383 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | |
| 1384 isolate->factory()->to_primitive_symbol()) | |
| 1385 .ToHandleChecked(); | |
| 1386 CHECK_EQ(7 & ~2, Smi::cast(*result)->value()); | |
| 1387 | |
| 1388 // First handler throws, second handler throws, third handler returns thrown | |
| 1389 // value. | |
| 1390 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | |
| 1391 isolate->factory()->to_primitive_symbol(), | |
| 1392 isolate->factory()->unscopables_symbol()) | |
| 1393 .ToHandleChecked(); | |
| 1394 | |
| 1395 // Should be a TypeError. | |
| 1396 CHECK(result->IsJSObject()); | |
| 1397 | |
| 1398 Handle<Object> constructor = | |
| 1399 Object::GetPropertyOrElement(result, | |
| 1400 isolate->factory()->constructor_string()) | |
| 1401 .ToHandleChecked(); | |
| 1402 CHECK(constructor->SameValue(*isolate->type_error_function())); | |
| 1403 } | |
| 1404 | |
| 1405 TEST(AllocateJSObjectFromMap) { | 1225 TEST(AllocateJSObjectFromMap) { |
| 1406 Isolate* isolate(CcTest::InitIsolateOnce()); | 1226 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1407 Factory* factory = isolate->factory(); | 1227 Factory* factory = isolate->factory(); |
| 1408 | 1228 |
| 1409 const int kNumParams = 3; | 1229 const int kNumParams = 3; |
| 1410 CodeAssemblerTester data(isolate, kNumParams); | 1230 CodeAssemblerTester data(isolate, kNumParams); |
| 1411 CodeStubAssembler m(data.state()); | 1231 CodeStubAssembler m(data.state()); |
| 1412 | 1232 |
| 1413 { | 1233 { |
| 1414 Node* map = m.Parameter(0); | 1234 Node* map = m.Parameter(0); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1698 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); | 1518 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); |
| 1699 } | 1519 } |
| 1700 | 1520 |
| 1701 TEST(Arguments) { | 1521 TEST(Arguments) { |
| 1702 Isolate* isolate(CcTest::InitIsolateOnce()); | 1522 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1703 | 1523 |
| 1704 const int kNumParams = 4; | 1524 const int kNumParams = 4; |
| 1705 CodeAssemblerTester data(isolate, kNumParams); | 1525 CodeAssemblerTester data(isolate, kNumParams); |
| 1706 CodeStubAssembler m(data.state()); | 1526 CodeStubAssembler m(data.state()); |
| 1707 | 1527 |
| 1708 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); | 1528 CodeStubArguments arguments(&m, m.Int32Constant(3)); |
| 1709 | 1529 |
| 1710 CSA_ASSERT( | 1530 CSA_ASSERT( |
| 1711 &m, m.WordEqual(arguments.AtIndex(0), m.SmiConstant(Smi::FromInt(12)))); | 1531 &m, m.WordEqual(arguments.AtIndex(0), m.SmiConstant(Smi::FromInt(12)))); |
| 1712 CSA_ASSERT( | 1532 CSA_ASSERT( |
| 1713 &m, m.WordEqual(arguments.AtIndex(1), m.SmiConstant(Smi::FromInt(13)))); | 1533 &m, m.WordEqual(arguments.AtIndex(1), m.SmiConstant(Smi::FromInt(13)))); |
| 1714 CSA_ASSERT( | 1534 CSA_ASSERT( |
| 1715 &m, m.WordEqual(arguments.AtIndex(2), m.SmiConstant(Smi::FromInt(14)))); | 1535 &m, m.WordEqual(arguments.AtIndex(2), m.SmiConstant(Smi::FromInt(14)))); |
| 1716 | 1536 |
| 1717 m.Return(arguments.GetReceiver()); | 1537 m.Return(arguments.GetReceiver()); |
| 1718 | 1538 |
| 1719 Handle<Code> code = data.GenerateCode(); | 1539 Handle<Code> code = data.GenerateCode(); |
| 1720 CHECK(!code.is_null()); | 1540 CHECK(!code.is_null()); |
| 1721 | 1541 |
| 1722 FunctionTester ft(code, kNumParams); | 1542 FunctionTester ft(code, kNumParams); |
| 1723 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), | 1543 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), |
| 1724 Handle<Smi>(Smi::FromInt(12), isolate), | 1544 Handle<Smi>(Smi::FromInt(12), isolate), |
| 1725 Handle<Smi>(Smi::FromInt(13), isolate), | 1545 Handle<Smi>(Smi::FromInt(13), isolate), |
| 1726 Handle<Smi>(Smi::FromInt(14), isolate)) | 1546 Handle<Smi>(Smi::FromInt(14), isolate)) |
| 1727 .ToHandleChecked(); | 1547 .ToHandleChecked(); |
| 1728 CHECK_EQ(*isolate->factory()->undefined_value(), *result); | 1548 CHECK_EQ(*isolate->factory()->undefined_value(), *result); |
| 1729 } | 1549 } |
| 1730 | 1550 |
| 1731 TEST(ArgumentsForEach) { | 1551 TEST(ArgumentsForEach) { |
| 1732 Isolate* isolate(CcTest::InitIsolateOnce()); | 1552 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1733 | 1553 |
| 1734 const int kNumParams = 4; | 1554 const int kNumParams = 4; |
| 1735 CodeAssemblerTester data(isolate, kNumParams); | 1555 CodeAssemblerTester data(isolate, kNumParams); |
| 1736 CodeStubAssembler m(data.state()); | 1556 CodeStubAssembler m(data.state()); |
| 1737 | 1557 |
| 1738 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); | 1558 CodeStubArguments arguments(&m, m.Int32Constant(3)); |
| 1739 | 1559 |
| 1740 CodeStubAssembler::Variable sum(&m, MachineType::PointerRepresentation()); | 1560 CodeAssemblerVariable sum(&m, MachineRepresentation::kTagged); |
| 1741 CodeStubAssembler::VariableList list({&sum}, m.zone()); | 1561 CodeAssemblerVariableList list({&sum}, m.zone()); |
| 1742 | 1562 |
| 1743 sum.Bind(m.IntPtrConstant(0)); | 1563 sum.Bind(m.SmiConstant(0)); |
| 1744 | 1564 |
| 1745 arguments.ForEach( | 1565 arguments.ForEach( |
| 1746 list, [&m, &sum](Node* arg) { sum.Bind(m.IntPtrAdd(sum.value(), arg)); }); | 1566 list, [&m, &sum](Node* arg) { sum.Bind(m.SmiAdd(sum.value(), arg)); }); |
| 1747 | 1567 |
| 1748 m.Return(sum.value()); | 1568 m.Return(sum.value()); |
| 1749 | 1569 |
| 1750 Handle<Code> code = data.GenerateCode(); | 1570 Handle<Code> code = data.GenerateCode(); |
| 1751 CHECK(!code.is_null()); | 1571 CHECK(!code.is_null()); |
| 1752 | 1572 |
| 1753 FunctionTester ft(code, kNumParams); | 1573 FunctionTester ft(code, kNumParams); |
| 1754 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), | 1574 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), |
| 1755 Handle<Smi>(Smi::FromInt(12), isolate), | 1575 Handle<Smi>(Smi::FromInt(12), isolate), |
| 1756 Handle<Smi>(Smi::FromInt(13), isolate), | 1576 Handle<Smi>(Smi::FromInt(13), isolate), |
| 1757 Handle<Smi>(Smi::FromInt(14), isolate)) | 1577 Handle<Smi>(Smi::FromInt(14), isolate)) |
| 1758 .ToHandleChecked(); | 1578 .ToHandleChecked(); |
| 1759 CHECK_EQ(Smi::FromInt(12 + 13 + 14), *result); | 1579 CHECK_EQ(Smi::FromInt(12 + 13 + 14), *result); |
| 1760 } | 1580 } |
| 1761 | 1581 |
| 1762 TEST(IsDebugActive) { | 1582 TEST(IsDebugActive) { |
| 1763 Isolate* isolate(CcTest::InitIsolateOnce()); | 1583 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1764 | 1584 |
| 1765 const int kNumParams = 1; | 1585 const int kNumParams = 1; |
| 1766 CodeAssemblerTester data(isolate, kNumParams); | 1586 CodeAssemblerTester data(isolate, kNumParams); |
| 1767 CodeStubAssembler m(data.state()); | 1587 CodeStubAssembler m(data.state()); |
| 1768 | 1588 |
| 1769 CodeStubAssembler::Label if_active(&m), if_not_active(&m); | 1589 CodeAssemblerLabel if_active(&m), if_not_active(&m); |
| 1770 | 1590 |
| 1771 m.Branch(m.IsDebugActive(), &if_active, &if_not_active); | 1591 m.Branch(m.IsDebugActive(), &if_active, &if_not_active); |
| 1772 m.Bind(&if_active); | 1592 m.Bind(&if_active); |
| 1773 m.Return(m.TrueConstant()); | 1593 m.Return(m.TrueConstant()); |
| 1774 m.Bind(&if_not_active); | 1594 m.Bind(&if_not_active); |
| 1775 m.Return(m.FalseConstant()); | 1595 m.Return(m.FalseConstant()); |
| 1776 | 1596 |
| 1777 Handle<Code> code = data.GenerateCode(); | 1597 Handle<Code> code = data.GenerateCode(); |
| 1778 CHECK(!code.is_null()); | 1598 CHECK(!code.is_null()); |
| 1779 | 1599 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1798 | 1618 |
| 1799 class AppendJSArrayCodeStubAssembler : public CodeStubAssembler { | 1619 class AppendJSArrayCodeStubAssembler : public CodeStubAssembler { |
| 1800 public: | 1620 public: |
| 1801 AppendJSArrayCodeStubAssembler(compiler::CodeAssemblerState* state, | 1621 AppendJSArrayCodeStubAssembler(compiler::CodeAssemblerState* state, |
| 1802 ElementsKind kind) | 1622 ElementsKind kind) |
| 1803 : CodeStubAssembler(state), kind_(kind) {} | 1623 : CodeStubAssembler(state), kind_(kind) {} |
| 1804 | 1624 |
| 1805 void TestAppendJSArrayImpl(Isolate* isolate, CodeAssemblerTester* tester, | 1625 void TestAppendJSArrayImpl(Isolate* isolate, CodeAssemblerTester* tester, |
| 1806 Object* o1, Object* o2, Object* o3, Object* o4, | 1626 Object* o1, Object* o2, Object* o3, Object* o4, |
| 1807 int initial_size, int result_size) { | 1627 int initial_size, int result_size) { |
| 1808 typedef CodeStubAssembler::Variable Variable; | 1628 typedef CodeAssemblerVariable Variable; |
| 1809 typedef CodeStubAssembler::Label Label; | 1629 typedef CodeAssemblerLabel Label; |
| 1810 Handle<JSArray> array = isolate->factory()->NewJSArray( | 1630 Handle<JSArray> array = isolate->factory()->NewJSArray( |
| 1811 kind_, 2, initial_size, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); | 1631 kind_, 2, initial_size, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
| 1812 JSObject::SetElement(isolate, array, 0, | 1632 JSObject::SetElement(isolate, array, 0, |
| 1813 Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY) | 1633 Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY) |
| 1814 .Check(); | 1634 .Check(); |
| 1815 JSObject::SetElement(isolate, array, 1, | 1635 JSObject::SetElement(isolate, array, 1, |
| 1816 Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY) | 1636 Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY) |
| 1817 .Check(); | 1637 .Check(); |
| 1818 CodeStubArguments args(this, IntPtrConstant(kNumParams)); | 1638 CodeStubArguments args(this, Int32Constant(kNumParams)); |
| 1819 Variable arg_index(this, MachineType::PointerRepresentation()); | 1639 Variable arg_index(this, MachineType::PointerRepresentation()); |
| 1820 Label bailout(this); | 1640 Label bailout(this); |
| 1821 arg_index.Bind(IntPtrConstant(0)); | 1641 arg_index.Bind(IntPtrConstant(0)); |
| 1822 Node* length = BuildAppendJSArray( | 1642 Node* length = BuildAppendJSArray( |
| 1823 kind_, HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), | 1643 kind_, HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
| 1824 HeapConstant(array), args, arg_index, &bailout); | 1644 HeapConstant(array), args, arg_index, &bailout); |
| 1825 Return(length); | 1645 Return(length); |
| 1826 | 1646 |
| 1827 Bind(&bailout); | 1647 Bind(&bailout); |
| 1828 Return(SmiTag(IntPtrAdd(arg_index.value(), IntPtrConstant(2)))); | 1648 Return(SmiTag(IntPtrAdd(arg_index.value(), IntPtrConstant(2)))); |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2098 CHECK_EQ(Smi::FromInt(1), promise_info->value()); | 1918 CHECK_EQ(Smi::FromInt(1), promise_info->value()); |
| 2099 CHECK(promise_info->tasks()->IsFixedArray()); | 1919 CHECK(promise_info->tasks()->IsFixedArray()); |
| 2100 CHECK(promise_info->deferred()->IsFixedArray()); | 1920 CHECK(promise_info->deferred()->IsFixedArray()); |
| 2101 CHECK(promise_info->context()->IsContext()); | 1921 CHECK(promise_info->context()->IsContext()); |
| 2102 CHECK(promise_info->debug_id()->IsUndefined(isolate)); | 1922 CHECK(promise_info->debug_id()->IsUndefined(isolate)); |
| 2103 CHECK(promise_info->debug_name()->IsUndefined(isolate)); | 1923 CHECK(promise_info->debug_name()->IsUndefined(isolate)); |
| 2104 } | 1924 } |
| 2105 | 1925 |
| 2106 } // namespace internal | 1926 } // namespace internal |
| 2107 } // namespace v8 | 1927 } // namespace v8 |
| OLD | NEW |