| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 4594 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4605         break; | 4605         break; | 
| 4606       default: | 4606       default: | 
| 4607         BAILOUT("Value: unsupported unary operation"); | 4607         BAILOUT("Value: unsupported unary operation"); | 
| 4608         break; | 4608         break; | 
| 4609     } | 4609     } | 
| 4610     ast_context()->ReturnInstruction(instr, expr->id()); | 4610     ast_context()->ReturnInstruction(instr, expr->id()); | 
| 4611   } | 4611   } | 
| 4612 } | 4612 } | 
| 4613 | 4613 | 
| 4614 | 4614 | 
| 4615 void HGraphBuilder::VisitIncrementOperation(IncrementOperation* expr) { |  | 
| 4616   // IncrementOperation is never visited by the visitor. It only |  | 
| 4617   // occurs as a subexpression of CountOperation. |  | 
| 4618   UNREACHABLE(); |  | 
| 4619 } |  | 
| 4620 |  | 
| 4621 |  | 
| 4622 HInstruction* HGraphBuilder::BuildIncrement(HValue* value, bool increment) { | 4615 HInstruction* HGraphBuilder::BuildIncrement(HValue* value, bool increment) { | 
| 4623   HConstant* delta = increment | 4616   HConstant* delta = increment | 
| 4624       ? graph_->GetConstant1() | 4617       ? graph_->GetConstant1() | 
| 4625       : graph_->GetConstantMinus1(); | 4618       : graph_->GetConstantMinus1(); | 
| 4626   HInstruction* instr = new(zone()) HAdd(value, delta); | 4619   HInstruction* instr = new(zone()) HAdd(value, delta); | 
| 4627   AssumeRepresentation(instr,  Representation::Integer32()); | 4620   AssumeRepresentation(instr,  Representation::Integer32()); | 
| 4628   return instr; | 4621   return instr; | 
| 4629 } | 4622 } | 
| 4630 | 4623 | 
| 4631 | 4624 | 
| 4632 void HGraphBuilder::VisitCountOperation(CountOperation* expr) { | 4625 void HGraphBuilder::VisitCountOperation(CountOperation* expr) { | 
| 4633   IncrementOperation* increment = expr->increment(); | 4626   Expression* target = expr->expression(); | 
| 4634   Expression* target = increment->expression(); |  | 
| 4635   VariableProxy* proxy = target->AsVariableProxy(); | 4627   VariableProxy* proxy = target->AsVariableProxy(); | 
| 4636   Variable* var = proxy->AsVariable(); | 4628   Variable* var = proxy->AsVariable(); | 
| 4637   Property* prop = target->AsProperty(); | 4629   Property* prop = target->AsProperty(); | 
| 4638   ASSERT(var == NULL || prop == NULL); | 4630   ASSERT(var == NULL || prop == NULL); | 
| 4639   bool inc = expr->op() == Token::INC; | 4631   bool inc = expr->op() == Token::INC; | 
| 4640 | 4632 | 
| 4641   if (var != NULL) { | 4633   if (var != NULL) { | 
| 4642     VISIT_FOR_VALUE(target); | 4634     VISIT_FOR_VALUE(target); | 
| 4643 | 4635 | 
| 4644     // Match the full code generator stack by simulating an extra stack | 4636     // Match the full code generator stack by simulating an extra stack | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4685 | 4677 | 
| 4686       HInstruction* load = NULL; | 4678       HInstruction* load = NULL; | 
| 4687       if (prop->IsMonomorphic()) { | 4679       if (prop->IsMonomorphic()) { | 
| 4688         Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 4680         Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 
| 4689         Handle<Map> map = prop->GetReceiverTypes()->first(); | 4681         Handle<Map> map = prop->GetReceiverTypes()->first(); | 
| 4690         load = BuildLoadNamed(obj, prop, map, name); | 4682         load = BuildLoadNamed(obj, prop, map, name); | 
| 4691       } else { | 4683       } else { | 
| 4692         load = BuildLoadNamedGeneric(obj, prop); | 4684         load = BuildLoadNamedGeneric(obj, prop); | 
| 4693       } | 4685       } | 
| 4694       PushAndAdd(load); | 4686       PushAndAdd(load); | 
| 4695       if (load->HasSideEffects()) AddSimulate(increment->id()); | 4687       if (load->HasSideEffects()) AddSimulate(expr->CountId()); | 
| 4696 | 4688 | 
| 4697       HValue* before = Pop(); | 4689       HValue* before = Pop(); | 
| 4698       // There is no deoptimization to after the increment, so we don't need | 4690       // There is no deoptimization to after the increment, so we don't need | 
| 4699       // to simulate the expression stack after this instruction. | 4691       // to simulate the expression stack after this instruction. | 
| 4700       HInstruction* after = BuildIncrement(before, inc); | 4692       HInstruction* after = BuildIncrement(before, inc); | 
| 4701       AddInstruction(after); | 4693       AddInstruction(after); | 
| 4702 | 4694 | 
| 4703       HInstruction* store = BuildStoreNamed(obj, after, prop); | 4695       HInstruction* store = BuildStoreNamed(obj, after, prop); | 
| 4704       AddInstruction(store); | 4696       AddInstruction(store); | 
| 4705 | 4697 | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 4726       HValue* obj = environment()->ExpressionStackAt(1); | 4718       HValue* obj = environment()->ExpressionStackAt(1); | 
| 4727       HValue* key = environment()->ExpressionStackAt(0); | 4719       HValue* key = environment()->ExpressionStackAt(0); | 
| 4728 | 4720 | 
| 4729       bool is_fast_elements = prop->IsMonomorphic() && | 4721       bool is_fast_elements = prop->IsMonomorphic() && | 
| 4730           prop->GetMonomorphicReceiverType()->has_fast_elements(); | 4722           prop->GetMonomorphicReceiverType()->has_fast_elements(); | 
| 4731 | 4723 | 
| 4732       HInstruction* load = is_fast_elements | 4724       HInstruction* load = is_fast_elements | 
| 4733           ? BuildLoadKeyedFastElement(obj, key, prop) | 4725           ? BuildLoadKeyedFastElement(obj, key, prop) | 
| 4734           : BuildLoadKeyedGeneric(obj, key); | 4726           : BuildLoadKeyedGeneric(obj, key); | 
| 4735       PushAndAdd(load); | 4727       PushAndAdd(load); | 
| 4736       if (load->HasSideEffects()) AddSimulate(increment->id()); | 4728       if (load->HasSideEffects()) AddSimulate(expr->CountId()); | 
| 4737 | 4729 | 
| 4738       HValue* before = Pop(); | 4730       HValue* before = Pop(); | 
| 4739       // There is no deoptimization to after the increment, so we don't need | 4731       // There is no deoptimization to after the increment, so we don't need | 
| 4740       // to simulate the expression stack after this instruction. | 4732       // to simulate the expression stack after this instruction. | 
| 4741       HInstruction* after = BuildIncrement(before, inc); | 4733       HInstruction* after = BuildIncrement(before, inc); | 
| 4742       AddInstruction(after); | 4734       AddInstruction(after); | 
| 4743 | 4735 | 
| 4744       HInstruction* store = is_fast_elements | 4736       HInstruction* store = is_fast_elements | 
| 4745           ? BuildStoreKeyedFastElement(obj, key, after, prop) | 4737           ? BuildStoreKeyedFastElement(obj, key, after, prop) | 
| 4746           : BuildStoreKeyedGeneric(obj, key, after); | 4738           : BuildStoreKeyedGeneric(obj, key, after); | 
| (...skipping 1255 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6002     } | 5994     } | 
| 6003   } | 5995   } | 
| 6004 | 5996 | 
| 6005 #ifdef DEBUG | 5997 #ifdef DEBUG | 
| 6006   if (graph_ != NULL) graph_->Verify(); | 5998   if (graph_ != NULL) graph_->Verify(); | 
| 6007   if (allocator_ != NULL) allocator_->Verify(); | 5999   if (allocator_ != NULL) allocator_->Verify(); | 
| 6008 #endif | 6000 #endif | 
| 6009 } | 6001 } | 
| 6010 | 6002 | 
| 6011 } }  // namespace v8::internal | 6003 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|