| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 #include <utility> | 6 #include <utility> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 static double GetDoubleFieldValue(JSObject* obj, FieldIndex field_index) { | 63 static double GetDoubleFieldValue(JSObject* obj, FieldIndex field_index) { |
| 64 if (obj->IsUnboxedDoubleField(field_index)) { | 64 if (obj->IsUnboxedDoubleField(field_index)) { |
| 65 return obj->RawFastDoublePropertyAt(field_index); | 65 return obj->RawFastDoublePropertyAt(field_index); |
| 66 } else { | 66 } else { |
| 67 Object* value = obj->RawFastPropertyAt(field_index); | 67 Object* value = obj->RawFastPropertyAt(field_index); |
| 68 CHECK(value->IsMutableHeapNumber()); | 68 CHECK(value->IsMutableHeapNumber()); |
| 69 return HeapNumber::cast(value)->value(); | 69 return HeapNumber::cast(value)->value(); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 void WriteToField(JSObject* object, int descriptor, Object* value) { |
| 74 DescriptorArray* descriptors = object->map()->instance_descriptors(); |
| 75 PropertyDetails details = descriptors->GetDetails(descriptor); |
| 76 object->WriteToField(descriptor, details, value); |
| 77 } |
| 78 |
| 73 const int kNumberOfBits = 32; | 79 const int kNumberOfBits = 32; |
| 74 | 80 |
| 75 | 81 |
| 76 enum TestPropertyKind { | 82 enum TestPropertyKind { |
| 77 PROP_CONSTANT, | 83 PROP_CONSTANT, |
| 78 PROP_SMI, | 84 PROP_SMI, |
| 79 PROP_DOUBLE, | 85 PROP_DOUBLE, |
| 80 PROP_TAGGED, | 86 PROP_TAGGED, |
| 81 PROP_KIND_NUMBER | 87 PROP_KIND_NUMBER |
| 82 }; | 88 }; |
| (...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 Handle<FieldType> any_type = FieldType::Any(isolate); | 1046 Handle<FieldType> any_type = FieldType::Any(isolate); |
| 1041 Handle<Map> map = Map::Create(isolate, 10); | 1047 Handle<Map> map = Map::Create(isolate, 10); |
| 1042 map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, | 1048 map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, |
| 1043 Representation::Double(), | 1049 Representation::Double(), |
| 1044 INSERT_TRANSITION).ToHandleChecked(); | 1050 INSERT_TRANSITION).ToHandleChecked(); |
| 1045 | 1051 |
| 1046 // Create object in new space. | 1052 // Create object in new space. |
| 1047 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED); | 1053 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED); |
| 1048 | 1054 |
| 1049 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); | 1055 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); |
| 1050 obj->WriteToField(0, *heap_number); | 1056 WriteToField(*obj, 0, *heap_number); |
| 1051 | 1057 |
| 1052 { | 1058 { |
| 1053 // Ensure the object is properly set up. | 1059 // Ensure the object is properly set up. |
| 1054 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 0); | 1060 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 0); |
| 1055 CHECK(field_index.is_inobject() && field_index.is_double()); | 1061 CHECK(field_index.is_inobject() && field_index.is_double()); |
| 1056 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); | 1062 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); |
| 1057 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); | 1063 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); |
| 1058 } | 1064 } |
| 1059 CHECK(isolate->heap()->new_space()->Contains(*obj)); | 1065 CHECK(isolate->heap()->new_space()->Contains(*obj)); |
| 1060 | 1066 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1116 // Make sure |obj_value| is placed on an old-space evacuation candidate. | 1122 // Make sure |obj_value| is placed on an old-space evacuation candidate. |
| 1117 heap::SimulateFullSpace(old_space); | 1123 heap::SimulateFullSpace(old_space); |
| 1118 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); | 1124 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); |
| 1119 ec_page = Page::FromAddress(obj_value->address()); | 1125 ec_page = Page::FromAddress(obj_value->address()); |
| 1120 } | 1126 } |
| 1121 | 1127 |
| 1122 // Create object in new space. | 1128 // Create object in new space. |
| 1123 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED); | 1129 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED); |
| 1124 | 1130 |
| 1125 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); | 1131 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); |
| 1126 obj->WriteToField(0, *heap_number); | 1132 WriteToField(*obj, 0, *heap_number); |
| 1127 obj->WriteToField(1, *obj_value); | 1133 WriteToField(*obj, 1, *obj_value); |
| 1128 | 1134 |
| 1129 { | 1135 { |
| 1130 // Ensure the object is properly set up. | 1136 // Ensure the object is properly set up. |
| 1131 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 0); | 1137 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 0); |
| 1132 CHECK(field_index.is_inobject() && field_index.is_double()); | 1138 CHECK(field_index.is_inobject() && field_index.is_double()); |
| 1133 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); | 1139 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); |
| 1134 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); | 1140 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); |
| 1135 | 1141 |
| 1136 field_index = FieldIndex::ForDescriptor(*map, 1); | 1142 field_index = FieldIndex::ForDescriptor(*map, 1); |
| 1137 CHECK(field_index.is_inobject() && !field_index.is_double()); | 1143 CHECK(field_index.is_inobject() && !field_index.is_double()); |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 | 1562 |
| 1557 // TODO(ishell): add respective tests for property kind reconfiguring from | 1563 // TODO(ishell): add respective tests for property kind reconfiguring from |
| 1558 // accessor field to double, once accessor fields are supported by | 1564 // accessor field to double, once accessor fields are supported by |
| 1559 // Map::ReconfigureProperty(). | 1565 // Map::ReconfigureProperty(). |
| 1560 | 1566 |
| 1561 | 1567 |
| 1562 // TODO(ishell): add respective tests for fast property removal case once | 1568 // TODO(ishell): add respective tests for fast property removal case once |
| 1563 // Map::ReconfigureProperty() supports that. | 1569 // Map::ReconfigureProperty() supports that. |
| 1564 | 1570 |
| 1565 #endif | 1571 #endif |
| OLD | NEW |