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 |