| OLD | NEW | 
|      1 // Copyright 2012 the V8 project authors. All rights reserved. |      1 // Copyright 2012 the V8 project authors. All rights reserved. | 
|      2 // Redistribution and use in source and binary forms, with or without |      2 // Redistribution and use in source and binary forms, with or without | 
|      3 // modification, are permitted provided that the following conditions are |      3 // modification, are permitted provided that the following conditions are | 
|      4 // met: |      4 // met: | 
|      5 // |      5 // | 
|      6 //     * Redistributions of source code must retain the above copyright |      6 //     * Redistributions of source code must retain the above copyright | 
|      7 //       notice, this list of conditions and the following disclaimer. |      7 //       notice, this list of conditions and the following disclaimer. | 
|      8 //     * Redistributions in binary form must reproduce the above |      8 //     * Redistributions in binary form must reproduce the above | 
|      9 //       copyright notice, this list of conditions and the following |      9 //       copyright notice, this list of conditions and the following | 
|     10 //       disclaimer in the documentation and/or other materials provided |     10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 6363 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   6374     instr = new(zone()) HLoadNamedFieldPolymorphic( |   6374     instr = new(zone()) HLoadNamedFieldPolymorphic( | 
|   6375         context, object, types, name, zone()); |   6375         context, object, types, name, zone()); | 
|   6376   } |   6376   } | 
|   6377  |   6377  | 
|   6378   instr->set_position(expr->position()); |   6378   instr->set_position(expr->position()); | 
|   6379   return ast_context()->ReturnInstruction(instr, expr->id()); |   6379   return ast_context()->ReturnInstruction(instr, expr->id()); | 
|   6380 } |   6380 } | 
|   6381  |   6381  | 
|   6382  |   6382  | 
|   6383 bool HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic( |   6383 bool HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic( | 
|   6384     Assignment* expr, |   6384     int position, | 
 |   6385     BailoutId assignment_id, | 
|   6385     HValue* object, |   6386     HValue* object, | 
|   6386     HValue* value, |   6387     HValue* value, | 
|   6387     SmallMapList* types, |   6388     SmallMapList* types, | 
|   6388     Handle<String> name) { |   6389     Handle<String> name) { | 
|   6389   // Use monomorphic store if property lookup results in the same field index |   6390   // Use monomorphic store if property lookup results in the same field index | 
|   6390   // for all maps. Requires special map check on the set of all handled maps. |   6391   // for all maps. Requires special map check on the set of all handled maps. | 
|   6391   if (types->length() > kMaxStorePolymorphism) return false; |   6392   if (types->length() > kMaxStorePolymorphism) return false; | 
|   6392  |   6393  | 
|   6393   // TODO(verwaest): Merge the checking logic with the code in |   6394   // TODO(verwaest): Merge the checking logic with the code in | 
|   6394   // TryLoadPolymorphicAsMonomorphic. |   6395   // TryLoadPolymorphicAsMonomorphic. | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|   6425  |   6426  | 
|   6426   // Everything matched; can use monomorphic store. |   6427   // Everything matched; can use monomorphic store. | 
|   6427   BuildCheckNonSmi(object); |   6428   BuildCheckNonSmi(object); | 
|   6428   AddInstruction(HCheckMaps::New(object, types, zone())); |   6429   AddInstruction(HCheckMaps::New(object, types, zone())); | 
|   6429   HInstruction* store; |   6430   HInstruction* store; | 
|   6430   CHECK_ALIVE_OR_RETURN( |   6431   CHECK_ALIVE_OR_RETURN( | 
|   6431       store = BuildStoreNamedField( |   6432       store = BuildStoreNamedField( | 
|   6432           object, name, value, types->at(count - 1), &lookup), |   6433           object, name, value, types->at(count - 1), &lookup), | 
|   6433       true); |   6434       true); | 
|   6434   Push(value); |   6435   Push(value); | 
|   6435   store->set_position(expr->position()); |   6436   store->set_position(position); | 
|   6436   AddInstruction(store); |   6437   AddInstruction(store); | 
|   6437   AddSimulate(expr->AssignmentId()); |   6438   AddSimulate(assignment_id); | 
|   6438   ast_context()->ReturnValue(Pop()); |   6439   ast_context()->ReturnValue(Pop()); | 
|   6439   return true; |   6440   return true; | 
|   6440 } |   6441 } | 
|   6441  |   6442  | 
|   6442  |   6443  | 
|   6443 void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |   6444 void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( | 
|   6444     Assignment* expr, |   6445     BailoutId id, | 
 |   6446     int position, | 
 |   6447     BailoutId assignment_id, | 
|   6445     HValue* object, |   6448     HValue* object, | 
|   6446     HValue* value, |   6449     HValue* value, | 
|   6447     SmallMapList* types, |   6450     SmallMapList* types, | 
|   6448     Handle<String> name) { |   6451     Handle<String> name) { | 
|   6449   if (TryStorePolymorphicAsMonomorphic(expr, object, value, types, name)) { |   6452   if (TryStorePolymorphicAsMonomorphic( | 
 |   6453           position, assignment_id, object, value, types, name)) { | 
|   6450     return; |   6454     return; | 
|   6451   } |   6455   } | 
|   6452  |   6456  | 
|   6453   // TODO(ager): We should recognize when the prototype chains for different |   6457   // TODO(ager): We should recognize when the prototype chains for different | 
|   6454   // maps are identical. In that case we can avoid repeatedly generating the |   6458   // maps are identical. In that case we can avoid repeatedly generating the | 
|   6455   // same prototype map checks. |   6459   // same prototype map checks. | 
|   6456   int count = 0; |   6460   int count = 0; | 
|   6457   HBasicBlock* join = NULL; |   6461   HBasicBlock* join = NULL; | 
|   6458   for (int i = 0; i < types->length() && count < kMaxStorePolymorphism; ++i) { |   6462   for (int i = 0; i < types->length() && count < kMaxStorePolymorphism; ++i) { | 
|   6459     Handle<Map> map = types->at(i); |   6463     Handle<Map> map = types->at(i); | 
|   6460     LookupResult lookup(isolate()); |   6464     LookupResult lookup(isolate()); | 
|   6461     if (ComputeLoadStoreField(map, name, &lookup, true)) { |   6465     if (ComputeLoadStoreField(map, name, &lookup, true)) { | 
|   6462       if (count == 0) { |   6466       if (count == 0) { | 
|   6463         BuildCheckNonSmi(object); |   6467         BuildCheckNonSmi(object); | 
|   6464         join = graph()->CreateBasicBlock(); |   6468         join = graph()->CreateBasicBlock(); | 
|   6465       } |   6469       } | 
|   6466       ++count; |   6470       ++count; | 
|   6467       HBasicBlock* if_true = graph()->CreateBasicBlock(); |   6471       HBasicBlock* if_true = graph()->CreateBasicBlock(); | 
|   6468       HBasicBlock* if_false = graph()->CreateBasicBlock(); |   6472       HBasicBlock* if_false = graph()->CreateBasicBlock(); | 
|   6469       HCompareMap* compare = |   6473       HCompareMap* compare = | 
|   6470           new(zone()) HCompareMap(object, map, if_true, if_false); |   6474           new(zone()) HCompareMap(object, map, if_true, if_false); | 
|   6471       current_block()->Finish(compare); |   6475       current_block()->Finish(compare); | 
|   6472  |   6476  | 
|   6473       set_current_block(if_true); |   6477       set_current_block(if_true); | 
|   6474       HInstruction* instr; |   6478       HInstruction* instr; | 
|   6475       CHECK_ALIVE( |   6479       CHECK_ALIVE( | 
|   6476           instr = BuildStoreNamedField(object, name, value, map, &lookup)); |   6480           instr = BuildStoreNamedField(object, name, value, map, &lookup)); | 
|   6477       instr->set_position(expr->position()); |   6481       instr->set_position(position); | 
|   6478       // Goto will add the HSimulate for the store. |   6482       // Goto will add the HSimulate for the store. | 
|   6479       AddInstruction(instr); |   6483       AddInstruction(instr); | 
|   6480       if (!ast_context()->IsEffect()) Push(value); |   6484       if (!ast_context()->IsEffect()) Push(value); | 
|   6481       current_block()->Goto(join); |   6485       current_block()->Goto(join); | 
|   6482  |   6486  | 
|   6483       set_current_block(if_false); |   6487       set_current_block(if_false); | 
|   6484     } |   6488     } | 
|   6485   } |   6489   } | 
|   6486  |   6490  | 
|   6487   // Finish up.  Unconditionally deoptimize if we've handled all the maps we |   6491   // Finish up.  Unconditionally deoptimize if we've handled all the maps we | 
|   6488   // know about and do not want to handle ones we've never seen.  Otherwise |   6492   // know about and do not want to handle ones we've never seen.  Otherwise | 
|   6489   // use a generic IC. |   6493   // use a generic IC. | 
|   6490   if (count == types->length() && FLAG_deoptimize_uncommon_cases) { |   6494   if (count == types->length() && FLAG_deoptimize_uncommon_cases) { | 
|   6491     current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); |   6495     current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); | 
|   6492   } else { |   6496   } else { | 
|   6493     HInstruction* instr = BuildStoreNamedGeneric(object, name, value); |   6497     HInstruction* instr = BuildStoreNamedGeneric(object, name, value); | 
|   6494     instr->set_position(expr->position()); |   6498     instr->set_position(position); | 
|   6495     AddInstruction(instr); |   6499     AddInstruction(instr); | 
|   6496  |   6500  | 
|   6497     if (join != NULL) { |   6501     if (join != NULL) { | 
|   6498       if (!ast_context()->IsEffect()) Push(value); |   6502       if (!ast_context()->IsEffect()) Push(value); | 
|   6499       current_block()->Goto(join); |   6503       current_block()->Goto(join); | 
|   6500     } else { |   6504     } else { | 
|   6501       // The HSimulate for the store should not see the stored value in |   6505       // The HSimulate for the store should not see the stored value in | 
|   6502       // effect contexts (it is not materialized at expr->id() in the |   6506       // effect contexts (it is not materialized at expr->id() in the | 
|   6503       // unoptimized code). |   6507       // unoptimized code). | 
|   6504       if (instr->HasObservableSideEffects()) { |   6508       if (instr->HasObservableSideEffects()) { | 
|   6505         if (ast_context()->IsEffect()) { |   6509         if (ast_context()->IsEffect()) { | 
|   6506           AddSimulate(expr->id(), REMOVABLE_SIMULATE); |   6510           AddSimulate(id, REMOVABLE_SIMULATE); | 
|   6507         } else { |   6511         } else { | 
|   6508           Push(value); |   6512           Push(value); | 
|   6509           AddSimulate(expr->id(), REMOVABLE_SIMULATE); |   6513           AddSimulate(id, REMOVABLE_SIMULATE); | 
|   6510           Drop(1); |   6514           Drop(1); | 
|   6511         } |   6515         } | 
|   6512       } |   6516       } | 
|   6513       return ast_context()->ReturnValue(value); |   6517       return ast_context()->ReturnValue(value); | 
|   6514     } |   6518     } | 
|   6515   } |   6519   } | 
|   6516  |   6520  | 
|   6517   ASSERT(join != NULL); |   6521   ASSERT(join != NULL); | 
|   6518   join->SetJoinId(expr->id()); |   6522   join->SetJoinId(id); | 
|   6519   set_current_block(join); |   6523   set_current_block(join); | 
|   6520   if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); |   6524   if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop()); | 
|   6521 } |   6525 } | 
|   6522  |   6526  | 
|   6523  |   6527  | 
|   6524 void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |   6528 void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) { | 
|   6525   Property* prop = expr->target()->AsProperty(); |   6529   Property* prop = expr->target()->AsProperty(); | 
|   6526   ASSERT(prop != NULL); |   6530   ASSERT(prop != NULL); | 
|   6527   CHECK_ALIVE(VisitForValue(prop->obj())); |   6531   CHECK_ALIVE(VisitForValue(prop->obj())); | 
|   6528  |   6532  | 
|   6529   if (prop->key()->IsPropertyName()) { |   6533   if (prop->key()->IsPropertyName()) { | 
|   6530     // Named store. |   6534     // Named store. | 
|   6531     CHECK_ALIVE(VisitForValue(expr->value())); |   6535     CHECK_ALIVE(VisitForValue(expr->value())); | 
|   6532     HValue* value = environment()->ExpressionStackAt(0); |   6536     HValue* value = environment()->ExpressionStackAt(0); | 
|   6533     HValue* object = environment()->ExpressionStackAt(1); |   6537     HValue* object = environment()->ExpressionStackAt(1); | 
|   6534  |   6538  | 
|   6535     Literal* key = prop->key()->AsLiteral(); |   6539     return BuildStoreNamed(expr, expr->id(), expr->position(), | 
|   6536     Handle<String> name = Handle<String>::cast(key->handle()); |   6540                            expr->AssignmentId(), prop, object, value); | 
|   6537     ASSERT(!name.is_null()); |  | 
|   6538  |  | 
|   6539     HInstruction* instr = NULL; |  | 
|   6540     SmallMapList* types = expr->GetReceiverTypes(); |  | 
|   6541     bool monomorphic = expr->IsMonomorphic(); |  | 
|   6542     Handle<Map> map; |  | 
|   6543     if (monomorphic) { |  | 
|   6544       map = types->first(); |  | 
|   6545       if (map->is_dictionary_map()) monomorphic = false; |  | 
|   6546     } |  | 
|   6547     if (monomorphic) { |  | 
|   6548       Handle<JSFunction> setter; |  | 
|   6549       Handle<JSObject> holder; |  | 
|   6550       if (LookupSetter(map, name, &setter, &holder)) { |  | 
|   6551         AddCheckConstantFunction(holder, object, map); |  | 
|   6552         if (FLAG_inline_accessors && TryInlineSetter(setter, expr, value)) { |  | 
|   6553           return; |  | 
|   6554         } |  | 
|   6555         Drop(2); |  | 
|   6556         AddInstruction(new(zone()) HPushArgument(object)); |  | 
|   6557         AddInstruction(new(zone()) HPushArgument(value)); |  | 
|   6558         instr = new(zone()) HCallConstantFunction(setter, 2); |  | 
|   6559       } else { |  | 
|   6560         Drop(2); |  | 
|   6561         CHECK_ALIVE(instr = BuildStoreNamedMonomorphic(object, |  | 
|   6562                                                        name, |  | 
|   6563                                                        value, |  | 
|   6564                                                        map)); |  | 
|   6565       } |  | 
|   6566  |  | 
|   6567     } else if (types != NULL && types->length() > 1) { |  | 
|   6568       Drop(2); |  | 
|   6569       return HandlePolymorphicStoreNamedField(expr, object, value, types, name); |  | 
|   6570     } else { |  | 
|   6571       Drop(2); |  | 
|   6572       instr = BuildStoreNamedGeneric(object, name, value); |  | 
|   6573     } |  | 
|   6574  |  | 
|   6575     Push(value); |  | 
|   6576     instr->set_position(expr->position()); |  | 
|   6577     AddInstruction(instr); |  | 
|   6578     if (instr->HasObservableSideEffects()) { |  | 
|   6579       AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |  | 
|   6580     } |  | 
|   6581     return ast_context()->ReturnValue(Pop()); |  | 
|   6582  |  | 
|   6583   } else { |   6541   } else { | 
|   6584     // Keyed store. |   6542     // Keyed store. | 
|   6585     CHECK_ALIVE(VisitForValue(prop->key())); |   6543     CHECK_ALIVE(VisitForValue(prop->key())); | 
|   6586     CHECK_ALIVE(VisitForValue(expr->value())); |   6544     CHECK_ALIVE(VisitForValue(expr->value())); | 
|   6587     HValue* value = environment()->ExpressionStackAt(0); |   6545     HValue* value = environment()->ExpressionStackAt(0); | 
|   6588     HValue* key = environment()->ExpressionStackAt(1); |   6546     HValue* key = environment()->ExpressionStackAt(1); | 
|   6589     HValue* object = environment()->ExpressionStackAt(2); |   6547     HValue* object = environment()->ExpressionStackAt(2); | 
|   6590     bool has_side_effects = false; |   6548     bool has_side_effects = false; | 
|   6591     HandleKeyedElementAccess(object, key, value, expr, expr->AssignmentId(), |   6549     HandleKeyedElementAccess(object, key, value, expr, expr->AssignmentId(), | 
|   6592                              expr->position(), |   6550                              expr->position(), | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   6631                                         value, |   6589                                         value, | 
|   6632                                         function_strict_mode_flag()); |   6590                                         function_strict_mode_flag()); | 
|   6633     instr->set_position(position); |   6591     instr->set_position(position); | 
|   6634     AddInstruction(instr); |   6592     AddInstruction(instr); | 
|   6635     ASSERT(instr->HasObservableSideEffects()); |   6593     ASSERT(instr->HasObservableSideEffects()); | 
|   6636     AddSimulate(ast_id, REMOVABLE_SIMULATE); |   6594     AddSimulate(ast_id, REMOVABLE_SIMULATE); | 
|   6637   } |   6595   } | 
|   6638 } |   6596 } | 
|   6639  |   6597  | 
|   6640  |   6598  | 
 |   6599 void HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr, | 
 |   6600                                              BailoutId id, | 
 |   6601                                              int position, | 
 |   6602                                              BailoutId assignment_id, | 
 |   6603                                              Property* prop, | 
 |   6604                                              HValue* object, | 
 |   6605                                              HValue* value) { | 
 |   6606   Literal* key = prop->key()->AsLiteral(); | 
 |   6607   Handle<String> name = Handle<String>::cast(key->handle()); | 
 |   6608   ASSERT(!name.is_null()); | 
 |   6609  | 
 |   6610   HInstruction* instr = NULL; | 
 |   6611   SmallMapList* types = expr->GetReceiverTypes(); | 
 |   6612   bool monomorphic = expr->IsMonomorphic(); | 
 |   6613   Handle<Map> map; | 
 |   6614   if (monomorphic) { | 
 |   6615     map = types->first(); | 
 |   6616     if (map->is_dictionary_map()) monomorphic = false; | 
 |   6617   } | 
 |   6618   if (monomorphic) { | 
 |   6619     Handle<JSFunction> setter; | 
 |   6620     Handle<JSObject> holder; | 
 |   6621     if (LookupSetter(map, name, &setter, &holder)) { | 
 |   6622       AddCheckConstantFunction(holder, object, map); | 
 |   6623       if (FLAG_inline_accessors && | 
 |   6624           TryInlineSetter(setter, id, assignment_id, value)) { | 
 |   6625         return; | 
 |   6626       } | 
 |   6627       Drop(2); | 
 |   6628       AddInstruction(new(zone()) HPushArgument(object)); | 
 |   6629       AddInstruction(new(zone()) HPushArgument(value)); | 
 |   6630       instr = new(zone()) HCallConstantFunction(setter, 2); | 
 |   6631     } else { | 
 |   6632       Drop(2); | 
 |   6633       CHECK_ALIVE(instr = BuildStoreNamedMonomorphic(object, | 
 |   6634                                                      name, | 
 |   6635                                                      value, | 
 |   6636                                                      map)); | 
 |   6637     } | 
 |   6638  | 
 |   6639   } else if (types != NULL && types->length() > 1) { | 
 |   6640     Drop(2); | 
 |   6641     return HandlePolymorphicStoreNamedField( | 
 |   6642         id, position, assignment_id, object, value, types, name); | 
 |   6643   } else { | 
 |   6644     Drop(2); | 
 |   6645     instr = BuildStoreNamedGeneric(object, name, value); | 
 |   6646   } | 
 |   6647  | 
 |   6648   Push(value); | 
 |   6649   instr->set_position(position); | 
 |   6650   AddInstruction(instr); | 
 |   6651   if (instr->HasObservableSideEffects()) { | 
 |   6652     AddSimulate(assignment_id, REMOVABLE_SIMULATE); | 
 |   6653   } | 
 |   6654   return ast_context()->ReturnValue(Pop()); | 
 |   6655 } | 
 |   6656  | 
 |   6657  | 
