| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/ast.h" | 7 #include "src/ast.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 } | 99 } |
| 100 | 100 |
| 101 // If we can't find an IC, assume we've seen *something*, but we don't know | 101 // If we can't find an IC, assume we've seen *something*, but we don't know |
| 102 // what. PREMONOMORPHIC roughly encodes this meaning. | 102 // what. PREMONOMORPHIC roughly encodes this meaning. |
| 103 return PREMONOMORPHIC; | 103 return PREMONOMORPHIC; |
| 104 } | 104 } |
| 105 | 105 |
| 106 | 106 |
| 107 InlineCacheState TypeFeedbackOracle::LoadInlineCacheState( | 107 InlineCacheState TypeFeedbackOracle::LoadInlineCacheState( |
| 108 FeedbackVectorICSlot slot) { | 108 FeedbackVectorICSlot slot) { |
| 109 Code::Kind kind = feedback_vector_->GetKind(slot); | 109 if (!slot.IsInvalid()) { |
| 110 if (kind == Code::LOAD_IC) { | 110 Code::Kind kind = feedback_vector_->GetKind(slot); |
| 111 LoadICNexus nexus(feedback_vector_, slot); | 111 if (kind == Code::LOAD_IC) { |
| 112 return nexus.StateFromFeedback(); | 112 LoadICNexus nexus(feedback_vector_, slot); |
| 113 } else if (kind == Code::KEYED_LOAD_IC) { | 113 return nexus.StateFromFeedback(); |
| 114 KeyedLoadICNexus nexus(feedback_vector_, slot); | 114 } else if (kind == Code::KEYED_LOAD_IC) { |
| 115 return nexus.StateFromFeedback(); | 115 KeyedLoadICNexus nexus(feedback_vector_, slot); |
| 116 return nexus.StateFromFeedback(); |
| 117 } |
| 116 } | 118 } |
| 117 | 119 |
| 118 // If we can't find an IC, assume we've seen *something*, but we don't know | 120 // If we can't find an IC, assume we've seen *something*, but we don't know |
| 119 // what. PREMONOMORPHIC roughly encodes this meaning. | 121 // what. PREMONOMORPHIC roughly encodes this meaning. |
| 120 return PREMONOMORPHIC; | 122 return PREMONOMORPHIC; |
| 121 } | 123 } |
| 122 | 124 |
| 123 | 125 |
| 124 bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) { | 126 bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) { |
| 125 Handle<Object> maybe_code = GetInfo(ast_id); | 127 Handle<Object> maybe_code = GetInfo(ast_id); |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 all_strings &= receiver_types->at(i)->IsStringMap(); | 326 all_strings &= receiver_types->at(i)->IsStringMap(); |
| 325 } | 327 } |
| 326 return all_strings; | 328 return all_strings; |
| 327 } | 329 } |
| 328 | 330 |
| 329 | 331 |
| 330 void TypeFeedbackOracle::PropertyReceiverTypes(FeedbackVectorICSlot slot, | 332 void TypeFeedbackOracle::PropertyReceiverTypes(FeedbackVectorICSlot slot, |
| 331 Handle<Name> name, | 333 Handle<Name> name, |
| 332 SmallMapList* receiver_types) { | 334 SmallMapList* receiver_types) { |
| 333 receiver_types->Clear(); | 335 receiver_types->Clear(); |
| 334 LoadICNexus nexus(feedback_vector_, slot); | 336 if (!slot.IsInvalid()) { |
| 335 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); | 337 LoadICNexus nexus(feedback_vector_, slot); |
| 336 CollectReceiverTypes(&nexus, name, flags, receiver_types); | 338 Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); |
| 339 CollectReceiverTypes(&nexus, name, flags, receiver_types); |
| 340 } |
| 337 } | 341 } |
| 338 | 342 |
| 339 | 343 |
| 340 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( | 344 void TypeFeedbackOracle::KeyedPropertyReceiverTypes( |
| 341 FeedbackVectorICSlot slot, SmallMapList* receiver_types, bool* is_string, | 345 FeedbackVectorICSlot slot, SmallMapList* receiver_types, bool* is_string, |
| 342 IcCheckType* key_type) { | 346 IcCheckType* key_type) { |
| 343 receiver_types->Clear(); | 347 receiver_types->Clear(); |
| 344 KeyedLoadICNexus nexus(feedback_vector_, slot); | 348 if (slot.IsInvalid()) { |
| 345 CollectReceiverTypes<FeedbackNexus>(&nexus, receiver_types); | 349 *is_string = false; |
| 346 *is_string = HasOnlyStringMaps(receiver_types); | 350 *key_type = ELEMENT; |
| 347 *key_type = nexus.FindFirstName() != NULL ? PROPERTY : ELEMENT; | 351 } else { |
| 352 KeyedLoadICNexus nexus(feedback_vector_, slot); |
| 353 CollectReceiverTypes<FeedbackNexus>(&nexus, receiver_types); |
| 354 *is_string = HasOnlyStringMaps(receiver_types); |
| 355 *key_type = nexus.FindFirstName() != NULL ? PROPERTY : ELEMENT; |
| 356 } |
| 348 } | 357 } |
| 349 | 358 |
| 350 | 359 |
| 351 void TypeFeedbackOracle::AssignmentReceiverTypes(TypeFeedbackId id, | 360 void TypeFeedbackOracle::AssignmentReceiverTypes(TypeFeedbackId id, |
| 352 Handle<Name> name, | 361 Handle<Name> name, |
| 353 SmallMapList* receiver_types) { | 362 SmallMapList* receiver_types) { |
| 354 receiver_types->Clear(); | 363 receiver_types->Clear(); |
| 355 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); | 364 Code::Flags flags = Code::ComputeHandlerFlags(Code::STORE_IC); |
| 356 CollectReceiverTypes(id, name, flags, receiver_types); | 365 CollectReceiverTypes(id, name, flags, receiver_types); |
| 357 } | 366 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 // Dictionary has been allocated with sufficient size for all elements. | 524 // Dictionary has been allocated with sufficient size for all elements. |
| 516 DisallowHeapAllocation no_need_to_resize_dictionary; | 525 DisallowHeapAllocation no_need_to_resize_dictionary; |
| 517 HandleScope scope(isolate()); | 526 HandleScope scope(isolate()); |
| 518 USE(UnseededNumberDictionary::AtNumberPut( | 527 USE(UnseededNumberDictionary::AtNumberPut( |
| 519 dictionary_, IdToKey(ast_id), handle(target, isolate()))); | 528 dictionary_, IdToKey(ast_id), handle(target, isolate()))); |
| 520 } | 529 } |
| 521 | 530 |
| 522 | 531 |
| 523 } // namespace internal | 532 } // namespace internal |
| 524 } // namespace v8 | 533 } // namespace v8 |
| OLD | NEW |