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

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

Issue 2598543003: [runtime][ic] Constant field tracking support. (Closed)
Patch Set: Rebasing Created 3 years, 10 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
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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 Init(index, kAccessor, attrs, kConst, kDescriptor, Representation::Tagged(), 168 Init(index, kAccessor, attrs, kConst, kDescriptor, Representation::Tagged(),
169 FieldType::Any(isolate_)); 169 FieldType::Any(isolate_));
170 } 170 }
171 171
172 void SetAccessorField(int index) { 172 void SetAccessorField(int index) {
173 SetAccessorField(index, attributes_[index]); 173 SetAccessorField(index, attributes_[index]);
174 } 174 }
175 175
176 void SetDataConstant(int index, PropertyAttributes attrs, 176 void SetDataConstant(int index, PropertyAttributes attrs,
177 Handle<JSFunction> value) { 177 Handle<JSFunction> value) {
178 Init(index, kData, attrs, kConst, kDescriptor, Representation::HeapObject(), 178 if (FLAG_track_constant_fields) {
179 value); 179 Handle<FieldType> field_type(FieldType::Class(value->map()), isolate_);
180 Init(index, kData, attrs, kConst, kField, Representation::HeapObject(),
181 field_type);
182
183 } else {
184 Init(index, kData, attrs, kConst, kDescriptor,
185 Representation::HeapObject(), value);
186 }
180 } 187 }
181 188
182 void SetDataConstant(int index, Handle<JSFunction> value) { 189 void SetDataConstant(int index, Handle<JSFunction> value) {
183 SetDataConstant(index, attributes_[index], value); 190 SetDataConstant(index, attributes_[index], value);
184 } 191 }
185 192
186 void SetAccessorConstant(int index, PropertyAttributes attrs, 193 void SetAccessorConstant(int index, PropertyAttributes attrs,
187 Handle<Object> getter, Handle<Object> setter) { 194 Handle<Object> getter, Handle<Object> setter) {
188 Init(index, kAccessor, attrs, kConst, kDescriptor, Representation::Tagged(), 195 Init(index, kAccessor, attrs, kConst, kDescriptor, Representation::Tagged(),
189 getter); 196 getter);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 FieldType* type = descriptors->GetFieldType(descriptor); 256 FieldType* type = descriptors->GetFieldType(descriptor);
250 return FieldType::cast(expected_value) == type; 257 return FieldType::cast(expected_value) == type;
251 } else { 258 } else {
252 // kAccessor 259 // kAccessor
253 UNREACHABLE(); 260 UNREACHABLE();
254 return false; 261 return false;
255 } 262 }
256 } else { 263 } else {
257 // kDescriptor 264 // kDescriptor
258 if (details.kind() == kData) { 265 if (details.kind() == kData) {
266 CHECK(!FLAG_track_constant_fields);
259 return value == expected_value; 267 return value == expected_value;
260 } else { 268 } else {
261 // kAccessor 269 // kAccessor
262 if (value == expected_value) return true; 270 if (value == expected_value) return true;
263 if (!value->IsAccessorPair()) return false; 271 if (!value->IsAccessorPair()) return false;
264 AccessorPair* pair = AccessorPair::cast(value); 272 AccessorPair* pair = AccessorPair::cast(value);
265 return pair->Equals(expected_value, *setter_values_[descriptor]); 273 return pair->Equals(expected_value, *setter_values_[descriptor]);
266 } 274 }
267 } 275 }
268 UNREACHABLE(); 276 UNREACHABLE();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 Handle<Map> AddDataField(Handle<Map> map, PropertyAttributes attributes, 316 Handle<Map> AddDataField(Handle<Map> map, PropertyAttributes attributes,
309 PropertyConstness constness, 317 PropertyConstness constness,
310 Representation representation, 318 Representation representation,
311 Handle<FieldType> heap_type) { 319 Handle<FieldType> heap_type) {
312 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 320 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
313 int property_index = number_of_properties_++; 321 int property_index = number_of_properties_++;
314 SetDataField(property_index, attributes, constness, representation, 322 SetDataField(property_index, attributes, constness, representation,
315 heap_type); 323 heap_type);
316 324
317 Handle<String> name = MakeName("prop", property_index); 325 Handle<String> name = MakeName("prop", property_index);
318 return Map::CopyWithField(map, name, heap_type, attributes, representation, 326 return Map::CopyWithField(map, name, heap_type, attributes, constness,
319 INSERT_TRANSITION) 327 representation, INSERT_TRANSITION)
320 .ToHandleChecked(); 328 .ToHandleChecked();
321 } 329 }
322 330
323 Handle<Map> AddDataConstant(Handle<Map> map, PropertyAttributes attributes, 331 Handle<Map> AddDataConstant(Handle<Map> map, PropertyAttributes attributes,
324 Handle<JSFunction> value) { 332 Handle<JSFunction> value) {
325 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 333 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
326 int property_index = number_of_properties_++; 334 int property_index = number_of_properties_++;
327 SetDataConstant(property_index, attributes, value); 335 SetDataConstant(property_index, attributes, value);
328 336
329 Handle<String> name = MakeName("prop", property_index); 337 Handle<String> name = MakeName("prop", property_index);
330 return Map::CopyWithConstant(map, name, value, attributes, 338 return Map::CopyWithConstant(map, name, value, attributes,
331 INSERT_TRANSITION) 339 INSERT_TRANSITION)
332 .ToHandleChecked(); 340 .ToHandleChecked();
333 } 341 }
334 342
335 Handle<Map> TransitionToDataField(Handle<Map> map, 343 Handle<Map> TransitionToDataField(Handle<Map> map,
336 PropertyAttributes attributes, 344 PropertyAttributes attributes,
337 PropertyConstness constness, 345 PropertyConstness constness,
338 Representation representation, 346 Representation representation,
339 Handle<FieldType> heap_type, 347 Handle<FieldType> heap_type,
340 Handle<Object> value) { 348 Handle<Object> value) {
341 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 349 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
342 int property_index = number_of_properties_++; 350 int property_index = number_of_properties_++;
343 SetDataField(property_index, attributes, constness, representation, 351 SetDataField(property_index, attributes, constness, representation,
344 heap_type); 352 heap_type);
345 353
346 Handle<String> name = MakeName("prop", property_index); 354 Handle<String> name = MakeName("prop", property_index);
347 return Map::TransitionToDataProperty( 355 return Map::TransitionToDataProperty(
348 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED); 356 map, name, value, attributes, constness,
357 Object::CERTAINLY_NOT_STORE_FROM_KEYED);
349 } 358 }
350 359
351 Handle<Map> TransitionToDataConstant(Handle<Map> map, 360 Handle<Map> TransitionToDataConstant(Handle<Map> map,
352 PropertyAttributes attributes, 361 PropertyAttributes attributes,
353 Handle<JSFunction> value) { 362 Handle<JSFunction> value) {
354 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 363 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
355 int property_index = number_of_properties_++; 364 int property_index = number_of_properties_++;
356 SetDataConstant(property_index, attributes, value); 365 SetDataConstant(property_index, attributes, value);
357 366
358 Handle<String> name = MakeName("prop", property_index); 367 Handle<String> name = MakeName("prop", property_index);
359 return Map::TransitionToDataProperty( 368 return Map::TransitionToDataProperty(
360 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED); 369 map, name, value, attributes, kConst,
370 Object::CERTAINLY_NOT_STORE_FROM_KEYED);
361 } 371 }
362 372
363 Handle<Map> FollowDataTransition(Handle<Map> map, 373 Handle<Map> FollowDataTransition(Handle<Map> map,
364 PropertyAttributes attributes, 374 PropertyAttributes attributes,
365 PropertyConstness constness, 375 PropertyConstness constness,
366 Representation representation, 376 Representation representation,
367 Handle<FieldType> heap_type) { 377 Handle<FieldType> heap_type) {
368 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 378 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
369 int property_index = number_of_properties_++; 379 int property_index = number_of_properties_++;
370 SetDataField(property_index, attributes, constness, representation, 380 SetDataField(property_index, attributes, constness, representation,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 489
480 CHECK(!new_map->is_deprecated()); 490 CHECK(!new_map->is_deprecated());
481 CHECK(new_map->is_stable()); 491 CHECK(new_map->is_stable());
482 CHECK(expectations.Check(*new_map)); 492 CHECK(expectations.Check(*new_map));
483 493
484 Handle<Map> new_map2 = Map::ReconfigureProperty( 494 Handle<Map> new_map2 = Map::ReconfigureProperty(
485 map, 0, kData, NONE, Representation::None(), none_type); 495 map, 0, kData, NONE, Representation::None(), none_type);
486 CHECK_EQ(*new_map, *new_map2); 496 CHECK_EQ(*new_map, *new_map2);
487 497
488 Handle<Object> value(Smi::kZero, isolate); 498 Handle<Object> value(Smi::kZero, isolate);
489 Handle<Map> prepared_map = Map::PrepareForDataProperty(new_map, 0, value); 499 Handle<Map> prepared_map =
500 Map::PrepareForDataProperty(new_map, 0, kConst, value);
490 // None to Smi generalization is trivial, map does not change. 501 // None to Smi generalization is trivial, map does not change.
491 CHECK_EQ(*new_map, *prepared_map); 502 CHECK_EQ(*new_map, *prepared_map);
492 503
493 expectations.SetDataField(0, NONE, kMutable, Representation::Smi(), any_type); 504 expectations.SetDataField(0, NONE, kMutable, Representation::Smi(), any_type);
494 CHECK(prepared_map->is_stable()); 505 CHECK(prepared_map->is_stable());
495 CHECK(expectations.Check(*prepared_map)); 506 CHECK(expectations.Check(*prepared_map));
496 507
497 // Now create an object with |map|, migrate it to |prepared_map| and ensure 508 // Now create an object with |map|, migrate it to |prepared_map| and ensure
498 // that the data property is uninitialized. 509 // that the data property is uninitialized.
499 Factory* factory = isolate->factory(); 510 Factory* factory = isolate->factory();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 600
590 // Create a map, add required properties to it and initialize expectations. 601 // Create a map, add required properties to it and initialize expectations.
591 Handle<Map> initial_map = Map::Create(isolate, 0); 602 Handle<Map> initial_map = Map::Create(isolate, 0);
592 Handle<Map> map = initial_map; 603 Handle<Map> map = initial_map;
593 Handle<Map> detach_point_map; 604 Handle<Map> detach_point_map;
594 for (int i = 0; i < kPropCount; i++) { 605 for (int i = 0; i < kPropCount; i++) {
595 if (i == property_index) { 606 if (i == property_index) {
596 map = expectations.AddDataField(map, NONE, from.constness, 607 map = expectations.AddDataField(map, NONE, from.constness,
597 from.representation, from.type); 608 from.representation, from.type);
598 } else { 609 } else {
599 map = expectations.AddDataField(map, NONE, kMutable, 610 map = expectations.AddDataField(map, NONE, kDefaultFieldConstness,
600 Representation::Smi(), any_type); 611 Representation::Smi(), any_type);
601 if (i == detach_property_at_index) { 612 if (i == detach_property_at_index) {
602 detach_point_map = map; 613 detach_point_map = map;
603 } 614 }
604 } 615 }
605 } 616 }
606 CHECK(!map->is_deprecated()); 617 CHECK(!map->is_deprecated());
607 CHECK(map->is_stable()); 618 CHECK(map->is_stable());
608 CHECK(expectations.Check(*map)); 619 CHECK(expectations.Check(*map));
609 620
610 Zone zone(isolate->allocator(), ZONE_NAME); 621 Zone zone(isolate->allocator(), ZONE_NAME);
611 622
612 if (is_detached_map) { 623 if (is_detached_map) {
613 detach_point_map = Map::ReconfigureProperty( 624 detach_point_map = Map::ReconfigureProperty(
614 detach_point_map, detach_property_at_index, kData, NONE, 625 detach_point_map, detach_property_at_index, kData, NONE,
615 Representation::Tagged(), any_type); 626 Representation::Tagged(), any_type);
616 expectations.SetDataField(detach_property_at_index, kMutable, 627 expectations.SetDataField(detach_property_at_index, kDefaultFieldConstness,
617 Representation::Tagged(), any_type); 628 Representation::Tagged(), any_type);
618 CHECK(map->is_deprecated()); 629 CHECK(map->is_deprecated());
619 CHECK(expectations.Check(*detach_point_map, 630 CHECK(expectations.Check(*detach_point_map,
620 detach_point_map->NumberOfOwnDescriptors())); 631 detach_point_map->NumberOfOwnDescriptors()));
621 } 632 }
622 633
623 // Create new maps by generalizing representation of propX field. 634 // Create new maps by generalizing representation of propX field.
624 Handle<Map> field_owner(map->FindFieldOwner(property_index), isolate); 635 Handle<Map> field_owner(map->FindFieldOwner(property_index), isolate);
625 CompilationDependencies dependencies(isolate, &zone); 636 CompilationDependencies dependencies(isolate, &zone);
626 CHECK(!dependencies.HasAborted()); 637 CHECK(!dependencies.HasAborted());
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 Handle<Map> updated_map = Map::Update(map); 1105 Handle<Map> updated_map = Map::Update(map);
1095 CHECK_EQ(*new_map, *updated_map); 1106 CHECK_EQ(*new_map, *updated_map);
1096 } 1107 }
1097 1108
1098 TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToDouble) { 1109 TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToDouble) {
1099 CcTest::InitializeVM(); 1110 CcTest::InitializeVM();
1100 v8::HandleScope scope(CcTest::isolate()); 1111 v8::HandleScope scope(CcTest::isolate());
1101 Isolate* isolate = CcTest::i_isolate(); 1112 Isolate* isolate = CcTest::i_isolate();
1102 Handle<FieldType> any_type = FieldType::Any(isolate); 1113 Handle<FieldType> any_type = FieldType::Any(isolate);
1103 1114
1115 if (FLAG_track_constant_fields) {
1116 TestReconfigureDataFieldAttribute_GeneralizeField(
1117 {kConst, Representation::Smi(), any_type},
1118 {kConst, Representation::Double(), any_type},
1119 {kConst, Representation::Double(), any_type});
1120
1121 TestReconfigureDataFieldAttribute_GeneralizeField(
1122 {kConst, Representation::Smi(), any_type},
1123 {kMutable, Representation::Double(), any_type},
1124 {kMutable, Representation::Double(), any_type});
1125
1126 TestReconfigureDataFieldAttribute_GeneralizeField(
1127 {kMutable, Representation::Smi(), any_type},
1128 {kConst, Representation::Double(), any_type},
1129 {kMutable, Representation::Double(), any_type});
1130 }
1131
1104 TestReconfigureDataFieldAttribute_GeneralizeField( 1132 TestReconfigureDataFieldAttribute_GeneralizeField(
1105 {kMutable, Representation::Smi(), any_type}, 1133 {kMutable, Representation::Smi(), any_type},
1106 {kMutable, Representation::Double(), any_type}, 1134 {kMutable, Representation::Double(), any_type},
1107 {kMutable, Representation::Double(), any_type}); 1135 {kMutable, Representation::Double(), any_type});
1108 } 1136 }
1109 1137
1110 TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToTagged) { 1138 TEST(ReconfigureDataFieldAttribute_GeneralizeSmiFieldToTagged) {
1111 CcTest::InitializeVM(); 1139 CcTest::InitializeVM();
1112 v8::HandleScope scope(CcTest::isolate()); 1140 v8::HandleScope scope(CcTest::isolate());
1113 Isolate* isolate = CcTest::i_isolate(); 1141 Isolate* isolate = CcTest::i_isolate();
1114 Handle<FieldType> any_type = FieldType::Any(isolate); 1142 Handle<FieldType> any_type = FieldType::Any(isolate);
1115 Handle<FieldType> value_type = 1143 Handle<FieldType> value_type =
1116 FieldType::Class(Map::Create(isolate, 0), isolate); 1144 FieldType::Class(Map::Create(isolate, 0), isolate);
1117 1145
1146 if (FLAG_track_constant_fields) {
1147 TestReconfigureDataFieldAttribute_GeneralizeField(
1148 {kConst, Representation::Smi(), any_type},
1149 {kConst, Representation::HeapObject(), value_type},
1150 {kConst, Representation::Tagged(), any_type});
1151
1152 TestReconfigureDataFieldAttribute_GeneralizeField(
1153 {kConst, Representation::Smi(), any_type},
1154 {kMutable, Representation::HeapObject(), value_type},
1155 {kMutable, Representation::Tagged(), any_type});
1156
1157 TestReconfigureDataFieldAttribute_GeneralizeField(
1158 {kMutable, Representation::Smi(), any_type},
1159 {kConst, Representation::HeapObject(), value_type},
1160 {kMutable, Representation::Tagged(), any_type});
1161 }
1162
1118 TestReconfigureDataFieldAttribute_GeneralizeField( 1163 TestReconfigureDataFieldAttribute_GeneralizeField(
1119 {kMutable, Representation::Smi(), any_type}, 1164 {kMutable, Representation::Smi(), any_type},
1120 {kMutable, Representation::HeapObject(), value_type}, 1165 {kMutable, Representation::HeapObject(), value_type},
1121 {kMutable, Representation::Tagged(), any_type}); 1166 {kMutable, Representation::Tagged(), any_type});
1122 } 1167 }
1123 1168
1124 TEST(ReconfigureDataFieldAttribute_GeneralizeDoubleFieldToTagged) { 1169 TEST(ReconfigureDataFieldAttribute_GeneralizeDoubleFieldToTagged) {
1125 CcTest::InitializeVM(); 1170 CcTest::InitializeVM();
1126 v8::HandleScope scope(CcTest::isolate()); 1171 v8::HandleScope scope(CcTest::isolate());
1127 Isolate* isolate = CcTest::i_isolate(); 1172 Isolate* isolate = CcTest::i_isolate();
1128 Handle<FieldType> any_type = FieldType::Any(isolate); 1173 Handle<FieldType> any_type = FieldType::Any(isolate);
1129 Handle<FieldType> value_type = 1174 Handle<FieldType> value_type =
1130 FieldType::Class(Map::Create(isolate, 0), isolate); 1175 FieldType::Class(Map::Create(isolate, 0), isolate);
1131 1176
1177 if (FLAG_track_constant_fields) {
1178 TestReconfigureDataFieldAttribute_GeneralizeField(
1179 {kConst, Representation::Double(), any_type},
1180 {kConst, Representation::HeapObject(), value_type},
1181 {kConst, Representation::Tagged(), any_type});
1182
1183 TestReconfigureDataFieldAttribute_GeneralizeField(
1184 {kConst, Representation::Double(), any_type},
1185 {kMutable, Representation::HeapObject(), value_type},
1186 {kMutable, Representation::Tagged(), any_type});
1187
1188 TestReconfigureDataFieldAttribute_GeneralizeField(
1189 {kMutable, Representation::Double(), any_type},
1190 {kConst, Representation::HeapObject(), value_type},
1191 {kMutable, Representation::Tagged(), any_type});
1192 }
1193
1132 TestReconfigureDataFieldAttribute_GeneralizeField( 1194 TestReconfigureDataFieldAttribute_GeneralizeField(
1133 {kMutable, Representation::Double(), any_type}, 1195 {kMutable, Representation::Double(), any_type},
1134 {kMutable, Representation::HeapObject(), value_type}, 1196 {kMutable, Representation::HeapObject(), value_type},
1135 {kMutable, Representation::Tagged(), any_type}); 1197 {kMutable, Representation::Tagged(), any_type});
1136 } 1198 }
1137 1199
1138 TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjFieldToHeapObj) { 1200 TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjFieldToHeapObj) {
1139 CcTest::InitializeVM(); 1201 CcTest::InitializeVM();
1140 v8::HandleScope scope(CcTest::isolate()); 1202 v8::HandleScope scope(CcTest::isolate());
1141 Isolate* isolate = CcTest::i_isolate(); 1203 Isolate* isolate = CcTest::i_isolate();
1142 Handle<FieldType> any_type = FieldType::Any(isolate); 1204 Handle<FieldType> any_type = FieldType::Any(isolate);
1143 1205
1144 Handle<FieldType> current_type = 1206 Handle<FieldType> current_type =
1145 FieldType::Class(Map::Create(isolate, 0), isolate); 1207 FieldType::Class(Map::Create(isolate, 0), isolate);
1146 1208
1147 Handle<FieldType> new_type = 1209 Handle<FieldType> new_type =
1148 FieldType::Class(Map::Create(isolate, 0), isolate); 1210 FieldType::Class(Map::Create(isolate, 0), isolate);
1149 1211
1150 Handle<FieldType> expected_type = any_type; 1212 Handle<FieldType> expected_type = any_type;
1151 1213
1214 // Check generalizations that trigger deopts.
1215 if (FLAG_track_constant_fields) {
1216 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1217 {kConst, Representation::HeapObject(), current_type},
1218 {kConst, Representation::HeapObject(), new_type},
1219 {kConst, Representation::HeapObject(), expected_type});
1220
1221 // Currently, kConst to kMutable migration causes map change, therefore
1222 // non-trivial generalization.
1223 TestReconfigureDataFieldAttribute_GeneralizeField(
1224 {kConst, Representation::HeapObject(), current_type},
1225 {kMutable, Representation::HeapObject(), new_type},
1226 {kMutable, Representation::HeapObject(), expected_type});
1227
1228 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1229 {kMutable, Representation::HeapObject(), current_type},
1230 {kConst, Representation::HeapObject(), new_type},
1231 {kMutable, Representation::HeapObject(), expected_type});
1232 }
1152 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial( 1233 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1153 {kMutable, Representation::HeapObject(), current_type}, 1234 {kMutable, Representation::HeapObject(), current_type},
1154 {kMutable, Representation::HeapObject(), new_type}, 1235 {kMutable, Representation::HeapObject(), new_type},
1155 {kMutable, Representation::HeapObject(), expected_type}); 1236 {kMutable, Representation::HeapObject(), expected_type});
1156 current_type = expected_type; 1237 current_type = expected_type;
1157 1238
1239 // Check generalizations that do not trigger deopts.
1158 new_type = FieldType::Class(Map::Create(isolate, 0), isolate); 1240 new_type = FieldType::Class(Map::Create(isolate, 0), isolate);
1159 1241
1242 if (FLAG_track_constant_fields) {
1243 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1244 {kConst, Representation::HeapObject(), any_type},
1245 {kConst, Representation::HeapObject(), new_type},
1246 {kConst, Representation::HeapObject(), any_type}, false);
1247
1248 // Currently, kConst to kMutable migration causes map change, therefore
1249 // non-trivial generalization.
1250 TestReconfigureDataFieldAttribute_GeneralizeField(
1251 {kConst, Representation::HeapObject(), any_type},
1252 {kMutable, Representation::HeapObject(), new_type},
1253 {kMutable, Representation::HeapObject(), any_type});
1254
1255 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1256 {kMutable, Representation::HeapObject(), any_type},
1257 {kConst, Representation::HeapObject(), new_type},
1258 {kMutable, Representation::HeapObject(), any_type}, false);
1259 }
1160 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial( 1260 TestReconfigureDataFieldAttribute_GeneralizeFieldTrivial(
1161 {kMutable, Representation::HeapObject(), any_type}, 1261 {kMutable, Representation::HeapObject(), any_type},
1162 {kMutable, Representation::HeapObject(), new_type}, 1262 {kMutable, Representation::HeapObject(), new_type},
1163 {kMutable, Representation::HeapObject(), any_type}, false); 1263 {kMutable, Representation::HeapObject(), any_type}, false);
1164 } 1264 }
1165 1265
1166 TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjectFieldToTagged) { 1266 TEST(ReconfigureDataFieldAttribute_GeneralizeHeapObjectFieldToTagged) {
1167 CcTest::InitializeVM(); 1267 CcTest::InitializeVM();
1168 v8::HandleScope scope(CcTest::isolate()); 1268 v8::HandleScope scope(CcTest::isolate());
1169 Isolate* isolate = CcTest::i_isolate(); 1269 Isolate* isolate = CcTest::i_isolate();
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 } 1499 }
1400 1500
1401 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations, 1501 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations,
1402 Handle<Map> map) { 1502 Handle<Map> map) {
1403 CHECK(branch_id == 1 || branch_id == 2); 1503 CHECK(branch_id == 1 || branch_id == 2);
1404 Handle<JSFunction> js_func = branch_id == 1 ? js_func1_ : js_func2_; 1504 Handle<JSFunction> js_func = branch_id == 1 ? js_func1_ : js_func2_;
1405 return expectations.AddDataConstant(map, NONE, js_func); 1505 return expectations.AddDataConstant(map, NONE, js_func);
1406 } 1506 }
1407 1507
1408 void UpdateExpectations(int property_index, Expectations& expectations) { 1508 void UpdateExpectations(int property_index, Expectations& expectations) {
1409 expectations.SetDataField(property_index, kMutable, 1509 PropertyConstness expected_constness =
1510 FLAG_track_constant_fields ? kConst : kMutable;
1511 expectations.SetDataField(property_index, expected_constness,
1410 Representation::HeapObject(), function_type_); 1512 Representation::HeapObject(), function_type_);
1411 } 1513 }
1412 }; 1514 };
1413 1515
1414 TestConfig config; 1516 TestConfig config;
1415 // Two branches are "incompatible" so the |map1| should be deprecated. 1517 if (FLAG_track_constant_fields) {
1416 CheckDeprecated checker; 1518 CheckSameMap checker;
1417 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker); 1519 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker);
1520
1521 } else {
1522 // Two branches are "incompatible" so the |map1| should be deprecated.
1523 CheckDeprecated checker;
1524 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker);
1525 }
1418 } 1526 }
1419 1527
1420 1528
1421 TEST(ReconfigureDataFieldAttribute_DataConstantToAccConstantAfterTargetMap) { 1529 TEST(ReconfigureDataFieldAttribute_DataConstantToAccConstantAfterTargetMap) {
1422 CcTest::InitializeVM(); 1530 CcTest::InitializeVM();
1423 v8::HandleScope scope(CcTest::isolate()); 1531 v8::HandleScope scope(CcTest::isolate());
1424 1532
1425 struct TestConfig { 1533 struct TestConfig {
1426 Handle<JSFunction> js_func_; 1534 Handle<JSFunction> js_func_;
1427 Handle<AccessorPair> pair_; 1535 Handle<AccessorPair> pair_;
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 TestConfig() { pair_ = CreateAccessorPair(true, true); } 1638 TestConfig() { pair_ = CreateAccessorPair(true, true); }
1531 1639
1532 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations, 1640 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations,
1533 Handle<Map> map) { 1641 Handle<Map> map) {
1534 CHECK(branch_id == 1 || branch_id == 2); 1642 CHECK(branch_id == 1 || branch_id == 2);
1535 if (branch_id == 1) { 1643 if (branch_id == 1) {
1536 return expectations.AddAccessorConstant(map, NONE, pair_); 1644 return expectations.AddAccessorConstant(map, NONE, pair_);
1537 } else { 1645 } else {
1538 Isolate* isolate = CcTest::i_isolate(); 1646 Isolate* isolate = CcTest::i_isolate();
1539 Handle<FieldType> any_type = FieldType::Any(isolate); 1647 Handle<FieldType> any_type = FieldType::Any(isolate);
1540 return expectations.AddDataField(map, NONE, kMutable, 1648 return expectations.AddDataField(map, NONE, kDefaultFieldConstness,
1541 Representation::Smi(), any_type); 1649 Representation::Smi(), any_type);
1542 } 1650 }
1543 } 1651 }
1544 1652
1545 void UpdateExpectations(int property_index, Expectations& expectations) {} 1653 void UpdateExpectations(int property_index, Expectations& expectations) {}
1546 }; 1654 };
1547 1655
1548 TestConfig config; 1656 TestConfig config;
1549 // These are completely separate branches in transition tree. 1657 // These are completely separate branches in transition tree.
1550 CheckUnrelated checker; 1658 CheckUnrelated checker;
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1742 CHECK_EQ(*updated_map, transitioned_map); 1850 CHECK_EQ(*updated_map, transitioned_map);
1743 } 1851 }
1744 } 1852 }
1745 1853
1746 TEST(ReconfigureElementsKind_GeneralizeSmiFieldToDouble) { 1854 TEST(ReconfigureElementsKind_GeneralizeSmiFieldToDouble) {
1747 CcTest::InitializeVM(); 1855 CcTest::InitializeVM();
1748 v8::HandleScope scope(CcTest::isolate()); 1856 v8::HandleScope scope(CcTest::isolate());
1749 Isolate* isolate = CcTest::i_isolate(); 1857 Isolate* isolate = CcTest::i_isolate();
1750 Handle<FieldType> any_type = FieldType::Any(isolate); 1858 Handle<FieldType> any_type = FieldType::Any(isolate);
1751 1859
1860 if (FLAG_track_constant_fields) {
1861 TestReconfigureElementsKind_GeneralizeField(
1862 {kConst, Representation::Smi(), any_type},
1863 {kConst, Representation::Double(), any_type},
1864 {kConst, Representation::Double(), any_type});
1865
1866 TestReconfigureElementsKind_GeneralizeField(
1867 {kConst, Representation::Smi(), any_type},
1868 {kMutable, Representation::Double(), any_type},
1869 {kMutable, Representation::Double(), any_type});
1870
1871 TestReconfigureElementsKind_GeneralizeField(
1872 {kMutable, Representation::Smi(), any_type},
1873 {kConst, Representation::Double(), any_type},
1874 {kMutable, Representation::Double(), any_type});
1875 }
1752 TestReconfigureElementsKind_GeneralizeField( 1876 TestReconfigureElementsKind_GeneralizeField(
1753 {kMutable, Representation::Smi(), any_type}, 1877 {kMutable, Representation::Smi(), any_type},
1754 {kMutable, Representation::Double(), any_type}, 1878 {kMutable, Representation::Double(), any_type},
1755 {kMutable, Representation::Double(), any_type}); 1879 {kMutable, Representation::Double(), any_type});
1756 } 1880 }
1757 1881
1758 TEST(ReconfigureElementsKind_GeneralizeSmiFieldToTagged) { 1882 TEST(ReconfigureElementsKind_GeneralizeSmiFieldToTagged) {
1759 CcTest::InitializeVM(); 1883 CcTest::InitializeVM();
1760 v8::HandleScope scope(CcTest::isolate()); 1884 v8::HandleScope scope(CcTest::isolate());
1761 Isolate* isolate = CcTest::i_isolate(); 1885 Isolate* isolate = CcTest::i_isolate();
1762 Handle<FieldType> any_type = FieldType::Any(isolate); 1886 Handle<FieldType> any_type = FieldType::Any(isolate);
1763 Handle<FieldType> value_type = 1887 Handle<FieldType> value_type =
1764 FieldType::Class(Map::Create(isolate, 0), isolate); 1888 FieldType::Class(Map::Create(isolate, 0), isolate);
1765 1889
1890 if (FLAG_track_constant_fields) {
1891 TestReconfigureElementsKind_GeneralizeField(
1892 {kConst, Representation::Smi(), any_type},
1893 {kConst, Representation::HeapObject(), value_type},
1894 {kConst, Representation::Tagged(), any_type});
1895
1896 TestReconfigureElementsKind_GeneralizeField(
1897 {kConst, Representation::Smi(), any_type},
1898 {kMutable, Representation::HeapObject(), value_type},
1899 {kMutable, Representation::Tagged(), any_type});
1900
1901 TestReconfigureElementsKind_GeneralizeField(
1902 {kMutable, Representation::Smi(), any_type},
1903 {kConst, Representation::HeapObject(), value_type},
1904 {kMutable, Representation::Tagged(), any_type});
1905 }
1766 TestReconfigureElementsKind_GeneralizeField( 1906 TestReconfigureElementsKind_GeneralizeField(
1767 {kMutable, Representation::Smi(), any_type}, 1907 {kMutable, Representation::Smi(), any_type},
1768 {kMutable, Representation::HeapObject(), value_type}, 1908 {kMutable, Representation::HeapObject(), value_type},
1769 {kMutable, Representation::Tagged(), any_type}); 1909 {kMutable, Representation::Tagged(), any_type});
1770 } 1910 }
1771 1911
1772 TEST(ReconfigureElementsKind_GeneralizeDoubleFieldToTagged) { 1912 TEST(ReconfigureElementsKind_GeneralizeDoubleFieldToTagged) {
1773 CcTest::InitializeVM(); 1913 CcTest::InitializeVM();
1774 v8::HandleScope scope(CcTest::isolate()); 1914 v8::HandleScope scope(CcTest::isolate());
1775 Isolate* isolate = CcTest::i_isolate(); 1915 Isolate* isolate = CcTest::i_isolate();
1776 Handle<FieldType> any_type = FieldType::Any(isolate); 1916 Handle<FieldType> any_type = FieldType::Any(isolate);
1777 Handle<FieldType> value_type = 1917 Handle<FieldType> value_type =
1778 FieldType::Class(Map::Create(isolate, 0), isolate); 1918 FieldType::Class(Map::Create(isolate, 0), isolate);
1779 1919
1920 if (FLAG_track_constant_fields) {
1921 TestReconfigureElementsKind_GeneralizeField(
1922 {kConst, Representation::Double(), any_type},
1923 {kConst, Representation::HeapObject(), value_type},
1924 {kConst, Representation::Tagged(), any_type});
1925
1926 TestReconfigureElementsKind_GeneralizeField(
1927 {kConst, Representation::Double(), any_type},
1928 {kMutable, Representation::HeapObject(), value_type},
1929 {kMutable, Representation::Tagged(), any_type});
1930
1931 TestReconfigureElementsKind_GeneralizeField(
1932 {kMutable, Representation::Double(), any_type},
1933 {kConst, Representation::HeapObject(), value_type},
1934 {kMutable, Representation::Tagged(), any_type});
1935 }
1780 TestReconfigureElementsKind_GeneralizeField( 1936 TestReconfigureElementsKind_GeneralizeField(
1781 {kMutable, Representation::Double(), any_type}, 1937 {kMutable, Representation::Double(), any_type},
1782 {kMutable, Representation::HeapObject(), value_type}, 1938 {kMutable, Representation::HeapObject(), value_type},
1783 {kMutable, Representation::Tagged(), any_type}); 1939 {kMutable, Representation::Tagged(), any_type});
1784 } 1940 }
1785 1941
1786 TEST(ReconfigureElementsKind_GeneralizeHeapObjFieldToHeapObj) { 1942 TEST(ReconfigureElementsKind_GeneralizeHeapObjFieldToHeapObj) {
1787 CcTest::InitializeVM(); 1943 CcTest::InitializeVM();
1788 v8::HandleScope scope(CcTest::isolate()); 1944 v8::HandleScope scope(CcTest::isolate());
1789 Isolate* isolate = CcTest::i_isolate(); 1945 Isolate* isolate = CcTest::i_isolate();
1790 Handle<FieldType> any_type = FieldType::Any(isolate); 1946 Handle<FieldType> any_type = FieldType::Any(isolate);
1791 1947
1792 Handle<FieldType> current_type = 1948 Handle<FieldType> current_type =
1793 FieldType::Class(Map::Create(isolate, 0), isolate); 1949 FieldType::Class(Map::Create(isolate, 0), isolate);
1794 1950
1795 Handle<FieldType> new_type = 1951 Handle<FieldType> new_type =
1796 FieldType::Class(Map::Create(isolate, 0), isolate); 1952 FieldType::Class(Map::Create(isolate, 0), isolate);
1797 1953
1798 Handle<FieldType> expected_type = any_type; 1954 Handle<FieldType> expected_type = any_type;
1799 1955
1956 // Check generalizations that trigger deopts.
1957 if (FLAG_track_constant_fields) {
1958 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1959 {kConst, Representation::HeapObject(), current_type},
1960 {kConst, Representation::HeapObject(), new_type},
1961 {kConst, Representation::HeapObject(), expected_type});
1962
1963 // Currently, kConst to kMutable migration causes map change, therefore
1964 // non-trivial generalization.
1965 TestReconfigureElementsKind_GeneralizeField(
1966 {kConst, Representation::HeapObject(), current_type},
1967 {kMutable, Representation::HeapObject(), new_type},
1968 {kMutable, Representation::HeapObject(), expected_type});
1969
1970 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1971 {kMutable, Representation::HeapObject(), current_type},
1972 {kConst, Representation::HeapObject(), new_type},
1973 {kMutable, Representation::HeapObject(), expected_type});
1974 }
1800 TestReconfigureElementsKind_GeneralizeFieldTrivial( 1975 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1801 {kMutable, Representation::HeapObject(), current_type}, 1976 {kMutable, Representation::HeapObject(), current_type},
1802 {kMutable, Representation::HeapObject(), new_type}, 1977 {kMutable, Representation::HeapObject(), new_type},
1803 {kMutable, Representation::HeapObject(), expected_type}); 1978 {kMutable, Representation::HeapObject(), expected_type});
1804 current_type = expected_type; 1979 current_type = expected_type;
1805 1980
1981 // Check generalizations that do not trigger deopts.
1806 new_type = FieldType::Class(Map::Create(isolate, 0), isolate); 1982 new_type = FieldType::Class(Map::Create(isolate, 0), isolate);
1807 1983
1984 if (FLAG_track_constant_fields) {
1985 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1986 {kConst, Representation::HeapObject(), any_type},
1987 {kConst, Representation::HeapObject(), new_type},
1988 {kConst, Representation::HeapObject(), any_type}, false);
1989
1990 // Currently, kConst to kMutable migration causes map change, therefore
1991 // non-trivial generalization.
1992 TestReconfigureElementsKind_GeneralizeField(
1993 {kConst, Representation::HeapObject(), any_type},
1994 {kMutable, Representation::HeapObject(), new_type},
1995 {kMutable, Representation::HeapObject(), any_type});
1996
1997 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1998 {kMutable, Representation::HeapObject(), any_type},
1999 {kConst, Representation::HeapObject(), new_type},
2000 {kMutable, Representation::HeapObject(), any_type}, false);
2001 }
1808 TestReconfigureElementsKind_GeneralizeFieldTrivial( 2002 TestReconfigureElementsKind_GeneralizeFieldTrivial(
1809 {kMutable, Representation::HeapObject(), any_type}, 2003 {kMutable, Representation::HeapObject(), any_type},
1810 {kMutable, Representation::HeapObject(), new_type}, 2004 {kMutable, Representation::HeapObject(), new_type},
1811 {kMutable, Representation::HeapObject(), any_type}, false); 2005 {kMutable, Representation::HeapObject(), any_type}, false);
1812 } 2006 }
1813 2007
1814 TEST(ReconfigureElementsKind_GeneralizeHeapObjectFieldToTagged) { 2008 TEST(ReconfigureElementsKind_GeneralizeHeapObjectFieldToTagged) {
1815 CcTest::InitializeVM(); 2009 CcTest::InitializeVM();
1816 v8::HandleScope scope(CcTest::isolate()); 2010 v8::HandleScope scope(CcTest::isolate());
1817 Isolate* isolate = CcTest::i_isolate(); 2011 Isolate* isolate = CcTest::i_isolate();
1818 Handle<FieldType> any_type = FieldType::Any(isolate); 2012 Handle<FieldType> any_type = FieldType::Any(isolate);
1819 Handle<FieldType> value_type = 2013 Handle<FieldType> value_type =
1820 FieldType::Class(Map::Create(isolate, 0), isolate); 2014 FieldType::Class(Map::Create(isolate, 0), isolate);
1821 2015
2016 if (FLAG_track_constant_fields) {
2017 TestReconfigureElementsKind_GeneralizeField(
2018 {kConst, Representation::HeapObject(), value_type},
2019 {kConst, Representation::Smi(), any_type},
2020 {kConst, Representation::Tagged(), any_type});
2021
2022 TestReconfigureElementsKind_GeneralizeField(
2023 {kConst, Representation::HeapObject(), value_type},
2024 {kMutable, Representation::Smi(), any_type},
2025 {kMutable, Representation::Tagged(), any_type});
2026
2027 TestReconfigureElementsKind_GeneralizeField(
2028 {kMutable, Representation::HeapObject(), value_type},
2029 {kConst, Representation::Smi(), any_type},
2030 {kMutable, Representation::Tagged(), any_type});
2031 }
1822 TestReconfigureElementsKind_GeneralizeField( 2032 TestReconfigureElementsKind_GeneralizeField(
1823 {kMutable, Representation::HeapObject(), value_type}, 2033 {kMutable, Representation::HeapObject(), value_type},
1824 {kMutable, Representation::Smi(), any_type}, 2034 {kMutable, Representation::Smi(), any_type},
1825 {kMutable, Representation::Tagged(), any_type}); 2035 {kMutable, Representation::Tagged(), any_type});
1826 } 2036 }
1827 2037
1828 //////////////////////////////////////////////////////////////////////////////// 2038 ////////////////////////////////////////////////////////////////////////////////
1829 // A set of tests checking split map deprecation. 2039 // A set of tests checking split map deprecation.
1830 // 2040 //
1831 2041
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1877 // transition tree. 2087 // transition tree.
1878 CHECK(map->is_deprecated()); 2088 CHECK(map->is_deprecated());
1879 CHECK(!split_map->is_deprecated()); 2089 CHECK(!split_map->is_deprecated());
1880 CHECK(map2->is_stable()); 2090 CHECK(map2->is_stable());
1881 CHECK(!map2->is_deprecated()); 2091 CHECK(!map2->is_deprecated());
1882 2092
1883 // Fill in transition tree of |map2| so that it can't have more transitions. 2093 // Fill in transition tree of |map2| so that it can't have more transitions.
1884 for (int i = 0; i < TransitionArray::kMaxNumberOfTransitions; i++) { 2094 for (int i = 0; i < TransitionArray::kMaxNumberOfTransitions; i++) {
1885 CHECK(TransitionArray::CanHaveMoreTransitions(map2)); 2095 CHECK(TransitionArray::CanHaveMoreTransitions(map2));
1886 Handle<String> name = MakeName("foo", i); 2096 Handle<String> name = MakeName("foo", i);
1887 Map::CopyWithField(map2, name, any_type, NONE, Representation::Smi(), 2097 Map::CopyWithField(map2, name, any_type, NONE, kMutable,
1888 INSERT_TRANSITION) 2098 Representation::Smi(), INSERT_TRANSITION)
1889 .ToHandleChecked(); 2099 .ToHandleChecked();
1890 } 2100 }
1891 CHECK(!TransitionArray::CanHaveMoreTransitions(map2)); 2101 CHECK(!TransitionArray::CanHaveMoreTransitions(map2));
1892 2102
1893 // Try to update |map|, since there is no place for propX transition at |map2| 2103 // Try to update |map|, since there is no place for propX transition at |map2|
1894 // |map| should become "copy-generalized". 2104 // |map| should become "copy-generalized".
1895 Handle<Map> updated_map = Map::Update(map); 2105 Handle<Map> updated_map = Map::Update(map);
1896 CHECK(updated_map->GetBackPointer()->IsUndefined(isolate)); 2106 CHECK(updated_map->GetBackPointer()->IsUndefined(isolate));
1897 2107
1898 for (int i = 0; i < kPropCount; i++) { 2108 for (int i = 0; i < kPropCount; i++) {
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
2051 FieldType::Class(Map::Create(isolate, 0), isolate); 2261 FieldType::Class(Map::Create(isolate, 0), isolate);
2052 2262
2053 struct TestConfig { 2263 struct TestConfig {
2054 Handle<Map> Transition(Handle<Map> map, Expectations& expectations) { 2264 Handle<Map> Transition(Handle<Map> map, Expectations& expectations) {
2055 Isolate* isolate = CcTest::i_isolate(); 2265 Isolate* isolate = CcTest::i_isolate();
2056 Handle<FieldType> any_type = FieldType::Any(isolate); 2266 Handle<FieldType> any_type = FieldType::Any(isolate);
2057 2267
2058 // Add one more transition to |map| in order to prevent descriptors 2268 // Add one more transition to |map| in order to prevent descriptors
2059 // ownership. 2269 // ownership.
2060 CHECK(map->owns_descriptors()); 2270 CHECK(map->owns_descriptors());
2061 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, 2271 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, kMutable,
2062 Representation::Smi(), INSERT_TRANSITION) 2272 Representation::Smi(), INSERT_TRANSITION)
2063 .ToHandleChecked(); 2273 .ToHandleChecked();
2064 CHECK(!map->owns_descriptors()); 2274 CHECK(!map->owns_descriptors());
2065 2275
2066 Handle<Symbol> frozen_symbol(map->GetHeap()->frozen_symbol()); 2276 Handle<Symbol> frozen_symbol(map->GetHeap()->frozen_symbol());
2067 expectations.SetElementsKind(DICTIONARY_ELEMENTS); 2277 expectations.SetElementsKind(DICTIONARY_ELEMENTS);
2068 return Map::CopyForPreventExtensions(map, NONE, frozen_symbol, 2278 return Map::CopyForPreventExtensions(map, NONE, frozen_symbol,
2069 "CopyForPreventExtensions"); 2279 "CopyForPreventExtensions");
2070 } 2280 }
2071 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 2281 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0)); 2343 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0));
2134 } 2344 }
2135 2345
2136 Handle<Map> Transition(Handle<Map> map, Expectations& expectations) { 2346 Handle<Map> Transition(Handle<Map> map, Expectations& expectations) {
2137 Isolate* isolate = CcTest::i_isolate(); 2347 Isolate* isolate = CcTest::i_isolate();
2138 Handle<FieldType> any_type = FieldType::Any(isolate); 2348 Handle<FieldType> any_type = FieldType::Any(isolate);
2139 2349
2140 // Add one more transition to |map| in order to prevent descriptors 2350 // Add one more transition to |map| in order to prevent descriptors
2141 // ownership. 2351 // ownership.
2142 CHECK(map->owns_descriptors()); 2352 CHECK(map->owns_descriptors());
2143 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, 2353 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, kMutable,
2144 Representation::Smi(), INSERT_TRANSITION) 2354 Representation::Smi(), INSERT_TRANSITION)
2145 .ToHandleChecked(); 2355 .ToHandleChecked();
2146 CHECK(!map->owns_descriptors()); 2356 CHECK(!map->owns_descriptors());
2147 2357
2148 return Map::TransitionToPrototype(map, prototype_, REGULAR_PROTOTYPE); 2358 return Map::TransitionToPrototype(map, prototype_, REGULAR_PROTOTYPE);
2149 } 2359 }
2150 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 2360 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
2151 bool generalizes_representations() const { 2361 bool generalizes_representations() const {
2152 return !IS_PROTO_TRANS_ISSUE_FIXED; 2362 return !IS_PROTO_TRANS_ISSUE_FIXED;
2153 } 2363 }
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
2404 CHECK(sloppy_map->is_stable()); 2614 CHECK(sloppy_map->is_stable());
2405 2615
2406 Handle<JSFunction> js_func1 = 2616 Handle<JSFunction> js_func1 =
2407 factory->NewFunction(sloppy_map, info, isolate->native_context()); 2617 factory->NewFunction(sloppy_map, info, isolate->native_context());
2408 TransitionToDataConstantOperator transition_op1(js_func1); 2618 TransitionToDataConstantOperator transition_op1(js_func1);
2409 2619
2410 Handle<JSFunction> js_func2 = 2620 Handle<JSFunction> js_func2 =
2411 factory->NewFunction(sloppy_map, info, isolate->native_context()); 2621 factory->NewFunction(sloppy_map, info, isolate->native_context());
2412 TransitionToDataConstantOperator transition_op2(js_func2); 2622 TransitionToDataConstantOperator transition_op2(js_func2);
2413 2623
2414 FieldGeneralizationChecker checker( 2624 if (FLAG_track_constant_fields) {
2415 kPropCount - 1, kMutable, Representation::HeapObject(), function_type); 2625 SameMapChecker checker;
2416 TestTransitionTo(transition_op1, transition_op2, checker); 2626 TestTransitionTo(transition_op1, transition_op2, checker);
2627
2628 } else {
2629 FieldGeneralizationChecker checker(
2630 kPropCount - 1, kMutable, Representation::HeapObject(), function_type);
2631 TestTransitionTo(transition_op1, transition_op2, checker);
2632 }
2417 } 2633 }
2418 2634
2419 2635
2420 TEST(TransitionDataConstantToDataField) { 2636 TEST(TransitionDataConstantToDataField) {
2421 CcTest::InitializeVM(); 2637 CcTest::InitializeVM();
2422 v8::HandleScope scope(CcTest::isolate()); 2638 v8::HandleScope scope(CcTest::isolate());
2423 Isolate* isolate = CcTest::i_isolate(); 2639 Isolate* isolate = CcTest::i_isolate();
2424 Factory* factory = isolate->factory(); 2640 Factory* factory = isolate->factory();
2425 Handle<FieldType> any_type = FieldType::Any(isolate); 2641 Handle<FieldType> any_type = FieldType::Any(isolate);
2426 2642
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
2482 Handle<Object> obj = 2698 Handle<Object> obj =
2483 Object::NewStorageFor(isolate, isolate->factory()->uninitialized_value(), 2699 Object::NewStorageFor(isolate, isolate->factory()->uninitialized_value(),
2484 Representation::Double()); 2700 Representation::Double());
2485 CHECK(obj->IsMutableHeapNumber()); 2701 CHECK(obj->IsMutableHeapNumber());
2486 CHECK_EQ(kHoleNanInt64, HeapNumber::cast(*obj)->value_as_bits()); 2702 CHECK_EQ(kHoleNanInt64, HeapNumber::cast(*obj)->value_as_bits());
2487 2703
2488 obj = Object::NewStorageFor(isolate, mhn, Representation::Double()); 2704 obj = Object::NewStorageFor(isolate, mhn, Representation::Double());
2489 CHECK(obj->IsMutableHeapNumber()); 2705 CHECK(obj->IsMutableHeapNumber());
2490 CHECK_EQ(kHoleNanInt64, HeapNumber::cast(*obj)->value_as_bits()); 2706 CHECK_EQ(kHoleNanInt64, HeapNumber::cast(*obj)->value_as_bits());
2491 } 2707 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698