| Index: src/ast.cc
|
| diff --git a/src/ast.cc b/src/ast.cc
|
| index b966cc3d2db9582cc67cfcab7d7ad1d634cdf8a1..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());
|
| + 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);
|
| }
|
| }
|
| @@ -1085,7 +1083,7 @@ CaseClause::CaseClause(Isolate* isolate,
|
| #define DONT_OPTIMIZE_NODE(NodeType) \
|
| void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
|
| increase_node_count(); \
|
| - add_flag(kDontOptimize); \
|
| + set_dont_optimize_reason(k##NodeType); \
|
| add_flag(kDontInline); \
|
| add_flag(kDontSelfOptimize); \
|
| }
|
| @@ -1097,7 +1095,7 @@ CaseClause::CaseClause(Isolate* isolate,
|
| #define DONT_CACHE_NODE(NodeType) \
|
| void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
|
| increase_node_count(); \
|
| - add_flag(kDontOptimize); \
|
| + set_dont_optimize_reason(k##NodeType); \
|
| add_flag(kDontInline); \
|
| add_flag(kDontSelfOptimize); \
|
| add_flag(kDontCache); \
|
|
|