|   6641 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |   6658 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { | 
|   6642   Expression* target = expr->target(); |   6659   Expression* target = expr->target(); | 
|   6643   VariableProxy* proxy = target->AsVariableProxy(); |   6660   VariableProxy* proxy = target->AsVariableProxy(); | 
|   6644   Property* prop = target->AsProperty(); |   6661   Property* prop = target->AsProperty(); | 
|   6645   ASSERT(proxy == NULL || prop == NULL); |   6662   ASSERT(proxy == NULL || prop == NULL); | 
|   6646  |   6663  | 
|   6647   // We have a second position recorded in the FullCodeGenerator to have |   6664   // We have a second position recorded in the FullCodeGenerator to have | 
|   6648   // type feedback for the binary operation. |   6665   // type feedback for the binary operation. | 
|   6649   BinaryOperation* operation = expr->binary_operation(); |   6666   BinaryOperation* operation = expr->binary_operation(); | 
|   6650  |   6667  | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   6757       CHECK_ALIVE(VisitForValue(expr->value())); |   6774       CHECK_ALIVE(VisitForValue(expr->value())); | 
|   6758       HValue* right = Pop(); |   6775       HValue* right = Pop(); | 
|   6759       HValue* left = Pop(); |   6776       HValue* left = Pop(); | 
|   6760  |   6777  | 
|   6761       HInstruction* instr = BuildBinaryOperation(operation, left, right); |   6778       HInstruction* instr = BuildBinaryOperation(operation, left, right); | 
|   6762       PushAndAdd(instr); |   6779       PushAndAdd(instr); | 
|   6763       if (instr->HasObservableSideEffects()) { |   6780       if (instr->HasObservableSideEffects()) { | 
|   6764         AddSimulate(operation->id(), REMOVABLE_SIMULATE); |   6781         AddSimulate(operation->id(), REMOVABLE_SIMULATE); | 
|   6765       } |   6782       } | 
|   6766  |   6783  | 
|   6767       HInstruction* store; |   6784       return BuildStoreNamed(prop, expr->id(), expr->position(), | 
|   6768       if (!monomorphic || map->is_observed()) { |   6785                              expr->AssignmentId(), prop, object, instr); | 
|   6769         // If we don't know the monomorphic type, do a generic store. |  | 
|   6770         CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, instr)); |  | 
|   6771       } else { |  | 
|   6772         Handle<JSFunction> setter; |  | 
|   6773         Handle<JSObject> holder; |  | 
|   6774         if (LookupSetter(map, name, &setter, &holder)) { |  | 
|   6775           store = BuildCallSetter(object, instr, map, setter, holder); |  | 
|   6776         } else { |  | 
|   6777           CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object, |  | 
|   6778                                                          name, |  | 
|   6779                                                          instr, |  | 
|   6780                                                          map)); |  | 
|   6781         } |  | 
|   6782       } |  | 
|   6783       AddInstruction(store); |  | 
|   6784       // Drop the simulated receiver and value.  Return the value. |  | 
|   6785       Drop(2); |  | 
|   6786       Push(instr); |  | 
|   6787       if (store->HasObservableSideEffects()) { |  | 
|   6788         AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE); |  | 
|   6789       } |  | 
|   6790       return ast_context()->ReturnValue(Pop()); |  | 
|   6791  |  | 
|   6792     } else { |   6786     } else { | 
|   6793       // Keyed property. |   6787       // Keyed property. | 
|   6794       CHECK_ALIVE(VisitForValue(prop->obj())); |   6788       CHECK_ALIVE(VisitForValue(prop->obj())); | 
|   6795       CHECK_ALIVE(VisitForValue(prop->key())); |   6789       CHECK_ALIVE(VisitForValue(prop->key())); | 
|   6796       HValue* obj = environment()->ExpressionStackAt(1); |   6790       HValue* obj = environment()->ExpressionStackAt(1); | 
|   6797       HValue* key = environment()->ExpressionStackAt(0); |   6791       HValue* key = environment()->ExpressionStackAt(0); | 
|   6798  |   6792  | 
|   6799       bool has_side_effects = false; |   6793       bool has_side_effects = false; | 
|   6800       HValue* load = HandleKeyedElementAccess( |   6794       HValue* load = HandleKeyedElementAccess( | 
|   6801           obj, key, NULL, prop, prop->LoadId(), RelocInfo::kNoPosition, |   6795           obj, key, NULL, prop, prop->LoadId(), RelocInfo::kNoPosition, | 
| (...skipping 1442 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   8244                    getter, |   8238                    getter, | 
|   8245                    0, |   8239                    0, | 
|   8246                    NULL, |   8240                    NULL, | 
|   8247                    prop->id(), |   8241                    prop->id(), | 
|   8248                    prop->LoadId(), |   8242                    prop->LoadId(), | 
|   8249                    GETTER_CALL_RETURN); |   8243                    GETTER_CALL_RETURN); | 
|   8250 } |   8244 } | 
|   8251  |   8245  | 
|   8252  |   8246  | 
|   8253 bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, |   8247 bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, | 
|   8254                                              Assignment* assignment, |   8248                                              BailoutId id, | 
 |   8249                                              BailoutId assignment_id, | 
