| Index: src/mark-compact.cc
|
| diff --git a/src/mark-compact.cc b/src/mark-compact.cc
|
| index 89ce89ef77ebf66a98189d70a1f0599ed5371301..4314c9d7217dd952033678469f6ee8c2e78cb268 100644
|
| --- a/src/mark-compact.cc
|
| +++ b/src/mark-compact.cc
|
| @@ -3204,13 +3204,21 @@ enum SkipListRebuildingMode {
|
| };
|
|
|
|
|
| +enum FreeSpaceTreatmentMode {
|
| + IGNORE_FREE_SPACE,
|
| + ZAP_FREE_SPACE
|
| +};
|
| +
|
| +
|
| // Sweep a space precisely. After this has been done the space can
|
| // be iterated precisely, hitting only the live objects. Code space
|
| // is always swept precisely because we want to be able to iterate
|
| // over it. Map space is swept precisely, because it is not compacted.
|
| // Slots in live objects pointing into evacuation candidates are updated
|
| // if requested.
|
| -template<SweepingMode sweeping_mode, SkipListRebuildingMode skip_list_mode>
|
| +template<SweepingMode sweeping_mode,
|
| + SkipListRebuildingMode skip_list_mode,
|
| + FreeSpaceTreatmentMode free_space_mode>
|
| static void SweepPrecisely(PagedSpace* space,
|
| Page* p,
|
| ObjectVisitor* v) {
|
| @@ -3244,6 +3252,9 @@ static void SweepPrecisely(PagedSpace* space,
|
| for ( ; live_objects != 0; live_objects--) {
|
| Address free_end = cell_base + offsets[live_index++] * kPointerSize;
|
| if (free_end != free_start) {
|
| + if (free_space_mode == ZAP_FREE_SPACE) {
|
| + memset(free_start, 0xcc, static_cast<int>(free_end - free_start));
|
| + }
|
| space->Free(free_start, static_cast<int>(free_end - free_start));
|
| #ifdef ENABLE_GDB_JIT_INTERFACE
|
| if (FLAG_gdbjit && space->identity() == CODE_SPACE) {
|
| @@ -3275,6 +3286,9 @@ static void SweepPrecisely(PagedSpace* space,
|
| *cell = 0;
|
| }
|
| if (free_start != p->area_end()) {
|
| + if (free_space_mode == ZAP_FREE_SPACE) {
|
| + memset(free_start, 0xcc, static_cast<int>(p->area_end() - free_start));
|
| + }
|
| space->Free(free_start, static_cast<int>(p->area_end() - free_start));
|
| #ifdef ENABLE_GDB_JIT_INTERFACE
|
| if (FLAG_gdbjit && space->identity() == CODE_SPACE) {
|
| @@ -3520,12 +3534,23 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() {
|
| SweepConservatively<SWEEP_SEQUENTIALLY>(space, NULL, p);
|
| break;
|
| case OLD_POINTER_SPACE:
|
| - SweepPrecisely<SWEEP_AND_VISIT_LIVE_OBJECTS, IGNORE_SKIP_LIST>(
|
| + SweepPrecisely<SWEEP_AND_VISIT_LIVE_OBJECTS,
|
| + IGNORE_SKIP_LIST,
|
| + IGNORE_FREE_SPACE>(
|
| space, p, &updating_visitor);
|
| break;
|
| case CODE_SPACE:
|
| - SweepPrecisely<SWEEP_AND_VISIT_LIVE_OBJECTS, REBUILD_SKIP_LIST>(
|
| - space, p, &updating_visitor);
|
| + if (FLAG_zap_code_space) {
|
| + SweepPrecisely<SWEEP_AND_VISIT_LIVE_OBJECTS,
|
| + REBUILD_SKIP_LIST,
|
| + ZAP_FREE_SPACE>(
|
| + space, p, &updating_visitor);
|
| + } else {
|
| + SweepPrecisely<SWEEP_AND_VISIT_LIVE_OBJECTS,
|
| + REBUILD_SKIP_LIST,
|
| + IGNORE_FREE_SPACE>(
|
| + space, p, &updating_visitor);
|
| + }
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -4145,10 +4170,15 @@ void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) {
|
| PrintF("Sweeping 0x%" V8PRIxPTR " precisely.\n",
|
| reinterpret_cast<intptr_t>(p));
|
| }
|
| - if (space->identity() == CODE_SPACE) {
|
| - SweepPrecisely<SWEEP_ONLY, REBUILD_SKIP_LIST>(space, p, NULL);
|
| + if (space->identity() == CODE_SPACE && FLAG_zap_code_space) {
|
| + SweepPrecisely<SWEEP_ONLY, REBUILD_SKIP_LIST, ZAP_FREE_SPACE>(
|
| + space, p, NULL);
|
| + } else if (space->identity() == CODE_SPACE) {
|
| + SweepPrecisely<SWEEP_ONLY, REBUILD_SKIP_LIST, IGNORE_FREE_SPACE>(
|
| + space, p, NULL);
|
| } else {
|
| - SweepPrecisely<SWEEP_ONLY, IGNORE_SKIP_LIST>(space, p, NULL);
|
| + SweepPrecisely<SWEEP_ONLY, IGNORE_SKIP_LIST, IGNORE_FREE_SPACE>(
|
| + space, p, NULL);
|
| }
|
| pages_swept++;
|
| break;
|
|
|