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

Side by Side Diff: src/objects.cc

Issue 650073002: vector-based ICs did not update type feedback counts correctly. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Ports. Created 6 years, 2 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
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 <sstream> 5 #include <sstream>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 10366 matching lines...) Expand 10 before | Expand all | Expand 10 after
10377 10377
10378 void Code::ClearInlineCaches(Code::Kind* kind) { 10378 void Code::ClearInlineCaches(Code::Kind* kind) {
10379 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | 10379 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) |
10380 RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) | 10380 RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) |
10381 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID); 10381 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID);
10382 for (RelocIterator it(this, mask); !it.done(); it.next()) { 10382 for (RelocIterator it(this, mask); !it.done(); it.next()) {
10383 RelocInfo* info = it.rinfo(); 10383 RelocInfo* info = it.rinfo();
10384 Code* target(Code::GetCodeFromTargetAddress(info->target_address())); 10384 Code* target(Code::GetCodeFromTargetAddress(info->target_address()));
10385 if (target->is_inline_cache_stub()) { 10385 if (target->is_inline_cache_stub()) {
10386 if (kind == NULL || *kind == target->kind()) { 10386 if (kind == NULL || *kind == target->kind()) {
10387 IC::Clear(this->GetIsolate(), info->pc(), 10387 Object* feedback_info =
10388 target->kind() == FUNCTION ? type_feedback_info() : NULL;
Jakob Kummerow 2014/10/14 15:27:20 I think you're confused here (or is it a bad merge
mvstanton 2014/10/16 10:54:14 Yes, this is hilarious and sad. Sorry 'bout that!
10389 TypeFeedbackVector* vector =
10390 feedback_info->IsTypeFeedbackInfo()
Jakob Kummerow 2014/10/14 15:27:20 feedback_info is NULL here!
mvstanton 2014/10/16 10:54:14 The logic was revisited.
10391 ? TypeFeedbackInfo::cast(feedback_info)->feedback_vector()
10392 : NULL;
10393 FeedbackVectorICSlot slot =
10394 FeedbackVectorICSlot(static_cast<unsigned>(info->data()));
10395
10396 IC::Clear(this->GetIsolate(), info->pc(), vector, slot,
10388 info->host()->constant_pool()); 10397 info->host()->constant_pool());
10389 } 10398 }
10390 } 10399 }
10391 } 10400 }
10392 } 10401 }
10393 10402
10394 10403
10395 void SharedFunctionInfo::ClearTypeFeedbackInfo() { 10404 void SharedFunctionInfo::ClearTypeFeedbackInfo() {
10396 TypeFeedbackVector* vector = feedback_vector(); 10405 feedback_vector()->ClearSlots();
10397 Heap* heap = GetHeap();
10398 int length = vector->length();
10399
10400 for (int i = 0; i < length; i++) {
10401 Object* obj = vector->get(i);
10402 if (obj->IsHeapObject()) {
10403 InstanceType instance_type =
10404 HeapObject::cast(obj)->map()->instance_type();
10405 switch (instance_type) {
10406 case ALLOCATION_SITE_TYPE:
10407 // AllocationSites are not cleared because they do not store
10408 // information that leaks.
10409 break;
10410 // Fall through...
10411 default:
10412 vector->set(i, TypeFeedbackVector::RawUninitializedSentinel(heap),
10413 SKIP_WRITE_BARRIER);
10414 }
10415 }
10416 }
10417 } 10406 }
10418 10407
10419 10408
10420 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) { 10409 BailoutId Code::TranslatePcOffsetToAstId(uint32_t pc_offset) {
10421 DisallowHeapAllocation no_gc; 10410 DisallowHeapAllocation no_gc;
10422 DCHECK(kind() == FUNCTION); 10411 DCHECK(kind() == FUNCTION);
10423 BackEdgeTable back_edges(this, &no_gc); 10412 BackEdgeTable back_edges(this, &no_gc);
10424 for (uint32_t i = 0; i < back_edges.length(); i++) { 10413 for (uint32_t i = 0; i < back_edges.length(); i++) {
10425 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i); 10414 if (back_edges.pc_offset(i) == pc_offset) return back_edges.ast_id(i);
10426 } 10415 }
(...skipping 5961 matching lines...) Expand 10 before | Expand all | Expand 10 after
16388 Handle<DependentCode> codes = 16377 Handle<DependentCode> codes =
16389 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), 16378 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()),
16390 DependentCode::kPropertyCellChangedGroup, 16379 DependentCode::kPropertyCellChangedGroup,
16391 info->object_wrapper()); 16380 info->object_wrapper());
16392 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 16381 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
16393 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 16382 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
16394 cell, info->zone()); 16383 cell, info->zone());
16395 } 16384 }
16396 16385
16397 } } // namespace v8::internal 16386 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698