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

Side by Side Diff: src/mark-compact.cc

Issue 16925008: Generate StoreGlobal stubs with Hydrogen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix test cases Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/mark-compact.h ('k') | src/objects.h » ('j') | src/types.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2251 matching lines...) Expand 10 before | Expand all | Expand 10 after
2262 } 2262 }
2263 } 2263 }
2264 } 2264 }
2265 { 2265 {
2266 HeapObjectIterator js_global_property_cell_iterator( 2266 HeapObjectIterator js_global_property_cell_iterator(
2267 heap()->property_cell_space()); 2267 heap()->property_cell_space());
2268 HeapObject* cell; 2268 HeapObject* cell;
2269 while ((cell = js_global_property_cell_iterator.Next()) != NULL) { 2269 while ((cell = js_global_property_cell_iterator.Next()) != NULL) {
2270 ASSERT(cell->IsPropertyCell()); 2270 ASSERT(cell->IsPropertyCell());
2271 if (IsMarked(cell)) { 2271 if (IsMarked(cell)) {
2272 int offset = PropertyCell::kValueOffset; 2272 MarkCompactMarkingVisitor::VisitPropertyCell(cell->map(), cell);
2273 MarkCompactMarkingVisitor::VisitPointer(
2274 heap(),
2275 reinterpret_cast<Object**>(cell->address() + offset));
2276 offset = PropertyCell::kTypeOffset;
2277 MarkCompactMarkingVisitor::VisitPointer(
2278 heap(),
2279 reinterpret_cast<Object**>(cell->address() + offset));
2280 } 2273 }
2281 } 2274 }
2282 } 2275 }
2283 } 2276 }
2284 2277
2285 RootMarkingVisitor root_visitor(heap()); 2278 RootMarkingVisitor root_visitor(heap());
2286 MarkRoots(&root_visitor); 2279 MarkRoots(&root_visitor);
2287 2280
2288 // The objects reachable from the roots are marked, yet unreachable 2281 // The objects reachable from the roots are marked, yet unreachable
2289 // objects are unmarked. Mark objects reachable due to host 2282 // objects are unmarked. Mark objects reachable due to host
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
2448 // This map is used for inobject slack tracking and has been detached 2441 // This map is used for inobject slack tracking and has been detached
2449 // from SharedFunctionInfo during the mark phase. 2442 // from SharedFunctionInfo during the mark phase.
2450 // Since it survived the GC, reattach it now. 2443 // Since it survived the GC, reattach it now.
2451 JSFunction::cast(map->constructor())->shared()->AttachInitialMap(map); 2444 JSFunction::cast(map->constructor())->shared()->AttachInitialMap(map);
2452 } 2445 }
2453 2446
2454 ClearNonLivePrototypeTransitions(map); 2447 ClearNonLivePrototypeTransitions(map);
2455 ClearNonLiveMapTransitions(map, map_mark); 2448 ClearNonLiveMapTransitions(map, map_mark);
2456 2449
2457 if (map_mark.Get()) { 2450 if (map_mark.Get()) {
2458 ClearNonLiveDependentCode(map); 2451 ClearNonLiveDependentCode(map->dependent_code());
2459 } else { 2452 } else {
2460 ClearAndDeoptimizeDependentCode(map); 2453 ClearAndDeoptimizeDependentCode(map);
2461 } 2454 }
2462 } 2455 }
2456
2457 // Iterate over property cell space, removing dependent code that is not
2458 // otherwise kept alive by strong references.
2459 HeapObjectIterator cell_iterator(heap_->property_cell_space());
2460 for (HeapObject* cell = cell_iterator.Next();
2461 cell != NULL;
2462 cell = cell_iterator.Next()) {
2463 ClearNonLiveDependentCode(PropertyCell::cast(cell)->dependent_code());
2464 }
2463 } 2465 }
2464 2466
2465 2467
2466 void MarkCompactCollector::ClearNonLivePrototypeTransitions(Map* map) { 2468 void MarkCompactCollector::ClearNonLivePrototypeTransitions(Map* map) {
2467 int number_of_transitions = map->NumberOfProtoTransitions(); 2469 int number_of_transitions = map->NumberOfProtoTransitions();
2468 FixedArray* prototype_transitions = map->GetPrototypeTransitions(); 2470 FixedArray* prototype_transitions = map->GetPrototypeTransitions();
2469 2471
2470 int new_number_of_transitions = 0; 2472 int new_number_of_transitions = 0;
2471 const int header = Map::kProtoTransitionHeaderSize; 2473 const int header = Map::kProtoTransitionHeaderSize;
2472 const int proto_offset = header + Map::kProtoTransitionPrototypeOffset; 2474 const int proto_offset = header + Map::kProtoTransitionPrototypeOffset;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2538 Code* code = entries->code_at(i); 2540 Code* code = entries->code_at(i);
2539 if (IsMarked(code) && !code->marked_for_deoptimization()) { 2541 if (IsMarked(code) && !code->marked_for_deoptimization()) {
2540 code->set_marked_for_deoptimization(true); 2542 code->set_marked_for_deoptimization(true);
2541 } 2543 }
2542 entries->clear_at(i); 2544 entries->clear_at(i);
2543 } 2545 }
2544 map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array())); 2546 map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array()));
2545 } 2547 }
2546 2548
2547 2549
2548 void MarkCompactCollector::ClearNonLiveDependentCode(Map* map) { 2550 void MarkCompactCollector::ClearNonLiveDependentCode(DependentCode* entries) {
2549 DisallowHeapAllocation no_allocation; 2551 DisallowHeapAllocation no_allocation;
2550 DependentCode* entries = map->dependent_code();
2551 DependentCode::GroupStartIndexes starts(entries); 2552 DependentCode::GroupStartIndexes starts(entries);
2552 int number_of_entries = starts.number_of_entries(); 2553 int number_of_entries = starts.number_of_entries();
2553 if (number_of_entries == 0) return; 2554 if (number_of_entries == 0) return;
2554 int new_number_of_entries = 0; 2555 int new_number_of_entries = 0;
2555 // Go through all groups, remove dead codes and compact. 2556 // Go through all groups, remove dead codes and compact.
2556 for (int g = 0; g < DependentCode::kGroupCount; g++) { 2557 for (int g = 0; g < DependentCode::kGroupCount; g++) {
2557 int group_number_of_entries = 0; 2558 int group_number_of_entries = 0;
2558 for (int i = starts.at(g); i < starts.at(g + 1); i++) { 2559 for (int i = starts.at(g); i < starts.at(g + 1); i++) {
2559 Object* obj = entries->object_at(i); 2560 Object* obj = entries->object_at(i);
2560 ASSERT(obj->IsCode() || IsMarked(obj)); 2561 ASSERT(obj->IsCode() || IsMarked(obj));
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after
3411 } 3412 }
3412 3413
3413 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_UPDATE_MISC_POINTERS); 3414 GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_UPDATE_MISC_POINTERS);
3414 3415
3415 // Update pointers from cells. 3416 // Update pointers from cells.
3416 HeapObjectIterator cell_iterator(heap_->cell_space()); 3417 HeapObjectIterator cell_iterator(heap_->cell_space());
3417 for (HeapObject* cell = cell_iterator.Next(); 3418 for (HeapObject* cell = cell_iterator.Next();
3418 cell != NULL; 3419 cell != NULL;
3419 cell = cell_iterator.Next()) { 3420 cell = cell_iterator.Next()) {
3420 if (cell->IsCell()) { 3421 if (cell->IsCell()) {
3421 Address value_address = reinterpret_cast<Address>(cell) + 3422 Cell::BodyDescriptor::IterateBody(cell, &updating_visitor);
3422 (Cell::kValueOffset - kHeapObjectTag);
3423 updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address));
3424 } 3423 }
3425 } 3424 }
3426 3425
3427 HeapObjectIterator js_global_property_cell_iterator( 3426 HeapObjectIterator js_global_property_cell_iterator(
3428 heap_->property_cell_space()); 3427 heap_->property_cell_space());
3429 for (HeapObject* cell = js_global_property_cell_iterator.Next(); 3428 for (HeapObject* cell = js_global_property_cell_iterator.Next();
3430 cell != NULL; 3429 cell != NULL;
3431 cell = js_global_property_cell_iterator.Next()) { 3430 cell = js_global_property_cell_iterator.Next()) {
3432 if (cell->IsPropertyCell()) { 3431 if (cell->IsPropertyCell()) {
3433 Address value_address = 3432 PropertyCell::BodyDescriptor::IterateBody(cell, &updating_visitor);
3434 reinterpret_cast<Address>(cell) +
3435 (PropertyCell::kValueOffset - kHeapObjectTag);
3436 updating_visitor.VisitPointer(reinterpret_cast<Object**>(value_address));
3437 Address type_address =
3438 reinterpret_cast<Address>(cell) +
3439 (PropertyCell::kTypeOffset - kHeapObjectTag);
3440 updating_visitor.VisitPointer(reinterpret_cast<Object**>(type_address));
3441 } 3433 }
3442 } 3434 }
3443 3435
3444 // Update pointer from the native contexts list. 3436 // Update pointer from the native contexts list.
3445 updating_visitor.VisitPointer(heap_->native_contexts_list_address()); 3437 updating_visitor.VisitPointer(heap_->native_contexts_list_address());
3446 3438
3447 heap_->string_table()->Iterate(&updating_visitor); 3439 heap_->string_table()->Iterate(&updating_visitor);
3448 3440
3449 // Update pointers from external string table. 3441 // Update pointers from external string table.
3450 heap_->UpdateReferencesInExternalStringTable( 3442 heap_->UpdateReferencesInExternalStringTable(
(...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after
4315 while (buffer != NULL) { 4307 while (buffer != NULL) {
4316 SlotsBuffer* next_buffer = buffer->next(); 4308 SlotsBuffer* next_buffer = buffer->next();
4317 DeallocateBuffer(buffer); 4309 DeallocateBuffer(buffer);
4318 buffer = next_buffer; 4310 buffer = next_buffer;
4319 } 4311 }
4320 *buffer_address = NULL; 4312 *buffer_address = NULL;
4321 } 4313 }
4322 4314
4323 4315
4324 } } // namespace v8::internal 4316 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mark-compact.h ('k') | src/objects.h » ('j') | src/types.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698