Chromium Code Reviews| Index: src/ast.cc |
| diff --git a/src/ast.cc b/src/ast.cc |
| index cbadb75c61f3f58527dbcc612ae97fd0b30f4908..6d1dc12054419dc27e14c3f5a13fa90952d5e364 100644 |
| --- a/src/ast.cc |
| +++ b/src/ast.cc |
| @@ -646,8 +646,15 @@ void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| Literal* key = property->key()->AsLiteral(); |
| ASSERT(key != NULL && key->value()->IsString()); |
| Handle<String> name = Handle<String>::cast(key->value()); |
| + check_type_ = oracle->GetCallCheckType(this); |
| receiver_types_.Clear(); |
| - oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_); |
| + if (check_type_ == RECEIVER_MAP_CHECK) { |
| + oracle->CallReceiverTypes(this, name, call_kind, &receiver_types_); |
| + is_monomorphic_ = is_monomorphic_ && receiver_types_.length() > 0; |
| + } else { |
| + holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate()); |
|
Michael Starzinger
2013/09/06 09:34:40
Does it hold that "receiver_types_.IsEmpty()" down
Toon Verwaest
2013/09/06 11:24:28
The receiver_types_ are Clear()ed right above, so
|
| + receiver_types_.Add(handle(holder_->map()), oracle->zone()); |
| + } |
| #ifdef DEBUG |
| if (FLAG_enable_slow_asserts) { |
| int length = receiver_types_.length(); |
| @@ -657,17 +664,8 @@ void Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| } |
| } |
| #endif |
| - check_type_ = oracle->GetCallCheckType(this); |
| if (is_monomorphic_) { |
| - Handle<Map> map; |
| - if (receiver_types_.length() > 0) { |
| - ASSERT(check_type_ == RECEIVER_MAP_CHECK); |
| - map = receiver_types_.at(0); |
| - } else { |
| - ASSERT(check_type_ != RECEIVER_MAP_CHECK); |
| - holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate()); |
| - map = Handle<Map>(holder_->map()); |
| - } |
| + Handle<Map> map = receiver_types_.first(); |
| is_monomorphic_ = ComputeTarget(map, name); |
| } |
| } |