Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/type-feedback-vector.h" | 5 #include "src/type-feedback-vector.h" |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/ic/ic-inl.h" | 8 #include "src/ic/ic-inl.h" |
| 9 #include "src/ic/ic-state.h" | 9 #include "src/ic/ic-state.h" |
| 10 #include "src/objects.h" | 10 #include "src/objects.h" |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 190 const int length = slot_count + kReservedIndexCount; | 190 const int length = slot_count + kReservedIndexCount; |
| 191 if (length == kReservedIndexCount) { | 191 if (length == kReservedIndexCount) { |
| 192 return Handle<TypeFeedbackVector>::cast( | 192 return Handle<TypeFeedbackVector>::cast( |
| 193 factory->empty_type_feedback_vector()); | 193 factory->empty_type_feedback_vector()); |
| 194 } | 194 } |
| 195 | 195 |
| 196 Handle<FixedArray> array = factory->NewFixedArray(length, TENURED); | 196 Handle<FixedArray> array = factory->NewFixedArray(length, TENURED); |
| 197 array->set_map_no_write_barrier(isolate->heap()->type_feedback_vector_map()); | 197 array->set_map_no_write_barrier(isolate->heap()->type_feedback_vector_map()); |
| 198 array->set(kMetadataIndex, *metadata); | 198 array->set(kMetadataIndex, *metadata); |
| 199 array->set(kInvocationCountIndex, Smi::kZero); | 199 array->set(kInvocationCountIndex, Smi::kZero); |
| 200 for (int i = 0; i < slot_count;) { | |
|
mvstanton
2017/02/01 15:57:12
Actually if you can keep this here I'd prefer it,
Igor Sheludko
2017/02/01 16:10:01
As discussed offline, we should better remove the
| |
| 201 FeedbackVectorSlot slot(i); | |
| 202 FeedbackVectorSlotKind kind = metadata->GetKind(slot); | |
| 203 int index = TypeFeedbackVector::GetIndex(slot); | |
| 204 int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); | |
| 205 | |
| 206 if (kind == FeedbackVectorSlotKind::CREATE_CLOSURE) { | |
| 207 // TODO(mvstanton): Root feedback vectors in this location. | |
| 208 array->set(index, *factory->empty_type_feedback_vector(), | |
| 209 SKIP_WRITE_BARRIER); | |
| 210 } | |
| 211 i += entry_size; | |
| 212 } | |
| 213 | 200 |
| 214 DisallowHeapAllocation no_gc; | 201 DisallowHeapAllocation no_gc; |
| 215 | 202 |
| 216 // Ensure we can skip the write barrier | 203 // Ensure we can skip the write barrier |
| 217 Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); | 204 Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); |
| 218 Handle<Oddball> undefined_value = factory->undefined_value(); | 205 Handle<Oddball> undefined_value = factory->undefined_value(); |
| 219 DCHECK_EQ(isolate->heap()->uninitialized_symbol(), *uninitialized_sentinel); | 206 DCHECK_EQ(isolate->heap()->uninitialized_symbol(), *uninitialized_sentinel); |
| 220 for (int i = 0; i < slot_count;) { | 207 for (int i = 0; i < slot_count;) { |
| 221 FeedbackVectorSlot slot(i); | 208 FeedbackVectorSlot slot(i); |
| 222 FeedbackVectorSlotKind kind = metadata->GetKind(slot); | 209 FeedbackVectorSlotKind kind = metadata->GetKind(slot); |
| 223 int index = TypeFeedbackVector::GetIndex(slot); | 210 int index = TypeFeedbackVector::GetIndex(slot); |
| 224 int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); | 211 int entry_size = TypeFeedbackMetadata::GetSlotSize(kind); |
| 225 | 212 |
| 226 Object* value; | 213 Object* value; |
| 227 if (kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC) { | 214 Object* extra_value = *uninitialized_sentinel; |
| 228 value = isolate->heap()->empty_weak_cell(); | 215 switch (kind) { |
| 229 } else if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC || | 216 case FeedbackVectorSlotKind::LOAD_GLOBAL_IC: |
| 230 kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC) { | 217 value = isolate->heap()->empty_weak_cell(); |
| 231 value = Smi::kZero; | 218 break; |
| 232 } else if (kind == FeedbackVectorSlotKind::LITERAL) { | 219 case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC: |
| 233 value = *undefined_value; | 220 case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC: |
| 234 } else { | 221 value = Smi::kZero; |
| 235 value = *uninitialized_sentinel; | 222 break; |
| 223 case FeedbackVectorSlotKind::CREATE_CLOSURE: | |
| 224 // TODO(mvstanton): Root feedback vectors in this location. | |
| 225 value = isolate->heap()->empty_type_feedback_vector(); | |
| 226 break; | |
| 227 case FeedbackVectorSlotKind::LITERAL: | |
| 228 value = *undefined_value; | |
| 229 break; | |
| 230 case FeedbackVectorSlotKind::CALL_IC: | |
| 231 value = *uninitialized_sentinel; | |
| 232 extra_value = Smi::kZero; | |
| 233 break; | |
| 234 case FeedbackVectorSlotKind::LOAD_IC: | |
| 235 case FeedbackVectorSlotKind::KEYED_LOAD_IC: | |
| 236 case FeedbackVectorSlotKind::STORE_IC: | |
| 237 case FeedbackVectorSlotKind::KEYED_STORE_IC: | |
| 238 case FeedbackVectorSlotKind::STORE_DATA_PROPERTY_IN_LITERAL_IC: | |
| 239 case FeedbackVectorSlotKind::GENERAL: | |
| 240 value = *uninitialized_sentinel; | |
| 241 break; | |
| 242 | |
| 243 case FeedbackVectorSlotKind::INVALID: | |
| 244 case FeedbackVectorSlotKind::KINDS_NUMBER: | |
| 245 UNREACHABLE(); | |
| 246 value = Smi::kZero; | |
| 247 break; | |
| 236 } | 248 } |
| 237 | 249 array->set(index, value, SKIP_WRITE_BARRIER); |
| 238 if (kind != FeedbackVectorSlotKind::CREATE_CLOSURE) { | 250 for (int j = 1; j < entry_size; j++) { |
| 239 array->set(index, value, SKIP_WRITE_BARRIER); | 251 array->set(index + j, extra_value, SKIP_WRITE_BARRIER); |
| 240 value = kind == FeedbackVectorSlotKind::CALL_IC ? Smi::kZero | |
| 241 : *uninitialized_sentinel; | |
| 242 for (int j = 1; j < entry_size; j++) { | |
| 243 array->set(index + j, value, SKIP_WRITE_BARRIER); | |
| 244 } | |
| 245 } | 252 } |
| 246 i += entry_size; | 253 i += entry_size; |
| 247 } | 254 } |
| 248 return Handle<TypeFeedbackVector>::cast(array); | 255 return Handle<TypeFeedbackVector>::cast(array); |
| 249 } | 256 } |
| 250 | 257 |
| 251 // static | 258 // static |
| 252 Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( | 259 Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( |
| 253 Isolate* isolate, Handle<TypeFeedbackVector> vector) { | 260 Isolate* isolate, Handle<TypeFeedbackVector> vector) { |
| 254 Handle<TypeFeedbackVector> result; | 261 Handle<TypeFeedbackVector> result; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 void FeedbackNexus::ConfigurePremonomorphic() { | 418 void FeedbackNexus::ConfigurePremonomorphic() { |
| 412 SetFeedback(*TypeFeedbackVector::PremonomorphicSentinel(GetIsolate()), | 419 SetFeedback(*TypeFeedbackVector::PremonomorphicSentinel(GetIsolate()), |
| 413 SKIP_WRITE_BARRIER); | 420 SKIP_WRITE_BARRIER); |
| 414 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), | 421 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(GetIsolate()), |
| 415 SKIP_WRITE_BARRIER); | 422 SKIP_WRITE_BARRIER); |
| 416 } | 423 } |
| 417 | 424 |
| 418 | 425 |
| 419 void FeedbackNexus::ConfigureMegamorphic() { | 426 void FeedbackNexus::ConfigureMegamorphic() { |
| 420 // Keyed ICs must use ConfigureMegamorphicKeyed. | 427 // Keyed ICs must use ConfigureMegamorphicKeyed. |
| 421 DCHECK_NE(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector()->GetKind(slot())); | 428 DCHECK(!vector()->IsKeyedLoadIC(slot())); |
| 422 DCHECK_NE(FeedbackVectorSlotKind::KEYED_STORE_IC, vector()->GetKind(slot())); | 429 DCHECK(!vector()->IsKeyedStoreIC(slot())); |
| 423 | 430 |
| 424 Isolate* isolate = GetIsolate(); | 431 Isolate* isolate = GetIsolate(); |
| 425 SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate), | 432 SetFeedback(*TypeFeedbackVector::MegamorphicSentinel(isolate), |
| 426 SKIP_WRITE_BARRIER); | 433 SKIP_WRITE_BARRIER); |
| 427 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(isolate), | 434 SetFeedbackExtra(*TypeFeedbackVector::UninitializedSentinel(isolate), |
| 428 SKIP_WRITE_BARRIER); | 435 SKIP_WRITE_BARRIER); |
| 429 } | 436 } |
| 430 | 437 |
| 431 void KeyedLoadICNexus::ConfigureMegamorphicKeyed(IcCheckType property_type) { | 438 void KeyedLoadICNexus::ConfigureMegamorphicKeyed(IcCheckType property_type) { |
| 432 Isolate* isolate = GetIsolate(); | 439 Isolate* isolate = GetIsolate(); |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1034 void StoreDataPropertyInLiteralICNexus::ConfigureMonomorphic( | 1041 void StoreDataPropertyInLiteralICNexus::ConfigureMonomorphic( |
| 1035 Handle<Name> name, Handle<Map> receiver_map) { | 1042 Handle<Name> name, Handle<Map> receiver_map) { |
| 1036 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); | 1043 Handle<WeakCell> cell = Map::WeakCellForMap(receiver_map); |
| 1037 | 1044 |
| 1038 SetFeedback(*cell); | 1045 SetFeedback(*cell); |
| 1039 SetFeedbackExtra(*name); | 1046 SetFeedbackExtra(*name); |
| 1040 } | 1047 } |
| 1041 | 1048 |
| 1042 } // namespace internal | 1049 } // namespace internal |
| 1043 } // namespace v8 | 1050 } // namespace v8 |
| OLD | NEW |