|   8255                                              HValue* implicit_return_value) { |   8250                                              HValue* implicit_return_value) { | 
|   8256   return TryInline(CALL_AS_METHOD, |   8251   return TryInline(CALL_AS_METHOD, | 
|   8257                    setter, |   8252                    setter, | 
|   8258                    1, |   8253                    1, | 
|   8259                    implicit_return_value, |   8254                    implicit_return_value, | 
|   8260                    assignment->id(), |   8255                    id, assignment_id, | 
|   8261                    assignment->AssignmentId(), |  | 
|   8262                    SETTER_CALL_RETURN); |   8256                    SETTER_CALL_RETURN); | 
|   8263 } |   8257 } | 
|   8264  |   8258  | 
|   8265  |   8259  | 
|   8266 bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function, |   8260 bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function, | 
|   8267                                             Call* expr, |   8261                                             Call* expr, | 
|   8268                                             int arguments_count) { |   8262                                             int arguments_count) { | 
|   8269   return TryInline(CALL_AS_METHOD, |   8263   return TryInline(CALL_AS_METHOD, | 
|   8270                    function, |   8264                    function, | 
|   8271                    arguments_count, |   8265                    arguments_count, | 
| (...skipping 3391 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  11663     } |  11657     } | 
|  11664   } |  11658   } | 
|  11665  |  11659  | 
|  11666 #ifdef DEBUG |  11660 #ifdef DEBUG | 
|  11667   if (graph_ != NULL) graph_->Verify(false);  // No full verify. |  11661   if (graph_ != NULL) graph_->Verify(false);  // No full verify. | 
|  11668   if (allocator_ != NULL) allocator_->Verify(); |  11662   if (allocator_ != NULL) allocator_->Verify(); | 
|  11669 #endif |  11663 #endif | 
|  11670 } |  11664 } | 
|  11671  |  11665  | 
|  11672 } }  // namespace v8::internal |  11666 } }  // namespace v8::internal | 
| OLD | NEW |