Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(402)

Side by Side Diff: test/cctest/test-field-type-tracking.cc

Issue 2629423002: [runtime] Remove PropertyType definition and use PropertyKind/PropertyLocation instead. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/property-details.h ('k') | test/cctest/test-transitions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <stdlib.h> 5 #include <stdlib.h>
6 #include <utility> 6 #include <utility>
7 7
8 #include "test/cctest/test-api.h" 8 #include "test/cctest/test-api.h"
9 9
10 #include "src/v8.h" 10 #include "src/v8.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 pair->set_getter(*func); 66 pair->set_getter(*func);
67 } 67 }
68 if (with_setter) { 68 if (with_setter) {
69 Handle<JSFunction> func = factory->NewFunction(empty_string); 69 Handle<JSFunction> func = factory->NewFunction(empty_string);
70 pair->set_setter(*func); 70 pair->set_setter(*func);
71 } 71 }
72 return pair; 72 return pair;
73 } 73 }
74 74
75 75
76 static bool EqualDetails(DescriptorArray* descriptors, int descriptor,
77 PropertyType type, PropertyAttributes attributes,
78 Representation representation, int field_index = -1) {
79 PropertyDetails details = descriptors->GetDetails(descriptor);
80 if (details.type() != type) return false;
81 if (details.attributes() != attributes) return false;
82 if (!details.representation().Equals(representation)) return false;
83 if (field_index >= 0 && details.field_index() != field_index) return false;
84 return true;
85 }
86
87
88 class Expectations { 76 class Expectations {
89 static const int MAX_PROPERTIES = 10; 77 static const int MAX_PROPERTIES = 10;
90 Isolate* isolate_; 78 Isolate* isolate_;
91 ElementsKind elements_kind_; 79 ElementsKind elements_kind_;
92 PropertyType types_[MAX_PROPERTIES]; 80 PropertyKind kinds_[MAX_PROPERTIES];
81 PropertyLocation locations_[MAX_PROPERTIES];
93 PropertyAttributes attributes_[MAX_PROPERTIES]; 82 PropertyAttributes attributes_[MAX_PROPERTIES];
94 Representation representations_[MAX_PROPERTIES]; 83 Representation representations_[MAX_PROPERTIES];
95 // FieldType for kField, value for DATA_CONSTANT and getter for 84 // FieldType for kField, value for DATA_CONSTANT and getter for
96 // ACCESSOR_CONSTANT. 85 // ACCESSOR_CONSTANT.
97 Handle<Object> values_[MAX_PROPERTIES]; 86 Handle<Object> values_[MAX_PROPERTIES];
98 // Setter for ACCESSOR_CONSTANT. 87 // Setter for ACCESSOR_CONSTANT.
99 Handle<Object> setter_values_[MAX_PROPERTIES]; 88 Handle<Object> setter_values_[MAX_PROPERTIES];
100 int number_of_properties_; 89 int number_of_properties_;
101 90
102 public: 91 public:
103 explicit Expectations(Isolate* isolate, ElementsKind elements_kind) 92 explicit Expectations(Isolate* isolate, ElementsKind elements_kind)
104 : isolate_(isolate), 93 : isolate_(isolate),
105 elements_kind_(elements_kind), 94 elements_kind_(elements_kind),
106 number_of_properties_(0) {} 95 number_of_properties_(0) {}
107 96
108 explicit Expectations(Isolate* isolate) 97 explicit Expectations(Isolate* isolate)
109 : Expectations( 98 : Expectations(
110 isolate, 99 isolate,
111 isolate->object_function()->initial_map()->elements_kind()) {} 100 isolate->object_function()->initial_map()->elements_kind()) {}
112 101
113 void Init(int index, PropertyType type, PropertyAttributes attributes, 102 void Init(int index, PropertyKind kind, PropertyAttributes attributes,
114 Representation representation, Handle<Object> value) { 103 PropertyLocation location, Representation representation,
104 Handle<Object> value) {
115 CHECK(index < MAX_PROPERTIES); 105 CHECK(index < MAX_PROPERTIES);
116 types_[index] = type; 106 kinds_[index] = kind;
107 locations_[index] = location;
117 attributes_[index] = attributes; 108 attributes_[index] = attributes;
118 representations_[index] = representation; 109 representations_[index] = representation;
119 values_[index] = value; 110 values_[index] = value;
120 } 111 }
121 112
122 void Print() const { 113 void Print() const {
123 OFStream os(stdout); 114 OFStream os(stdout);
124 os << "Expectations: #" << number_of_properties_ << "\n"; 115 os << "Expectations: #" << number_of_properties_ << "\n";
125 for (int i = 0; i < number_of_properties_; i++) { 116 for (int i = 0; i < number_of_properties_; i++) {
126 os << " " << i << ": "; 117 os << " " << i << ": ";
127 os << "Descriptor @ "; 118 os << "Descriptor @ ";
128 if (types_[i] == ACCESSOR_CONSTANT) { 119
120 if (kinds_[i] == kData) {
121 os << Brief(*values_[i]);
122 } else {
123 // kAccessor
129 os << "(get: " << Brief(*values_[i]) 124 os << "(get: " << Brief(*values_[i])
130 << ", set: " << Brief(*setter_values_[i]) << ") "; 125 << ", set: " << Brief(*setter_values_[i]) << ") ";
126 }
127
128 os << " (";
129 os << (kinds_[i] == kData ? "data " : "accessor ");
130 if (locations_[i] == kField) {
131 os << "field"
132 << ": " << representations_[i].Mnemonic();
131 } else { 133 } else {
132 os << Brief(*values_[i]); 134 os << "descriptor";
133 } 135 }
134 os << " (";
135 switch (types_[i]) {
136 case DATA_CONSTANT:
137 os << "immutable ";
138 // Fall through.
139 case DATA:
140 os << "data";
141 break;
142
143 case ACCESSOR_CONSTANT:
144 os << "immutable ";
145 // Fall through.
146 case ACCESSOR:
147 os << "accessor";
148 break;
149 }
150 os << ": " << representations_[i].Mnemonic();
151 os << ", attrs: " << attributes_[i] << ")\n"; 136 os << ", attrs: " << attributes_[i] << ")\n";
152 } 137 }
153 os << "\n"; 138 os << "\n";
154 } 139 }
155 140
156 void SetElementsKind(ElementsKind elements_kind) { 141 void SetElementsKind(ElementsKind elements_kind) {
157 elements_kind_ = elements_kind; 142 elements_kind_ = elements_kind;
158 } 143 }
159 144
160 Handle<FieldType> GetFieldType(int index) { 145 Handle<FieldType> GetFieldType(int index) {
161 CHECK(index < MAX_PROPERTIES); 146 CHECK(index < MAX_PROPERTIES);
162 CHECK(types_[index] == DATA || types_[index] == ACCESSOR); 147 CHECK_EQ(kField, locations_[index]);
163 return Handle<FieldType>::cast(values_[index]); 148 return Handle<FieldType>::cast(values_[index]);
164 } 149 }
165 150
166 void SetDataField(int index, PropertyAttributes attrs, 151 void SetDataField(int index, PropertyAttributes attrs,
167 Representation representation, Handle<FieldType> value) { 152 Representation representation,
168 Init(index, DATA, attrs, representation, value); 153 Handle<FieldType> field_type) {
154 Init(index, kData, attrs, kField, representation, field_type);
169 } 155 }
170 156
171 void SetDataField(int index, Representation representation, 157 void SetDataField(int index, Representation representation,
172 Handle<FieldType> value) { 158 Handle<FieldType> field_type) {
173 SetDataField(index, attributes_[index], representation, value); 159 SetDataField(index, attributes_[index], representation, field_type);
174 } 160 }
175 161
176 void SetAccessorField(int index, PropertyAttributes attrs) { 162 void SetAccessorField(int index, PropertyAttributes attrs) {
177 Init(index, ACCESSOR, attrs, Representation::Tagged(), 163 Init(index, kAccessor, attrs, kDescriptor, Representation::Tagged(),
178 FieldType::Any(isolate_)); 164 FieldType::Any(isolate_));
179 } 165 }
180 166
181 void SetAccessorField(int index) { 167 void SetAccessorField(int index) {
182 SetAccessorField(index, attributes_[index]); 168 SetAccessorField(index, attributes_[index]);
183 } 169 }
184 170
185 void SetDataConstant(int index, PropertyAttributes attrs, 171 void SetDataConstant(int index, PropertyAttributes attrs,
186 Handle<JSFunction> value) { 172 Handle<JSFunction> value) {
187 Init(index, DATA_CONSTANT, attrs, Representation::HeapObject(), value); 173 Init(index, kData, attrs, kDescriptor, Representation::HeapObject(), value);
188 } 174 }
189 175
190 void SetDataConstant(int index, Handle<JSFunction> value) { 176 void SetDataConstant(int index, Handle<JSFunction> value) {
191 SetDataConstant(index, attributes_[index], value); 177 SetDataConstant(index, attributes_[index], value);
192 } 178 }
193 179
194 void SetAccessorConstant(int index, PropertyAttributes attrs, 180 void SetAccessorConstant(int index, PropertyAttributes attrs,
195 Handle<Object> getter, Handle<Object> setter) { 181 Handle<Object> getter, Handle<Object> setter) {
196 Init(index, ACCESSOR_CONSTANT, attrs, Representation::Tagged(), getter); 182 Init(index, kAccessor, attrs, kDescriptor, Representation::Tagged(),
183 getter);
197 setter_values_[index] = setter; 184 setter_values_[index] = setter;
198 } 185 }
199 186
200 void SetAccessorConstantComponent(int index, PropertyAttributes attrs, 187 void SetAccessorConstantComponent(int index, PropertyAttributes attrs,
201 AccessorComponent component, 188 AccessorComponent component,
202 Handle<Object> accessor) { 189 Handle<Object> accessor) {
203 CHECK_EQ(ACCESSOR_CONSTANT, types_[index]); 190 CHECK_EQ(kAccessor, kinds_[index]);
191 CHECK_EQ(kDescriptor, locations_[index]);
204 CHECK(index < number_of_properties_); 192 CHECK(index < number_of_properties_);
205 if (component == ACCESSOR_GETTER) { 193 if (component == ACCESSOR_GETTER) {
206 values_[index] = accessor; 194 values_[index] = accessor;
207 } else { 195 } else {
208 setter_values_[index] = accessor; 196 setter_values_[index] = accessor;
209 } 197 }
210 } 198 }
211 199
212 void SetAccessorConstant(int index, PropertyAttributes attrs, 200 void SetAccessorConstant(int index, PropertyAttributes attrs,
213 Handle<AccessorPair> pair) { 201 Handle<AccessorPair> pair) {
214 Handle<Object> getter = handle(pair->getter(), isolate_); 202 Handle<Object> getter = handle(pair->getter(), isolate_);
215 Handle<Object> setter = handle(pair->setter(), isolate_); 203 Handle<Object> setter = handle(pair->setter(), isolate_);
216 SetAccessorConstant(index, attrs, getter, setter); 204 SetAccessorConstant(index, attrs, getter, setter);
217 } 205 }
218 206
219 void SetAccessorConstant(int index, Handle<Object> getter, 207 void SetAccessorConstant(int index, Handle<Object> getter,
220 Handle<Object> setter) { 208 Handle<Object> setter) {
221 SetAccessorConstant(index, attributes_[index], getter, setter); 209 SetAccessorConstant(index, attributes_[index], getter, setter);
222 } 210 }
223 211
224 void SetAccessorConstant(int index, Handle<AccessorPair> pair) { 212 void SetAccessorConstant(int index, Handle<AccessorPair> pair) {
225 Handle<Object> getter = handle(pair->getter(), isolate_); 213 Handle<Object> getter = handle(pair->getter(), isolate_);
226 Handle<Object> setter = handle(pair->setter(), isolate_); 214 Handle<Object> setter = handle(pair->setter(), isolate_);
227 SetAccessorConstant(index, getter, setter); 215 SetAccessorConstant(index, getter, setter);
228 } 216 }
229 217
230 void GeneralizeRepresentation(int index) { 218 void GeneralizeRepresentation(int index) {
231 CHECK(index < number_of_properties_); 219 CHECK(index < number_of_properties_);
232 representations_[index] = Representation::Tagged(); 220 representations_[index] = Representation::Tagged();
233 if (types_[index] == DATA || types_[index] == ACCESSOR) { 221 if (locations_[index] == kField) {
234 values_[index] = FieldType::Any(isolate_); 222 values_[index] = FieldType::Any(isolate_);
235 } 223 }
236 } 224 }
237 225
238 226
239 bool Check(DescriptorArray* descriptors, int descriptor) const { 227 bool Check(DescriptorArray* descriptors, int descriptor) const {
240 PropertyType type = types_[descriptor]; 228 PropertyDetails details = descriptors->GetDetails(descriptor);
241 if (!EqualDetails(descriptors, descriptor, type, attributes_[descriptor], 229
242 representations_[descriptor])) { 230 if (details.kind() != kinds_[descriptor]) return false;
243 return false; 231 if (details.location() != locations_[descriptor]) return false;
244 } 232
233 PropertyAttributes expected_attributes = attributes_[descriptor];
234 if (details.attributes() != expected_attributes) return false;
235
236 Representation expected_representation = representations_[descriptor];
237 if (!details.representation().Equals(expected_representation)) return false;
238
245 Object* value = descriptors->GetValue(descriptor); 239 Object* value = descriptors->GetValue(descriptor);
246 Object* expected_value = *values_[descriptor]; 240 Object* expected_value = *values_[descriptor];
247 switch (type) { 241 if (details.location() == kField) {
248 case DATA: 242 if (details.kind() == kData) {
249 case ACCESSOR: {
250 FieldType* type = descriptors->GetFieldType(descriptor); 243 FieldType* type = descriptors->GetFieldType(descriptor);
251 return FieldType::cast(expected_value) == type; 244 return FieldType::cast(expected_value) == type;
245 } else {
246 // kAccessor
247 UNREACHABLE();
248 return false;
252 } 249 }
253 250 } else {
254 case DATA_CONSTANT: 251 // kDescriptor
252 if (details.kind() == kData) {
255 return value == expected_value; 253 return value == expected_value;
256 254 } else {
257 case ACCESSOR_CONSTANT: { 255 // kAccessor
258 if (value == expected_value) return true; 256 if (value == expected_value) return true;
259 if (!value->IsAccessorPair()) return false; 257 if (!value->IsAccessorPair()) return false;
260 AccessorPair* pair = AccessorPair::cast(value); 258 AccessorPair* pair = AccessorPair::cast(value);
261 return pair->Equals(expected_value, *setter_values_[descriptor]); 259 return pair->Equals(expected_value, *setter_values_[descriptor]);
262 } 260 }
263 } 261 }
264 UNREACHABLE(); 262 UNREACHABLE();
265 return false; 263 return false;
266 } 264 }
267 265
(...skipping 2165 matching lines...) Expand 10 before | Expand all | Expand 10 after
2433 Isolate* isolate = CcTest::i_isolate(); 2431 Isolate* isolate = CcTest::i_isolate();
2434 2432
2435 Zone zone(isolate->allocator(), ZONE_NAME); 2433 Zone zone(isolate->allocator(), ZONE_NAME);
2436 2434
2437 CHECK_EQ(FieldType::Any()->Convert(&zone), AstType::NonInternal()); 2435 CHECK_EQ(FieldType::Any()->Convert(&zone), AstType::NonInternal());
2438 CHECK_EQ(FieldType::None()->Convert(&zone), AstType::None()); 2436 CHECK_EQ(FieldType::None()->Convert(&zone), AstType::None());
2439 } 2437 }
2440 2438
2441 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. 2439 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported.
2442 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) 2440 // TEST(TransitionAccessorConstantToAnotherAccessorConstant)
OLDNEW
« no previous file with comments | « src/property-details.h ('k') | test/cctest/test-transitions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698