OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 #endif | 143 #endif |
144 | 144 |
145 // Ensure old_generation_size_ is a multiple of kPageSize. | 145 // Ensure old_generation_size_ is a multiple of kPageSize. |
146 DCHECK(MB >= Page::kPageSize); | 146 DCHECK(MB >= Page::kPageSize); |
147 | 147 |
148 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); | 148 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); |
149 set_native_contexts_list(NULL); | 149 set_native_contexts_list(NULL); |
150 set_array_buffers_list(Smi::FromInt(0)); | 150 set_array_buffers_list(Smi::FromInt(0)); |
151 set_allocation_sites_list(Smi::FromInt(0)); | 151 set_allocation_sites_list(Smi::FromInt(0)); |
152 set_encountered_weak_collections(Smi::FromInt(0)); | 152 set_encountered_weak_collections(Smi::FromInt(0)); |
| 153 set_encountered_weak_cells(Smi::FromInt(0)); |
153 // Put a dummy entry in the remembered pages so we can find the list the | 154 // Put a dummy entry in the remembered pages so we can find the list the |
154 // minidump even if there are no real unmapped pages. | 155 // minidump even if there are no real unmapped pages. |
155 RememberUnmappedPage(NULL, false); | 156 RememberUnmappedPage(NULL, false); |
156 | 157 |
157 ClearObjectStats(true); | 158 ClearObjectStats(true); |
158 } | 159 } |
159 | 160 |
160 | 161 |
161 intptr_t Heap::Capacity() { | 162 intptr_t Heap::Capacity() { |
162 if (!HasBeenSetUp()) return 0; | 163 if (!HasBeenSetUp()) return 0; |
(...skipping 1339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1502 PropertyCell* cell = PropertyCell::cast(heap_object); | 1503 PropertyCell* cell = PropertyCell::cast(heap_object); |
1503 Address value_address = cell->ValueAddress(); | 1504 Address value_address = cell->ValueAddress(); |
1504 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); | 1505 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(value_address)); |
1505 Address type_address = cell->TypeAddress(); | 1506 Address type_address = cell->TypeAddress(); |
1506 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(type_address)); | 1507 scavenge_visitor.VisitPointer(reinterpret_cast<Object**>(type_address)); |
1507 } | 1508 } |
1508 } | 1509 } |
1509 | 1510 |
1510 // Copy objects reachable from the encountered weak collections list. | 1511 // Copy objects reachable from the encountered weak collections list. |
1511 scavenge_visitor.VisitPointer(&encountered_weak_collections_); | 1512 scavenge_visitor.VisitPointer(&encountered_weak_collections_); |
| 1513 // Copy objects reachable from the encountered weak cells. |
| 1514 scavenge_visitor.VisitPointer(&encountered_weak_cells_); |
1512 | 1515 |
1513 // Copy objects reachable from the code flushing candidates list. | 1516 // Copy objects reachable from the code flushing candidates list. |
1514 MarkCompactCollector* collector = mark_compact_collector(); | 1517 MarkCompactCollector* collector = mark_compact_collector(); |
1515 if (collector->is_code_flushing_enabled()) { | 1518 if (collector->is_code_flushing_enabled()) { |
1516 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); | 1519 collector->code_flusher()->IteratePointersToFromSpace(&scavenge_visitor); |
1517 } | 1520 } |
1518 | 1521 |
1519 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); | 1522 new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
1520 | 1523 |
1521 while (isolate()->global_handles()->IterateObjectGroups( | 1524 while (isolate()->global_handles()->IterateObjectGroups( |
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2552 | 2555 |
2553 TYPED_ARRAYS(ALLOCATE_FIXED_TYPED_ARRAY_MAP) | 2556 TYPED_ARRAYS(ALLOCATE_FIXED_TYPED_ARRAY_MAP) |
2554 #undef ALLOCATE_FIXED_TYPED_ARRAY_MAP | 2557 #undef ALLOCATE_FIXED_TYPED_ARRAY_MAP |
2555 | 2558 |
2556 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, sloppy_arguments_elements) | 2559 ALLOCATE_VARSIZE_MAP(FIXED_ARRAY_TYPE, sloppy_arguments_elements) |
2557 | 2560 |
2558 ALLOCATE_VARSIZE_MAP(CODE_TYPE, code) | 2561 ALLOCATE_VARSIZE_MAP(CODE_TYPE, code) |
2559 | 2562 |
2560 ALLOCATE_MAP(CELL_TYPE, Cell::kSize, cell) | 2563 ALLOCATE_MAP(CELL_TYPE, Cell::kSize, cell) |
2561 ALLOCATE_MAP(PROPERTY_CELL_TYPE, PropertyCell::kSize, global_property_cell) | 2564 ALLOCATE_MAP(PROPERTY_CELL_TYPE, PropertyCell::kSize, global_property_cell) |
| 2565 ALLOCATE_MAP(WEAK_CELL_TYPE, WeakCell::kSize, weak_cell) |
2562 ALLOCATE_MAP(FILLER_TYPE, kPointerSize, one_pointer_filler) | 2566 ALLOCATE_MAP(FILLER_TYPE, kPointerSize, one_pointer_filler) |
2563 ALLOCATE_MAP(FILLER_TYPE, 2 * kPointerSize, two_pointer_filler) | 2567 ALLOCATE_MAP(FILLER_TYPE, 2 * kPointerSize, two_pointer_filler) |
2564 | 2568 |
2565 | 2569 |
2566 for (unsigned i = 0; i < arraysize(struct_table); i++) { | 2570 for (unsigned i = 0; i < arraysize(struct_table); i++) { |
2567 const StructTable& entry = struct_table[i]; | 2571 const StructTable& entry = struct_table[i]; |
2568 Map* map; | 2572 Map* map; |
2569 if (!AllocateMap(entry.type, entry.size).To(&map)) return false; | 2573 if (!AllocateMap(entry.type, entry.size).To(&map)) return false; |
2570 roots_[entry.index] = map; | 2574 roots_[entry.index] = map; |
2571 } | 2575 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2678 result->set_map_no_write_barrier(global_property_cell_map()); | 2682 result->set_map_no_write_barrier(global_property_cell_map()); |
2679 PropertyCell* cell = PropertyCell::cast(result); | 2683 PropertyCell* cell = PropertyCell::cast(result); |
2680 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), | 2684 cell->set_dependent_code(DependentCode::cast(empty_fixed_array()), |
2681 SKIP_WRITE_BARRIER); | 2685 SKIP_WRITE_BARRIER); |
2682 cell->set_value(the_hole_value()); | 2686 cell->set_value(the_hole_value()); |
2683 cell->set_type(HeapType::None()); | 2687 cell->set_type(HeapType::None()); |
2684 return result; | 2688 return result; |
2685 } | 2689 } |
2686 | 2690 |
2687 | 2691 |
| 2692 AllocationResult Heap::AllocateWeakCell(HeapObject* value) { |
| 2693 int size = WeakCell::kSize; |
| 2694 STATIC_ASSERT(WeakCell::kSize <= Page::kMaxRegularHeapObjectSize); |
| 2695 HeapObject* result; |
| 2696 { |
| 2697 AllocationResult allocation = |
| 2698 AllocateRaw(size, OLD_POINTER_SPACE, OLD_POINTER_SPACE); |
| 2699 if (!allocation.To(&result)) return allocation; |
| 2700 } |
| 2701 result->set_map_no_write_barrier(weak_cell_map()); |
| 2702 WeakCell::cast(result)->initialize(value); |
| 2703 WeakCell::cast(result)->set_next(undefined_value(), SKIP_WRITE_BARRIER); |
| 2704 return result; |
| 2705 } |
| 2706 |
| 2707 |
2688 void Heap::CreateApiObjects() { | 2708 void Heap::CreateApiObjects() { |
2689 HandleScope scope(isolate()); | 2709 HandleScope scope(isolate()); |
2690 Factory* factory = isolate()->factory(); | 2710 Factory* factory = isolate()->factory(); |
2691 Handle<Map> new_neander_map = | 2711 Handle<Map> new_neander_map = |
2692 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 2712 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
2693 | 2713 |
2694 // Don't use Smi-only elements optimizations for objects with the neander | 2714 // Don't use Smi-only elements optimizations for objects with the neander |
2695 // map. There are too many cases where element values are set directly with a | 2715 // map. There are too many cases where element values are set directly with a |
2696 // bottleneck to trap the Smi-only -> fast elements transition, and there | 2716 // bottleneck to trap the Smi-only -> fast elements transition, and there |
2697 // appears to be no benefit for optimize this case. | 2717 // appears to be no benefit for optimize this case. |
(...skipping 3474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6172 static_cast<int>(object_sizes_last_time_[index])); | 6192 static_cast<int>(object_sizes_last_time_[index])); |
6173 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6193 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
6174 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6194 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
6175 | 6195 |
6176 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6196 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
6177 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6197 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
6178 ClearObjectStats(); | 6198 ClearObjectStats(); |
6179 } | 6199 } |
6180 } | 6200 } |
6181 } // namespace v8::internal | 6201 } // namespace v8::internal |
OLD | NEW |