Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index d6b8d64db67893b77badd7795c404ee9362531e8..7840bbf58bb6bc9f8f78cee59bfcca29266519a4 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -4990,12 +4990,20 @@ void HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr, |
| HInstruction* instr = NULL; |
| SmallMapList* types = expr->GetReceiverTypes(); |
| + |
| bool monomorphic = expr->IsMonomorphic(); |
| + if (types != NULL && object->HasMonomorphicJSObjectType()) { |
| + types->FilterForPossibleTransitions( |
| + object->GetMonomorphicJSObjectMap()->FindRootMap(), zone()); |
| + monomorphic = types->length() == 1; |
| + } |
| + |
| Handle<Map> map; |
| if (monomorphic) { |
| map = types->first(); |
| monomorphic = CanInlinePropertyAccess(*map); |
| } |
| + |
| if (monomorphic) { |
| Handle<JSFunction> setter; |
| Handle<JSObject> holder; |
| @@ -5692,7 +5700,16 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
| bool* has_side_effects) { |
| ASSERT(!expr->IsPropertyName()); |
| HInstruction* instr = NULL; |
| - if (expr->IsMonomorphic()) { |
| + bool monomorphic = expr->IsMonomorphic(); |
| + SmallMapList* types = expr->GetReceiverTypes(); |
| + |
| + if (types != NULL && obj->HasMonomorphicJSObjectType()) { |
|
Michael Starzinger
2013/09/05 20:07:23
suggestion: Does it make sense to factor this out
Toon Verwaest
2013/09/06 09:23:12
Done.
|
| + types->FilterForPossibleTransitions( |
| + obj->GetMonomorphicJSObjectMap()->FindRootMap(), zone()); |
| + monomorphic = types->length() == 1; |
| + } |
| + |
| + if (monomorphic) { |
| Handle<Map> map = expr->GetMonomorphicReceiverType(); |
| if (map->has_slow_elements_kind()) { |
| instr = is_store ? BuildStoreKeyedGeneric(obj, key, val) |
| @@ -5861,15 +5878,19 @@ void HOptimizedGraphBuilder::BuildLoad(Property* expr, |
| SmallMapList* types = expr->GetReceiverTypes(); |
| HValue* object = Top(); |
| + bool monomorphic = expr->IsMonomorphic(); |
| + if (types != NULL && object->HasMonomorphicJSObjectType()) { |
| + types->FilterForPossibleTransitions( |
| + object->GetMonomorphicJSObjectMap()->FindRootMap(), zone()); |
| + monomorphic = types->length() == 1; |
| + } |
| + |
| Handle<Map> map; |
| - bool monomorphic = false; |
| - if (expr->IsMonomorphic()) { |
| + if (monomorphic) { |
| map = types->first(); |
| monomorphic = CanInlinePropertyAccess(*map); |
| - } else if (object->HasMonomorphicJSObjectType()) { |
| - map = object->GetMonomorphicJSObjectMap(); |
| - monomorphic = CanInlinePropertyAccess(*map); |
| } |
| + |
| if (monomorphic) { |
| Handle<JSFunction> getter; |
| Handle<JSObject> holder; |
| @@ -6967,7 +6988,18 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
| SmallMapList* types = expr->GetReceiverTypes(); |
| + |
|
Michael Starzinger
2013/09/05 20:07:23
nit: Drop one of the two empty newlines.
|
| + HValue* receiver = |
| + environment()->ExpressionStackAt(expr->arguments()->length()); |
| + |
| bool monomorphic = expr->IsMonomorphic(); |
| + if (types != NULL && receiver->HasMonomorphicJSObjectType()) { |
| + types->FilterForPossibleTransitions( |
| + receiver->GetMonomorphicJSObjectMap()->FindRootMap(), zone()); |
| + monomorphic = types->length() == 1 && |
| + expr->ComputeTarget(types->at(0), name); |
| + } |
| + |
| Handle<Map> receiver_map; |
| if (monomorphic) { |
| receiver_map = (types == NULL || types->is_empty()) |
|
Michael Starzinger
2013/09/05 20:07:23
I know it's not part of this change, but can "type
|
| @@ -6975,8 +7007,6 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| : types->first(); |
| } |
| - HValue* receiver = |
| - environment()->ExpressionStackAt(expr->arguments()->length()); |
| if (monomorphic) { |
| if (TryInlineBuiltinMethodCall(expr, |
| receiver, |