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

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

Issue 1636013002: Replace HeapType with a non-templated FieldType class. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix tracing of generalizations Created 4 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
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 return true; 81 return true;
82 } 82 }
83 83
84 84
85 class Expectations { 85 class Expectations {
86 static const int MAX_PROPERTIES = 10; 86 static const int MAX_PROPERTIES = 10;
87 Isolate* isolate_; 87 Isolate* isolate_;
88 PropertyType types_[MAX_PROPERTIES]; 88 PropertyType types_[MAX_PROPERTIES];
89 PropertyAttributes attributes_[MAX_PROPERTIES]; 89 PropertyAttributes attributes_[MAX_PROPERTIES];
90 Representation representations_[MAX_PROPERTIES]; 90 Representation representations_[MAX_PROPERTIES];
91 // HeapType for kField, value for DATA_CONSTANT and getter for 91 // FieldType for kField, value for DATA_CONSTANT and getter for
92 // ACCESSOR_CONSTANT. 92 // ACCESSOR_CONSTANT.
93 Handle<Object> values_[MAX_PROPERTIES]; 93 Handle<Object> values_[MAX_PROPERTIES];
94 // Setter for ACCESSOR_CONSTANT. 94 // Setter for ACCESSOR_CONSTANT.
95 Handle<Object> setter_values_[MAX_PROPERTIES]; 95 Handle<Object> setter_values_[MAX_PROPERTIES];
96 int number_of_properties_; 96 int number_of_properties_;
97 97
98 public: 98 public:
99 explicit Expectations(Isolate* isolate) 99 explicit Expectations(Isolate* isolate)
100 : isolate_(isolate), number_of_properties_(0) {} 100 : isolate_(isolate), number_of_properties_(0) {}
101 101
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 case ACCESSOR: 135 case ACCESSOR:
136 os << "accessor"; 136 os << "accessor";
137 break; 137 break;
138 } 138 }
139 os << ": " << representations_[i].Mnemonic(); 139 os << ": " << representations_[i].Mnemonic();
140 os << ", attrs: " << attributes_[i] << ")\n"; 140 os << ", attrs: " << attributes_[i] << ")\n";
141 } 141 }
142 os << "\n"; 142 os << "\n";
143 } 143 }
144 144
145 Handle<HeapType> GetFieldType(int index) { 145 Handle<FieldType> GetFieldType(int index) {
146 CHECK(index < MAX_PROPERTIES); 146 CHECK(index < MAX_PROPERTIES);
147 CHECK(types_[index] == DATA || types_[index] == ACCESSOR); 147 CHECK(types_[index] == DATA || types_[index] == ACCESSOR);
148 return Handle<HeapType>::cast(values_[index]); 148 return Handle<FieldType>::cast(values_[index]);
149 } 149 }
150 150
151 void SetDataField(int index, PropertyAttributes attrs, 151 void SetDataField(int index, PropertyAttributes attrs,
152 Representation representation, Handle<HeapType> value) { 152 Representation representation, Handle<FieldType> value) {
153 Init(index, DATA, attrs, representation, value); 153 Init(index, DATA, attrs, representation, value);
154 } 154 }
155 155
156 void SetDataField(int index, Representation representation, 156 void SetDataField(int index, Representation representation,
157 Handle<HeapType> value) { 157 Handle<FieldType> value) {
158 SetDataField(index, attributes_[index], representation, value); 158 SetDataField(index, attributes_[index], representation, value);
159 } 159 }
160 160
161 void SetAccessorField(int index, PropertyAttributes attrs) { 161 void SetAccessorField(int index, PropertyAttributes attrs) {
162 Init(index, ACCESSOR, attrs, Representation::Tagged(), 162 Init(index, ACCESSOR, attrs, Representation::Tagged(),
163 HeapType::Any(isolate_)); 163 FieldType::Any(isolate_));
164 } 164 }
165 165
166 void SetAccessorField(int index) { 166 void SetAccessorField(int index) {
167 SetAccessorField(index, attributes_[index]); 167 SetAccessorField(index, attributes_[index]);
168 } 168 }
169 169
170 void SetDataConstant(int index, PropertyAttributes attrs, 170 void SetDataConstant(int index, PropertyAttributes attrs,
171 Handle<JSFunction> value) { 171 Handle<JSFunction> value) {
172 Init(index, DATA_CONSTANT, attrs, Representation::HeapObject(), value); 172 Init(index, DATA_CONSTANT, attrs, Representation::HeapObject(), value);
173 } 173 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 void SetAccessorConstant(int index, Handle<AccessorPair> pair) { 209 void SetAccessorConstant(int index, Handle<AccessorPair> pair) {
210 Handle<Object> getter = handle(pair->getter(), isolate_); 210 Handle<Object> getter = handle(pair->getter(), isolate_);
211 Handle<Object> setter = handle(pair->setter(), isolate_); 211 Handle<Object> setter = handle(pair->setter(), isolate_);
212 SetAccessorConstant(index, getter, setter); 212 SetAccessorConstant(index, getter, setter);
213 } 213 }
214 214
215 void GeneralizeRepresentation(int index) { 215 void GeneralizeRepresentation(int index) {
216 CHECK(index < number_of_properties_); 216 CHECK(index < number_of_properties_);
217 representations_[index] = Representation::Tagged(); 217 representations_[index] = Representation::Tagged();
218 if (types_[index] == DATA || types_[index] == ACCESSOR) { 218 if (types_[index] == DATA || types_[index] == ACCESSOR) {
219 values_[index] = HeapType::Any(isolate_); 219 values_[index] = FieldType::Any(isolate_);
220 } 220 }
221 } 221 }
222 222
223 223
224 bool Check(DescriptorArray* descriptors, int descriptor) const { 224 bool Check(DescriptorArray* descriptors, int descriptor) const {
225 PropertyType type = types_[descriptor]; 225 PropertyType type = types_[descriptor];
226 if (!EqualDetails(descriptors, descriptor, type, attributes_[descriptor], 226 if (!EqualDetails(descriptors, descriptor, type, attributes_[descriptor],
227 representations_[descriptor])) { 227 representations_[descriptor])) {
228 return false; 228 return false;
229 } 229 }
230 Object* value = descriptors->GetValue(descriptor); 230 Object* value = descriptors->GetValue(descriptor);
231 Object* expected_value = *values_[descriptor]; 231 Object* expected_value = *values_[descriptor];
232 switch (type) { 232 switch (type) {
233 case DATA: 233 case DATA:
234 case ACCESSOR: { 234 case ACCESSOR: {
235 HeapType* type = descriptors->GetFieldType(descriptor); 235 FieldType* type = descriptors->GetFieldType(descriptor);
236 return HeapType::cast(expected_value)->Equals(type); 236 return FieldType::cast(expected_value) == type;
237 } 237 }
238 238
239 case DATA_CONSTANT: 239 case DATA_CONSTANT:
240 return value == expected_value; 240 return value == expected_value;
241 241
242 case ACCESSOR_CONSTANT: { 242 case ACCESSOR_CONSTANT: {
243 if (value == expected_value) return true; 243 if (value == expected_value) return true;
244 if (!value->IsAccessorPair()) return false; 244 if (!value->IsAccessorPair()) return false;
245 AccessorPair* pair = AccessorPair::cast(value); 245 AccessorPair* pair = AccessorPair::cast(value);
246 return pair->Equals(expected_value, *setter_values_[descriptor]); 246 return pair->Equals(expected_value, *setter_values_[descriptor]);
(...skipping 26 matching lines...) Expand all
273 bool Check(Map* map) const { return Check(map, number_of_properties_); } 273 bool Check(Map* map) const { return Check(map, number_of_properties_); }
274 274
275 275
276 // 276 //
277 // Helper methods for initializing expectations and adding properties to 277 // Helper methods for initializing expectations and adding properties to
278 // given |map|. 278 // given |map|.
279 // 279 //
280 280
281 Handle<Map> AddDataField(Handle<Map> map, PropertyAttributes attributes, 281 Handle<Map> AddDataField(Handle<Map> map, PropertyAttributes attributes,
282 Representation representation, 282 Representation representation,
283 Handle<HeapType> heap_type) { 283 Handle<FieldType> heap_type) {
284 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 284 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
285 int property_index = number_of_properties_++; 285 int property_index = number_of_properties_++;
286 SetDataField(property_index, attributes, representation, heap_type); 286 SetDataField(property_index, attributes, representation, heap_type);
287 287
288 Handle<String> name = MakeName("prop", property_index); 288 Handle<String> name = MakeName("prop", property_index);
289 return Map::CopyWithField(map, name, heap_type, attributes, representation, 289 return Map::CopyWithField(map, name, heap_type, attributes, representation,
290 INSERT_TRANSITION) 290 INSERT_TRANSITION)
291 .ToHandleChecked(); 291 .ToHandleChecked();
292 } 292 }
293 293
294 Handle<Map> AddDataConstant(Handle<Map> map, PropertyAttributes attributes, 294 Handle<Map> AddDataConstant(Handle<Map> map, PropertyAttributes attributes,
295 Handle<JSFunction> value) { 295 Handle<JSFunction> value) {
296 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 296 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
297 int property_index = number_of_properties_++; 297 int property_index = number_of_properties_++;
298 SetDataConstant(property_index, attributes, value); 298 SetDataConstant(property_index, attributes, value);
299 299
300 Handle<String> name = MakeName("prop", property_index); 300 Handle<String> name = MakeName("prop", property_index);
301 return Map::CopyWithConstant(map, name, value, attributes, 301 return Map::CopyWithConstant(map, name, value, attributes,
302 INSERT_TRANSITION) 302 INSERT_TRANSITION)
303 .ToHandleChecked(); 303 .ToHandleChecked();
304 } 304 }
305 305
306 Handle<Map> TransitionToDataField(Handle<Map> map, 306 Handle<Map> TransitionToDataField(Handle<Map> map,
307 PropertyAttributes attributes, 307 PropertyAttributes attributes,
308 Representation representation, 308 Representation representation,
309 Handle<HeapType> heap_type, 309 Handle<FieldType> heap_type,
310 Handle<Object> value) { 310 Handle<Object> value) {
311 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 311 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
312 int property_index = number_of_properties_++; 312 int property_index = number_of_properties_++;
313 SetDataField(property_index, attributes, representation, heap_type); 313 SetDataField(property_index, attributes, representation, heap_type);
314 314
315 Handle<String> name = MakeName("prop", property_index); 315 Handle<String> name = MakeName("prop", property_index);
316 return Map::TransitionToDataProperty( 316 return Map::TransitionToDataProperty(
317 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED); 317 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED);
318 } 318 }
319 319
320 Handle<Map> TransitionToDataConstant(Handle<Map> map, 320 Handle<Map> TransitionToDataConstant(Handle<Map> map,
321 PropertyAttributes attributes, 321 PropertyAttributes attributes,
322 Handle<JSFunction> value) { 322 Handle<JSFunction> value) {
323 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 323 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
324 int property_index = number_of_properties_++; 324 int property_index = number_of_properties_++;
325 SetDataConstant(property_index, attributes, value); 325 SetDataConstant(property_index, attributes, value);
326 326
327 Handle<String> name = MakeName("prop", property_index); 327 Handle<String> name = MakeName("prop", property_index);
328 return Map::TransitionToDataProperty( 328 return Map::TransitionToDataProperty(
329 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED); 329 map, name, value, attributes, Object::CERTAINLY_NOT_STORE_FROM_KEYED);
330 } 330 }
331 331
332 Handle<Map> FollowDataTransition(Handle<Map> map, 332 Handle<Map> FollowDataTransition(Handle<Map> map,
333 PropertyAttributes attributes, 333 PropertyAttributes attributes,
334 Representation representation, 334 Representation representation,
335 Handle<HeapType> heap_type) { 335 Handle<FieldType> heap_type) {
336 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors()); 336 CHECK_EQ(number_of_properties_, map->NumberOfOwnDescriptors());
337 int property_index = number_of_properties_++; 337 int property_index = number_of_properties_++;
338 SetDataField(property_index, attributes, representation, heap_type); 338 SetDataField(property_index, attributes, representation, heap_type);
339 339
340 Handle<String> name = MakeName("prop", property_index); 340 Handle<String> name = MakeName("prop", property_index);
341 Map* target = 341 Map* target =
342 TransitionArray::SearchTransition(*map, kData, *name, attributes); 342 TransitionArray::SearchTransition(*map, kData, *name, attributes);
343 CHECK(target != NULL); 343 CHECK(target != NULL);
344 return handle(target); 344 return handle(target);
345 } 345 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 414
415 //////////////////////////////////////////////////////////////////////////////// 415 ////////////////////////////////////////////////////////////////////////////////
416 // A set of tests for property reconfiguration that makes new transition tree 416 // A set of tests for property reconfiguration that makes new transition tree
417 // branch. 417 // branch.
418 // 418 //
419 419
420 TEST(ReconfigureAccessorToNonExistingDataField) { 420 TEST(ReconfigureAccessorToNonExistingDataField) {
421 CcTest::InitializeVM(); 421 CcTest::InitializeVM();
422 v8::HandleScope scope(CcTest::isolate()); 422 v8::HandleScope scope(CcTest::isolate());
423 Isolate* isolate = CcTest::i_isolate(); 423 Isolate* isolate = CcTest::i_isolate();
424 Handle<HeapType> any_type = HeapType::Any(isolate); 424 Handle<FieldType> any_type = FieldType::Any(isolate);
425 Handle<HeapType> none_type = HeapType::None(isolate); 425 Handle<FieldType> none_type = FieldType::None(isolate);
426 Handle<AccessorPair> pair = CreateAccessorPair(true, true); 426 Handle<AccessorPair> pair = CreateAccessorPair(true, true);
427 427
428 Expectations expectations(isolate); 428 Expectations expectations(isolate);
429 429
430 // Create a map, add required properties to it and initialize expectations. 430 // Create a map, add required properties to it and initialize expectations.
431 Handle<Map> initial_map = Map::Create(isolate, 0); 431 Handle<Map> initial_map = Map::Create(isolate, 0);
432 Handle<Map> map = initial_map; 432 Handle<Map> map = initial_map;
433 map = expectations.AddAccessorConstant(map, NONE, pair); 433 map = expectations.AddAccessorConstant(map, NONE, pair);
434 434
435 CHECK(!map->is_deprecated()); 435 CHECK(!map->is_deprecated());
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 // {} - p0 - p1 - p2: |detach_point_map| 526 // {} - p0 - p1 - p2: |detach_point_map|
527 // | 527 // |
528 // X - detached at |detach_property_at_index| 528 // X - detached at |detach_property_at_index|
529 // | 529 // |
530 // + - p3 - p4: |map| 530 // + - p3 - p4: |map|
531 // 531 //
532 // Detaching does not happen if |detach_property_at_index| is -1. 532 // Detaching does not happen if |detach_property_at_index| is -1.
533 // 533 //
534 static void TestGeneralizeRepresentation( 534 static void TestGeneralizeRepresentation(
535 int detach_property_at_index, int property_index, 535 int detach_property_at_index, int property_index,
536 Representation from_representation, Handle<HeapType> from_type, 536 Representation from_representation, Handle<FieldType> from_type,
537 Representation to_representation, Handle<HeapType> to_type, 537 Representation to_representation, Handle<FieldType> to_type,
538 Representation expected_representation, Handle<HeapType> expected_type, 538 Representation expected_representation, Handle<FieldType> expected_type,
539 bool expected_deprecation, bool expected_field_type_dependency) { 539 bool expected_deprecation, bool expected_field_type_dependency) {
540 Isolate* isolate = CcTest::i_isolate(); 540 Isolate* isolate = CcTest::i_isolate();
541 Handle<HeapType> any_type = HeapType::Any(isolate); 541 Handle<FieldType> any_type = FieldType::Any(isolate);
542 542
543 CHECK(detach_property_at_index >= -1 && 543 CHECK(detach_property_at_index >= -1 &&
544 detach_property_at_index < kPropCount); 544 detach_property_at_index < kPropCount);
545 CHECK(property_index < kPropCount); 545 CHECK(property_index < kPropCount);
546 CHECK_NE(detach_property_at_index, property_index); 546 CHECK_NE(detach_property_at_index, property_index);
547 547
548 const bool is_detached_map = detach_property_at_index >= 0; 548 const bool is_detached_map = detach_property_at_index >= 0;
549 549
550 Expectations expectations(isolate); 550 Expectations expectations(isolate);
551 551
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 } 632 }
633 } 633 }
634 634
635 info.dependencies()->Rollback(); // Properly cleanup compilation info. 635 info.dependencies()->Rollback(); // Properly cleanup compilation info.
636 636
637 // Update all deprecated maps and check that they are now the same. 637 // Update all deprecated maps and check that they are now the same.
638 Handle<Map> updated_map = Map::Update(map); 638 Handle<Map> updated_map = Map::Update(map);
639 CHECK_EQ(*new_map, *updated_map); 639 CHECK_EQ(*new_map, *updated_map);
640 } 640 }
641 641
642
643 static void TestGeneralizeRepresentation( 642 static void TestGeneralizeRepresentation(
644 Representation from_representation, Handle<HeapType> from_type, 643 Representation from_representation, Handle<FieldType> from_type,
645 Representation to_representation, Handle<HeapType> to_type, 644 Representation to_representation, Handle<FieldType> to_type,
646 Representation expected_representation, Handle<HeapType> expected_type, 645 Representation expected_representation, Handle<FieldType> expected_type,
647 bool expected_deprecation, bool expected_field_type_dependency) { 646 bool expected_deprecation, bool expected_field_type_dependency) {
648 // Check the cases when the map being reconfigured is a part of the 647 // Check the cases when the map being reconfigured is a part of the
649 // transition tree. 648 // transition tree.
650 STATIC_ASSERT(kPropCount > 4); 649 STATIC_ASSERT(kPropCount > 4);
651 int indices[] = {0, 2, kPropCount - 1}; 650 int indices[] = {0, 2, kPropCount - 1};
652 for (int i = 0; i < static_cast<int>(arraysize(indices)); i++) { 651 for (int i = 0; i < static_cast<int>(arraysize(indices)); i++) {
653 TestGeneralizeRepresentation( 652 TestGeneralizeRepresentation(
654 -1, indices[i], from_representation, from_type, to_representation, 653 -1, indices[i], from_representation, from_type, to_representation,
655 to_type, expected_representation, expected_type, expected_deprecation, 654 to_type, expected_representation, expected_type, expected_deprecation,
656 expected_field_type_dependency); 655 expected_field_type_dependency);
657 } 656 }
658 657
659 if (!from_representation.IsNone()) { 658 if (!from_representation.IsNone()) {
660 // Check the cases when the map being reconfigured is NOT a part of the 659 // Check the cases when the map being reconfigured is NOT a part of the
661 // transition tree. "None -> anything" representation changes make sense 660 // transition tree. "None -> anything" representation changes make sense
662 // only for "attached" maps. 661 // only for "attached" maps.
663 int indices[] = {0, kPropCount - 1}; 662 int indices[] = {0, kPropCount - 1};
664 for (int i = 0; i < static_cast<int>(arraysize(indices)); i++) { 663 for (int i = 0; i < static_cast<int>(arraysize(indices)); i++) {
665 TestGeneralizeRepresentation( 664 TestGeneralizeRepresentation(
666 indices[i], 2, from_representation, from_type, to_representation, 665 indices[i], 2, from_representation, from_type, to_representation,
667 to_type, expected_representation, expected_type, expected_deprecation, 666 to_type, expected_representation, expected_type, expected_deprecation,
668 expected_field_type_dependency); 667 expected_field_type_dependency);
669 } 668 }
670 669
671 // Check that reconfiguration to the very same field works correctly. 670 // Check that reconfiguration to the very same field works correctly.
672 Representation representation = from_representation; 671 Representation representation = from_representation;
673 Handle<HeapType> type = from_type; 672 Handle<FieldType> type = from_type;
674 TestGeneralizeRepresentation(-1, 2, representation, type, representation, 673 TestGeneralizeRepresentation(-1, 2, representation, type, representation,
675 type, representation, type, false, false); 674 type, representation, type, false, false);
676 } 675 }
677 } 676 }
678 677
679
680 static void TestGeneralizeRepresentation(Representation from_representation, 678 static void TestGeneralizeRepresentation(Representation from_representation,
681 Handle<HeapType> from_type, 679 Handle<FieldType> from_type,
682 Representation to_representation, 680 Representation to_representation,
683 Handle<HeapType> to_type, 681 Handle<FieldType> to_type,
684 Representation expected_representation, 682 Representation expected_representation,
685 Handle<HeapType> expected_type) { 683 Handle<FieldType> expected_type) {
686 const bool expected_deprecation = true; 684 const bool expected_deprecation = true;
687 const bool expected_field_type_dependency = false; 685 const bool expected_field_type_dependency = false;
688 686
689 TestGeneralizeRepresentation( 687 TestGeneralizeRepresentation(
690 from_representation, from_type, to_representation, to_type, 688 from_representation, from_type, to_representation, to_type,
691 expected_representation, expected_type, expected_deprecation, 689 expected_representation, expected_type, expected_deprecation,
692 expected_field_type_dependency); 690 expected_field_type_dependency);
693 } 691 }
694 692
695
696 static void TestGeneralizeRepresentationTrivial( 693 static void TestGeneralizeRepresentationTrivial(
697 Representation from_representation, Handle<HeapType> from_type, 694 Representation from_representation, Handle<FieldType> from_type,
698 Representation to_representation, Handle<HeapType> to_type, 695 Representation to_representation, Handle<FieldType> to_type,
699 Representation expected_representation, Handle<HeapType> expected_type, 696 Representation expected_representation, Handle<FieldType> expected_type,
700 bool expected_field_type_dependency = true) { 697 bool expected_field_type_dependency = true) {
701 const bool expected_deprecation = false; 698 const bool expected_deprecation = false;
702 699
703 TestGeneralizeRepresentation( 700 TestGeneralizeRepresentation(
704 from_representation, from_type, to_representation, to_type, 701 from_representation, from_type, to_representation, to_type,
705 expected_representation, expected_type, expected_deprecation, 702 expected_representation, expected_type, expected_deprecation,
706 expected_field_type_dependency); 703 expected_field_type_dependency);
707 } 704 }
708 705
709 706
710 TEST(GeneralizeRepresentationSmiToDouble) { 707 TEST(GeneralizeRepresentationSmiToDouble) {
711 CcTest::InitializeVM(); 708 CcTest::InitializeVM();
712 v8::HandleScope scope(CcTest::isolate()); 709 v8::HandleScope scope(CcTest::isolate());
713 Isolate* isolate = CcTest::i_isolate(); 710 Isolate* isolate = CcTest::i_isolate();
714 Handle<HeapType> any_type = HeapType::Any(isolate); 711 Handle<FieldType> any_type = FieldType::Any(isolate);
715 712
716 TestGeneralizeRepresentation(Representation::Smi(), any_type, 713 TestGeneralizeRepresentation(Representation::Smi(), any_type,
717 Representation::Double(), any_type, 714 Representation::Double(), any_type,
718 Representation::Double(), any_type); 715 Representation::Double(), any_type);
719 } 716 }
720 717
721 718
722 TEST(GeneralizeRepresentationSmiToTagged) { 719 TEST(GeneralizeRepresentationSmiToTagged) {
723 CcTest::InitializeVM(); 720 CcTest::InitializeVM();
724 v8::HandleScope scope(CcTest::isolate()); 721 v8::HandleScope scope(CcTest::isolate());
725 Isolate* isolate = CcTest::i_isolate(); 722 Isolate* isolate = CcTest::i_isolate();
726 Handle<HeapType> any_type = HeapType::Any(isolate); 723 Handle<FieldType> any_type = FieldType::Any(isolate);
727 Handle<HeapType> value_type = 724 Handle<FieldType> value_type =
728 HeapType::Class(Map::Create(isolate, 0), isolate); 725 FieldType::Class(Map::Create(isolate, 0), isolate);
729 726
730 TestGeneralizeRepresentation(Representation::Smi(), any_type, 727 TestGeneralizeRepresentation(Representation::Smi(), any_type,
731 Representation::HeapObject(), value_type, 728 Representation::HeapObject(), value_type,
732 Representation::Tagged(), any_type); 729 Representation::Tagged(), any_type);
733 } 730 }
734 731
735 732
736 TEST(GeneralizeRepresentationDoubleToTagged) { 733 TEST(GeneralizeRepresentationDoubleToTagged) {
737 CcTest::InitializeVM(); 734 CcTest::InitializeVM();
738 v8::HandleScope scope(CcTest::isolate()); 735 v8::HandleScope scope(CcTest::isolate());
739 Isolate* isolate = CcTest::i_isolate(); 736 Isolate* isolate = CcTest::i_isolate();
740 Handle<HeapType> any_type = HeapType::Any(isolate); 737 Handle<FieldType> any_type = FieldType::Any(isolate);
741 Handle<HeapType> value_type = 738 Handle<FieldType> value_type =
742 HeapType::Class(Map::Create(isolate, 0), isolate); 739 FieldType::Class(Map::Create(isolate, 0), isolate);
743 740
744 TestGeneralizeRepresentation(Representation::Double(), any_type, 741 TestGeneralizeRepresentation(Representation::Double(), any_type,
745 Representation::HeapObject(), value_type, 742 Representation::HeapObject(), value_type,
746 Representation::Tagged(), any_type); 743 Representation::Tagged(), any_type);
747 } 744 }
748 745
749 746
750 TEST(GeneralizeRepresentationHeapObjectToTagged) { 747 TEST(GeneralizeRepresentationHeapObjectToTagged) {
751 CcTest::InitializeVM(); 748 CcTest::InitializeVM();
752 v8::HandleScope scope(CcTest::isolate()); 749 v8::HandleScope scope(CcTest::isolate());
753 Isolate* isolate = CcTest::i_isolate(); 750 Isolate* isolate = CcTest::i_isolate();
754 Handle<HeapType> any_type = HeapType::Any(isolate); 751 Handle<FieldType> any_type = FieldType::Any(isolate);
755 Handle<HeapType> value_type = 752 Handle<FieldType> value_type =
756 HeapType::Class(Map::Create(isolate, 0), isolate); 753 FieldType::Class(Map::Create(isolate, 0), isolate);
757 754
758 TestGeneralizeRepresentation(Representation::HeapObject(), value_type, 755 TestGeneralizeRepresentation(Representation::HeapObject(), value_type,
759 Representation::Smi(), any_type, 756 Representation::Smi(), any_type,
760 Representation::Tagged(), any_type); 757 Representation::Tagged(), any_type);
761 } 758 }
762 759
763 760
764 TEST(GeneralizeRepresentationHeapObjectToHeapObject) { 761 TEST(GeneralizeRepresentationHeapObjectToHeapObject) {
765 CcTest::InitializeVM(); 762 CcTest::InitializeVM();
766 v8::HandleScope scope(CcTest::isolate()); 763 v8::HandleScope scope(CcTest::isolate());
767 Isolate* isolate = CcTest::i_isolate(); 764 Isolate* isolate = CcTest::i_isolate();
768 Handle<HeapType> any_type = HeapType::Any(isolate); 765 Handle<FieldType> any_type = FieldType::Any(isolate);
769 766
770 const int kMaxClassesPerFieldType = 1; 767 Handle<FieldType> current_type =
771 Handle<HeapType> current_type = 768 FieldType::Class(Map::Create(isolate, 0), isolate);
772 HeapType::Class(Map::Create(isolate, 0), isolate);
773 769
774 for (int i = 0; i < kMaxClassesPerFieldType; i++) { 770 Handle<FieldType> new_type =
775 Handle<HeapType> new_type = 771 FieldType::Class(Map::Create(isolate, 0), isolate);
776 HeapType::Class(Map::Create(isolate, 0), isolate);
777 772
778 Handle<HeapType> expected_type = 773 Handle<FieldType> expected_type = any_type;
779 (i < kMaxClassesPerFieldType - 1)
780 ? HeapType::Union(current_type, new_type, isolate)
781 : any_type;
782 774
783 TestGeneralizeRepresentationTrivial( 775 TestGeneralizeRepresentationTrivial(
784 Representation::HeapObject(), current_type, 776 Representation::HeapObject(), current_type,
785 Representation::HeapObject(), new_type, Representation::HeapObject(), 777 Representation::HeapObject(), new_type, Representation::HeapObject(),
786 expected_type); 778 expected_type);
787 current_type = expected_type; 779 current_type = expected_type;
788 }
789 780
790 Handle<HeapType> new_type = HeapType::Class(Map::Create(isolate, 0), isolate); 781 new_type = FieldType::Class(Map::Create(isolate, 0), isolate);
791 782
792 TestGeneralizeRepresentationTrivial( 783 TestGeneralizeRepresentationTrivial(
793 Representation::HeapObject(), any_type, Representation::HeapObject(), 784 Representation::HeapObject(), any_type, Representation::HeapObject(),
794 new_type, Representation::HeapObject(), any_type, false); 785 new_type, Representation::HeapObject(), any_type, false);
795 } 786 }
796 787
797 788
798 TEST(GeneralizeRepresentationNoneToSmi) { 789 TEST(GeneralizeRepresentationNoneToSmi) {
799 CcTest::InitializeVM(); 790 CcTest::InitializeVM();
800 v8::HandleScope scope(CcTest::isolate()); 791 v8::HandleScope scope(CcTest::isolate());
801 Isolate* isolate = CcTest::i_isolate(); 792 Isolate* isolate = CcTest::i_isolate();
802 Handle<HeapType> none_type = HeapType::None(isolate); 793 Handle<FieldType> none_type = FieldType::None(isolate);
803 Handle<HeapType> any_type = HeapType::Any(isolate); 794 Handle<FieldType> any_type = FieldType::Any(isolate);
804 795
805 // None -> Smi representation change is trivial. 796 // None -> Smi representation change is trivial.
806 TestGeneralizeRepresentationTrivial(Representation::None(), none_type, 797 TestGeneralizeRepresentationTrivial(Representation::None(), none_type,
807 Representation::Smi(), any_type, 798 Representation::Smi(), any_type,
808 Representation::Smi(), any_type); 799 Representation::Smi(), any_type);
809 } 800 }
810 801
811 802
812 TEST(GeneralizeRepresentationNoneToDouble) { 803 TEST(GeneralizeRepresentationNoneToDouble) {
813 CcTest::InitializeVM(); 804 CcTest::InitializeVM();
814 v8::HandleScope scope(CcTest::isolate()); 805 v8::HandleScope scope(CcTest::isolate());
815 Isolate* isolate = CcTest::i_isolate(); 806 Isolate* isolate = CcTest::i_isolate();
816 Handle<HeapType> none_type = HeapType::None(isolate); 807 Handle<FieldType> none_type = FieldType::None(isolate);
817 Handle<HeapType> any_type = HeapType::Any(isolate); 808 Handle<FieldType> any_type = FieldType::Any(isolate);
818 809
819 // None -> Double representation change is NOT trivial. 810 // None -> Double representation change is NOT trivial.
820 TestGeneralizeRepresentation(Representation::None(), none_type, 811 TestGeneralizeRepresentation(Representation::None(), none_type,
821 Representation::Double(), any_type, 812 Representation::Double(), any_type,
822 Representation::Double(), any_type); 813 Representation::Double(), any_type);
823 } 814 }
824 815
825 816
826 TEST(GeneralizeRepresentationNoneToHeapObject) { 817 TEST(GeneralizeRepresentationNoneToHeapObject) {
827 CcTest::InitializeVM(); 818 CcTest::InitializeVM();
828 v8::HandleScope scope(CcTest::isolate()); 819 v8::HandleScope scope(CcTest::isolate());
829 Isolate* isolate = CcTest::i_isolate(); 820 Isolate* isolate = CcTest::i_isolate();
830 Handle<HeapType> none_type = HeapType::None(isolate); 821 Handle<FieldType> none_type = FieldType::None(isolate);
831 Handle<HeapType> value_type = 822 Handle<FieldType> value_type =
832 HeapType::Class(Map::Create(isolate, 0), isolate); 823 FieldType::Class(Map::Create(isolate, 0), isolate);
833 824
834 // None -> HeapObject representation change is trivial. 825 // None -> HeapObject representation change is trivial.
835 TestGeneralizeRepresentationTrivial(Representation::None(), none_type, 826 TestGeneralizeRepresentationTrivial(Representation::None(), none_type,
836 Representation::HeapObject(), value_type, 827 Representation::HeapObject(), value_type,
837 Representation::HeapObject(), value_type); 828 Representation::HeapObject(), value_type);
838 } 829 }
839 830
840 831
841 TEST(GeneralizeRepresentationNoneToTagged) { 832 TEST(GeneralizeRepresentationNoneToTagged) {
842 CcTest::InitializeVM(); 833 CcTest::InitializeVM();
843 v8::HandleScope scope(CcTest::isolate()); 834 v8::HandleScope scope(CcTest::isolate());
844 Isolate* isolate = CcTest::i_isolate(); 835 Isolate* isolate = CcTest::i_isolate();
845 Handle<HeapType> none_type = HeapType::None(isolate); 836 Handle<FieldType> none_type = FieldType::None(isolate);
846 Handle<HeapType> any_type = HeapType::Any(isolate); 837 Handle<FieldType> any_type = FieldType::Any(isolate);
847 838
848 // None -> HeapObject representation change is trivial. 839 // None -> HeapObject representation change is trivial.
849 TestGeneralizeRepresentationTrivial(Representation::None(), none_type, 840 TestGeneralizeRepresentationTrivial(Representation::None(), none_type,
850 Representation::Tagged(), any_type, 841 Representation::Tagged(), any_type,
851 Representation::Tagged(), any_type); 842 Representation::Tagged(), any_type);
852 } 843 }
853 844
854 845
855 //////////////////////////////////////////////////////////////////////////////// 846 ////////////////////////////////////////////////////////////////////////////////
856 // A set of tests for representation generalization case with kAccessor 847 // A set of tests for representation generalization case with kAccessor
857 // properties. 848 // properties.
858 // 849 //
859 850
860 TEST(GeneralizeRepresentationWithAccessorProperties) { 851 TEST(GeneralizeRepresentationWithAccessorProperties) {
861 CcTest::InitializeVM(); 852 CcTest::InitializeVM();
862 v8::HandleScope scope(CcTest::isolate()); 853 v8::HandleScope scope(CcTest::isolate());
863 Isolate* isolate = CcTest::i_isolate(); 854 Isolate* isolate = CcTest::i_isolate();
864 Handle<HeapType> any_type = HeapType::Any(isolate); 855 Handle<FieldType> any_type = FieldType::Any(isolate);
865 Handle<AccessorPair> pair = CreateAccessorPair(true, true); 856 Handle<AccessorPair> pair = CreateAccessorPair(true, true);
866 857
867 const int kAccessorProp = kPropCount / 2; 858 const int kAccessorProp = kPropCount / 2;
868 Expectations expectations(isolate); 859 Expectations expectations(isolate);
869 860
870 // Create a map, add required properties to it and initialize expectations. 861 // Create a map, add required properties to it and initialize expectations.
871 Handle<Map> initial_map = Map::Create(isolate, 0); 862 Handle<Map> initial_map = Map::Create(isolate, 0);
872 Handle<Map> map = initial_map; 863 Handle<Map> map = initial_map;
873 for (int i = 0; i < kPropCount; i++) { 864 for (int i = 0; i < kPropCount; i++) {
874 if (i == kAccessorProp) { 865 if (i == kAccessorProp) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 // This test ensures that representation/field type generalization is correctly 916 // This test ensures that representation/field type generalization is correctly
926 // propagated from one branch of transition tree (|map2|) to another (|map|). 917 // propagated from one branch of transition tree (|map2|) to another (|map|).
927 // 918 //
928 // + - p2B - p3 - p4: |map2| 919 // + - p2B - p3 - p4: |map2|
929 // | 920 // |
930 // {} - p0 - p1 - p2A - p3 - p4: |map| 921 // {} - p0 - p1 - p2A - p3 - p4: |map|
931 // 922 //
932 // where "p2A" and "p2B" differ only in the attributes. 923 // where "p2A" and "p2B" differ only in the attributes.
933 // 924 //
934 static void TestReconfigureDataFieldAttribute_GeneralizeRepresentation( 925 static void TestReconfigureDataFieldAttribute_GeneralizeRepresentation(
935 Representation from_representation, Handle<HeapType> from_type, 926 Representation from_representation, Handle<FieldType> from_type,
936 Representation to_representation, Handle<HeapType> to_type, 927 Representation to_representation, Handle<FieldType> to_type,
937 Representation expected_representation, Handle<HeapType> expected_type) { 928 Representation expected_representation, Handle<FieldType> expected_type) {
938 Isolate* isolate = CcTest::i_isolate(); 929 Isolate* isolate = CcTest::i_isolate();
939 930
940 Expectations expectations(isolate); 931 Expectations expectations(isolate);
941 932
942 // Create a map, add required properties to it and initialize expectations. 933 // Create a map, add required properties to it and initialize expectations.
943 Handle<Map> initial_map = Map::Create(isolate, 0); 934 Handle<Map> initial_map = Map::Create(isolate, 0);
944 Handle<Map> map = initial_map; 935 Handle<Map> map = initial_map;
945 for (int i = 0; i < kPropCount; i++) { 936 for (int i = 0; i < kPropCount; i++) {
946 map = expectations.AddDataField(map, NONE, from_representation, from_type); 937 map = expectations.AddDataField(map, NONE, from_representation, from_type);
947 } 938 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 // (from HeapObject to HeapObject) is correctly propagated from one branch of 1000 // (from HeapObject to HeapObject) is correctly propagated from one branch of
1010 // transition tree (|map2|) to another (|map|). 1001 // transition tree (|map2|) to another (|map|).
1011 // 1002 //
1012 // + - p2B - p3 - p4: |map2| 1003 // + - p2B - p3 - p4: |map2|
1013 // | 1004 // |
1014 // {} - p0 - p1 - p2A - p3 - p4: |map| 1005 // {} - p0 - p1 - p2A - p3 - p4: |map|
1015 // 1006 //
1016 // where "p2A" and "p2B" differ only in the attributes. 1007 // where "p2A" and "p2B" differ only in the attributes.
1017 // 1008 //
1018 static void TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial( 1009 static void TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial(
1019 Representation from_representation, Handle<HeapType> from_type, 1010 Representation from_representation, Handle<FieldType> from_type,
1020 Representation to_representation, Handle<HeapType> to_type, 1011 Representation to_representation, Handle<FieldType> to_type,
1021 Representation expected_representation, Handle<HeapType> expected_type, 1012 Representation expected_representation, Handle<FieldType> expected_type,
1022 bool expected_field_type_dependency = true) { 1013 bool expected_field_type_dependency = true) {
1023 Isolate* isolate = CcTest::i_isolate(); 1014 Isolate* isolate = CcTest::i_isolate();
1024 1015
1025 Expectations expectations(isolate); 1016 Expectations expectations(isolate);
1026 1017
1027 // Create a map, add required properties to it and initialize expectations. 1018 // Create a map, add required properties to it and initialize expectations.
1028 Handle<Map> initial_map = Map::Create(isolate, 0); 1019 Handle<Map> initial_map = Map::Create(isolate, 0);
1029 Handle<Map> map = initial_map; 1020 Handle<Map> map = initial_map;
1030 for (int i = 0; i < kPropCount; i++) { 1021 for (int i = 0; i < kPropCount; i++) {
1031 map = expectations.AddDataField(map, NONE, from_representation, from_type); 1022 map = expectations.AddDataField(map, NONE, from_representation, from_type);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 1080
1090 Handle<Map> updated_map = Map::Update(map); 1081 Handle<Map> updated_map = Map::Update(map);
1091 CHECK_EQ(*new_map, *updated_map); 1082 CHECK_EQ(*new_map, *updated_map);
1092 } 1083 }
1093 1084
1094 1085
1095 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToDouble) { 1086 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToDouble) {
1096 CcTest::InitializeVM(); 1087 CcTest::InitializeVM();
1097 v8::HandleScope scope(CcTest::isolate()); 1088 v8::HandleScope scope(CcTest::isolate());
1098 Isolate* isolate = CcTest::i_isolate(); 1089 Isolate* isolate = CcTest::i_isolate();
1099 Handle<HeapType> any_type = HeapType::Any(isolate); 1090 Handle<FieldType> any_type = FieldType::Any(isolate);
1100 1091
1101 TestReconfigureDataFieldAttribute_GeneralizeRepresentation( 1092 TestReconfigureDataFieldAttribute_GeneralizeRepresentation(
1102 Representation::Smi(), any_type, Representation::Double(), any_type, 1093 Representation::Smi(), any_type, Representation::Double(), any_type,
1103 Representation::Double(), any_type); 1094 Representation::Double(), any_type);
1104 } 1095 }
1105 1096
1106 1097
1107 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToTagged) { 1098 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationSmiToTagged) {
1108 CcTest::InitializeVM(); 1099 CcTest::InitializeVM();
1109 v8::HandleScope scope(CcTest::isolate()); 1100 v8::HandleScope scope(CcTest::isolate());
1110 Isolate* isolate = CcTest::i_isolate(); 1101 Isolate* isolate = CcTest::i_isolate();
1111 Handle<HeapType> any_type = HeapType::Any(isolate); 1102 Handle<FieldType> any_type = FieldType::Any(isolate);
1112 Handle<HeapType> value_type = 1103 Handle<FieldType> value_type =
1113 HeapType::Class(Map::Create(isolate, 0), isolate); 1104 FieldType::Class(Map::Create(isolate, 0), isolate);
1114 1105
1115 TestReconfigureDataFieldAttribute_GeneralizeRepresentation( 1106 TestReconfigureDataFieldAttribute_GeneralizeRepresentation(
1116 Representation::Smi(), any_type, Representation::HeapObject(), value_type, 1107 Representation::Smi(), any_type, Representation::HeapObject(), value_type,
1117 Representation::Tagged(), any_type); 1108 Representation::Tagged(), any_type);
1118 } 1109 }
1119 1110
1120 1111
1121 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationDoubleToTagged) { 1112 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationDoubleToTagged) {
1122 CcTest::InitializeVM(); 1113 CcTest::InitializeVM();
1123 v8::HandleScope scope(CcTest::isolate()); 1114 v8::HandleScope scope(CcTest::isolate());
1124 Isolate* isolate = CcTest::i_isolate(); 1115 Isolate* isolate = CcTest::i_isolate();
1125 Handle<HeapType> any_type = HeapType::Any(isolate); 1116 Handle<FieldType> any_type = FieldType::Any(isolate);
1126 Handle<HeapType> value_type = 1117 Handle<FieldType> value_type =
1127 HeapType::Class(Map::Create(isolate, 0), isolate); 1118 FieldType::Class(Map::Create(isolate, 0), isolate);
1128 1119
1129 TestReconfigureDataFieldAttribute_GeneralizeRepresentation( 1120 TestReconfigureDataFieldAttribute_GeneralizeRepresentation(
1130 Representation::Double(), any_type, Representation::HeapObject(), 1121 Representation::Double(), any_type, Representation::HeapObject(),
1131 value_type, Representation::Tagged(), any_type); 1122 value_type, Representation::Tagged(), any_type);
1132 } 1123 }
1133 1124
1134 1125
1135 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationHeapObjToHeapObj) { 1126 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationHeapObjToHeapObj) {
1136 CcTest::InitializeVM(); 1127 CcTest::InitializeVM();
1137 v8::HandleScope scope(CcTest::isolate()); 1128 v8::HandleScope scope(CcTest::isolate());
1138 Isolate* isolate = CcTest::i_isolate(); 1129 Isolate* isolate = CcTest::i_isolate();
1139 Handle<HeapType> any_type = HeapType::Any(isolate); 1130 Handle<FieldType> any_type = FieldType::Any(isolate);
1140 1131
1141 const int kMaxClassesPerFieldType = 1; 1132 Handle<FieldType> current_type =
1142 Handle<HeapType> current_type = 1133 FieldType::Class(Map::Create(isolate, 0), isolate);
1143 HeapType::Class(Map::Create(isolate, 0), isolate);
1144 1134
1145 for (int i = 0; i < kMaxClassesPerFieldType; i++) { 1135 Handle<FieldType> new_type =
1146 Handle<HeapType> new_type = 1136 FieldType::Class(Map::Create(isolate, 0), isolate);
1147 HeapType::Class(Map::Create(isolate, 0), isolate);
1148 1137
1149 Handle<HeapType> expected_type = 1138 Handle<FieldType> expected_type = any_type;
1150 (i < kMaxClassesPerFieldType - 1)
1151 ? HeapType::Union(current_type, new_type, isolate)
1152 : any_type;
1153 1139
1154 TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial( 1140 TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial(
1155 Representation::HeapObject(), current_type, 1141 Representation::HeapObject(), current_type, Representation::HeapObject(),
1156 Representation::HeapObject(), new_type, Representation::HeapObject(), 1142 new_type, Representation::HeapObject(), expected_type);
1157 expected_type); 1143 current_type = expected_type;
1158 current_type = expected_type;
1159 }
1160 1144
1161 Handle<HeapType> new_type = HeapType::Class(Map::Create(isolate, 0), isolate); 1145 new_type = FieldType::Class(Map::Create(isolate, 0), isolate);
1162 1146
1163 TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial( 1147 TestReconfigureDataFieldAttribute_GeneralizeRepresentationTrivial(
1164 Representation::HeapObject(), any_type, Representation::HeapObject(), 1148 Representation::HeapObject(), any_type, Representation::HeapObject(),
1165 new_type, Representation::HeapObject(), any_type, false); 1149 new_type, Representation::HeapObject(), any_type, false);
1166 } 1150 }
1167 1151
1168 1152
1169 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationHeapObjectToTagged) { 1153 TEST(ReconfigureDataFieldAttribute_GeneralizeRepresentationHeapObjectToTagged) {
1170 CcTest::InitializeVM(); 1154 CcTest::InitializeVM();
1171 v8::HandleScope scope(CcTest::isolate()); 1155 v8::HandleScope scope(CcTest::isolate());
1172 Isolate* isolate = CcTest::i_isolate(); 1156 Isolate* isolate = CcTest::i_isolate();
1173 Handle<HeapType> any_type = HeapType::Any(isolate); 1157 Handle<FieldType> any_type = FieldType::Any(isolate);
1174 Handle<HeapType> value_type = 1158 Handle<FieldType> value_type =
1175 HeapType::Class(Map::Create(isolate, 0), isolate); 1159 FieldType::Class(Map::Create(isolate, 0), isolate);
1176 1160
1177 TestReconfigureDataFieldAttribute_GeneralizeRepresentation( 1161 TestReconfigureDataFieldAttribute_GeneralizeRepresentation(
1178 Representation::HeapObject(), value_type, Representation::Smi(), any_type, 1162 Representation::HeapObject(), value_type, Representation::Smi(), any_type,
1179 Representation::Tagged(), any_type); 1163 Representation::Tagged(), any_type);
1180 } 1164 }
1181 1165
1182 1166
1183 // Checks that given |map| is deprecated and that it updates to given |new_map| 1167 // Checks that given |map| is deprecated and that it updates to given |new_map|
1184 // which in turn should match expectations. 1168 // which in turn should match expectations.
1185 struct CheckDeprecated { 1169 struct CheckDeprecated {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1261 // + - p2A - p3 - p4: |map1| 1245 // + - p2A - p3 - p4: |map1|
1262 // | 1246 // |
1263 // + - the property customized by the TestConfig provided 1247 // + - the property customized by the TestConfig provided
1264 // 1248 //
1265 // where "p2A" and "p2B" differ only in the attributes. 1249 // where "p2A" and "p2B" differ only in the attributes.
1266 // 1250 //
1267 template <typename TestConfig, typename Checker> 1251 template <typename TestConfig, typename Checker>
1268 static void TestReconfigureProperty_CustomPropertyAfterTargetMap( 1252 static void TestReconfigureProperty_CustomPropertyAfterTargetMap(
1269 TestConfig& config, Checker& checker) { 1253 TestConfig& config, Checker& checker) {
1270 Isolate* isolate = CcTest::i_isolate(); 1254 Isolate* isolate = CcTest::i_isolate();
1271 Handle<HeapType> any_type = HeapType::Any(isolate); 1255 Handle<FieldType> any_type = FieldType::Any(isolate);
1272 1256
1273 const int kCustomPropIndex = kPropCount - 2; 1257 const int kCustomPropIndex = kPropCount - 2;
1274 Expectations expectations(isolate); 1258 Expectations expectations(isolate);
1275 1259
1276 const int kSplitProp = 2; 1260 const int kSplitProp = 2;
1277 CHECK(kSplitProp < kCustomPropIndex); 1261 CHECK(kSplitProp < kCustomPropIndex);
1278 1262
1279 const Representation representation = Representation::Smi(); 1263 const Representation representation = Representation::Smi();
1280 1264
1281 // Create common part of transition tree. 1265 // Create common part of transition tree.
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1384 1368
1385 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations, 1369 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations,
1386 Handle<Map> map) { 1370 Handle<Map> map) {
1387 CHECK(branch_id == 1 || branch_id == 2); 1371 CHECK(branch_id == 1 || branch_id == 2);
1388 Handle<JSFunction> js_func = branch_id == 1 ? js_func1_ : js_func2_; 1372 Handle<JSFunction> js_func = branch_id == 1 ? js_func1_ : js_func2_;
1389 return expectations.AddDataConstant(map, NONE, js_func); 1373 return expectations.AddDataConstant(map, NONE, js_func);
1390 } 1374 }
1391 1375
1392 void UpdateExpectations(int property_index, Expectations& expectations) { 1376 void UpdateExpectations(int property_index, Expectations& expectations) {
1393 Isolate* isolate = CcTest::i_isolate(); 1377 Isolate* isolate = CcTest::i_isolate();
1394 Handle<HeapType> function_type = 1378 Handle<FieldType> function_type =
1395 HeapType::Class(isolate->sloppy_function_map(), isolate); 1379 FieldType::Class(isolate->sloppy_function_map(), isolate);
1396 expectations.SetDataField(property_index, Representation::HeapObject(), 1380 expectations.SetDataField(property_index, Representation::HeapObject(),
1397 function_type); 1381 function_type);
1398 } 1382 }
1399 }; 1383 };
1400 1384
1401 TestConfig config; 1385 TestConfig config;
1402 // Two branches are "incompatible" so the |map1| should be deprecated. 1386 // Two branches are "incompatible" so the |map1| should be deprecated.
1403 CheckDeprecated checker; 1387 CheckDeprecated checker;
1404 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker); 1388 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker);
1405 } 1389 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 Handle<AccessorPair> pair_; 1500 Handle<AccessorPair> pair_;
1517 TestConfig() { pair_ = CreateAccessorPair(true, true); } 1501 TestConfig() { pair_ = CreateAccessorPair(true, true); }
1518 1502
1519 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations, 1503 Handle<Map> AddPropertyAtBranch(int branch_id, Expectations& expectations,
1520 Handle<Map> map) { 1504 Handle<Map> map) {
1521 CHECK(branch_id == 1 || branch_id == 2); 1505 CHECK(branch_id == 1 || branch_id == 2);
1522 if (branch_id == 1) { 1506 if (branch_id == 1) {
1523 return expectations.AddAccessorConstant(map, NONE, pair_); 1507 return expectations.AddAccessorConstant(map, NONE, pair_);
1524 } else { 1508 } else {
1525 Isolate* isolate = CcTest::i_isolate(); 1509 Isolate* isolate = CcTest::i_isolate();
1526 Handle<HeapType> any_type = HeapType::Any(isolate); 1510 Handle<FieldType> any_type = FieldType::Any(isolate);
1527 return expectations.AddDataField(map, NONE, Representation::Smi(), 1511 return expectations.AddDataField(map, NONE, Representation::Smi(),
1528 any_type); 1512 any_type);
1529 } 1513 }
1530 } 1514 }
1531 1515
1532 void UpdateExpectations(int property_index, Expectations& expectations) {} 1516 void UpdateExpectations(int property_index, Expectations& expectations) {}
1533 }; 1517 };
1534 1518
1535 TestConfig config; 1519 TestConfig config;
1536 // These are completely separate branches in transition tree. 1520 // These are completely separate branches in transition tree.
1537 CheckUnrelated checker; 1521 CheckUnrelated checker;
1538 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker); 1522 TestReconfigureProperty_CustomPropertyAfterTargetMap(config, checker);
1539 } 1523 }
1540 1524
1541 1525
1542 //////////////////////////////////////////////////////////////////////////////// 1526 ////////////////////////////////////////////////////////////////////////////////
1543 // A set of tests checking split map deprecation. 1527 // A set of tests checking split map deprecation.
1544 // 1528 //
1545 1529
1546 TEST(ReconfigurePropertySplitMapTransitionsOverflow) { 1530 TEST(ReconfigurePropertySplitMapTransitionsOverflow) {
1547 CcTest::InitializeVM(); 1531 CcTest::InitializeVM();
1548 v8::HandleScope scope(CcTest::isolate()); 1532 v8::HandleScope scope(CcTest::isolate());
1549 Isolate* isolate = CcTest::i_isolate(); 1533 Isolate* isolate = CcTest::i_isolate();
1550 Handle<HeapType> any_type = HeapType::Any(isolate); 1534 Handle<FieldType> any_type = FieldType::Any(isolate);
1551 1535
1552 Expectations expectations(isolate); 1536 Expectations expectations(isolate);
1553 1537
1554 // Create a map, add required properties to it and initialize expectations. 1538 // Create a map, add required properties to it and initialize expectations.
1555 Handle<Map> initial_map = Map::Create(isolate, 0); 1539 Handle<Map> initial_map = Map::Create(isolate, 0);
1556 Handle<Map> map = initial_map; 1540 Handle<Map> map = initial_map;
1557 for (int i = 0; i < kPropCount; i++) { 1541 for (int i = 0; i < kPropCount; i++) {
1558 map = expectations.AddDataField(map, NONE, Representation::Smi(), any_type); 1542 map = expectations.AddDataField(map, NONE, Representation::Smi(), any_type);
1559 } 1543 }
1560 CHECK(!map->is_deprecated()); 1544 CHECK(!map->is_deprecated());
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1631 // 1615 //
1632 // where "p4A" and "p4B" are exactly the same properties. 1616 // where "p4A" and "p4B" are exactly the same properties.
1633 // 1617 //
1634 // TODO(ishell): unify this test template with 1618 // TODO(ishell): unify this test template with
1635 // TestReconfigureDataFieldAttribute_GeneralizeRepresentation once 1619 // TestReconfigureDataFieldAttribute_GeneralizeRepresentation once
1636 // IS_PROTO_TRANS_ISSUE_FIXED and IS_NON_EQUIVALENT_TRANSITION_SUPPORTED are 1620 // IS_PROTO_TRANS_ISSUE_FIXED and IS_NON_EQUIVALENT_TRANSITION_SUPPORTED are
1637 // fixed. 1621 // fixed.
1638 template <typename TestConfig> 1622 template <typename TestConfig>
1639 static void TestGeneralizeRepresentationWithSpecialTransition( 1623 static void TestGeneralizeRepresentationWithSpecialTransition(
1640 TestConfig& config, Representation from_representation, 1624 TestConfig& config, Representation from_representation,
1641 Handle<HeapType> from_type, Representation to_representation, 1625 Handle<FieldType> from_type, Representation to_representation,
1642 Handle<HeapType> to_type, Representation expected_representation, 1626 Handle<FieldType> to_type, Representation expected_representation,
1643 Handle<HeapType> expected_type) { 1627 Handle<FieldType> expected_type) {
1644 Isolate* isolate = CcTest::i_isolate(); 1628 Isolate* isolate = CcTest::i_isolate();
1645 1629
1646 Expectations expectations(isolate); 1630 Expectations expectations(isolate);
1647 1631
1648 // Create a map, add required properties to it and initialize expectations. 1632 // Create a map, add required properties to it and initialize expectations.
1649 Handle<Map> initial_map = Map::Create(isolate, 0); 1633 Handle<Map> initial_map = Map::Create(isolate, 0);
1650 Handle<Map> map = initial_map; 1634 Handle<Map> map = initial_map;
1651 for (int i = 0; i < kPropCount; i++) { 1635 for (int i = 0; i < kPropCount; i++) {
1652 map = expectations.AddDataField(map, NONE, from_representation, from_type); 1636 map = expectations.AddDataField(map, NONE, from_representation, from_type);
1653 } 1637 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1723 updated_map = Map::Update(maps[i]); 1707 updated_map = Map::Update(maps[i]);
1724 CHECK_EQ(*active_map, *updated_map); 1708 CHECK_EQ(*active_map, *updated_map);
1725 } 1709 }
1726 } 1710 }
1727 1711
1728 1712
1729 TEST(ElementsKindTransitionFromMapOwningDescriptor) { 1713 TEST(ElementsKindTransitionFromMapOwningDescriptor) {
1730 CcTest::InitializeVM(); 1714 CcTest::InitializeVM();
1731 v8::HandleScope scope(CcTest::isolate()); 1715 v8::HandleScope scope(CcTest::isolate());
1732 Isolate* isolate = CcTest::i_isolate(); 1716 Isolate* isolate = CcTest::i_isolate();
1733 Handle<HeapType> any_type = HeapType::Any(isolate); 1717 Handle<FieldType> any_type = FieldType::Any(isolate);
1734 Handle<HeapType> value_type = 1718 Handle<FieldType> value_type =
1735 HeapType::Class(Map::Create(isolate, 0), isolate); 1719 FieldType::Class(Map::Create(isolate, 0), isolate);
1736 1720
1737 struct TestConfig { 1721 struct TestConfig {
1738 Handle<Map> Transition(Handle<Map> map) { 1722 Handle<Map> Transition(Handle<Map> map) {
1739 return Map::CopyAsElementsKind(map, DICTIONARY_ELEMENTS, 1723 return Map::CopyAsElementsKind(map, DICTIONARY_ELEMENTS,
1740 INSERT_TRANSITION); 1724 INSERT_TRANSITION);
1741 } 1725 }
1742 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 1726 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
1743 bool generalizes_representations() const { return false; } 1727 bool generalizes_representations() const { return false; }
1744 bool is_non_equevalent_transition() const { return false; } 1728 bool is_non_equevalent_transition() const { return false; }
1745 }; 1729 };
1746 TestConfig config; 1730 TestConfig config;
1747 TestGeneralizeRepresentationWithSpecialTransition( 1731 TestGeneralizeRepresentationWithSpecialTransition(
1748 config, Representation::Smi(), any_type, Representation::HeapObject(), 1732 config, Representation::Smi(), any_type, Representation::HeapObject(),
1749 value_type, Representation::Tagged(), any_type); 1733 value_type, Representation::Tagged(), any_type);
1750 } 1734 }
1751 1735
1752 1736
1753 TEST(ElementsKindTransitionFromMapNotOwningDescriptor) { 1737 TEST(ElementsKindTransitionFromMapNotOwningDescriptor) {
1754 CcTest::InitializeVM(); 1738 CcTest::InitializeVM();
1755 v8::HandleScope scope(CcTest::isolate()); 1739 v8::HandleScope scope(CcTest::isolate());
1756 Isolate* isolate = CcTest::i_isolate(); 1740 Isolate* isolate = CcTest::i_isolate();
1757 Handle<HeapType> any_type = HeapType::Any(isolate); 1741 Handle<FieldType> any_type = FieldType::Any(isolate);
1758 Handle<HeapType> value_type = 1742 Handle<FieldType> value_type =
1759 HeapType::Class(Map::Create(isolate, 0), isolate); 1743 FieldType::Class(Map::Create(isolate, 0), isolate);
1760 1744
1761 struct TestConfig { 1745 struct TestConfig {
1762 Handle<Map> Transition(Handle<Map> map) { 1746 Handle<Map> Transition(Handle<Map> map) {
1763 Isolate* isolate = CcTest::i_isolate(); 1747 Isolate* isolate = CcTest::i_isolate();
1764 Handle<HeapType> any_type = HeapType::Any(isolate); 1748 Handle<FieldType> any_type = FieldType::Any(isolate);
1765 1749
1766 // Add one more transition to |map| in order to prevent descriptors 1750 // Add one more transition to |map| in order to prevent descriptors
1767 // ownership. 1751 // ownership.
1768 CHECK(map->owns_descriptors()); 1752 CHECK(map->owns_descriptors());
1769 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, 1753 Map::CopyWithField(map, MakeString("foo"), any_type, NONE,
1770 Representation::Smi(), INSERT_TRANSITION) 1754 Representation::Smi(), INSERT_TRANSITION)
1771 .ToHandleChecked(); 1755 .ToHandleChecked();
1772 CHECK(!map->owns_descriptors()); 1756 CHECK(!map->owns_descriptors());
1773 1757
1774 return Map::CopyAsElementsKind(map, DICTIONARY_ELEMENTS, 1758 return Map::CopyAsElementsKind(map, DICTIONARY_ELEMENTS,
1775 INSERT_TRANSITION); 1759 INSERT_TRANSITION);
1776 } 1760 }
1777 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 1761 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
1778 bool generalizes_representations() const { return false; } 1762 bool generalizes_representations() const { return false; }
1779 bool is_non_equevalent_transition() const { return false; } 1763 bool is_non_equevalent_transition() const { return false; }
1780 }; 1764 };
1781 TestConfig config; 1765 TestConfig config;
1782 TestGeneralizeRepresentationWithSpecialTransition( 1766 TestGeneralizeRepresentationWithSpecialTransition(
1783 config, Representation::Smi(), any_type, Representation::HeapObject(), 1767 config, Representation::Smi(), any_type, Representation::HeapObject(),
1784 value_type, Representation::Tagged(), any_type); 1768 value_type, Representation::Tagged(), any_type);
1785 } 1769 }
1786 1770
1787 1771
1788 TEST(ForObservedTransitionFromMapOwningDescriptor) { 1772 TEST(ForObservedTransitionFromMapOwningDescriptor) {
1789 CcTest::InitializeVM(); 1773 CcTest::InitializeVM();
1790 v8::HandleScope scope(CcTest::isolate()); 1774 v8::HandleScope scope(CcTest::isolate());
1791 Isolate* isolate = CcTest::i_isolate(); 1775 Isolate* isolate = CcTest::i_isolate();
1792 Handle<HeapType> any_type = HeapType::Any(isolate); 1776 Handle<FieldType> any_type = FieldType::Any(isolate);
1793 Handle<HeapType> value_type = 1777 Handle<FieldType> value_type =
1794 HeapType::Class(Map::Create(isolate, 0), isolate); 1778 FieldType::Class(Map::Create(isolate, 0), isolate);
1795 1779
1796 struct TestConfig { 1780 struct TestConfig {
1797 Handle<Map> Transition(Handle<Map> map) { 1781 Handle<Map> Transition(Handle<Map> map) {
1798 return Map::CopyForObserved(map); 1782 return Map::CopyForObserved(map);
1799 } 1783 }
1800 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 1784 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
1801 bool generalizes_representations() const { return false; } 1785 bool generalizes_representations() const { return false; }
1802 bool is_non_equevalent_transition() const { return true; } 1786 bool is_non_equevalent_transition() const { return true; }
1803 }; 1787 };
1804 TestConfig config; 1788 TestConfig config;
1805 TestGeneralizeRepresentationWithSpecialTransition( 1789 TestGeneralizeRepresentationWithSpecialTransition(
1806 config, Representation::Smi(), any_type, Representation::HeapObject(), 1790 config, Representation::Smi(), any_type, Representation::HeapObject(),
1807 value_type, Representation::Tagged(), any_type); 1791 value_type, Representation::Tagged(), any_type);
1808 } 1792 }
1809 1793
1810 1794
1811 TEST(ForObservedTransitionFromMapNotOwningDescriptor) { 1795 TEST(ForObservedTransitionFromMapNotOwningDescriptor) {
1812 CcTest::InitializeVM(); 1796 CcTest::InitializeVM();
1813 v8::HandleScope scope(CcTest::isolate()); 1797 v8::HandleScope scope(CcTest::isolate());
1814 Isolate* isolate = CcTest::i_isolate(); 1798 Isolate* isolate = CcTest::i_isolate();
1815 Handle<HeapType> any_type = HeapType::Any(isolate); 1799 Handle<FieldType> any_type = FieldType::Any(isolate);
1816 Handle<HeapType> value_type = 1800 Handle<FieldType> value_type =
1817 HeapType::Class(Map::Create(isolate, 0), isolate); 1801 FieldType::Class(Map::Create(isolate, 0), isolate);
1818 1802
1819 struct TestConfig { 1803 struct TestConfig {
1820 Handle<Map> Transition(Handle<Map> map) { 1804 Handle<Map> Transition(Handle<Map> map) {
1821 Isolate* isolate = CcTest::i_isolate(); 1805 Isolate* isolate = CcTest::i_isolate();
1822 Handle<HeapType> any_type = HeapType::Any(isolate); 1806 Handle<FieldType> any_type = FieldType::Any(isolate);
1823 1807
1824 // Add one more transition to |map| in order to prevent descriptors 1808 // Add one more transition to |map| in order to prevent descriptors
1825 // ownership. 1809 // ownership.
1826 CHECK(map->owns_descriptors()); 1810 CHECK(map->owns_descriptors());
1827 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, 1811 Map::CopyWithField(map, MakeString("foo"), any_type, NONE,
1828 Representation::Smi(), INSERT_TRANSITION) 1812 Representation::Smi(), INSERT_TRANSITION)
1829 .ToHandleChecked(); 1813 .ToHandleChecked();
1830 CHECK(!map->owns_descriptors()); 1814 CHECK(!map->owns_descriptors());
1831 1815
1832 return Map::CopyForObserved(map); 1816 return Map::CopyForObserved(map);
1833 } 1817 }
1834 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed. 1818 // TODO(ishell): remove once IS_PROTO_TRANS_ISSUE_FIXED is removed.
1835 bool generalizes_representations() const { return false; } 1819 bool generalizes_representations() const { return false; }
1836 bool is_non_equevalent_transition() const { return true; } 1820 bool is_non_equevalent_transition() const { return true; }
1837 }; 1821 };
1838 TestConfig config; 1822 TestConfig config;
1839 TestGeneralizeRepresentationWithSpecialTransition( 1823 TestGeneralizeRepresentationWithSpecialTransition(
1840 config, Representation::Smi(), any_type, Representation::HeapObject(), 1824 config, Representation::Smi(), any_type, Representation::HeapObject(),
1841 value_type, Representation::Tagged(), any_type); 1825 value_type, Representation::Tagged(), any_type);
1842 } 1826 }
1843 1827
1844 1828
1845 TEST(PrototypeTransitionFromMapOwningDescriptor) { 1829 TEST(PrototypeTransitionFromMapOwningDescriptor) {
1846 CcTest::InitializeVM(); 1830 CcTest::InitializeVM();
1847 v8::HandleScope scope(CcTest::isolate()); 1831 v8::HandleScope scope(CcTest::isolate());
1848 Isolate* isolate = CcTest::i_isolate(); 1832 Isolate* isolate = CcTest::i_isolate();
1849 1833
1850 Handle<HeapType> any_type = HeapType::Any(isolate); 1834 Handle<FieldType> any_type = FieldType::Any(isolate);
1851 Handle<HeapType> value_type = 1835 Handle<FieldType> value_type =
1852 HeapType::Class(Map::Create(isolate, 0), isolate); 1836 FieldType::Class(Map::Create(isolate, 0), isolate);
1853 1837
1854 struct TestConfig { 1838 struct TestConfig {
1855 Handle<JSObject> prototype_; 1839 Handle<JSObject> prototype_;
1856 1840
1857 TestConfig() { 1841 TestConfig() {
1858 Isolate* isolate = CcTest::i_isolate(); 1842 Isolate* isolate = CcTest::i_isolate();
1859 Factory* factory = isolate->factory(); 1843 Factory* factory = isolate->factory();
1860 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0)); 1844 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0));
1861 } 1845 }
1862 1846
(...skipping 11 matching lines...) Expand all
1874 config, Representation::Smi(), any_type, Representation::HeapObject(), 1858 config, Representation::Smi(), any_type, Representation::HeapObject(),
1875 value_type, Representation::Tagged(), any_type); 1859 value_type, Representation::Tagged(), any_type);
1876 } 1860 }
1877 1861
1878 1862
1879 TEST(PrototypeTransitionFromMapNotOwningDescriptor) { 1863 TEST(PrototypeTransitionFromMapNotOwningDescriptor) {
1880 CcTest::InitializeVM(); 1864 CcTest::InitializeVM();
1881 v8::HandleScope scope(CcTest::isolate()); 1865 v8::HandleScope scope(CcTest::isolate());
1882 Isolate* isolate = CcTest::i_isolate(); 1866 Isolate* isolate = CcTest::i_isolate();
1883 1867
1884 Handle<HeapType> any_type = HeapType::Any(isolate); 1868 Handle<FieldType> any_type = FieldType::Any(isolate);
1885 Handle<HeapType> value_type = 1869 Handle<FieldType> value_type =
1886 HeapType::Class(Map::Create(isolate, 0), isolate); 1870 FieldType::Class(Map::Create(isolate, 0), isolate);
1887 1871
1888 struct TestConfig { 1872 struct TestConfig {
1889 Handle<JSObject> prototype_; 1873 Handle<JSObject> prototype_;
1890 1874
1891 TestConfig() { 1875 TestConfig() {
1892 Isolate* isolate = CcTest::i_isolate(); 1876 Isolate* isolate = CcTest::i_isolate();
1893 Factory* factory = isolate->factory(); 1877 Factory* factory = isolate->factory();
1894 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0)); 1878 prototype_ = factory->NewJSObjectFromMap(Map::Create(isolate, 0));
1895 } 1879 }
1896 1880
1897 Handle<Map> Transition(Handle<Map> map) { 1881 Handle<Map> Transition(Handle<Map> map) {
1898 Isolate* isolate = CcTest::i_isolate(); 1882 Isolate* isolate = CcTest::i_isolate();
1899 Handle<HeapType> any_type = HeapType::Any(isolate); 1883 Handle<FieldType> any_type = FieldType::Any(isolate);
1900 1884
1901 // Add one more transition to |map| in order to prevent descriptors 1885 // Add one more transition to |map| in order to prevent descriptors
1902 // ownership. 1886 // ownership.
1903 CHECK(map->owns_descriptors()); 1887 CHECK(map->owns_descriptors());
1904 Map::CopyWithField(map, MakeString("foo"), any_type, NONE, 1888 Map::CopyWithField(map, MakeString("foo"), any_type, NONE,
1905 Representation::Smi(), INSERT_TRANSITION) 1889 Representation::Smi(), INSERT_TRANSITION)
1906 .ToHandleChecked(); 1890 .ToHandleChecked();
1907 CHECK(!map->owns_descriptors()); 1891 CHECK(!map->owns_descriptors());
1908 1892
1909 return Map::TransitionToPrototype(map, prototype_, REGULAR_PROTOTYPE); 1893 return Map::TransitionToPrototype(map, prototype_, REGULAR_PROTOTYPE);
(...skipping 11 matching lines...) Expand all
1921 } 1905 }
1922 1906
1923 1907
1924 //////////////////////////////////////////////////////////////////////////////// 1908 ////////////////////////////////////////////////////////////////////////////////
1925 // A set of tests for higher level transitioning mechanics. 1909 // A set of tests for higher level transitioning mechanics.
1926 // 1910 //
1927 1911
1928 struct TransitionToDataFieldOperator { 1912 struct TransitionToDataFieldOperator {
1929 Representation representation_; 1913 Representation representation_;
1930 PropertyAttributes attributes_; 1914 PropertyAttributes attributes_;
1931 Handle<HeapType> heap_type_; 1915 Handle<FieldType> heap_type_;
1932 Handle<Object> value_; 1916 Handle<Object> value_;
1933 1917
1934 TransitionToDataFieldOperator(Representation representation, 1918 TransitionToDataFieldOperator(Representation representation,
1935 Handle<HeapType> heap_type, 1919 Handle<FieldType> heap_type,
1936 Handle<Object> value, 1920 Handle<Object> value,
1937 PropertyAttributes attributes = NONE) 1921 PropertyAttributes attributes = NONE)
1938 : representation_(representation), 1922 : representation_(representation),
1939 attributes_(attributes), 1923 attributes_(attributes),
1940 heap_type_(heap_type), 1924 heap_type_(heap_type),
1941 value_(value) {} 1925 value_(value) {}
1942 1926
1943 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) { 1927 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) {
1944 return expectations.TransitionToDataField(map, attributes_, representation_, 1928 return expectations.TransitionToDataField(map, attributes_, representation_,
1945 heap_type_, value_); 1929 heap_type_, value_);
(...skipping 26 matching lines...) Expand all
1972 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) { 1956 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) {
1973 return expectations.TransitionToAccessorConstant(map, attributes_, pair_); 1957 return expectations.TransitionToAccessorConstant(map, attributes_, pair_);
1974 } 1958 }
1975 }; 1959 };
1976 1960
1977 1961
1978 struct ReconfigureAsDataPropertyOperator { 1962 struct ReconfigureAsDataPropertyOperator {
1979 int descriptor_; 1963 int descriptor_;
1980 Representation representation_; 1964 Representation representation_;
1981 PropertyAttributes attributes_; 1965 PropertyAttributes attributes_;
1982 Handle<HeapType> heap_type_; 1966 Handle<FieldType> heap_type_;
1983 1967
1984 ReconfigureAsDataPropertyOperator(int descriptor, 1968 ReconfigureAsDataPropertyOperator(int descriptor,
1985 Representation representation, 1969 Representation representation,
1986 Handle<HeapType> heap_type, 1970 Handle<FieldType> heap_type,
1987 PropertyAttributes attributes = NONE) 1971 PropertyAttributes attributes = NONE)
1988 : descriptor_(descriptor), 1972 : descriptor_(descriptor),
1989 representation_(representation), 1973 representation_(representation),
1990 attributes_(attributes), 1974 attributes_(attributes),
1991 heap_type_(heap_type) {} 1975 heap_type_(heap_type) {}
1992 1976
1993 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) { 1977 Handle<Map> DoTransition(Expectations& expectations, Handle<Map> map) {
1994 expectations.SetDataField(descriptor_, representation_, heap_type_); 1978 expectations.SetDataField(descriptor_, representation_, heap_type_);
1995 return Map::ReconfigureExistingProperty(map, descriptor_, kData, 1979 return Map::ReconfigureExistingProperty(map, descriptor_, kData,
1996 attributes_); 1980 attributes_);
(...skipping 15 matching lines...) Expand all
2012 attributes_); 1996 attributes_);
2013 } 1997 }
2014 }; 1998 };
2015 1999
2016 2000
2017 // Checks that representation/field type generalization happened. 2001 // Checks that representation/field type generalization happened.
2018 struct FieldGeneralizationChecker { 2002 struct FieldGeneralizationChecker {
2019 int descriptor_; 2003 int descriptor_;
2020 Representation representation_; 2004 Representation representation_;
2021 PropertyAttributes attributes_; 2005 PropertyAttributes attributes_;
2022 Handle<HeapType> heap_type_; 2006 Handle<FieldType> heap_type_;
2023 2007
2024 FieldGeneralizationChecker(int descriptor, Representation representation, 2008 FieldGeneralizationChecker(int descriptor, Representation representation,
2025 Handle<HeapType> heap_type, 2009 Handle<FieldType> heap_type,
2026 PropertyAttributes attributes = NONE) 2010 PropertyAttributes attributes = NONE)
2027 : descriptor_(descriptor), 2011 : descriptor_(descriptor),
2028 representation_(representation), 2012 representation_(representation),
2029 attributes_(attributes), 2013 attributes_(attributes),
2030 heap_type_(heap_type) {} 2014 heap_type_(heap_type) {}
2031 2015
2032 void Check(Expectations& expectations2, Handle<Map> map1, Handle<Map> map2) { 2016 void Check(Expectations& expectations2, Handle<Map> map1, Handle<Map> map2) {
2033 CHECK(!map2->is_deprecated()); 2017 CHECK(!map2->is_deprecated());
2034 2018
2035 CHECK(map1->is_deprecated()); 2019 CHECK(map1->is_deprecated());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 // {} - p0 - p1 - pA - p3: |map| 2062 // {} - p0 - p1 - pA - p3: |map|
2079 // | 2063 // |
2080 // + - p4A: |map1| 2064 // + - p4A: |map1|
2081 // 2065 //
2082 // where "p4A" and "p4B" differ only in the attributes. 2066 // where "p4A" and "p4B" differ only in the attributes.
2083 // 2067 //
2084 template <typename TransitionOp1, typename TransitionOp2, typename Checker> 2068 template <typename TransitionOp1, typename TransitionOp2, typename Checker>
2085 static void TestTransitionTo(TransitionOp1& transition_op1, 2069 static void TestTransitionTo(TransitionOp1& transition_op1,
2086 TransitionOp2& transition_op2, Checker& checker) { 2070 TransitionOp2& transition_op2, Checker& checker) {
2087 Isolate* isolate = CcTest::i_isolate(); 2071 Isolate* isolate = CcTest::i_isolate();
2088 Handle<HeapType> any_type = HeapType::Any(isolate); 2072 Handle<FieldType> any_type = FieldType::Any(isolate);
2089 2073
2090 Expectations expectations(isolate); 2074 Expectations expectations(isolate);
2091 2075
2092 // Create a map, add required properties to it and initialize expectations. 2076 // Create a map, add required properties to it and initialize expectations.
2093 Handle<Map> initial_map = Map::Create(isolate, 0); 2077 Handle<Map> initial_map = Map::Create(isolate, 0);
2094 Handle<Map> map = initial_map; 2078 Handle<Map> map = initial_map;
2095 for (int i = 0; i < kPropCount - 1; i++) { 2079 for (int i = 0; i < kPropCount - 1; i++) {
2096 map = expectations.AddDataField(map, NONE, Representation::Smi(), any_type); 2080 map = expectations.AddDataField(map, NONE, Representation::Smi(), any_type);
2097 } 2081 }
2098 CHECK(expectations.Check(*map)); 2082 CHECK(expectations.Check(*map));
2099 2083
2100 Expectations expectations1 = expectations; 2084 Expectations expectations1 = expectations;
2101 Handle<Map> map1 = transition_op1.DoTransition(expectations1, map); 2085 Handle<Map> map1 = transition_op1.DoTransition(expectations1, map);
2102 CHECK(expectations1.Check(*map1)); 2086 CHECK(expectations1.Check(*map1));
2103 2087
2104 Expectations expectations2 = expectations; 2088 Expectations expectations2 = expectations;
2105 Handle<Map> map2 = transition_op2.DoTransition(expectations2, map); 2089 Handle<Map> map2 = transition_op2.DoTransition(expectations2, map);
2106 2090
2107 // Let the test customization do the check. 2091 // Let the test customization do the check.
2108 checker.Check(expectations2, map1, map2); 2092 checker.Check(expectations2, map1, map2);
2109 } 2093 }
2110 2094
2111 2095
2112 TEST(TransitionDataFieldToDataField) { 2096 TEST(TransitionDataFieldToDataField) {
2113 CcTest::InitializeVM(); 2097 CcTest::InitializeVM();
2114 v8::HandleScope scope(CcTest::isolate()); 2098 v8::HandleScope scope(CcTest::isolate());
2115 Isolate* isolate = CcTest::i_isolate(); 2099 Isolate* isolate = CcTest::i_isolate();
2116 Handle<HeapType> any_type = HeapType::Any(isolate); 2100 Handle<FieldType> any_type = FieldType::Any(isolate);
2117 2101
2118 Handle<Object> value1 = handle(Smi::FromInt(0), isolate); 2102 Handle<Object> value1 = handle(Smi::FromInt(0), isolate);
2119 TransitionToDataFieldOperator transition_op1(Representation::Smi(), any_type, 2103 TransitionToDataFieldOperator transition_op1(Representation::Smi(), any_type,
2120 value1); 2104 value1);
2121 2105
2122 Handle<Object> value2 = isolate->factory()->NewHeapNumber(0); 2106 Handle<Object> value2 = isolate->factory()->NewHeapNumber(0);
2123 TransitionToDataFieldOperator transition_op2(Representation::Double(), 2107 TransitionToDataFieldOperator transition_op2(Representation::Double(),
2124 any_type, value2); 2108 any_type, value2);
2125 2109
2126 FieldGeneralizationChecker checker(kPropCount - 1, Representation::Double(), 2110 FieldGeneralizationChecker checker(kPropCount - 1, Representation::Double(),
(...skipping 14 matching lines...) Expand all
2141 SameMapChecker checker; 2125 SameMapChecker checker;
2142 TestTransitionTo(transition_op, transition_op, checker); 2126 TestTransitionTo(transition_op, transition_op, checker);
2143 } 2127 }
2144 2128
2145 2129
2146 TEST(TransitionDataConstantToAnotherDataConstant) { 2130 TEST(TransitionDataConstantToAnotherDataConstant) {
2147 CcTest::InitializeVM(); 2131 CcTest::InitializeVM();
2148 v8::HandleScope scope(CcTest::isolate()); 2132 v8::HandleScope scope(CcTest::isolate());
2149 Isolate* isolate = CcTest::i_isolate(); 2133 Isolate* isolate = CcTest::i_isolate();
2150 Factory* factory = isolate->factory(); 2134 Factory* factory = isolate->factory();
2151 Handle<HeapType> function_type = 2135 Handle<FieldType> function_type =
2152 HeapType::Class(isolate->sloppy_function_map(), isolate); 2136 FieldType::Class(isolate->sloppy_function_map(), isolate);
2153 2137
2154 Handle<JSFunction> js_func1 = factory->NewFunction(factory->empty_string()); 2138 Handle<JSFunction> js_func1 = factory->NewFunction(factory->empty_string());
2155 TransitionToDataConstantOperator transition_op1(js_func1); 2139 TransitionToDataConstantOperator transition_op1(js_func1);
2156 2140
2157 Handle<JSFunction> js_func2 = factory->NewFunction(factory->empty_string()); 2141 Handle<JSFunction> js_func2 = factory->NewFunction(factory->empty_string());
2158 TransitionToDataConstantOperator transition_op2(js_func2); 2142 TransitionToDataConstantOperator transition_op2(js_func2);
2159 2143
2160 FieldGeneralizationChecker checker( 2144 FieldGeneralizationChecker checker(
2161 kPropCount - 1, Representation::HeapObject(), function_type); 2145 kPropCount - 1, Representation::HeapObject(), function_type);
2162 TestTransitionTo(transition_op1, transition_op2, checker); 2146 TestTransitionTo(transition_op1, transition_op2, checker);
2163 } 2147 }
2164 2148
2165 2149
2166 TEST(TransitionDataConstantToDataField) { 2150 TEST(TransitionDataConstantToDataField) {
2167 CcTest::InitializeVM(); 2151 CcTest::InitializeVM();
2168 v8::HandleScope scope(CcTest::isolate()); 2152 v8::HandleScope scope(CcTest::isolate());
2169 Isolate* isolate = CcTest::i_isolate(); 2153 Isolate* isolate = CcTest::i_isolate();
2170 Factory* factory = isolate->factory(); 2154 Factory* factory = isolate->factory();
2171 Handle<HeapType> any_type = HeapType::Any(isolate); 2155 Handle<FieldType> any_type = FieldType::Any(isolate);
2172 2156
2173 Handle<JSFunction> js_func1 = factory->NewFunction(factory->empty_string()); 2157 Handle<JSFunction> js_func1 = factory->NewFunction(factory->empty_string());
2174 TransitionToDataConstantOperator transition_op1(js_func1); 2158 TransitionToDataConstantOperator transition_op1(js_func1);
2175 2159
2176 Handle<Object> value2 = isolate->factory()->NewHeapNumber(0); 2160 Handle<Object> value2 = isolate->factory()->NewHeapNumber(0);
2177 TransitionToDataFieldOperator transition_op2(Representation::Double(), 2161 TransitionToDataFieldOperator transition_op2(Representation::Double(),
2178 any_type, value2); 2162 any_type, value2);
2179 2163
2180 FieldGeneralizationChecker checker(kPropCount - 1, Representation::Tagged(), 2164 FieldGeneralizationChecker checker(kPropCount - 1, Representation::Tagged(),
2181 any_type); 2165 any_type);
2182 TestTransitionTo(transition_op1, transition_op2, checker); 2166 TestTransitionTo(transition_op1, transition_op2, checker);
2183 } 2167 }
2184 2168
2185 2169
2186 TEST(TransitionAccessorConstantToSameAccessorConstant) { 2170 TEST(TransitionAccessorConstantToSameAccessorConstant) {
2187 CcTest::InitializeVM(); 2171 CcTest::InitializeVM();
2188 v8::HandleScope scope(CcTest::isolate()); 2172 v8::HandleScope scope(CcTest::isolate());
2189 2173
2190 Handle<AccessorPair> pair = CreateAccessorPair(true, true); 2174 Handle<AccessorPair> pair = CreateAccessorPair(true, true);
2191 TransitionToAccessorConstantOperator transition_op(pair); 2175 TransitionToAccessorConstantOperator transition_op(pair);
2192 2176
2193 SameMapChecker checker; 2177 SameMapChecker checker;
2194 TestTransitionTo(transition_op, transition_op, checker); 2178 TestTransitionTo(transition_op, transition_op, checker);
2195 } 2179 }
2196 2180
2197 2181
2198 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported. 2182 // TODO(ishell): add this test once IS_ACCESSOR_FIELD_SUPPORTED is supported.
2199 // TEST(TransitionAccessorConstantToAnotherAccessorConstant) 2183 // TEST(TransitionAccessorConstantToAnotherAccessorConstant)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698