| 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/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| 11 #include "test/cctest/compiler/code-assembler-tester.h" | 11 #include "test/cctest/compiler/code-assembler-tester.h" |
| 12 #include "test/cctest/compiler/function-tester.h" | 12 #include "test/cctest/compiler/function-tester.h" |
| 13 | 13 |
| 14 namespace v8 { | 14 namespace v8 { |
| 15 namespace internal { | 15 namespace internal { |
| 16 | 16 |
| 17 using compiler::CodeAssemblerTester; | |
| 18 using compiler::FunctionTester; | 17 using compiler::FunctionTester; |
| 19 using compiler::Node; | 18 using compiler::Node; |
| 20 | 19 |
| 20 typedef compiler::CodeAssemblerTesterImpl<CodeStubAssembler> |
| 21 CodeStubAssemblerTester; |
| 22 |
| 21 TEST(FixedArrayAccessSmiIndex) { | 23 TEST(FixedArrayAccessSmiIndex) { |
| 22 Isolate* isolate(CcTest::InitIsolateOnce()); | 24 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 23 CodeAssemblerTester data(isolate); | 25 VoidDescriptor descriptor(isolate); |
| 24 CodeStubAssembler m(data.state()); | 26 CodeStubAssemblerTester m(isolate, descriptor); |
| 25 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); | 27 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); |
| 26 array->set(4, Smi::FromInt(733)); | 28 array->set(4, Smi::FromInt(733)); |
| 27 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array), | 29 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array), |
| 28 m.SmiTag(m.Int32Constant(4)), 0, | 30 m.SmiTag(m.Int32Constant(4)), 0, |
| 29 CodeStubAssembler::SMI_PARAMETERS)); | 31 CodeStubAssembler::SMI_PARAMETERS)); |
| 30 Handle<Code> code = data.GenerateCode(); | 32 Handle<Code> code = m.GenerateCode(); |
| 31 FunctionTester ft(code); | 33 FunctionTester ft(descriptor, code); |
| 32 MaybeHandle<Object> result = ft.Call(); | 34 MaybeHandle<Object> result = ft.Call(); |
| 33 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 35 CHECK_EQ(733, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 34 } | 36 } |
| 35 | 37 |
| 36 TEST(LoadHeapNumberValue) { | 38 TEST(LoadHeapNumberValue) { |
| 37 Isolate* isolate(CcTest::InitIsolateOnce()); | 39 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 38 CodeAssemblerTester data(isolate); | 40 VoidDescriptor descriptor(isolate); |
| 39 CodeStubAssembler m(data.state()); | 41 CodeStubAssemblerTester m(isolate, descriptor); |
| 40 Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234); | 42 Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234); |
| 41 m.Return(m.SmiTag( | 43 m.Return(m.SmiTag( |
| 42 m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number))))); | 44 m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number))))); |
| 43 Handle<Code> code = data.GenerateCode(); | 45 Handle<Code> code = m.GenerateCode(); |
| 44 FunctionTester ft(code); | 46 FunctionTester ft(descriptor, code); |
| 45 MaybeHandle<Object> result = ft.Call(); | 47 MaybeHandle<Object> result = ft.Call(); |
| 46 CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 48 CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 47 } | 49 } |
| 48 | 50 |
| 49 TEST(LoadInstanceType) { | 51 TEST(LoadInstanceType) { |
| 50 Isolate* isolate(CcTest::InitIsolateOnce()); | 52 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 51 CodeAssemblerTester data(isolate); | 53 VoidDescriptor descriptor(isolate); |
| 52 CodeStubAssembler m(data.state()); | 54 CodeStubAssemblerTester m(isolate, descriptor); |
| 53 Handle<HeapObject> undefined = isolate->factory()->undefined_value(); | 55 Handle<HeapObject> undefined = isolate->factory()->undefined_value(); |
| 54 m.Return(m.SmiTag(m.LoadInstanceType(m.HeapConstant(undefined)))); | 56 m.Return(m.SmiTag(m.LoadInstanceType(m.HeapConstant(undefined)))); |
| 55 Handle<Code> code = data.GenerateCode(); | 57 Handle<Code> code = m.GenerateCode(); |
| 56 FunctionTester ft(code); | 58 FunctionTester ft(descriptor, code); |
| 57 MaybeHandle<Object> result = ft.Call(); | 59 MaybeHandle<Object> result = ft.Call(); |
| 58 CHECK_EQ(InstanceType::ODDBALL_TYPE, | 60 CHECK_EQ(InstanceType::ODDBALL_TYPE, |
| 59 Handle<Smi>::cast(result.ToHandleChecked())->value()); | 61 Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 60 } | 62 } |
| 61 | 63 |
| 62 TEST(DecodeWordFromWord32) { | 64 TEST(DecodeWordFromWord32) { |
| 63 Isolate* isolate(CcTest::InitIsolateOnce()); | 65 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 64 CodeAssemblerTester data(isolate); | 66 VoidDescriptor descriptor(isolate); |
| 65 CodeStubAssembler m(data.state()); | 67 CodeStubAssemblerTester m(isolate, descriptor); |
| 66 | 68 |
| 67 class TestBitField : public BitField<unsigned, 3, 3> {}; | 69 class TestBitField : public BitField<unsigned, 3, 3> {}; |
| 68 m.Return( | 70 m.Return( |
| 69 m.SmiTag(m.DecodeWordFromWord32<TestBitField>(m.Int32Constant(0x2f)))); | 71 m.SmiTag(m.DecodeWordFromWord32<TestBitField>(m.Int32Constant(0x2f)))); |
| 70 Handle<Code> code = data.GenerateCode(); | 72 Handle<Code> code = m.GenerateCode(); |
| 71 FunctionTester ft(code); | 73 FunctionTester ft(descriptor, code); |
| 72 MaybeHandle<Object> result = ft.Call(); | 74 MaybeHandle<Object> result = ft.Call(); |
| 73 // value = 00101111 | 75 // value = 00101111 |
| 74 // mask = 00111000 | 76 // mask = 00111000 |
| 75 // result = 101 | 77 // result = 101 |
| 76 CHECK_EQ(5, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 78 CHECK_EQ(5, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 77 } | 79 } |
| 78 | 80 |
| 79 TEST(JSFunction) { | 81 TEST(JSFunction) { |
| 80 const int kNumParams = 3; // Receiver, left, right. | 82 const int kNumParams = 3; // Receiver, left, right. |
| 81 Isolate* isolate(CcTest::InitIsolateOnce()); | 83 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 82 CodeAssemblerTester data(isolate, kNumParams); | 84 CodeStubAssemblerTester m(isolate, kNumParams); |
| 83 CodeStubAssembler m(data.state()); | |
| 84 m.Return(m.SmiFromWord32(m.Int32Add(m.SmiToWord32(m.Parameter(1)), | 85 m.Return(m.SmiFromWord32(m.Int32Add(m.SmiToWord32(m.Parameter(1)), |
| 85 m.SmiToWord32(m.Parameter(2))))); | 86 m.SmiToWord32(m.Parameter(2))))); |
| 86 | 87 |
| 87 Handle<Code> code = data.GenerateCode(); | 88 Handle<Code> code = m.GenerateCode(); |
| 88 FunctionTester ft(code, kNumParams); | 89 FunctionTester ft(code, kNumParams); |
| 89 | 90 |
| 90 MaybeHandle<Object> result = ft.Call(isolate->factory()->undefined_value(), | 91 MaybeHandle<Object> result = ft.Call(isolate->factory()->undefined_value(), |
| 91 handle(Smi::FromInt(23), isolate), | 92 handle(Smi::FromInt(23), isolate), |
| 92 handle(Smi::FromInt(34), isolate)); | 93 handle(Smi::FromInt(34), isolate)); |
| 93 CHECK_EQ(57, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 94 CHECK_EQ(57, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 94 } | 95 } |
| 95 | 96 |
| 96 TEST(ComputeIntegerHash) { | 97 TEST(ComputeIntegerHash) { |
| 97 Isolate* isolate(CcTest::InitIsolateOnce()); | 98 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 98 const int kNumParams = 2; | 99 const int kNumParams = 2; |
| 99 CodeAssemblerTester data(isolate, kNumParams); | 100 CodeStubAssemblerTester m(isolate, kNumParams); |
| 100 CodeStubAssembler m(data.state()); | |
| 101 m.Return(m.SmiFromWord32(m.ComputeIntegerHash( | 101 m.Return(m.SmiFromWord32(m.ComputeIntegerHash( |
| 102 m.SmiToWord32(m.Parameter(0)), m.SmiToWord32(m.Parameter(1))))); | 102 m.SmiToWord32(m.Parameter(0)), m.SmiToWord32(m.Parameter(1))))); |
| 103 | 103 |
| 104 Handle<Code> code = data.GenerateCode(); | 104 Handle<Code> code = m.GenerateCode(); |
| 105 FunctionTester ft(code, kNumParams); | 105 FunctionTester ft(code, kNumParams); |
| 106 | 106 |
| 107 Handle<Smi> hash_seed = isolate->factory()->hash_seed(); | 107 Handle<Smi> hash_seed = isolate->factory()->hash_seed(); |
| 108 | 108 |
| 109 base::RandomNumberGenerator rand_gen(FLAG_random_seed); | 109 base::RandomNumberGenerator rand_gen(FLAG_random_seed); |
| 110 | 110 |
| 111 for (int i = 0; i < 1024; i++) { | 111 for (int i = 0; i < 1024; i++) { |
| 112 int k = rand_gen.NextInt(Smi::kMaxValue); | 112 int k = rand_gen.NextInt(Smi::kMaxValue); |
| 113 | 113 |
| 114 Handle<Smi> key(Smi::FromInt(k), isolate); | 114 Handle<Smi> key(Smi::FromInt(k), isolate); |
| 115 Handle<Object> result = ft.Call(key, hash_seed).ToHandleChecked(); | 115 Handle<Object> result = ft.Call(key, hash_seed).ToHandleChecked(); |
| 116 | 116 |
| 117 uint32_t hash = ComputeIntegerHash(k, hash_seed->value()); | 117 uint32_t hash = ComputeIntegerHash(k, hash_seed->value()); |
| 118 Smi* expected = Smi::FromInt(hash & Smi::kMaxValue); | 118 Smi* expected = Smi::FromInt(hash & Smi::kMaxValue); |
| 119 CHECK_EQ(expected, Smi::cast(*result)); | 119 CHECK_EQ(expected, Smi::cast(*result)); |
| 120 } | 120 } |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST(ToString) { | 123 TEST(ToString) { |
| 124 Isolate* isolate(CcTest::InitIsolateOnce()); | 124 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 125 const int kNumParams = 1; | 125 const int kNumParams = 1; |
| 126 CodeAssemblerTester data(isolate, kNumParams); | 126 CodeStubAssemblerTester m(isolate, kNumParams); |
| 127 CodeStubAssembler m(data.state()); | |
| 128 m.Return(m.ToString(m.Parameter(kNumParams + 2), m.Parameter(0))); | 127 m.Return(m.ToString(m.Parameter(kNumParams + 2), m.Parameter(0))); |
| 129 | 128 |
| 130 Handle<Code> code = data.GenerateCode(); | 129 Handle<Code> code = m.GenerateCode(); |
| 131 FunctionTester ft(code, kNumParams); | 130 FunctionTester ft(code, kNumParams); |
| 132 | 131 |
| 133 Handle<FixedArray> test_cases = isolate->factory()->NewFixedArray(5); | 132 Handle<FixedArray> test_cases = isolate->factory()->NewFixedArray(5); |
| 134 Handle<FixedArray> smi_test = isolate->factory()->NewFixedArray(2); | 133 Handle<FixedArray> smi_test = isolate->factory()->NewFixedArray(2); |
| 135 smi_test->set(0, Smi::FromInt(42)); | 134 smi_test->set(0, Smi::FromInt(42)); |
| 136 Handle<String> str(isolate->factory()->InternalizeUtf8String("42")); | 135 Handle<String> str(isolate->factory()->InternalizeUtf8String("42")); |
| 137 smi_test->set(1, *str); | 136 smi_test->set(1, *str); |
| 138 test_cases->set(0, *smi_test); | 137 test_cases->set(0, *smi_test); |
| 139 | 138 |
| 140 Handle<FixedArray> number_test = isolate->factory()->NewFixedArray(2); | 139 Handle<FixedArray> number_test = isolate->factory()->NewFixedArray(2); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 Handle<String> expected = handle(String::cast(test->get(1))); | 172 Handle<String> expected = handle(String::cast(test->get(1))); |
| 174 Handle<Object> result = ft.Call(obj).ToHandleChecked(); | 173 Handle<Object> result = ft.Call(obj).ToHandleChecked(); |
| 175 CHECK(result->IsString()); | 174 CHECK(result->IsString()); |
| 176 CHECK(String::Equals(Handle<String>::cast(result), expected)); | 175 CHECK(String::Equals(Handle<String>::cast(result), expected)); |
| 177 } | 176 } |
| 178 } | 177 } |
| 179 | 178 |
| 180 TEST(FlattenString) { | 179 TEST(FlattenString) { |
| 181 Isolate* isolate(CcTest::InitIsolateOnce()); | 180 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 182 const int kNumParams = 1; | 181 const int kNumParams = 1; |
| 183 CodeAssemblerTester data(isolate, kNumParams); | 182 CodeStubAssemblerTester m(isolate, kNumParams); |
| 184 CodeStubAssembler m(data.state()); | |
| 185 m.Return(m.FlattenString(m.Parameter(0))); | 183 m.Return(m.FlattenString(m.Parameter(0))); |
| 186 | 184 |
| 187 Handle<Code> code = data.GenerateCode(); | 185 Handle<Code> code = m.GenerateCode(); |
| 188 FunctionTester ft(code, kNumParams); | 186 FunctionTester ft(code, kNumParams); |
| 189 | 187 |
| 190 Handle<FixedArray> test_cases(isolate->factory()->NewFixedArray(4)); | 188 Handle<FixedArray> test_cases(isolate->factory()->NewFixedArray(4)); |
| 191 Handle<String> expected( | 189 Handle<String> expected( |
| 192 isolate->factory()->InternalizeUtf8String("hello, world!")); | 190 isolate->factory()->InternalizeUtf8String("hello, world!")); |
| 193 test_cases->set(0, *expected); | 191 test_cases->set(0, *expected); |
| 194 | 192 |
| 195 Handle<String> string( | 193 Handle<String> string( |
| 196 isolate->factory()->InternalizeUtf8String("filler hello, world! filler")); | 194 isolate->factory()->InternalizeUtf8String("filler hello, world! filler")); |
| 197 Handle<String> sub_string( | 195 Handle<String> sub_string( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 217 CHECK(String::Equals(Handle<String>::cast(result), expected)); | 215 CHECK(String::Equals(Handle<String>::cast(result), expected)); |
| 218 } | 216 } |
| 219 } | 217 } |
| 220 | 218 |
| 221 TEST(TryToName) { | 219 TEST(TryToName) { |
| 222 typedef CodeStubAssembler::Label Label; | 220 typedef CodeStubAssembler::Label Label; |
| 223 typedef CodeStubAssembler::Variable Variable; | 221 typedef CodeStubAssembler::Variable Variable; |
| 224 Isolate* isolate(CcTest::InitIsolateOnce()); | 222 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 225 | 223 |
| 226 const int kNumParams = 3; | 224 const int kNumParams = 3; |
| 227 CodeAssemblerTester data(isolate, kNumParams); | 225 CodeStubAssemblerTester m(isolate, kNumParams); |
| 228 CodeStubAssembler m(data.state()); | |
| 229 | 226 |
| 230 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; | 227 enum Result { kKeyIsIndex, kKeyIsUnique, kBailout }; |
| 231 { | 228 { |
| 232 Node* key = m.Parameter(0); | 229 Node* key = m.Parameter(0); |
| 233 Node* expected_result = m.Parameter(1); | 230 Node* expected_result = m.Parameter(1); |
| 234 Node* expected_arg = m.Parameter(2); | 231 Node* expected_arg = m.Parameter(2); |
| 235 | 232 |
| 236 Label passed(&m), failed(&m); | 233 Label passed(&m), failed(&m); |
| 237 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); | 234 Label if_keyisindex(&m), if_keyisunique(&m), if_bailout(&m); |
| 238 Variable var_index(&m, MachineType::PointerRepresentation()); | 235 Variable var_index(&m, MachineType::PointerRepresentation()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 257 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), | 254 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), |
| 258 &passed, &failed); | 255 &passed, &failed); |
| 259 | 256 |
| 260 m.Bind(&passed); | 257 m.Bind(&passed); |
| 261 m.Return(m.BooleanConstant(true)); | 258 m.Return(m.BooleanConstant(true)); |
| 262 | 259 |
| 263 m.Bind(&failed); | 260 m.Bind(&failed); |
| 264 m.Return(m.BooleanConstant(false)); | 261 m.Return(m.BooleanConstant(false)); |
| 265 } | 262 } |
| 266 | 263 |
| 267 Handle<Code> code = data.GenerateCode(); | 264 Handle<Code> code = m.GenerateCode(); |
| 268 FunctionTester ft(code, kNumParams); | 265 FunctionTester ft(code, kNumParams); |
| 269 | 266 |
| 270 Handle<Object> expect_index(Smi::FromInt(kKeyIsIndex), isolate); | 267 Handle<Object> expect_index(Smi::FromInt(kKeyIsIndex), isolate); |
| 271 Handle<Object> expect_unique(Smi::FromInt(kKeyIsUnique), isolate); | 268 Handle<Object> expect_unique(Smi::FromInt(kKeyIsUnique), isolate); |
| 272 Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate); | 269 Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate); |
| 273 | 270 |
| 274 { | 271 { |
| 275 // TryToName(<zero smi>) => if_keyisindex: smi value. | 272 // TryToName(<zero smi>) => if_keyisindex: smi value. |
| 276 Handle<Object> key(Smi::kZero, isolate); | 273 Handle<Object> key(Smi::kZero, isolate); |
| 277 ft.CheckTrue(key, expect_index, key); | 274 ft.CheckTrue(key, expect_index, key); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 } | 345 } |
| 349 } | 346 } |
| 350 | 347 |
| 351 namespace { | 348 namespace { |
| 352 | 349 |
| 353 template <typename Dictionary> | 350 template <typename Dictionary> |
| 354 void TestEntryToIndex() { | 351 void TestEntryToIndex() { |
| 355 Isolate* isolate(CcTest::InitIsolateOnce()); | 352 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 356 | 353 |
| 357 const int kNumParams = 1; | 354 const int kNumParams = 1; |
| 358 CodeAssemblerTester data(isolate, kNumParams); | 355 CodeStubAssemblerTester m(isolate, kNumParams); |
| 359 CodeStubAssembler m(data.state()); | |
| 360 { | 356 { |
| 361 Node* entry = m.SmiUntag(m.Parameter(0)); | 357 Node* entry = m.SmiUntag(m.Parameter(0)); |
| 362 Node* result = m.EntryToIndex<Dictionary>(entry); | 358 Node* result = m.EntryToIndex<Dictionary>(entry); |
| 363 m.Return(m.SmiTag(result)); | 359 m.Return(m.SmiTag(result)); |
| 364 } | 360 } |
| 365 | 361 |
| 366 Handle<Code> code = data.GenerateCode(); | 362 Handle<Code> code = m.GenerateCode(); |
| 367 FunctionTester ft(code, kNumParams); | 363 FunctionTester ft(code, kNumParams); |
| 368 | 364 |
| 369 // Test a wide range of entries but staying linear in the first 100 entries. | 365 // Test a wide range of entries but staying linear in the first 100 entries. |
| 370 for (int entry = 0; entry < Dictionary::kMaxCapacity; | 366 for (int entry = 0; entry < Dictionary::kMaxCapacity; |
| 371 entry = entry * 1.01 + 1) { | 367 entry = entry * 1.01 + 1) { |
| 372 Handle<Object> result = | 368 Handle<Object> result = |
| 373 ft.Call(handle(Smi::FromInt(entry), isolate)).ToHandleChecked(); | 369 ft.Call(handle(Smi::FromInt(entry), isolate)).ToHandleChecked(); |
| 374 CHECK_EQ(Dictionary::EntryToIndex(entry), Smi::cast(*result)->value()); | 370 CHECK_EQ(Dictionary::EntryToIndex(entry), Smi::cast(*result)->value()); |
| 375 } | 371 } |
| 376 } | 372 } |
| 377 | 373 |
| 378 TEST(NameDictionaryEntryToIndex) { TestEntryToIndex<NameDictionary>(); } | 374 TEST(NameDictionaryEntryToIndex) { TestEntryToIndex<NameDictionary>(); } |
| 379 TEST(GlobalDictionaryEntryToIndex) { TestEntryToIndex<GlobalDictionary>(); } | 375 TEST(GlobalDictionaryEntryToIndex) { TestEntryToIndex<GlobalDictionary>(); } |
| 380 | 376 |
| 381 } // namespace | 377 } // namespace |
| 382 | 378 |
| 383 namespace { | 379 namespace { |
| 384 | 380 |
| 385 template <typename Dictionary> | 381 template <typename Dictionary> |
| 386 void TestNameDictionaryLookup() { | 382 void TestNameDictionaryLookup() { |
| 387 typedef CodeStubAssembler::Label Label; | 383 typedef CodeStubAssembler::Label Label; |
| 388 typedef CodeStubAssembler::Variable Variable; | 384 typedef CodeStubAssembler::Variable Variable; |
| 389 Isolate* isolate(CcTest::InitIsolateOnce()); | 385 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 390 | 386 |
| 391 const int kNumParams = 4; | 387 const int kNumParams = 4; |
| 392 CodeAssemblerTester data(isolate, kNumParams); | 388 CodeStubAssemblerTester m(isolate, kNumParams); |
| 393 CodeStubAssembler m(data.state()); | |
| 394 | 389 |
| 395 enum Result { kFound, kNotFound }; | 390 enum Result { kFound, kNotFound }; |
| 396 { | 391 { |
| 397 Node* dictionary = m.Parameter(0); | 392 Node* dictionary = m.Parameter(0); |
| 398 Node* unique_name = m.Parameter(1); | 393 Node* unique_name = m.Parameter(1); |
| 399 Node* expected_result = m.Parameter(2); | 394 Node* expected_result = m.Parameter(2); |
| 400 Node* expected_arg = m.Parameter(3); | 395 Node* expected_arg = m.Parameter(3); |
| 401 | 396 |
| 402 Label passed(&m), failed(&m); | 397 Label passed(&m), failed(&m); |
| 403 Label if_found(&m), if_not_found(&m); | 398 Label if_found(&m), if_not_found(&m); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 417 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), | 412 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), |
| 418 &passed, &failed); | 413 &passed, &failed); |
| 419 | 414 |
| 420 m.Bind(&passed); | 415 m.Bind(&passed); |
| 421 m.Return(m.BooleanConstant(true)); | 416 m.Return(m.BooleanConstant(true)); |
| 422 | 417 |
| 423 m.Bind(&failed); | 418 m.Bind(&failed); |
| 424 m.Return(m.BooleanConstant(false)); | 419 m.Return(m.BooleanConstant(false)); |
| 425 } | 420 } |
| 426 | 421 |
| 427 Handle<Code> code = data.GenerateCode(); | 422 Handle<Code> code = m.GenerateCode(); |
| 428 FunctionTester ft(code, kNumParams); | 423 FunctionTester ft(code, kNumParams); |
| 429 | 424 |
| 430 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); | 425 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); |
| 431 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); | 426 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); |
| 432 | 427 |
| 433 Handle<Dictionary> dictionary = Dictionary::New(isolate, 40); | 428 Handle<Dictionary> dictionary = Dictionary::New(isolate, 40); |
| 434 PropertyDetails fake_details = PropertyDetails::Empty(); | 429 PropertyDetails fake_details = PropertyDetails::Empty(); |
| 435 | 430 |
| 436 Factory* factory = isolate->factory(); | 431 Factory* factory = isolate->factory(); |
| 437 Handle<Name> keys[] = { | 432 Handle<Name> keys[] = { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 | 484 |
| 490 namespace { | 485 namespace { |
| 491 | 486 |
| 492 template <typename Dictionary> | 487 template <typename Dictionary> |
| 493 void TestNumberDictionaryLookup() { | 488 void TestNumberDictionaryLookup() { |
| 494 typedef CodeStubAssembler::Label Label; | 489 typedef CodeStubAssembler::Label Label; |
| 495 typedef CodeStubAssembler::Variable Variable; | 490 typedef CodeStubAssembler::Variable Variable; |
| 496 Isolate* isolate(CcTest::InitIsolateOnce()); | 491 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 497 | 492 |
| 498 const int kNumParams = 4; | 493 const int kNumParams = 4; |
| 499 CodeAssemblerTester data(isolate, kNumParams); | 494 CodeStubAssemblerTester m(isolate, kNumParams); |
| 500 CodeStubAssembler m(data.state()); | |
| 501 | 495 |
| 502 enum Result { kFound, kNotFound }; | 496 enum Result { kFound, kNotFound }; |
| 503 { | 497 { |
| 504 Node* dictionary = m.Parameter(0); | 498 Node* dictionary = m.Parameter(0); |
| 505 Node* key = m.SmiToWord32(m.Parameter(1)); | 499 Node* key = m.SmiToWord32(m.Parameter(1)); |
| 506 Node* expected_result = m.Parameter(2); | 500 Node* expected_result = m.Parameter(2); |
| 507 Node* expected_arg = m.Parameter(3); | 501 Node* expected_arg = m.Parameter(3); |
| 508 | 502 |
| 509 Label passed(&m), failed(&m); | 503 Label passed(&m), failed(&m); |
| 510 Label if_found(&m), if_not_found(&m); | 504 Label if_found(&m), if_not_found(&m); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 524 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), | 518 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kNotFound))), |
| 525 &passed, &failed); | 519 &passed, &failed); |
| 526 | 520 |
| 527 m.Bind(&passed); | 521 m.Bind(&passed); |
| 528 m.Return(m.BooleanConstant(true)); | 522 m.Return(m.BooleanConstant(true)); |
| 529 | 523 |
| 530 m.Bind(&failed); | 524 m.Bind(&failed); |
| 531 m.Return(m.BooleanConstant(false)); | 525 m.Return(m.BooleanConstant(false)); |
| 532 } | 526 } |
| 533 | 527 |
| 534 Handle<Code> code = data.GenerateCode(); | 528 Handle<Code> code = m.GenerateCode(); |
| 535 FunctionTester ft(code, kNumParams); | 529 FunctionTester ft(code, kNumParams); |
| 536 | 530 |
| 537 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); | 531 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); |
| 538 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); | 532 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); |
| 539 | 533 |
| 540 const int kKeysCount = 1000; | 534 const int kKeysCount = 1000; |
| 541 Handle<Dictionary> dictionary = Dictionary::New(isolate, kKeysCount); | 535 Handle<Dictionary> dictionary = Dictionary::New(isolate, kKeysCount); |
| 542 uint32_t keys[kKeysCount]; | 536 uint32_t keys[kKeysCount]; |
| 543 | 537 |
| 544 Handle<Object> fake_value(Smi::FromInt(42), isolate); | 538 Handle<Object> fake_value(Smi::FromInt(42), isolate); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 } | 621 } |
| 628 } | 622 } |
| 629 | 623 |
| 630 } // namespace | 624 } // namespace |
| 631 | 625 |
| 632 TEST(TryHasOwnProperty) { | 626 TEST(TryHasOwnProperty) { |
| 633 typedef CodeStubAssembler::Label Label; | 627 typedef CodeStubAssembler::Label Label; |
| 634 Isolate* isolate(CcTest::InitIsolateOnce()); | 628 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 635 | 629 |
| 636 const int kNumParams = 4; | 630 const int kNumParams = 4; |
| 637 CodeAssemblerTester data(isolate, kNumParams); | 631 CodeStubAssemblerTester m(isolate, kNumParams); |
| 638 CodeStubAssembler m(data.state()); | |
| 639 | 632 |
| 640 enum Result { kFound, kNotFound, kBailout }; | 633 enum Result { kFound, kNotFound, kBailout }; |
| 641 { | 634 { |
| 642 Node* object = m.Parameter(0); | 635 Node* object = m.Parameter(0); |
| 643 Node* unique_name = m.Parameter(1); | 636 Node* unique_name = m.Parameter(1); |
| 644 Node* expected_result = m.Parameter(2); | 637 Node* expected_result = m.Parameter(2); |
| 645 | 638 |
| 646 Label passed(&m), failed(&m); | 639 Label passed(&m), failed(&m); |
| 647 Label if_found(&m), if_not_found(&m), if_bailout(&m); | 640 Label if_found(&m), if_not_found(&m), if_bailout(&m); |
| 648 | 641 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 666 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), | 659 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), |
| 667 &passed, &failed); | 660 &passed, &failed); |
| 668 | 661 |
| 669 m.Bind(&passed); | 662 m.Bind(&passed); |
| 670 m.Return(m.BooleanConstant(true)); | 663 m.Return(m.BooleanConstant(true)); |
| 671 | 664 |
| 672 m.Bind(&failed); | 665 m.Bind(&failed); |
| 673 m.Return(m.BooleanConstant(false)); | 666 m.Return(m.BooleanConstant(false)); |
| 674 } | 667 } |
| 675 | 668 |
| 676 Handle<Code> code = data.GenerateCode(); | 669 Handle<Code> code = m.GenerateCode(); |
| 677 FunctionTester ft(code, kNumParams); | 670 FunctionTester ft(code, kNumParams); |
| 678 | 671 |
| 679 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); | 672 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); |
| 680 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); | 673 Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate); |
| 681 Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate); | 674 Handle<Object> expect_bailout(Smi::FromInt(kBailout), isolate); |
| 682 | 675 |
| 683 Factory* factory = isolate->factory(); | 676 Factory* factory = isolate->factory(); |
| 684 | 677 |
| 685 Handle<Name> deleted_property_name = | 678 Handle<Name> deleted_property_name = |
| 686 factory->InternalizeUtf8String("deleted"); | 679 factory->InternalizeUtf8String("deleted"); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 } | 807 } |
| 815 } | 808 } |
| 816 | 809 |
| 817 TEST(TryGetOwnProperty) { | 810 TEST(TryGetOwnProperty) { |
| 818 typedef CodeStubAssembler::Label Label; | 811 typedef CodeStubAssembler::Label Label; |
| 819 typedef CodeStubAssembler::Variable Variable; | 812 typedef CodeStubAssembler::Variable Variable; |
| 820 Isolate* isolate(CcTest::InitIsolateOnce()); | 813 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 821 Factory* factory = isolate->factory(); | 814 Factory* factory = isolate->factory(); |
| 822 | 815 |
| 823 const int kNumParams = 2; | 816 const int kNumParams = 2; |
| 824 CodeAssemblerTester data(isolate, kNumParams); | 817 CodeStubAssemblerTester m(isolate, kNumParams); |
| 825 CodeStubAssembler m(data.state()); | |
| 826 | 818 |
| 827 Handle<Symbol> not_found_symbol = factory->NewSymbol(); | 819 Handle<Symbol> not_found_symbol = factory->NewSymbol(); |
| 828 Handle<Symbol> bailout_symbol = factory->NewSymbol(); | 820 Handle<Symbol> bailout_symbol = factory->NewSymbol(); |
| 829 { | 821 { |
| 830 Node* object = m.Parameter(0); | 822 Node* object = m.Parameter(0); |
| 831 Node* unique_name = m.Parameter(1); | 823 Node* unique_name = m.Parameter(1); |
| 832 Node* context = m.Parameter(kNumParams + 2); | 824 Node* context = m.Parameter(kNumParams + 2); |
| 833 | 825 |
| 834 Variable var_value(&m, MachineRepresentation::kTagged); | 826 Variable var_value(&m, MachineRepresentation::kTagged); |
| 835 Label if_found(&m), if_not_found(&m), if_bailout(&m); | 827 Label if_found(&m), if_not_found(&m), if_bailout(&m); |
| 836 | 828 |
| 837 Node* map = m.LoadMap(object); | 829 Node* map = m.LoadMap(object); |
| 838 Node* instance_type = m.LoadMapInstanceType(map); | 830 Node* instance_type = m.LoadMapInstanceType(map); |
| 839 | 831 |
| 840 m.TryGetOwnProperty(context, object, object, map, instance_type, | 832 m.TryGetOwnProperty(context, object, object, map, instance_type, |
| 841 unique_name, &if_found, &var_value, &if_not_found, | 833 unique_name, &if_found, &var_value, &if_not_found, |
| 842 &if_bailout); | 834 &if_bailout); |
| 843 | 835 |
| 844 m.Bind(&if_found); | 836 m.Bind(&if_found); |
| 845 m.Return(var_value.value()); | 837 m.Return(var_value.value()); |
| 846 | 838 |
| 847 m.Bind(&if_not_found); | 839 m.Bind(&if_not_found); |
| 848 m.Return(m.HeapConstant(not_found_symbol)); | 840 m.Return(m.HeapConstant(not_found_symbol)); |
| 849 | 841 |
| 850 m.Bind(&if_bailout); | 842 m.Bind(&if_bailout); |
| 851 m.Return(m.HeapConstant(bailout_symbol)); | 843 m.Return(m.HeapConstant(bailout_symbol)); |
| 852 } | 844 } |
| 853 | 845 |
| 854 Handle<Code> code = data.GenerateCode(); | 846 Handle<Code> code = m.GenerateCode(); |
| 855 FunctionTester ft(code, kNumParams); | 847 FunctionTester ft(code, kNumParams); |
| 856 | 848 |
| 857 Handle<Name> deleted_property_name = | 849 Handle<Name> deleted_property_name = |
| 858 factory->InternalizeUtf8String("deleted"); | 850 factory->InternalizeUtf8String("deleted"); |
| 859 | 851 |
| 860 Handle<Name> names[] = { | 852 Handle<Name> names[] = { |
| 861 factory->InternalizeUtf8String("bb"), | 853 factory->InternalizeUtf8String("bb"), |
| 862 factory->NewSymbol(), | 854 factory->NewSymbol(), |
| 863 factory->InternalizeUtf8String("a"), | 855 factory->InternalizeUtf8String("a"), |
| 864 factory->InternalizeUtf8String("ccc"), | 856 factory->InternalizeUtf8String("ccc"), |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1031 JSObject::AddDataElement(object, index, value, attributes).ToHandleChecked(); | 1023 JSObject::AddDataElement(object, index, value, attributes).ToHandleChecked(); |
| 1032 } | 1024 } |
| 1033 | 1025 |
| 1034 } // namespace | 1026 } // namespace |
| 1035 | 1027 |
| 1036 TEST(TryLookupElement) { | 1028 TEST(TryLookupElement) { |
| 1037 typedef CodeStubAssembler::Label Label; | 1029 typedef CodeStubAssembler::Label Label; |
| 1038 Isolate* isolate(CcTest::InitIsolateOnce()); | 1030 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1039 | 1031 |
| 1040 const int kNumParams = 3; | 1032 const int kNumParams = 3; |
| 1041 CodeAssemblerTester data(isolate, kNumParams); | 1033 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1042 CodeStubAssembler m(data.state()); | |
| 1043 | 1034 |
| 1044 enum Result { kFound, kNotFound, kBailout }; | 1035 enum Result { kFound, kNotFound, kBailout }; |
| 1045 { | 1036 { |
| 1046 Node* object = m.Parameter(0); | 1037 Node* object = m.Parameter(0); |
| 1047 Node* index = m.SmiToWord32(m.Parameter(1)); | 1038 Node* index = m.SmiToWord32(m.Parameter(1)); |
| 1048 Node* expected_result = m.Parameter(2); | 1039 Node* expected_result = m.Parameter(2); |
| 1049 | 1040 |
| 1050 Label passed(&m), failed(&m); | 1041 Label passed(&m), failed(&m); |
| 1051 Label if_found(&m), if_not_found(&m), if_bailout(&m); | 1042 Label if_found(&m), if_not_found(&m), if_bailout(&m); |
| 1052 | 1043 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1070 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), | 1061 m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kBailout))), |
| 1071 &passed, &failed); | 1062 &passed, &failed); |
| 1072 | 1063 |
| 1073 m.Bind(&passed); | 1064 m.Bind(&passed); |
| 1074 m.Return(m.BooleanConstant(true)); | 1065 m.Return(m.BooleanConstant(true)); |
| 1075 | 1066 |
| 1076 m.Bind(&failed); | 1067 m.Bind(&failed); |
| 1077 m.Return(m.BooleanConstant(false)); | 1068 m.Return(m.BooleanConstant(false)); |
| 1078 } | 1069 } |
| 1079 | 1070 |
| 1080 Handle<Code> code = data.GenerateCode(); | 1071 Handle<Code> code = m.GenerateCode(); |
| 1081 FunctionTester ft(code, kNumParams); | 1072 FunctionTester ft(code, kNumParams); |
| 1082 | 1073 |
| 1083 Factory* factory = isolate->factory(); | 1074 Factory* factory = isolate->factory(); |
| 1084 Handle<Object> smi0(Smi::kZero, isolate); | 1075 Handle<Object> smi0(Smi::kZero, isolate); |
| 1085 Handle<Object> smi1(Smi::FromInt(1), isolate); | 1076 Handle<Object> smi1(Smi::FromInt(1), isolate); |
| 1086 Handle<Object> smi7(Smi::FromInt(7), isolate); | 1077 Handle<Object> smi7(Smi::FromInt(7), isolate); |
| 1087 Handle<Object> smi13(Smi::FromInt(13), isolate); | 1078 Handle<Object> smi13(Smi::FromInt(13), isolate); |
| 1088 Handle<Object> smi42(Smi::FromInt(42), isolate); | 1079 Handle<Object> smi42(Smi::FromInt(42), isolate); |
| 1089 | 1080 |
| 1090 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); | 1081 Handle<Object> expect_found(Smi::FromInt(kFound), isolate); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1218 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); | 1209 CHECK_EQ(JS_GLOBAL_PROXY_TYPE, object->map()->instance_type()); |
| 1219 ft.CheckTrue(object, smi0, expect_bailout); | 1210 ft.CheckTrue(object, smi0, expect_bailout); |
| 1220 } | 1211 } |
| 1221 } | 1212 } |
| 1222 | 1213 |
| 1223 TEST(DeferredCodePhiHints) { | 1214 TEST(DeferredCodePhiHints) { |
| 1224 typedef compiler::Node Node; | 1215 typedef compiler::Node Node; |
| 1225 typedef CodeStubAssembler::Label Label; | 1216 typedef CodeStubAssembler::Label Label; |
| 1226 typedef CodeStubAssembler::Variable Variable; | 1217 typedef CodeStubAssembler::Variable Variable; |
| 1227 Isolate* isolate(CcTest::InitIsolateOnce()); | 1218 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1228 CodeAssemblerTester data(isolate); | 1219 VoidDescriptor descriptor(isolate); |
| 1229 CodeStubAssembler m(data.state()); | 1220 CodeStubAssemblerTester m(isolate, descriptor); |
| 1230 Label block1(&m, Label::kDeferred); | 1221 Label block1(&m, Label::kDeferred); |
| 1231 m.Goto(&block1); | 1222 m.Goto(&block1); |
| 1232 m.Bind(&block1); | 1223 m.Bind(&block1); |
| 1233 { | 1224 { |
| 1234 Variable var_object(&m, MachineRepresentation::kTagged); | 1225 Variable var_object(&m, MachineRepresentation::kTagged); |
| 1235 Label loop(&m, &var_object); | 1226 Label loop(&m, &var_object); |
| 1236 var_object.Bind(m.IntPtrConstant(0)); | 1227 var_object.Bind(m.IntPtrConstant(0)); |
| 1237 m.Goto(&loop); | 1228 m.Goto(&loop); |
| 1238 m.Bind(&loop); | 1229 m.Bind(&loop); |
| 1239 { | 1230 { |
| 1240 Node* map = m.LoadMap(var_object.value()); | 1231 Node* map = m.LoadMap(var_object.value()); |
| 1241 var_object.Bind(map); | 1232 var_object.Bind(map); |
| 1242 m.Goto(&loop); | 1233 m.Goto(&loop); |
| 1243 } | 1234 } |
| 1244 } | 1235 } |
| 1245 CHECK(!data.GenerateCode().is_null()); | 1236 CHECK(!m.GenerateCode().is_null()); |
| 1246 } | 1237 } |
| 1247 | 1238 |
| 1248 TEST(TestOutOfScopeVariable) { | 1239 TEST(TestOutOfScopeVariable) { |
| 1249 typedef CodeStubAssembler::Label Label; | 1240 typedef CodeStubAssembler::Label Label; |
| 1250 typedef CodeStubAssembler::Variable Variable; | 1241 typedef CodeStubAssembler::Variable Variable; |
| 1251 Isolate* isolate(CcTest::InitIsolateOnce()); | 1242 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1252 CodeAssemblerTester data(isolate); | 1243 VoidDescriptor descriptor(isolate); |
| 1253 CodeStubAssembler m(data.state()); | 1244 CodeStubAssemblerTester m(isolate, descriptor); |
| 1254 Label block1(&m); | 1245 Label block1(&m); |
| 1255 Label block2(&m); | 1246 Label block2(&m); |
| 1256 Label block3(&m); | 1247 Label block3(&m); |
| 1257 Label block4(&m); | 1248 Label block4(&m); |
| 1258 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block1, &block4); | 1249 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block1, &block4); |
| 1259 m.Bind(&block4); | 1250 m.Bind(&block4); |
| 1260 { | 1251 { |
| 1261 Variable var_object(&m, MachineRepresentation::kTagged); | 1252 Variable var_object(&m, MachineRepresentation::kTagged); |
| 1262 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block2, | 1253 m.Branch(m.WordEqual(m.Parameter(0), m.IntPtrConstant(0)), &block2, |
| 1263 &block3); | 1254 &block3); |
| 1264 | 1255 |
| 1265 m.Bind(&block2); | 1256 m.Bind(&block2); |
| 1266 var_object.Bind(m.IntPtrConstant(55)); | 1257 var_object.Bind(m.IntPtrConstant(55)); |
| 1267 m.Goto(&block1); | 1258 m.Goto(&block1); |
| 1268 | 1259 |
| 1269 m.Bind(&block3); | 1260 m.Bind(&block3); |
| 1270 var_object.Bind(m.IntPtrConstant(66)); | 1261 var_object.Bind(m.IntPtrConstant(66)); |
| 1271 m.Goto(&block1); | 1262 m.Goto(&block1); |
| 1272 } | 1263 } |
| 1273 m.Bind(&block1); | 1264 m.Bind(&block1); |
| 1274 CHECK(!data.GenerateCode().is_null()); | 1265 CHECK(!m.GenerateCode().is_null()); |
| 1275 } | 1266 } |
| 1276 | 1267 |
| 1277 namespace { | 1268 namespace { |
| 1278 | 1269 |
| 1279 void TestStubCacheOffsetCalculation(StubCache::Table table) { | 1270 void TestStubCacheOffsetCalculation(StubCache::Table table) { |
| 1280 Isolate* isolate(CcTest::InitIsolateOnce()); | 1271 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1281 const int kNumParams = 2; | 1272 const int kNumParams = 2; |
| 1282 CodeAssemblerTester data(isolate, kNumParams); | 1273 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1283 CodeStubAssembler m(data.state()); | |
| 1284 | 1274 |
| 1285 { | 1275 { |
| 1286 Node* name = m.Parameter(0); | 1276 Node* name = m.Parameter(0); |
| 1287 Node* map = m.Parameter(1); | 1277 Node* map = m.Parameter(1); |
| 1288 Node* primary_offset = m.StubCachePrimaryOffset(name, map); | 1278 Node* primary_offset = m.StubCachePrimaryOffset(name, map); |
| 1289 Node* result; | 1279 Node* result; |
| 1290 if (table == StubCache::kPrimary) { | 1280 if (table == StubCache::kPrimary) { |
| 1291 result = primary_offset; | 1281 result = primary_offset; |
| 1292 } else { | 1282 } else { |
| 1293 CHECK_EQ(StubCache::kSecondary, table); | 1283 CHECK_EQ(StubCache::kSecondary, table); |
| 1294 result = m.StubCacheSecondaryOffset(name, primary_offset); | 1284 result = m.StubCacheSecondaryOffset(name, primary_offset); |
| 1295 } | 1285 } |
| 1296 m.Return(m.SmiFromWord32(result)); | 1286 m.Return(m.SmiFromWord32(result)); |
| 1297 } | 1287 } |
| 1298 | 1288 |
| 1299 Handle<Code> code = data.GenerateCode(); | 1289 Handle<Code> code = m.GenerateCode(); |
| 1300 FunctionTester ft(code, kNumParams); | 1290 FunctionTester ft(code, kNumParams); |
| 1301 | 1291 |
| 1302 Factory* factory = isolate->factory(); | 1292 Factory* factory = isolate->factory(); |
| 1303 Handle<Name> names[] = { | 1293 Handle<Name> names[] = { |
| 1304 factory->NewSymbol(), | 1294 factory->NewSymbol(), |
| 1305 factory->InternalizeUtf8String("a"), | 1295 factory->InternalizeUtf8String("a"), |
| 1306 factory->InternalizeUtf8String("bb"), | 1296 factory->InternalizeUtf8String("bb"), |
| 1307 factory->InternalizeUtf8String("ccc"), | 1297 factory->InternalizeUtf8String("ccc"), |
| 1308 factory->NewPrivateSymbol(), | 1298 factory->NewPrivateSymbol(), |
| 1309 factory->InternalizeUtf8String("dddd"), | 1299 factory->InternalizeUtf8String("dddd"), |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1357 } | 1347 } |
| 1358 | 1348 |
| 1359 TEST(StubCacheSecondaryOffset) { | 1349 TEST(StubCacheSecondaryOffset) { |
| 1360 TestStubCacheOffsetCalculation(StubCache::kSecondary); | 1350 TestStubCacheOffsetCalculation(StubCache::kSecondary); |
| 1361 } | 1351 } |
| 1362 | 1352 |
| 1363 namespace { | 1353 namespace { |
| 1364 | 1354 |
| 1365 Handle<Code> CreateCodeWithFlags(Code::Flags flags) { | 1355 Handle<Code> CreateCodeWithFlags(Code::Flags flags) { |
| 1366 Isolate* isolate(CcTest::InitIsolateOnce()); | 1356 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1367 CodeAssemblerTester data(isolate, flags); | 1357 CodeStubAssemblerTester m(isolate, flags); |
| 1368 CodeStubAssembler m(data.state()); | |
| 1369 m.Return(m.UndefinedConstant()); | 1358 m.Return(m.UndefinedConstant()); |
| 1370 return data.GenerateCodeCloseAndEscape(); | 1359 return m.GenerateCodeCloseAndEscape(); |
| 1371 } | 1360 } |
| 1372 | 1361 |
| 1373 } // namespace | 1362 } // namespace |
| 1374 | 1363 |
| 1375 TEST(TryProbeStubCache) { | 1364 TEST(TryProbeStubCache) { |
| 1376 typedef CodeStubAssembler::Label Label; | 1365 typedef CodeStubAssembler::Label Label; |
| 1377 typedef CodeStubAssembler::Variable Variable; | 1366 typedef CodeStubAssembler::Variable Variable; |
| 1378 Isolate* isolate(CcTest::InitIsolateOnce()); | 1367 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1379 const int kNumParams = 3; | 1368 const int kNumParams = 3; |
| 1380 CodeAssemblerTester data(isolate, kNumParams); | 1369 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1381 CodeStubAssembler m(data.state()); | |
| 1382 | 1370 |
| 1383 Code::Kind ic_kind = Code::LOAD_IC; | 1371 Code::Kind ic_kind = Code::LOAD_IC; |
| 1384 StubCache stub_cache(isolate, ic_kind); | 1372 StubCache stub_cache(isolate, ic_kind); |
| 1385 stub_cache.Clear(); | 1373 stub_cache.Clear(); |
| 1386 | 1374 |
| 1387 { | 1375 { |
| 1388 Node* receiver = m.Parameter(0); | 1376 Node* receiver = m.Parameter(0); |
| 1389 Node* name = m.Parameter(1); | 1377 Node* name = m.Parameter(1); |
| 1390 Node* expected_handler = m.Parameter(2); | 1378 Node* expected_handler = m.Parameter(2); |
| 1391 | 1379 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1404 m.Branch(m.WordEqual(expected_handler, m.IntPtrConstant(0)), &passed, | 1392 m.Branch(m.WordEqual(expected_handler, m.IntPtrConstant(0)), &passed, |
| 1405 &failed); | 1393 &failed); |
| 1406 | 1394 |
| 1407 m.Bind(&passed); | 1395 m.Bind(&passed); |
| 1408 m.Return(m.BooleanConstant(true)); | 1396 m.Return(m.BooleanConstant(true)); |
| 1409 | 1397 |
| 1410 m.Bind(&failed); | 1398 m.Bind(&failed); |
| 1411 m.Return(m.BooleanConstant(false)); | 1399 m.Return(m.BooleanConstant(false)); |
| 1412 } | 1400 } |
| 1413 | 1401 |
| 1414 Handle<Code> code = data.GenerateCode(); | 1402 Handle<Code> code = m.GenerateCode(); |
| 1415 FunctionTester ft(code, kNumParams); | 1403 FunctionTester ft(code, kNumParams); |
| 1416 | 1404 |
| 1417 std::vector<Handle<Name>> names; | 1405 std::vector<Handle<Name>> names; |
| 1418 std::vector<Handle<JSObject>> receivers; | 1406 std::vector<Handle<JSObject>> receivers; |
| 1419 std::vector<Handle<Code>> handlers; | 1407 std::vector<Handle<Code>> handlers; |
| 1420 | 1408 |
| 1421 base::RandomNumberGenerator rand_gen(FLAG_random_seed); | 1409 base::RandomNumberGenerator rand_gen(FLAG_random_seed); |
| 1422 | 1410 |
| 1423 Factory* factory = isolate->factory(); | 1411 Factory* factory = isolate->factory(); |
| 1424 | 1412 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 // Ensure we performed both kind of queries. | 1503 // Ensure we performed both kind of queries. |
| 1516 CHECK(queried_existing && queried_non_existing); | 1504 CHECK(queried_existing && queried_non_existing); |
| 1517 } | 1505 } |
| 1518 | 1506 |
| 1519 TEST(GotoIfException) { | 1507 TEST(GotoIfException) { |
| 1520 typedef CodeStubAssembler::Label Label; | 1508 typedef CodeStubAssembler::Label Label; |
| 1521 typedef CodeStubAssembler::Variable Variable; | 1509 typedef CodeStubAssembler::Variable Variable; |
| 1522 Isolate* isolate(CcTest::InitIsolateOnce()); | 1510 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1523 | 1511 |
| 1524 const int kNumParams = 1; | 1512 const int kNumParams = 1; |
| 1525 CodeAssemblerTester data(isolate, kNumParams); | 1513 // Emulate TFJ builtin |
| 1526 CodeStubAssembler m(data.state()); | 1514 CodeStubAssemblerTester m(isolate, kNumParams, Code::BUILTIN); |
| 1527 | 1515 |
| 1528 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 1516 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 1529 Node* to_string_tag = | 1517 Node* to_string_tag = |
| 1530 m.HeapConstant(isolate->factory()->to_string_tag_symbol()); | 1518 m.HeapConstant(isolate->factory()->to_string_tag_symbol()); |
| 1531 Variable exception(&m, MachineRepresentation::kTagged); | 1519 Variable exception(&m, MachineRepresentation::kTagged); |
| 1532 | 1520 |
| 1533 Label exception_handler(&m); | 1521 Label exception_handler(&m); |
| 1534 Callable to_string = CodeFactory::ToString(isolate); | 1522 Callable to_string = CodeFactory::ToString(isolate); |
| 1535 Node* string = m.CallStub(to_string, context, to_string_tag); | 1523 Node* string = m.CallStub(to_string, context, to_string_tag); |
| 1536 m.GotoIfException(string, &exception_handler, &exception); | 1524 m.GotoIfException(string, &exception_handler, &exception); |
| 1537 m.Return(string); | 1525 m.Return(string); |
| 1538 | 1526 |
| 1539 m.Bind(&exception_handler); | 1527 m.Bind(&exception_handler); |
| 1540 m.Return(exception.value()); | 1528 m.Return(exception.value()); |
| 1541 | 1529 |
| 1542 Handle<Code> code = data.GenerateCode(); | 1530 Handle<Code> code = m.GenerateCode(); |
| 1543 CHECK(!code.is_null()); | 1531 CHECK(!code.is_null()); |
| 1544 | 1532 |
| 1545 FunctionTester ft(code, kNumParams); | 1533 FunctionTester ft(code, kNumParams); |
| 1546 Handle<Object> result = ft.Call().ToHandleChecked(); | 1534 Handle<Object> result = ft.Call().ToHandleChecked(); |
| 1547 | 1535 |
| 1548 // Should be a TypeError. | 1536 // Should be a TypeError |
| 1549 CHECK(result->IsJSObject()); | 1537 CHECK(result->IsJSObject()); |
| 1550 | 1538 |
| 1551 Handle<Object> constructor = | 1539 Handle<Object> constructor = |
| 1552 Object::GetPropertyOrElement(result, | 1540 Object::GetPropertyOrElement(result, |
| 1553 isolate->factory()->constructor_string()) | 1541 isolate->factory()->constructor_string()) |
| 1554 .ToHandleChecked(); | 1542 .ToHandleChecked(); |
| 1555 CHECK(constructor->SameValue(*isolate->type_error_function())); | 1543 CHECK(constructor->SameValue(*isolate->type_error_function())); |
| 1556 } | 1544 } |
| 1557 | 1545 |
| 1558 TEST(GotoIfExceptionMultiple) { | 1546 TEST(GotoIfExceptionMultiple) { |
| 1559 typedef CodeStubAssembler::Label Label; | 1547 typedef CodeStubAssembler::Label Label; |
| 1560 typedef CodeStubAssembler::Variable Variable; | 1548 typedef CodeStubAssembler::Variable Variable; |
| 1561 Isolate* isolate(CcTest::InitIsolateOnce()); | 1549 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1562 | 1550 |
| 1563 const int kNumParams = 4; // receiver, first, second, third | 1551 const int kNumParams = 4; // receiver, first, second, third |
| 1564 CodeAssemblerTester data(isolate, kNumParams); | 1552 // Emulate TFJ builtin |
| 1565 CodeStubAssembler m(data.state()); | 1553 CodeStubAssemblerTester m(isolate, kNumParams, Code::BUILTIN); |
| 1566 | 1554 |
| 1567 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 1555 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 1568 Node* first_value = m.Parameter(0); | 1556 Node* first_value = m.Parameter(0); |
| 1569 Node* second_value = m.Parameter(1); | 1557 Node* second_value = m.Parameter(1); |
| 1570 Node* third_value = m.Parameter(2); | 1558 Node* third_value = m.Parameter(2); |
| 1571 | 1559 |
| 1572 Label exception_handler1(&m); | 1560 Label exception_handler1(&m); |
| 1573 Label exception_handler2(&m); | 1561 Label exception_handler2(&m); |
| 1574 Label exception_handler3(&m); | 1562 Label exception_handler3(&m); |
| 1575 Variable return_value(&m, MachineRepresentation::kWord32); | 1563 Variable return_value(&m, MachineRepresentation::kWord32); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1597 error.Bind(m.UndefinedConstant()); | 1585 error.Bind(m.UndefinedConstant()); |
| 1598 string = m.CallStub(to_string, context, third_value); | 1586 string = m.CallStub(to_string, context, third_value); |
| 1599 m.GotoIfException(string, &exception_handler3, &error); | 1587 m.GotoIfException(string, &exception_handler3, &error); |
| 1600 m.Return(m.SmiFromWord32( | 1588 m.Return(m.SmiFromWord32( |
| 1601 m.Word32And(return_value.value(), | 1589 m.Word32And(return_value.value(), |
| 1602 m.Word32Xor(m.Int32Constant(2), m.Int32Constant(-1))))); | 1590 m.Word32Xor(m.Int32Constant(2), m.Int32Constant(-1))))); |
| 1603 | 1591 |
| 1604 m.Bind(&exception_handler3); | 1592 m.Bind(&exception_handler3); |
| 1605 m.Return(error.value()); | 1593 m.Return(error.value()); |
| 1606 | 1594 |
| 1607 Handle<Code> code = data.GenerateCode(); | 1595 Handle<Code> code = m.GenerateCode(); |
| 1608 CHECK(!code.is_null()); | 1596 CHECK(!code.is_null()); |
| 1609 | 1597 |
| 1610 FunctionTester ft(code, kNumParams); | 1598 FunctionTester ft(code, kNumParams); |
| 1611 | 1599 |
| 1612 Handle<Object> result; | 1600 Handle<Object> result; |
| 1613 // First handler does not throw, returns result of first value. | 1601 // First handler does not throw, returns result of first value |
| 1614 result = ft.Call(isolate->factory()->undefined_value(), | 1602 result = ft.Call(isolate->factory()->undefined_value(), |
| 1615 isolate->factory()->to_string_tag_symbol()) | 1603 isolate->factory()->to_string_tag_symbol()) |
| 1616 .ToHandleChecked(); | 1604 .ToHandleChecked(); |
| 1617 CHECK(String::cast(*result)->IsOneByteEqualTo(OneByteVector("undefined"))); | 1605 CHECK(String::cast(*result)->IsOneByteEqualTo(OneByteVector("undefined"))); |
| 1618 | 1606 |
| 1619 // First handler returns a number. | 1607 // First handler returns a number |
| 1620 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | 1608 result = ft.Call(isolate->factory()->to_string_tag_symbol(), |
| 1621 isolate->factory()->undefined_value()) | 1609 isolate->factory()->undefined_value()) |
| 1622 .ToHandleChecked(); | 1610 .ToHandleChecked(); |
| 1623 CHECK_EQ(7, Smi::cast(*result)->value()); | 1611 CHECK_EQ(7, Smi::cast(*result)->value()); |
| 1624 | 1612 |
| 1625 // First handler throws, second handler returns a number. | 1613 // First handler throws, second handler returns a number |
| 1626 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | 1614 result = ft.Call(isolate->factory()->to_string_tag_symbol(), |
| 1627 isolate->factory()->to_primitive_symbol()) | 1615 isolate->factory()->to_primitive_symbol()) |
| 1628 .ToHandleChecked(); | 1616 .ToHandleChecked(); |
| 1629 CHECK_EQ(7 & ~2, Smi::cast(*result)->value()); | 1617 CHECK_EQ(7 & ~2, Smi::cast(*result)->value()); |
| 1630 | 1618 |
| 1631 // First handler throws, second handler throws, third handler returns thrown | 1619 // First handler throws, second handler throws, third handler returns thrown |
| 1632 // value. | 1620 // value. |
| 1633 result = ft.Call(isolate->factory()->to_string_tag_symbol(), | 1621 result = ft.Call(isolate->factory()->to_string_tag_symbol(), |
| 1634 isolate->factory()->to_primitive_symbol(), | 1622 isolate->factory()->to_primitive_symbol(), |
| 1635 isolate->factory()->unscopables_symbol()) | 1623 isolate->factory()->unscopables_symbol()) |
| 1636 .ToHandleChecked(); | 1624 .ToHandleChecked(); |
| 1637 | 1625 |
| 1638 // Should be a TypeError. | 1626 // Should be a TypeError |
| 1639 CHECK(result->IsJSObject()); | 1627 CHECK(result->IsJSObject()); |
| 1640 | 1628 |
| 1641 Handle<Object> constructor = | 1629 Handle<Object> constructor = |
| 1642 Object::GetPropertyOrElement(result, | 1630 Object::GetPropertyOrElement(result, |
| 1643 isolate->factory()->constructor_string()) | 1631 isolate->factory()->constructor_string()) |
| 1644 .ToHandleChecked(); | 1632 .ToHandleChecked(); |
| 1645 CHECK(constructor->SameValue(*isolate->type_error_function())); | 1633 CHECK(constructor->SameValue(*isolate->type_error_function())); |
| 1646 } | 1634 } |
| 1647 | 1635 |
| 1648 TEST(AllocateJSObjectFromMap) { | 1636 TEST(AllocateJSObjectFromMap) { |
| 1649 Isolate* isolate(CcTest::InitIsolateOnce()); | 1637 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1650 Factory* factory = isolate->factory(); | 1638 Factory* factory = isolate->factory(); |
| 1651 | 1639 |
| 1652 const int kNumParams = 3; | 1640 const int kNumParams = 3; |
| 1653 CodeAssemblerTester data(isolate, kNumParams); | 1641 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1654 CodeStubAssembler m(data.state()); | |
| 1655 | 1642 |
| 1656 { | 1643 { |
| 1657 Node* map = m.Parameter(0); | 1644 Node* map = m.Parameter(0); |
| 1658 Node* properties = m.Parameter(1); | 1645 Node* properties = m.Parameter(1); |
| 1659 Node* elements = m.Parameter(2); | 1646 Node* elements = m.Parameter(2); |
| 1660 | 1647 |
| 1661 Node* result = m.AllocateJSObjectFromMap(map, properties, elements); | 1648 Node* result = m.AllocateJSObjectFromMap(map, properties, elements); |
| 1662 | 1649 |
| 1663 m.Return(result); | 1650 m.Return(result); |
| 1664 } | 1651 } |
| 1665 | 1652 |
| 1666 Handle<Code> code = data.GenerateCode(); | 1653 Handle<Code> code = m.GenerateCode(); |
| 1667 FunctionTester ft(code, kNumParams); | 1654 FunctionTester ft(code, kNumParams); |
| 1668 | 1655 |
| 1669 Handle<Map> maps[] = { | 1656 Handle<Map> maps[] = { |
| 1670 handle(isolate->object_function()->initial_map(), isolate), | 1657 handle(isolate->object_function()->initial_map(), isolate), |
| 1671 handle(isolate->array_function()->initial_map(), isolate), | 1658 handle(isolate->array_function()->initial_map(), isolate), |
| 1672 }; | 1659 }; |
| 1673 | 1660 |
| 1674 #define VERIFY(result, map_value, properties_value, elements_value) \ | 1661 #define VERIFY(result, map_value, properties_value, elements_value) \ |
| 1675 CHECK_EQ(result->map(), map_value); \ | 1662 CHECK_EQ(result->map(), map_value); \ |
| 1676 CHECK_EQ(result->properties(), properties_value); \ | 1663 CHECK_EQ(result->properties(), properties_value); \ |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1707 isolate->heap()->Verify(); | 1694 isolate->heap()->Verify(); |
| 1708 #endif | 1695 #endif |
| 1709 } | 1696 } |
| 1710 #undef VERIFY | 1697 #undef VERIFY |
| 1711 } | 1698 } |
| 1712 | 1699 |
| 1713 TEST(AllocateNameDictionary) { | 1700 TEST(AllocateNameDictionary) { |
| 1714 Isolate* isolate(CcTest::InitIsolateOnce()); | 1701 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1715 | 1702 |
| 1716 const int kNumParams = 1; | 1703 const int kNumParams = 1; |
| 1717 CodeAssemblerTester data(isolate, kNumParams); | 1704 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1718 CodeStubAssembler m(data.state()); | |
| 1719 | 1705 |
| 1720 { | 1706 { |
| 1721 Node* capacity = m.Parameter(0); | 1707 Node* capacity = m.Parameter(0); |
| 1722 Node* result = m.AllocateNameDictionary(m.SmiUntag(capacity)); | 1708 Node* result = m.AllocateNameDictionary(m.SmiUntag(capacity)); |
| 1723 m.Return(result); | 1709 m.Return(result); |
| 1724 } | 1710 } |
| 1725 | 1711 |
| 1726 Handle<Code> code = data.GenerateCode(); | 1712 Handle<Code> code = m.GenerateCode(); |
| 1727 FunctionTester ft(code, kNumParams); | 1713 FunctionTester ft(code, kNumParams); |
| 1728 | 1714 |
| 1729 { | 1715 { |
| 1730 for (int i = 0; i < 256; i = i * 1.1 + 1) { | 1716 for (int i = 0; i < 256; i = i * 1.1 + 1) { |
| 1731 Handle<Object> result = | 1717 Handle<Object> result = |
| 1732 ft.Call(handle(Smi::FromInt(i), isolate)).ToHandleChecked(); | 1718 ft.Call(handle(Smi::FromInt(i), isolate)).ToHandleChecked(); |
| 1733 Handle<NameDictionary> dict = NameDictionary::New(isolate, i); | 1719 Handle<NameDictionary> dict = NameDictionary::New(isolate, i); |
| 1734 // Both dictionaries should be memory equal. | 1720 // Both dictionaries should be memory equal. |
| 1735 int size = | 1721 int size = |
| 1736 FixedArrayBase::kHeaderSize + (dict->length() - 1) * kPointerSize; | 1722 FixedArrayBase::kHeaderSize + (dict->length() - 1) * kPointerSize; |
| 1737 CHECK_EQ(0, memcmp(*dict, *result, size)); | 1723 CHECK_EQ(0, memcmp(*dict, *result, size)); |
| 1738 } | 1724 } |
| 1739 } | 1725 } |
| 1740 } | 1726 } |
| 1741 | 1727 |
| 1742 TEST(PopAndReturnConstant) { | 1728 TEST(PopAndReturnConstant) { |
| 1743 Isolate* isolate(CcTest::InitIsolateOnce()); | 1729 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1744 | 1730 |
| 1745 const int kNumParams = 4; | 1731 const int kNumParams = 4; |
| 1746 const int kNumProgrammaticParams = 2; | 1732 const int kNumProgramaticParams = 2; |
| 1747 CodeAssemblerTester data(isolate, kNumParams - kNumProgrammaticParams); | 1733 CodeStubAssemblerTester m(isolate, kNumParams - kNumProgramaticParams); |
| 1748 CodeStubAssembler m(data.state()); | |
| 1749 | 1734 |
| 1750 // Call a function that return |kNumProgramaticParams| parameters in addition | 1735 // Call a function that return |kNumProgramaticParams| parameters in addition |
| 1751 // to those specified by the static descriptor. |kNumProgramaticParams| is | 1736 // to those specified by the static descriptor. |kNumProgramaticParams| is |
| 1752 // specified as a constant. | 1737 // specified as a constant. |
| 1753 m.PopAndReturn(m.Int32Constant(kNumProgrammaticParams), | 1738 m.PopAndReturn(m.Int32Constant(kNumProgramaticParams), |
| 1754 m.SmiConstant(Smi::FromInt(1234))); | 1739 m.SmiConstant(Smi::FromInt(1234))); |
| 1755 | 1740 |
| 1756 Handle<Code> code = data.GenerateCode(); | 1741 Handle<Code> code = m.GenerateCode(); |
| 1757 CHECK(!code.is_null()); | 1742 CHECK(!code.is_null()); |
| 1758 | 1743 |
| 1759 FunctionTester ft(code, kNumParams); | 1744 FunctionTester ft(code, kNumParams); |
| 1760 Handle<Object> result; | 1745 Handle<Object> result; |
| 1761 for (int test_count = 0; test_count < 100; ++test_count) { | 1746 for (int test_count = 0; test_count < 100; ++test_count) { |
| 1762 result = ft.Call(isolate->factory()->undefined_value(), | 1747 result = ft.Call(isolate->factory()->undefined_value(), |
| 1763 Handle<Smi>(Smi::FromInt(1234), isolate), | 1748 Handle<Smi>(Smi::FromInt(1234), isolate), |
| 1764 isolate->factory()->undefined_value(), | 1749 isolate->factory()->undefined_value(), |
| 1765 isolate->factory()->undefined_value()) | 1750 isolate->factory()->undefined_value()) |
| 1766 .ToHandleChecked(); | 1751 .ToHandleChecked(); |
| 1767 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); | 1752 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); |
| 1768 } | 1753 } |
| 1769 } | 1754 } |
| 1770 | 1755 |
| 1771 TEST(PopAndReturnVariable) { | 1756 TEST(PopAndReturnVariable) { |
| 1772 Isolate* isolate(CcTest::InitIsolateOnce()); | 1757 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1773 | 1758 |
| 1774 const int kNumParams = 4; | 1759 const int kNumParams = 4; |
| 1775 const int kNumProgrammaticParams = 2; | 1760 const int kNumProgramaticParams = 2; |
| 1776 CodeAssemblerTester data(isolate, kNumParams - kNumProgrammaticParams); | 1761 CodeStubAssemblerTester m(isolate, kNumParams - kNumProgramaticParams); |
| 1777 CodeStubAssembler m(data.state()); | |
| 1778 | 1762 |
| 1779 // Call a function that return |kNumProgramaticParams| parameters in addition | 1763 // Call a function that return |kNumProgramaticParams| parameters in addition |
| 1780 // to those specified by the static descriptor. |kNumProgramaticParams| is | 1764 // to those specified by the static descriptor. |kNumProgramaticParams| is |
| 1781 // passed in as a parameter to the function so that it can't be recongized as | 1765 // passed in as a parameter to the function so that it can't be recongized as |
| 1782 // a constant. | 1766 // a constant. |
| 1783 m.PopAndReturn(m.SmiUntag(m.Parameter(1)), m.SmiConstant(Smi::FromInt(1234))); | 1767 m.PopAndReturn(m.SmiUntag(m.Parameter(1)), m.SmiConstant(Smi::FromInt(1234))); |
| 1784 | 1768 |
| 1785 Handle<Code> code = data.GenerateCode(); | 1769 Handle<Code> code = m.GenerateCode(); |
| 1786 CHECK(!code.is_null()); | 1770 CHECK(!code.is_null()); |
| 1787 | 1771 |
| 1788 FunctionTester ft(code, kNumParams); | 1772 FunctionTester ft(code, kNumParams); |
| 1789 Handle<Object> result; | 1773 Handle<Object> result; |
| 1790 for (int test_count = 0; test_count < 100; ++test_count) { | 1774 for (int test_count = 0; test_count < 100; ++test_count) { |
| 1791 result = ft.Call(isolate->factory()->undefined_value(), | 1775 result = ft.Call(isolate->factory()->undefined_value(), |
| 1792 Handle<Smi>(Smi::FromInt(1234), isolate), | 1776 Handle<Smi>(Smi::FromInt(1234), isolate), |
| 1793 isolate->factory()->undefined_value(), | 1777 isolate->factory()->undefined_value(), |
| 1794 Handle<Smi>(Smi::FromInt(kNumProgrammaticParams), isolate)) | 1778 Handle<Smi>(Smi::FromInt(kNumProgramaticParams), isolate)) |
| 1795 .ToHandleChecked(); | 1779 .ToHandleChecked(); |
| 1796 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); | 1780 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); |
| 1797 } | 1781 } |
| 1798 } | 1782 } |
| 1799 | 1783 |
| 1800 TEST(OneToTwoByteStringCopy) { | 1784 TEST(OneToTwoByteStringCopy) { |
| 1801 Isolate* isolate(CcTest::InitIsolateOnce()); | 1785 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1802 | 1786 |
| 1803 const int kNumParams = 2; | 1787 CodeStubAssemblerTester m(isolate, 2); |
| 1804 CodeAssemblerTester data(isolate, kNumParams); | |
| 1805 CodeStubAssembler m(data.state()); | |
| 1806 | 1788 |
| 1807 m.CopyStringCharacters( | 1789 m.CopyStringCharacters( |
| 1808 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), | 1790 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
| 1809 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), | 1791 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
| 1810 String::ONE_BYTE_ENCODING, String::TWO_BYTE_ENCODING, | 1792 String::ONE_BYTE_ENCODING, String::TWO_BYTE_ENCODING, |
| 1811 CodeStubAssembler::SMI_PARAMETERS); | 1793 CodeStubAssembler::SMI_PARAMETERS); |
| 1812 m.Return(m.SmiConstant(Smi::FromInt(0))); | 1794 m.Return(m.SmiConstant(Smi::FromInt(0))); |
| 1813 | 1795 |
| 1814 Handle<Code> code = data.GenerateCode(); | 1796 Handle<Code> code = m.GenerateCode(); |
| 1815 CHECK(!code.is_null()); | 1797 CHECK(!code.is_null()); |
| 1816 | 1798 |
| 1817 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); | 1799 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
| 1818 uc16 array[] = {1000, 1001, 1002, 1003, 1004}; | 1800 uc16 array[] = {1000, 1001, 1002, 1003, 1004}; |
| 1819 Vector<const uc16> str(array); | 1801 Vector<const uc16> str(array); |
| 1820 Handle<String> string2 = | 1802 Handle<String> string2 = |
| 1821 isolate->factory()->NewStringFromTwoByte(str).ToHandleChecked(); | 1803 isolate->factory()->NewStringFromTwoByte(str).ToHandleChecked(); |
| 1822 FunctionTester ft(code, 2); | 1804 FunctionTester ft(code, 2); |
| 1823 ft.Call(string1, string2); | 1805 ft.Call(string1, string2); |
| 1824 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], | 1806 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
| 1825 Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); | 1807 Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); |
| 1826 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], | 1808 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
| 1827 Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); | 1809 Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); |
| 1828 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], | 1810 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], |
| 1829 Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); | 1811 Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); |
| 1830 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], | 1812 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], |
| 1831 Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); | 1813 Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); |
| 1832 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], | 1814 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], |
| 1833 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); | 1815 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); |
| 1834 } | 1816 } |
| 1835 | 1817 |
| 1836 TEST(OneToOneByteStringCopy) { | 1818 TEST(OneToOneByteStringCopy) { |
| 1837 Isolate* isolate(CcTest::InitIsolateOnce()); | 1819 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1838 | 1820 |
| 1839 const int kNumParams = 2; | 1821 CodeStubAssemblerTester m(isolate, 2); |
| 1840 CodeAssemblerTester data(isolate, kNumParams); | |
| 1841 CodeStubAssembler m(data.state()); | |
| 1842 | 1822 |
| 1843 m.CopyStringCharacters( | 1823 m.CopyStringCharacters( |
| 1844 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), | 1824 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
| 1845 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), | 1825 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
| 1846 String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, | 1826 String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, |
| 1847 CodeStubAssembler::SMI_PARAMETERS); | 1827 CodeStubAssembler::SMI_PARAMETERS); |
| 1848 m.Return(m.SmiConstant(Smi::FromInt(0))); | 1828 m.Return(m.SmiConstant(Smi::FromInt(0))); |
| 1849 | 1829 |
| 1850 Handle<Code> code = data.GenerateCode(); | 1830 Handle<Code> code = m.GenerateCode(); |
| 1851 CHECK(!code.is_null()); | 1831 CHECK(!code.is_null()); |
| 1852 | 1832 |
| 1853 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); | 1833 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
| 1854 uint8_t array[] = {100, 101, 102, 103, 104}; | 1834 uint8_t array[] = {100, 101, 102, 103, 104}; |
| 1855 Vector<const uint8_t> str(array); | 1835 Vector<const uint8_t> str(array); |
| 1856 Handle<String> string2 = | 1836 Handle<String> string2 = |
| 1857 isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); | 1837 isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); |
| 1858 FunctionTester ft(code, 2); | 1838 FunctionTester ft(code, 2); |
| 1859 ft.Call(string1, string2); | 1839 ft.Call(string1, string2); |
| 1860 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], | 1840 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
| 1861 Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); | 1841 Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); |
| 1862 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], | 1842 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
| 1863 Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); | 1843 Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); |
| 1864 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], | 1844 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], |
| 1865 Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); | 1845 Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); |
| 1866 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], | 1846 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], |
| 1867 Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); | 1847 Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); |
| 1868 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], | 1848 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], |
| 1869 Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); | 1849 Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); |
| 1870 } | 1850 } |
| 1871 | 1851 |
| 1872 TEST(OneToOneByteStringCopyNonZeroStart) { | 1852 TEST(OneToOneByteStringCopyNonZeroStart) { |
| 1873 Isolate* isolate(CcTest::InitIsolateOnce()); | 1853 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1874 | 1854 |
| 1875 const int kNumParams = 2; | 1855 CodeStubAssemblerTester m(isolate, 2); |
| 1876 CodeAssemblerTester data(isolate, kNumParams); | |
| 1877 CodeStubAssembler m(data.state()); | |
| 1878 | 1856 |
| 1879 m.CopyStringCharacters( | 1857 m.CopyStringCharacters( |
| 1880 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), | 1858 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
| 1881 m.SmiConstant(Smi::FromInt(3)), m.SmiConstant(Smi::FromInt(2)), | 1859 m.SmiConstant(Smi::FromInt(3)), m.SmiConstant(Smi::FromInt(2)), |
| 1882 String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, | 1860 String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, |
| 1883 CodeStubAssembler::SMI_PARAMETERS); | 1861 CodeStubAssembler::SMI_PARAMETERS); |
| 1884 m.Return(m.SmiConstant(Smi::FromInt(0))); | 1862 m.Return(m.SmiConstant(Smi::FromInt(0))); |
| 1885 | 1863 |
| 1886 Handle<Code> code = data.GenerateCode(); | 1864 Handle<Code> code = m.GenerateCode(); |
| 1887 CHECK(!code.is_null()); | 1865 CHECK(!code.is_null()); |
| 1888 | 1866 |
| 1889 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); | 1867 Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
| 1890 uint8_t array[] = {100, 101, 102, 103, 104}; | 1868 uint8_t array[] = {100, 101, 102, 103, 104}; |
| 1891 Vector<const uint8_t> str(array); | 1869 Vector<const uint8_t> str(array); |
| 1892 Handle<String> string2 = | 1870 Handle<String> string2 = |
| 1893 isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); | 1871 isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); |
| 1894 FunctionTester ft(code, 2); | 1872 FunctionTester ft(code, 2); |
| 1895 ft.Call(string1, string2); | 1873 ft.Call(string1, string2); |
| 1896 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], | 1874 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
| 1897 Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); | 1875 Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); |
| 1898 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], | 1876 CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
| 1899 Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); | 1877 Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); |
| 1900 CHECK_EQ(100, Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); | 1878 CHECK_EQ(100, Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); |
| 1901 CHECK_EQ(101, Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); | 1879 CHECK_EQ(101, Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); |
| 1902 CHECK_EQ(102, Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); | 1880 CHECK_EQ(102, Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); |
| 1903 } | 1881 } |
| 1904 | 1882 |
| 1905 TEST(TwoToTwoByteStringCopy) { | 1883 TEST(TwoToTwoByteStringCopy) { |
| 1906 Isolate* isolate(CcTest::InitIsolateOnce()); | 1884 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1907 | 1885 |
| 1908 const int kNumParams = 2; | 1886 CodeStubAssemblerTester m(isolate, 2); |
| 1909 CodeAssemblerTester data(isolate, kNumParams); | |
| 1910 CodeStubAssembler m(data.state()); | |
| 1911 | 1887 |
| 1912 m.CopyStringCharacters( | 1888 m.CopyStringCharacters( |
| 1913 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), | 1889 m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
| 1914 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), | 1890 m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
| 1915 String::TWO_BYTE_ENCODING, String::TWO_BYTE_ENCODING, | 1891 String::TWO_BYTE_ENCODING, String::TWO_BYTE_ENCODING, |
| 1916 CodeStubAssembler::SMI_PARAMETERS); | 1892 CodeStubAssembler::SMI_PARAMETERS); |
| 1917 m.Return(m.SmiConstant(Smi::FromInt(0))); | 1893 m.Return(m.SmiConstant(Smi::FromInt(0))); |
| 1918 | 1894 |
| 1919 Handle<Code> code = data.GenerateCode(); | 1895 Handle<Code> code = m.GenerateCode(); |
| 1920 CHECK(!code.is_null()); | 1896 CHECK(!code.is_null()); |
| 1921 | 1897 |
| 1922 uc16 array1[] = {2000, 2001, 2002, 2003, 2004}; | 1898 uc16 array1[] = {2000, 2001, 2002, 2003, 2004}; |
| 1923 Vector<const uc16> str1(array1); | 1899 Vector<const uc16> str1(array1); |
| 1924 Handle<String> string1 = | 1900 Handle<String> string1 = |
| 1925 isolate->factory()->NewStringFromTwoByte(str1).ToHandleChecked(); | 1901 isolate->factory()->NewStringFromTwoByte(str1).ToHandleChecked(); |
| 1926 uc16 array2[] = {1000, 1001, 1002, 1003, 1004}; | 1902 uc16 array2[] = {1000, 1001, 1002, 1003, 1004}; |
| 1927 Vector<const uc16> str2(array2); | 1903 Vector<const uc16> str2(array2); |
| 1928 Handle<String> string2 = | 1904 Handle<String> string2 = |
| 1929 isolate->factory()->NewStringFromTwoByte(str2).ToHandleChecked(); | 1905 isolate->factory()->NewStringFromTwoByte(str2).ToHandleChecked(); |
| 1930 FunctionTester ft(code, 2); | 1906 FunctionTester ft(code, 2); |
| 1931 ft.Call(string1, string2); | 1907 ft.Call(string1, string2); |
| 1932 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[0], | 1908 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[0], |
| 1933 Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); | 1909 Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); |
| 1934 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[1], | 1910 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[1], |
| 1935 Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); | 1911 Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); |
| 1936 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[2], | 1912 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[2], |
| 1937 Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); | 1913 Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); |
| 1938 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[3], | 1914 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[3], |
| 1939 Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); | 1915 Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); |
| 1940 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[4], | 1916 CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[4], |
| 1941 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); | 1917 Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); |
| 1942 } | 1918 } |
| 1943 | 1919 |
| 1944 TEST(Arguments) { | 1920 TEST(Arguments) { |
| 1945 Isolate* isolate(CcTest::InitIsolateOnce()); | 1921 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1946 | 1922 |
| 1947 const int kNumParams = 4; | 1923 const int kNumParams = 4; |
| 1948 CodeAssemblerTester data(isolate, kNumParams); | 1924 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1949 CodeStubAssembler m(data.state()); | |
| 1950 | 1925 |
| 1951 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); | 1926 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); |
| 1952 | 1927 |
| 1953 CSA_ASSERT( | 1928 CSA_ASSERT( |
| 1954 &m, m.WordEqual(arguments.AtIndex(0), m.SmiConstant(Smi::FromInt(12)))); | 1929 &m, m.WordEqual(arguments.AtIndex(0), m.SmiConstant(Smi::FromInt(12)))); |
| 1955 CSA_ASSERT( | 1930 CSA_ASSERT( |
| 1956 &m, m.WordEqual(arguments.AtIndex(1), m.SmiConstant(Smi::FromInt(13)))); | 1931 &m, m.WordEqual(arguments.AtIndex(1), m.SmiConstant(Smi::FromInt(13)))); |
| 1957 CSA_ASSERT( | 1932 CSA_ASSERT( |
| 1958 &m, m.WordEqual(arguments.AtIndex(2), m.SmiConstant(Smi::FromInt(14)))); | 1933 &m, m.WordEqual(arguments.AtIndex(2), m.SmiConstant(Smi::FromInt(14)))); |
| 1959 | 1934 |
| 1960 m.Return(arguments.GetReceiver()); | 1935 m.Return(arguments.GetReceiver()); |
| 1961 | 1936 |
| 1962 Handle<Code> code = data.GenerateCode(); | 1937 Handle<Code> code = m.GenerateCode(); |
| 1963 CHECK(!code.is_null()); | 1938 CHECK(!code.is_null()); |
| 1964 | 1939 |
| 1965 FunctionTester ft(code, kNumParams); | 1940 FunctionTester ft(code, kNumParams); |
| 1966 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), | 1941 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), |
| 1967 Handle<Smi>(Smi::FromInt(12), isolate), | 1942 Handle<Smi>(Smi::FromInt(12), isolate), |
| 1968 Handle<Smi>(Smi::FromInt(13), isolate), | 1943 Handle<Smi>(Smi::FromInt(13), isolate), |
| 1969 Handle<Smi>(Smi::FromInt(14), isolate)) | 1944 Handle<Smi>(Smi::FromInt(14), isolate)) |
| 1970 .ToHandleChecked(); | 1945 .ToHandleChecked(); |
| 1971 CHECK_EQ(*isolate->factory()->undefined_value(), *result); | 1946 CHECK_EQ(*isolate->factory()->undefined_value(), *result); |
| 1972 } | 1947 } |
| 1973 | 1948 |
| 1974 TEST(ArgumentsForEach) { | 1949 TEST(ArgumentsForEach) { |
| 1975 Isolate* isolate(CcTest::InitIsolateOnce()); | 1950 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1976 | 1951 |
| 1977 const int kNumParams = 4; | 1952 const int kNumParams = 4; |
| 1978 CodeAssemblerTester data(isolate, kNumParams); | 1953 CodeStubAssemblerTester m(isolate, kNumParams); |
| 1979 CodeStubAssembler m(data.state()); | |
| 1980 | 1954 |
| 1981 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); | 1955 CodeStubArguments arguments(&m, m.IntPtrConstant(3)); |
| 1982 | 1956 |
| 1983 CodeStubAssembler::Variable sum(&m, MachineType::PointerRepresentation()); | 1957 CodeStubAssemblerTester::Variable sum(&m, |
| 1984 CodeStubAssembler::VariableList list({&sum}, m.zone()); | 1958 MachineType::PointerRepresentation()); |
| 1959 CodeStubAssemblerTester::VariableList list({&sum}, m.zone()); |
| 1985 | 1960 |
| 1986 sum.Bind(m.IntPtrConstant(0)); | 1961 sum.Bind(m.IntPtrConstant(0)); |
| 1987 | 1962 |
| 1988 arguments.ForEach(list, [&m, &sum](CodeStubAssembler* assembler, Node* arg) { | 1963 arguments.ForEach(list, [&m, &sum](CodeStubAssembler* assembler, Node* arg) { |
| 1989 sum.Bind(assembler->IntPtrAdd(sum.value(), arg)); | 1964 sum.Bind(assembler->IntPtrAdd(sum.value(), arg)); |
| 1990 }); | 1965 }); |
| 1991 | 1966 |
| 1992 m.Return(sum.value()); | 1967 m.Return(sum.value()); |
| 1993 | 1968 |
| 1994 Handle<Code> code = data.GenerateCode(); | 1969 Handle<Code> code = m.GenerateCode(); |
| 1995 CHECK(!code.is_null()); | 1970 CHECK(!code.is_null()); |
| 1996 | 1971 |
| 1997 FunctionTester ft(code, kNumParams); | 1972 FunctionTester ft(code, kNumParams); |
| 1998 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), | 1973 Handle<Object> result = ft.Call(isolate->factory()->undefined_value(), |
| 1999 Handle<Smi>(Smi::FromInt(12), isolate), | 1974 Handle<Smi>(Smi::FromInt(12), isolate), |
| 2000 Handle<Smi>(Smi::FromInt(13), isolate), | 1975 Handle<Smi>(Smi::FromInt(13), isolate), |
| 2001 Handle<Smi>(Smi::FromInt(14), isolate)) | 1976 Handle<Smi>(Smi::FromInt(14), isolate)) |
| 2002 .ToHandleChecked(); | 1977 .ToHandleChecked(); |
| 2003 CHECK_EQ(Smi::FromInt(12 + 13 + 14), *result); | 1978 CHECK_EQ(Smi::FromInt(12 + 13 + 14), *result); |
| 2004 } | 1979 } |
| 2005 | 1980 |
| 2006 } // namespace internal | 1981 } // namespace internal |
| 2007 } // namespace v8 | 1982 } // namespace v8 |
| OLD | NEW |