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 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 double boom_value = bit_cast<double>(fake_object); | 1044 double boom_value = bit_cast<double>(fake_object); |
1045 | 1045 |
1046 FieldIndex field_index = FieldIndex::ForDescriptor(obj->map(), 0); | 1046 FieldIndex field_index = FieldIndex::ForDescriptor(obj->map(), 0); |
1047 Handle<HeapNumber> boom_number = factory->NewHeapNumber(boom_value, MUTABLE); | 1047 Handle<HeapNumber> boom_number = factory->NewHeapNumber(boom_value, MUTABLE); |
1048 obj->FastPropertyAtPut(field_index, *boom_number); | 1048 obj->FastPropertyAtPut(field_index, *boom_number); |
1049 | 1049 |
1050 // Now |obj| moves to old gen and it has a double field that looks like | 1050 // Now |obj| moves to old gen and it has a double field that looks like |
1051 // a pointer to a from semi-space. | 1051 // a pointer to a from semi-space. |
1052 CcTest::heap()->CollectGarbage(i::NEW_SPACE, "boom"); | 1052 CcTest::heap()->CollectGarbage(i::NEW_SPACE, "boom"); |
1053 | 1053 |
1054 CHECK(isolate->heap()->old_pointer_space()->Contains(*obj)); | 1054 CHECK(isolate->heap()->old_space()->Contains(*obj)); |
1055 | 1055 |
1056 CHECK_EQ(boom_value, GetDoubleFieldValue(*obj, field_index)); | 1056 CHECK_EQ(boom_value, GetDoubleFieldValue(*obj, field_index)); |
1057 } | 1057 } |
1058 | 1058 |
1059 | 1059 |
1060 TEST(DoScavengeWithIncrementalWriteBarrier) { | 1060 TEST(DoScavengeWithIncrementalWriteBarrier) { |
1061 if (FLAG_never_compact || !FLAG_incremental_marking) return; | 1061 if (FLAG_never_compact || !FLAG_incremental_marking) return; |
1062 CcTest::InitializeVM(); | 1062 CcTest::InitializeVM(); |
1063 v8::HandleScope scope(CcTest::isolate()); | 1063 v8::HandleScope scope(CcTest::isolate()); |
1064 Isolate* isolate = CcTest::i_isolate(); | 1064 Isolate* isolate = CcTest::i_isolate(); |
1065 Factory* factory = isolate->factory(); | 1065 Factory* factory = isolate->factory(); |
1066 Heap* heap = CcTest::heap(); | 1066 Heap* heap = CcTest::heap(); |
1067 PagedSpace* old_pointer_space = heap->old_pointer_space(); | 1067 PagedSpace* old_space = heap->old_space(); |
1068 | 1068 |
1069 // The plan: create |obj_value| in old space and ensure that it is allocated | 1069 // The plan: create |obj_value| in old space and ensure that it is allocated |
1070 // on evacuation candidate page, create |obj| with double and tagged fields | 1070 // on evacuation candidate page, create |obj| with double and tagged fields |
1071 // in new space and write |obj_value| to tagged field of |obj|, do two | 1071 // in new space and write |obj_value| to tagged field of |obj|, do two |
1072 // scavenges to promote |obj| to old space, a GC in old space and ensure that | 1072 // scavenges to promote |obj| to old space, a GC in old space and ensure that |
1073 // the tagged value was properly updated after candidates evacuation. | 1073 // the tagged value was properly updated after candidates evacuation. |
1074 | 1074 |
1075 Handle<HeapType> any_type = HeapType::Any(isolate); | 1075 Handle<HeapType> any_type = HeapType::Any(isolate); |
1076 Handle<Map> map = Map::Create(isolate, 10); | 1076 Handle<Map> map = Map::Create(isolate, 10); |
1077 map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, | 1077 map = Map::CopyWithField(map, MakeName("prop", 0), any_type, NONE, |
1078 Representation::Double(), | 1078 Representation::Double(), |
1079 INSERT_TRANSITION).ToHandleChecked(); | 1079 INSERT_TRANSITION).ToHandleChecked(); |
1080 map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE, | 1080 map = Map::CopyWithField(map, MakeName("prop", 1), any_type, NONE, |
1081 Representation::Tagged(), | 1081 Representation::Tagged(), |
1082 INSERT_TRANSITION).ToHandleChecked(); | 1082 INSERT_TRANSITION).ToHandleChecked(); |
1083 | 1083 |
1084 // Create |obj_value| in old space. | 1084 // Create |obj_value| in old space. |
1085 Handle<HeapObject> obj_value; | 1085 Handle<HeapObject> obj_value; |
1086 Page* ec_page; | 1086 Page* ec_page; |
1087 { | 1087 { |
1088 AlwaysAllocateScope always_allocate(isolate); | 1088 AlwaysAllocateScope always_allocate(isolate); |
1089 // Make sure |obj_value| is placed on an old-space evacuation candidate. | 1089 // Make sure |obj_value| is placed on an old-space evacuation candidate. |
1090 SimulateFullSpace(old_pointer_space); | 1090 SimulateFullSpace(old_space); |
1091 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); | 1091 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); |
1092 ec_page = Page::FromAddress(obj_value->address()); | 1092 ec_page = Page::FromAddress(obj_value->address()); |
1093 } | 1093 } |
1094 | 1094 |
1095 // Create object in new space. | 1095 // Create object in new space. |
1096 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED, false); | 1096 Handle<JSObject> obj = factory->NewJSObjectFromMap(map, NOT_TENURED, false); |
1097 | 1097 |
1098 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); | 1098 Handle<HeapNumber> heap_number = factory->NewHeapNumber(42.5); |
1099 obj->WriteToField(0, *heap_number); | 1099 obj->WriteToField(0, *heap_number); |
1100 obj->WriteToField(1, *obj_value); | 1100 obj->WriteToField(1, *obj_value); |
(...skipping 25 matching lines...) Expand all Loading... |
1126 // in compacting mode and |obj_value|'s page is an evacuation candidate). | 1126 // in compacting mode and |obj_value|'s page is an evacuation candidate). |
1127 IncrementalMarking* marking = heap->incremental_marking(); | 1127 IncrementalMarking* marking = heap->incremental_marking(); |
1128 CHECK(marking->IsCompacting()); | 1128 CHECK(marking->IsCompacting()); |
1129 CHECK(Marking::IsBlack(Marking::MarkBitFrom(*obj))); | 1129 CHECK(Marking::IsBlack(Marking::MarkBitFrom(*obj))); |
1130 CHECK(MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); | 1130 CHECK(MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); |
1131 | 1131 |
1132 // Trigger GCs so that |obj| moves to old gen. | 1132 // Trigger GCs so that |obj| moves to old gen. |
1133 heap->CollectGarbage(i::NEW_SPACE); // in survivor space now | 1133 heap->CollectGarbage(i::NEW_SPACE); // in survivor space now |
1134 heap->CollectGarbage(i::NEW_SPACE); // in old gen now | 1134 heap->CollectGarbage(i::NEW_SPACE); // in old gen now |
1135 | 1135 |
1136 CHECK(isolate->heap()->old_pointer_space()->Contains(*obj)); | 1136 CHECK(isolate->heap()->old_space()->Contains(*obj)); |
1137 CHECK(isolate->heap()->old_pointer_space()->Contains(*obj_value)); | 1137 CHECK(isolate->heap()->old_space()->Contains(*obj_value)); |
1138 CHECK(MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); | 1138 CHECK(MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); |
1139 | 1139 |
1140 heap->CollectGarbage(i::OLD_POINTER_SPACE, "boom"); | 1140 heap->CollectGarbage(i::OLD_SPACE, "boom"); |
1141 | 1141 |
1142 // |obj_value| must be evacuated. | 1142 // |obj_value| must be evacuated. |
1143 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); | 1143 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); |
1144 | 1144 |
1145 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 1); | 1145 FieldIndex field_index = FieldIndex::ForDescriptor(*map, 1); |
1146 CHECK_EQ(*obj_value, obj->RawFastPropertyAt(field_index)); | 1146 CHECK_EQ(*obj_value, obj->RawFastPropertyAt(field_index)); |
1147 } | 1147 } |
1148 | 1148 |
1149 | 1149 |
1150 static void TestLayoutDescriptorHelper(Isolate* isolate, | 1150 static void TestLayoutDescriptorHelper(Isolate* isolate, |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1363 CHECK(field_index.is_inobject() && field_index.is_double()); | 1363 CHECK(field_index.is_inobject() && field_index.is_double()); |
1364 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); | 1364 CHECK_EQ(FLAG_unbox_double_fields, map->IsUnboxedDoubleField(field_index)); |
1365 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); | 1365 CHECK_EQ(42.5, GetDoubleFieldValue(*obj, field_index)); |
1366 } | 1366 } |
1367 CHECK(isolate->heap()->new_space()->Contains(*obj)); | 1367 CHECK(isolate->heap()->new_space()->Contains(*obj)); |
1368 | 1368 |
1369 // Trigger GCs so that the newly allocated object moves to old gen. | 1369 // Trigger GCs so that the newly allocated object moves to old gen. |
1370 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 1370 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
1371 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 1371 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
1372 | 1372 |
1373 CHECK(isolate->heap()->old_pointer_space()->Contains(*obj)); | 1373 CHECK(isolate->heap()->old_space()->Contains(*obj)); |
1374 | 1374 |
1375 // Create temp object in the new space. | 1375 // Create temp object in the new space. |
1376 Handle<JSArray> temp = factory->NewJSArray(FAST_ELEMENTS, NOT_TENURED); | 1376 Handle<JSArray> temp = factory->NewJSArray(FAST_ELEMENTS, NOT_TENURED); |
1377 CHECK(isolate->heap()->new_space()->Contains(*temp)); | 1377 CHECK(isolate->heap()->new_space()->Contains(*temp)); |
1378 | 1378 |
1379 // Construct a double value that looks like a pointer to the new space object | 1379 // Construct a double value that looks like a pointer to the new space object |
1380 // and store it into the obj. | 1380 // and store it into the obj. |
1381 Address fake_object = reinterpret_cast<Address>(*temp) + kPointerSize; | 1381 Address fake_object = reinterpret_cast<Address>(*temp) + kPointerSize; |
1382 double boom_value = bit_cast<double>(fake_object); | 1382 double boom_value = bit_cast<double>(fake_object); |
1383 | 1383 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 FieldIndex index = FieldIndex::ForDescriptor(*my_map, 0); | 1465 FieldIndex index = FieldIndex::ForDescriptor(*my_map, 0); |
1466 jsobject->RawFastDoublePropertyAtPut(index, boom_value); | 1466 jsobject->RawFastDoublePropertyAtPut(index, boom_value); |
1467 | 1467 |
1468 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr)); | 1468 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr)); |
1469 | 1469 |
1470 // Step 4: clone jsobject, but force always allocate first to create a clone | 1470 // Step 4: clone jsobject, but force always allocate first to create a clone |
1471 // in old pointer space. | 1471 // in old pointer space. |
1472 AlwaysAllocateScope aa_scope(isolate); | 1472 AlwaysAllocateScope aa_scope(isolate); |
1473 Object* clone_obj = heap->CopyJSObject(jsobject).ToObjectChecked(); | 1473 Object* clone_obj = heap->CopyJSObject(jsobject).ToObjectChecked(); |
1474 Handle<JSObject> clone(JSObject::cast(clone_obj)); | 1474 Handle<JSObject> clone(JSObject::cast(clone_obj)); |
1475 CHECK(heap->old_pointer_space()->Contains(clone->address())); | 1475 CHECK(heap->old_space()->Contains(clone->address())); |
1476 | 1476 |
1477 CcTest::heap()->CollectGarbage(NEW_SPACE, "boom"); | 1477 CcTest::heap()->CollectGarbage(NEW_SPACE, "boom"); |
1478 | 1478 |
1479 // The value in cloned object should not be corrupted by GC. | 1479 // The value in cloned object should not be corrupted by GC. |
1480 CHECK_EQ(boom_value, clone->RawFastDoublePropertyAt(index)); | 1480 CHECK_EQ(boom_value, clone->RawFastDoublePropertyAt(index)); |
1481 } | 1481 } |
1482 | 1482 |
1483 | 1483 |
1484 static void TestWriteBarrier(Handle<Map> map, Handle<Map> new_map, | 1484 static void TestWriteBarrier(Handle<Map> map, Handle<Map> new_map, |
1485 int tagged_descriptor, int double_descriptor, | 1485 int tagged_descriptor, int double_descriptor, |
1486 bool check_tagged_value = true) { | 1486 bool check_tagged_value = true) { |
1487 FLAG_stress_compaction = true; | 1487 FLAG_stress_compaction = true; |
1488 FLAG_manual_evacuation_candidates_selection = true; | 1488 FLAG_manual_evacuation_candidates_selection = true; |
1489 Isolate* isolate = CcTest::i_isolate(); | 1489 Isolate* isolate = CcTest::i_isolate(); |
1490 Factory* factory = isolate->factory(); | 1490 Factory* factory = isolate->factory(); |
1491 Heap* heap = CcTest::heap(); | 1491 Heap* heap = CcTest::heap(); |
1492 PagedSpace* old_pointer_space = heap->old_pointer_space(); | 1492 PagedSpace* old_space = heap->old_space(); |
1493 | 1493 |
1494 // The plan: create |obj| by |map| in old space, create |obj_value| in | 1494 // The plan: create |obj| by |map| in old space, create |obj_value| in |
1495 // new space and ensure that write barrier is triggered when |obj_value| is | 1495 // new space and ensure that write barrier is triggered when |obj_value| is |
1496 // written to property |tagged_descriptor| of |obj|. | 1496 // written to property |tagged_descriptor| of |obj|. |
1497 // Then migrate object to |new_map| and set proper value for property | 1497 // Then migrate object to |new_map| and set proper value for property |
1498 // |double_descriptor|. Call GC and ensure that it did not crash during | 1498 // |double_descriptor|. Call GC and ensure that it did not crash during |
1499 // store buffer entries updating. | 1499 // store buffer entries updating. |
1500 | 1500 |
1501 Handle<JSObject> obj; | 1501 Handle<JSObject> obj; |
1502 Handle<HeapObject> obj_value; | 1502 Handle<HeapObject> obj_value; |
1503 { | 1503 { |
1504 AlwaysAllocateScope always_allocate(isolate); | 1504 AlwaysAllocateScope always_allocate(isolate); |
1505 obj = factory->NewJSObjectFromMap(map, TENURED, false); | 1505 obj = factory->NewJSObjectFromMap(map, TENURED, false); |
1506 CHECK(old_pointer_space->Contains(*obj)); | 1506 CHECK(old_space->Contains(*obj)); |
1507 | 1507 |
1508 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS); | 1508 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS); |
1509 } | 1509 } |
1510 | 1510 |
1511 CHECK(heap->InNewSpace(*obj_value)); | 1511 CHECK(heap->InNewSpace(*obj_value)); |
1512 | 1512 |
1513 { | 1513 { |
1514 FieldIndex index = FieldIndex::ForDescriptor(*map, tagged_descriptor); | 1514 FieldIndex index = FieldIndex::ForDescriptor(*map, tagged_descriptor); |
1515 const int n = 153; | 1515 const int n = 153; |
1516 for (int i = 0; i < n; i++) { | 1516 for (int i = 0; i < n; i++) { |
(...skipping 28 matching lines...) Expand all Loading... |
1545 static void TestIncrementalWriteBarrier(Handle<Map> map, Handle<Map> new_map, | 1545 static void TestIncrementalWriteBarrier(Handle<Map> map, Handle<Map> new_map, |
1546 int tagged_descriptor, | 1546 int tagged_descriptor, |
1547 int double_descriptor, | 1547 int double_descriptor, |
1548 bool check_tagged_value = true) { | 1548 bool check_tagged_value = true) { |
1549 if (FLAG_never_compact || !FLAG_incremental_marking) return; | 1549 if (FLAG_never_compact || !FLAG_incremental_marking) return; |
1550 FLAG_stress_compaction = true; | 1550 FLAG_stress_compaction = true; |
1551 FLAG_manual_evacuation_candidates_selection = true; | 1551 FLAG_manual_evacuation_candidates_selection = true; |
1552 Isolate* isolate = CcTest::i_isolate(); | 1552 Isolate* isolate = CcTest::i_isolate(); |
1553 Factory* factory = isolate->factory(); | 1553 Factory* factory = isolate->factory(); |
1554 Heap* heap = CcTest::heap(); | 1554 Heap* heap = CcTest::heap(); |
1555 PagedSpace* old_pointer_space = heap->old_pointer_space(); | 1555 PagedSpace* old_space = heap->old_space(); |
1556 | 1556 |
1557 // The plan: create |obj| by |map| in old space, create |obj_value| in | 1557 // The plan: create |obj| by |map| in old space, create |obj_value| in |
1558 // old space and ensure it end up in evacuation candidate page. Start | 1558 // old space and ensure it end up in evacuation candidate page. Start |
1559 // incremental marking and ensure that incremental write barrier is triggered | 1559 // incremental marking and ensure that incremental write barrier is triggered |
1560 // when |obj_value| is written to property |tagged_descriptor| of |obj|. | 1560 // when |obj_value| is written to property |tagged_descriptor| of |obj|. |
1561 // Then migrate object to |new_map| and set proper value for property | 1561 // Then migrate object to |new_map| and set proper value for property |
1562 // |double_descriptor|. Call GC and ensure that it did not crash during | 1562 // |double_descriptor|. Call GC and ensure that it did not crash during |
1563 // slots buffer entries updating. | 1563 // slots buffer entries updating. |
1564 | 1564 |
1565 Handle<JSObject> obj; | 1565 Handle<JSObject> obj; |
1566 Handle<HeapObject> obj_value; | 1566 Handle<HeapObject> obj_value; |
1567 Page* ec_page; | 1567 Page* ec_page; |
1568 { | 1568 { |
1569 AlwaysAllocateScope always_allocate(isolate); | 1569 AlwaysAllocateScope always_allocate(isolate); |
1570 obj = factory->NewJSObjectFromMap(map, TENURED, false); | 1570 obj = factory->NewJSObjectFromMap(map, TENURED, false); |
1571 CHECK(old_pointer_space->Contains(*obj)); | 1571 CHECK(old_space->Contains(*obj)); |
1572 | 1572 |
1573 // Make sure |obj_value| is placed on an old-space evacuation candidate. | 1573 // Make sure |obj_value| is placed on an old-space evacuation candidate. |
1574 SimulateFullSpace(old_pointer_space); | 1574 SimulateFullSpace(old_space); |
1575 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); | 1575 obj_value = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); |
1576 ec_page = Page::FromAddress(obj_value->address()); | 1576 ec_page = Page::FromAddress(obj_value->address()); |
1577 CHECK_NE(ec_page, Page::FromAddress(obj->address())); | 1577 CHECK_NE(ec_page, Page::FromAddress(obj->address())); |
1578 } | 1578 } |
1579 | 1579 |
1580 // Heap is ready, force |ec_page| to become an evacuation candidate and | 1580 // Heap is ready, force |ec_page| to become an evacuation candidate and |
1581 // simulate incremental marking. | 1581 // simulate incremental marking. |
1582 ec_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); | 1582 ec_page->SetFlag(MemoryChunk::FORCE_EVACUATION_CANDIDATE_FOR_TESTING); |
1583 SimulateIncrementalMarking(heap); | 1583 SimulateIncrementalMarking(heap); |
1584 | 1584 |
(...skipping 26 matching lines...) Expand all Loading... |
1611 JSObject::MigrateToMap(obj, new_map); | 1611 JSObject::MigrateToMap(obj, new_map); |
1612 | 1612 |
1613 double boom_value = bit_cast<double>(UINT64_C(0xbaad0176a37c28e1)); | 1613 double boom_value = bit_cast<double>(UINT64_C(0xbaad0176a37c28e1)); |
1614 | 1614 |
1615 FieldIndex double_field_index = | 1615 FieldIndex double_field_index = |
1616 FieldIndex::ForDescriptor(*new_map, double_descriptor); | 1616 FieldIndex::ForDescriptor(*new_map, double_descriptor); |
1617 CHECK(obj->IsUnboxedDoubleField(double_field_index)); | 1617 CHECK(obj->IsUnboxedDoubleField(double_field_index)); |
1618 obj->RawFastDoublePropertyAtPut(double_field_index, boom_value); | 1618 obj->RawFastDoublePropertyAtPut(double_field_index, boom_value); |
1619 | 1619 |
1620 // Trigger GC to evacuate all candidates. | 1620 // Trigger GC to evacuate all candidates. |
1621 CcTest::heap()->CollectGarbage(OLD_POINTER_SPACE, "boom"); | 1621 CcTest::heap()->CollectGarbage(OLD_SPACE, "boom"); |
1622 | 1622 |
1623 // Ensure that the values are still there and correct. | 1623 // Ensure that the values are still there and correct. |
1624 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); | 1624 CHECK(!MarkCompactCollector::IsOnEvacuationCandidate(*obj_value)); |
1625 | 1625 |
1626 if (check_tagged_value) { | 1626 if (check_tagged_value) { |
1627 FieldIndex tagged_field_index = | 1627 FieldIndex tagged_field_index = |
1628 FieldIndex::ForDescriptor(*new_map, tagged_descriptor); | 1628 FieldIndex::ForDescriptor(*new_map, tagged_descriptor); |
1629 CHECK_EQ(*obj_value, obj->RawFastPropertyAt(tagged_field_index)); | 1629 CHECK_EQ(*obj_value, obj->RawFastPropertyAt(tagged_field_index)); |
1630 } | 1630 } |
1631 CHECK_EQ(boom_value, obj->RawFastDoublePropertyAt(double_field_index)); | 1631 CHECK_EQ(boom_value, obj->RawFastDoublePropertyAt(double_field_index)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 | 1681 |
1682 // TODO(ishell): add respective tests for property kind reconfiguring from | 1682 // TODO(ishell): add respective tests for property kind reconfiguring from |
1683 // accessor field to double, once accessor fields are supported by | 1683 // accessor field to double, once accessor fields are supported by |
1684 // Map::ReconfigureProperty(). | 1684 // Map::ReconfigureProperty(). |
1685 | 1685 |
1686 | 1686 |
1687 // TODO(ishell): add respective tests for fast property removal case once | 1687 // TODO(ishell): add respective tests for fast property removal case once |
1688 // Map::ReconfigureProperty() supports that. | 1688 // Map::ReconfigureProperty() supports that. |
1689 | 1689 |
1690 #endif | 1690 #endif |
OLD | NEW |