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

Side by Side Diff: test/cctest/test-unboxed-doubles.cc

Issue 1051233002: Reland "Merge old data and pointer space." (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/test-spaces.cc ('k') | test/cctest/test-weakmaps.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « test/cctest/test-spaces.cc ('k') | test/cctest/test-weakmaps.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698