OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/v8.h" | 5 #include "src/v8.h" |
6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
7 | 7 |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/execution.h" | 10 #include "src/execution.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 | 24 |
25 TEST(VectorStructure) { | 25 TEST(VectorStructure) { |
26 LocalContext context; | 26 LocalContext context; |
27 v8::HandleScope scope(context->GetIsolate()); | 27 v8::HandleScope scope(context->GetIsolate()); |
28 Isolate* isolate = CcTest::i_isolate(); | 28 Isolate* isolate = CcTest::i_isolate(); |
29 Factory* factory = isolate->factory(); | 29 Factory* factory = isolate->factory(); |
30 Zone* zone = isolate->runtime_zone(); | 30 Zone* zone = isolate->runtime_zone(); |
31 | 31 |
32 // Empty vectors are the empty fixed array. | 32 // Empty vectors are the empty fixed array. |
33 StaticFeedbackVectorSpec empty; | 33 StaticFeedbackVectorSpec empty; |
34 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &empty); | 34 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &empty); |
35 CHECK(Handle<FixedArray>::cast(vector) | 35 CHECK(Handle<FixedArray>::cast(vector) |
36 .is_identical_to(factory->empty_fixed_array())); | 36 .is_identical_to(factory->empty_fixed_array())); |
37 // Which can nonetheless be queried. | 37 // Which can nonetheless be queried. |
38 CHECK_EQ(0, vector->ic_with_type_info_count()); | 38 CHECK_EQ(0, vector->ic_with_type_info_count()); |
39 CHECK_EQ(0, vector->ic_generic_count()); | 39 CHECK_EQ(0, vector->ic_generic_count()); |
40 CHECK(vector->is_empty()); | 40 CHECK(vector->is_empty()); |
41 | 41 |
42 { | 42 { |
43 FeedbackVectorSpec one_slot(zone); | 43 FeedbackVectorSpec one_slot(zone); |
44 one_slot.AddGeneralSlot(); | 44 one_slot.AddGeneralSlot(); |
45 vector = TypeFeedbackVector::New(isolate, &one_slot); | 45 vector = NewTypeFeedbackVector(isolate, &one_slot); |
46 FeedbackVectorHelper helper(vector); | 46 FeedbackVectorHelper helper(vector); |
47 CHECK_EQ(1, helper.slot_count()); | 47 CHECK_EQ(1, helper.slot_count()); |
48 } | 48 } |
49 | 49 |
50 { | 50 { |
51 FeedbackVectorSpec one_icslot(zone); | 51 FeedbackVectorSpec one_icslot(zone); |
52 one_icslot.AddCallICSlot(); | 52 one_icslot.AddCallICSlot(); |
53 vector = TypeFeedbackVector::New(isolate, &one_icslot); | 53 vector = NewTypeFeedbackVector(isolate, &one_icslot); |
54 FeedbackVectorHelper helper(vector); | 54 FeedbackVectorHelper helper(vector); |
55 CHECK_EQ(1, helper.slot_count()); | 55 CHECK_EQ(1, helper.slot_count()); |
56 } | 56 } |
57 | 57 |
58 { | 58 { |
59 FeedbackVectorSpec spec(zone); | 59 FeedbackVectorSpec spec(zone); |
60 for (int i = 0; i < 3; i++) { | 60 for (int i = 0; i < 3; i++) { |
61 spec.AddGeneralSlot(); | 61 spec.AddGeneralSlot(); |
62 } | 62 } |
63 for (int i = 0; i < 5; i++) { | 63 for (int i = 0; i < 5; i++) { |
64 spec.AddCallICSlot(); | 64 spec.AddCallICSlot(); |
65 } | 65 } |
66 vector = TypeFeedbackVector::New(isolate, &spec); | 66 vector = NewTypeFeedbackVector(isolate, &spec); |
67 FeedbackVectorHelper helper(vector); | 67 FeedbackVectorHelper helper(vector); |
68 CHECK_EQ(8, helper.slot_count()); | 68 CHECK_EQ(8, helper.slot_count()); |
69 | 69 |
70 int metadata_length = vector->ic_metadata_length(); | |
71 CHECK(metadata_length > 0); | |
72 | |
73 int index = vector->GetIndex(helper.slot(0)); | 70 int index = vector->GetIndex(helper.slot(0)); |
74 | 71 |
75 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length, index); | 72 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount, index); |
76 CHECK(helper.slot(0) == vector->ToSlot(index)); | 73 CHECK_EQ(helper.slot(0), vector->ToSlot(index)); |
77 | 74 |
78 index = vector->GetIndex(helper.slot(3)); | 75 index = vector->GetIndex(helper.slot(3)); |
79 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3, | 76 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + 3, index); |
80 index); | 77 CHECK_EQ(helper.slot(3), vector->ToSlot(index)); |
81 CHECK(helper.slot(3) == vector->ToSlot(index)); | |
82 | 78 |
83 index = vector->GetIndex(helper.slot(7)); | 79 index = vector->GetIndex(helper.slot(7)); |
84 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3 + | 80 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + 3 + |
85 4 * TypeFeedbackVector::GetSlotSize( | 81 4 * TypeFeedbackMetadata::GetSlotSize( |
86 FeedbackVectorSlotKind::CALL_IC), | 82 FeedbackVectorSlotKind::CALL_IC), |
87 index); | 83 index); |
88 CHECK(helper.slot(7) == vector->ToSlot(index)); | 84 CHECK_EQ(helper.slot(7), vector->ToSlot(index)); |
89 | 85 |
90 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3 + | 86 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + 3 + |
91 5 * TypeFeedbackVector::GetSlotSize( | 87 5 * TypeFeedbackMetadata::GetSlotSize( |
92 FeedbackVectorSlotKind::CALL_IC), | 88 FeedbackVectorSlotKind::CALL_IC), |
93 vector->length()); | 89 vector->length()); |
94 } | 90 } |
95 } | 91 } |
96 | 92 |
97 | 93 |
98 // IC slots need an encoding to recognize what is in there. | 94 // IC slots need an encoding to recognize what is in there. |
99 TEST(VectorICMetadata) { | 95 TEST(VectorICMetadata) { |
100 LocalContext context; | 96 LocalContext context; |
101 v8::HandleScope scope(context->GetIsolate()); | 97 v8::HandleScope scope(context->GetIsolate()); |
(...skipping 12 matching lines...) Expand all Loading... |
114 break; | 110 break; |
115 case 2: | 111 case 2: |
116 spec.AddLoadICSlot(); | 112 spec.AddLoadICSlot(); |
117 break; | 113 break; |
118 case 3: | 114 case 3: |
119 spec.AddKeyedLoadICSlot(); | 115 spec.AddKeyedLoadICSlot(); |
120 break; | 116 break; |
121 } | 117 } |
122 } | 118 } |
123 | 119 |
124 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &spec); | 120 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &spec); |
125 FeedbackVectorHelper helper(vector); | 121 FeedbackVectorHelper helper(vector); |
126 CHECK_EQ(40, helper.slot_count()); | 122 CHECK_EQ(40, helper.slot_count()); |
127 | 123 |
128 // Meanwhile set some feedback values and type feedback values to | 124 // Meanwhile set some feedback values and type feedback values to |
129 // verify the data structure remains intact. | 125 // verify the data structure remains intact. |
130 vector->change_ic_with_type_info_count(100); | 126 vector->change_ic_with_type_info_count(100); |
131 vector->change_ic_generic_count(3333); | 127 vector->change_ic_generic_count(3333); |
132 vector->Set(FeedbackVectorSlot(0), *vector); | 128 vector->Set(FeedbackVectorSlot(0), *vector); |
133 | 129 |
134 // Verify the metadata is correctly set up from the spec. | 130 // Verify the metadata is correctly set up from the spec. |
(...skipping 24 matching lines...) Expand all Loading... |
159 Factory* factory = isolate->factory(); | 155 Factory* factory = isolate->factory(); |
160 Zone* zone = isolate->runtime_zone(); | 156 Zone* zone = isolate->runtime_zone(); |
161 | 157 |
162 // We only test clearing FeedbackVectorSlots, not FeedbackVectorSlots. | 158 // We only test clearing FeedbackVectorSlots, not FeedbackVectorSlots. |
163 // The reason is that FeedbackVectorSlots need a full code environment | 159 // The reason is that FeedbackVectorSlots need a full code environment |
164 // to fully test (See VectorICProfilerStatistics test below). | 160 // to fully test (See VectorICProfilerStatistics test below). |
165 FeedbackVectorSpec spec(zone); | 161 FeedbackVectorSpec spec(zone); |
166 for (int i = 0; i < 5; i++) { | 162 for (int i = 0; i < 5; i++) { |
167 spec.AddGeneralSlot(); | 163 spec.AddGeneralSlot(); |
168 } | 164 } |
169 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &spec); | 165 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &spec); |
170 FeedbackVectorHelper helper(vector); | 166 FeedbackVectorHelper helper(vector); |
171 | 167 |
172 // Fill with information | 168 // Fill with information |
173 vector->Set(helper.slot(0), Smi::FromInt(1)); | 169 vector->Set(helper.slot(0), Smi::FromInt(1)); |
174 Handle<WeakCell> cell = factory->NewWeakCell(factory->fixed_array_map()); | 170 Handle<WeakCell> cell = factory->NewWeakCell(factory->fixed_array_map()); |
175 vector->Set(helper.slot(1), *cell); | 171 vector->Set(helper.slot(1), *cell); |
176 Handle<AllocationSite> site = factory->NewAllocationSite(); | 172 Handle<AllocationSite> site = factory->NewAllocationSite(); |
177 vector->Set(helper.slot(2), *site); | 173 vector->Set(helper.slot(2), *site); |
178 | 174 |
179 // GC time clearing leaves slots alone. | 175 // GC time clearing leaves slots alone. |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 // There should be one IC slot. | 595 // There should be one IC slot. |
600 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 596 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); |
601 FeedbackVectorHelper helper(feedback_vector); | 597 FeedbackVectorHelper helper(feedback_vector); |
602 CHECK_EQ(1, helper.slot_count()); | 598 CHECK_EQ(1, helper.slot_count()); |
603 FeedbackVectorSlot slot(0); | 599 FeedbackVectorSlot slot(0); |
604 StoreICNexus nexus(feedback_vector, slot); | 600 StoreICNexus nexus(feedback_vector, slot); |
605 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 601 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
606 } | 602 } |
607 | 603 |
608 } // namespace | 604 } // namespace |
OLD | NEW |