| Index: src/typing.cc
 | 
| diff --git a/src/typing.cc b/src/typing.cc
 | 
| index d9420adb8ca2af8c20056cb7036d33fdfa2bd0a6..8487c05eb4af9fe472509c5afc34ae0eb1916053 100644
 | 
| --- a/src/typing.cc
 | 
| +++ b/src/typing.cc
 | 
| @@ -387,31 +387,35 @@ void AstTyper::VisitArrayLiteral(ArrayLiteral* expr) {
 | 
|  
 | 
|  
 | 
|  void AstTyper::VisitAssignment(Assignment* expr) {
 | 
| -  // TODO(rossberg): Can we clean this up?
 | 
| -  if (expr->is_compound()) {
 | 
| -    // Collect type feedback.
 | 
| -    Expression* target = expr->target();
 | 
| -    Property* prop = target->AsProperty();
 | 
| -    if (prop != NULL) {
 | 
| -      RECURSE(Visit(expr->target()));
 | 
| -      expr->RecordTypeFeedback(oracle(), zone());
 | 
| -    }
 | 
| -
 | 
| -    RECURSE(Visit(expr->binary_operation()));
 | 
| -
 | 
| -    NarrowType(expr, expr->binary_operation()->bounds());
 | 
| -  } else {
 | 
| -    // Collect type feedback.
 | 
| -    if (expr->target()->IsProperty()) {
 | 
| -      expr->RecordTypeFeedback(oracle(), zone());
 | 
| +  // Collect type feedback.
 | 
| +  Property* prop = expr->target()->AsProperty();
 | 
| +  if (prop != NULL) {
 | 
| +    TypeFeedbackId id = expr->AssignmentFeedbackId();
 | 
| +    expr->set_is_uninitialized(oracle()->StoreIsUninitialized(id));
 | 
| +    if (!expr->IsUninitialized()) {
 | 
| +      expr->set_is_pre_monomorphic(oracle()->StoreIsPreMonomorphic(id));
 | 
| +      expr->set_is_monomorphic(oracle()->StoreIsMonomorphicNormal(id));
 | 
| +      ASSERT(!expr->IsPreMonomorphic() || !expr->IsMonomorphic());
 | 
| +      if (prop->key()->IsPropertyName()) {
 | 
| +        Literal* lit_key = prop->key()->AsLiteral();
 | 
| +        ASSERT(lit_key != NULL && lit_key->value()->IsString());
 | 
| +        Handle<String> name = Handle<String>::cast(lit_key->value());
 | 
| +        oracle()->AssignmentReceiverTypes(id, name, expr->GetReceiverTypes());
 | 
| +      } else {
 | 
| +        KeyedAccessStoreMode store_mode;
 | 
| +        oracle()->KeyedAssignmentReceiverTypes(
 | 
| +            id, expr->GetReceiverTypes(), &store_mode);
 | 
| +        expr->set_store_mode(store_mode);
 | 
| +      }
 | 
|      }
 | 
| -
 | 
| -    RECURSE(Visit(expr->target()));
 | 
| -    RECURSE(Visit(expr->value()));
 | 
| -
 | 
| -    NarrowType(expr, expr->value()->bounds());
 | 
|    }
 | 
|  
 | 
| +  Expression* rhs =
 | 
| +      expr->is_compound() ? expr->binary_operation() : expr->value();
 | 
| +  RECURSE(Visit(expr->target()));
 | 
| +  RECURSE(Visit(rhs));
 | 
| +  NarrowType(expr, rhs->bounds());
 | 
| +
 | 
|    VariableProxy* proxy = expr->target()->AsVariableProxy();
 | 
|    if (proxy != NULL && proxy->var()->IsStackAllocated()) {
 | 
|      store_.Seq(variable_index(proxy->var()), Effect(expr->bounds()));
 | 
| 
 |