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

Side by Side Diff: src/objects.cc

Issue 1277873002: Fix stale entries in optimized code map. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 5 years, 4 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 | « no previous file | test/cctest/test-heap.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 9490 matching lines...) Expand 10 before | Expand all | Expand 10 after
9501 } 9501 }
9502 9502
9503 9503
9504 void SharedFunctionInfo::AddToOptimizedCodeMap( 9504 void SharedFunctionInfo::AddToOptimizedCodeMap(
9505 Handle<SharedFunctionInfo> shared, 9505 Handle<SharedFunctionInfo> shared,
9506 Handle<Context> native_context, 9506 Handle<Context> native_context,
9507 Handle<Code> code, 9507 Handle<Code> code,
9508 Handle<FixedArray> literals, 9508 Handle<FixedArray> literals,
9509 BailoutId osr_ast_id) { 9509 BailoutId osr_ast_id) {
9510 Isolate* isolate = shared->GetIsolate(); 9510 Isolate* isolate = shared->GetIsolate();
9511 DCHECK(!shared->SearchOptimizedCodeMap(*native_context, osr_ast_id).code);
9511 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION); 9512 DCHECK(code->kind() == Code::OPTIMIZED_FUNCTION);
9512 DCHECK(native_context->IsNativeContext()); 9513 DCHECK(native_context->IsNativeContext());
9513 STATIC_ASSERT(kEntryLength == 4); 9514 STATIC_ASSERT(kEntryLength == 4);
9514 Handle<FixedArray> new_code_map; 9515 Handle<FixedArray> new_code_map;
9515 Handle<Object> value(shared->optimized_code_map(), isolate); 9516 Handle<Object> value(shared->optimized_code_map(), isolate);
9516 int old_length; 9517 int old_length;
9517 if (value->IsSmi()) { 9518 if (value->IsSmi()) {
9518 // No optimized code map. 9519 // No optimized code map.
9519 DCHECK_EQ(0, Smi::cast(*value)->value()); 9520 DCHECK_EQ(0, Smi::cast(*value)->value());
9520 new_code_map = isolate->factory()->NewFixedArray(kInitialLength); 9521 new_code_map = isolate->factory()->NewFixedArray(kInitialLength, TENURED);
9521 old_length = kEntriesStart; 9522 old_length = kEntriesStart;
9522 } else { 9523 } else {
9523 // Copy old map and append one new entry. 9524 // Copy old optimized code map and append one new entry.
9524 Handle<FixedArray> old_code_map = Handle<FixedArray>::cast(value); 9525 Handle<FixedArray> old_code_map = Handle<FixedArray>::cast(value);
9525 DCHECK(!shared->SearchOptimizedCodeMap(*native_context, osr_ast_id).code); 9526 new_code_map = isolate->factory()->CopyFixedArrayAndGrow(
9526 new_code_map = 9527 old_code_map, kEntryLength, TENURED);
9527 isolate->factory()->CopyFixedArrayAndGrow(old_code_map, kEntryLength);
9528 old_length = old_code_map->length(); 9528 old_length = old_code_map->length();
9529 // Zap the old map for the sake of the heap verifier. 9529 // Zap the old map to avoid any stale entries. Note that this is required
9530 if (Heap::ShouldZapGarbage()) { 9530 // for correctness because entries are being treated weakly by the GC.
9531 Object** data = old_code_map->data_start(); 9531 MemsetPointer(old_code_map->data_start(), isolate->heap()->the_hole_value(),
9532 MemsetPointer(data, isolate->heap()->the_hole_value(), old_length); 9532 old_length);
9533 }
9534 } 9533 }
9535 new_code_map->set(old_length + kContextOffset, *native_context); 9534 new_code_map->set(old_length + kContextOffset, *native_context);
9536 new_code_map->set(old_length + kCachedCodeOffset, *code); 9535 new_code_map->set(old_length + kCachedCodeOffset, *code);
9537 new_code_map->set(old_length + kLiteralsOffset, *literals); 9536 new_code_map->set(old_length + kLiteralsOffset, *literals);
9538 new_code_map->set(old_length + kOsrAstIdOffset, 9537 new_code_map->set(old_length + kOsrAstIdOffset,
9539 Smi::FromInt(osr_ast_id.ToInt())); 9538 Smi::FromInt(osr_ast_id.ToInt()));
9540 9539
9541 #ifdef DEBUG 9540 #ifdef DEBUG
9542 for (int i = kEntriesStart; i < new_code_map->length(); i += kEntryLength) { 9541 for (int i = kEntriesStart; i < new_code_map->length(); i += kEntryLength) {
9543 DCHECK(new_code_map->get(i + kContextOffset)->IsNativeContext()); 9542 DCHECK(new_code_map->get(i + kContextOffset)->IsNativeContext());
(...skipping 6318 matching lines...) Expand 10 before | Expand all | Expand 10 after
15862 if (cell->value() != *new_value) { 15861 if (cell->value() != *new_value) {
15863 cell->set_value(*new_value); 15862 cell->set_value(*new_value);
15864 Isolate* isolate = cell->GetIsolate(); 15863 Isolate* isolate = cell->GetIsolate();
15865 cell->dependent_code()->DeoptimizeDependentCodeGroup( 15864 cell->dependent_code()->DeoptimizeDependentCodeGroup(
15866 isolate, DependentCode::kPropertyCellChangedGroup); 15865 isolate, DependentCode::kPropertyCellChangedGroup);
15867 } 15866 }
15868 } 15867 }
15869 15868
15870 } // namespace internal 15869 } // namespace internal
15871 } // namespace v8 15870 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698