OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 | 627 |
628 #endif | 628 #endif |
629 | 629 |
630 | 630 |
631 HConstant* HGraph::GetConstant(SetOncePointer<HConstant>* pointer, | 631 HConstant* HGraph::GetConstant(SetOncePointer<HConstant>* pointer, |
632 int32_t value) { | 632 int32_t value) { |
633 if (!pointer->is_set()) { | 633 if (!pointer->is_set()) { |
634 // Can't pass GetInvalidContext() to HConstant::New, because that will | 634 // Can't pass GetInvalidContext() to HConstant::New, because that will |
635 // recursively call GetConstant | 635 // recursively call GetConstant |
636 HConstant* constant = HConstant::New(zone(), NULL, value); | 636 HConstant* constant = HConstant::New(zone(), NULL, value); |
637 constant->InsertAfter(GetConstantUndefined()); | 637 constant->InsertAfter(entry_block()->first()); |
638 pointer->set(constant); | 638 pointer->set(constant); |
| 639 return constant; |
639 } | 640 } |
640 return pointer->get(); | 641 return ReinsertConstantIfNecessary(pointer->get()); |
641 } | 642 } |
642 | 643 |
643 | 644 |
| 645 HConstant* HGraph::ReinsertConstantIfNecessary(HConstant* constant) { |
| 646 if (!constant->IsLinked()) { |
| 647 // The constant was removed from the graph. Reinsert. |
| 648 constant->ClearFlag(HValue::kIsDead); |
| 649 constant->InsertAfter(entry_block()->first()); |
| 650 } |
| 651 return constant; |
| 652 } |
| 653 |
| 654 |
644 HConstant* HGraph::GetConstant0() { | 655 HConstant* HGraph::GetConstant0() { |
645 return GetConstant(&constant_0_, 0); | 656 return GetConstant(&constant_0_, 0); |
646 } | 657 } |
647 | 658 |
648 | 659 |
649 HConstant* HGraph::GetConstant1() { | 660 HConstant* HGraph::GetConstant1() { |
650 return GetConstant(&constant_1_, 1); | 661 return GetConstant(&constant_1_, 1); |
651 } | 662 } |
652 | 663 |
653 | 664 |
654 HConstant* HGraph::GetConstantMinus1() { | 665 HConstant* HGraph::GetConstantMinus1() { |
655 return GetConstant(&constant_minus1_, -1); | 666 return GetConstant(&constant_minus1_, -1); |
656 } | 667 } |
657 | 668 |
658 | 669 |
659 #define DEFINE_GET_CONSTANT(Name, name, htype, boolean_value) \ | 670 #define DEFINE_GET_CONSTANT(Name, name, htype, boolean_value) \ |
660 HConstant* HGraph::GetConstant##Name() { \ | 671 HConstant* HGraph::GetConstant##Name() { \ |
661 if (!constant_##name##_.is_set()) { \ | 672 if (!constant_##name##_.is_set()) { \ |
662 HConstant* constant = new(zone()) HConstant( \ | 673 HConstant* constant = new(zone()) HConstant( \ |
663 Unique<Object>::CreateImmovable(isolate()->factory()->name##_value()), \ | 674 Unique<Object>::CreateImmovable(isolate()->factory()->name##_value()), \ |
664 Representation::Tagged(), \ | 675 Representation::Tagged(), \ |
665 htype, \ | 676 htype, \ |
666 false, \ | 677 false, \ |
667 true, \ | 678 true, \ |
668 false, \ | 679 false, \ |
669 boolean_value); \ | 680 boolean_value); \ |
670 constant->InsertAfter(GetConstantUndefined()); \ | 681 constant->InsertAfter(entry_block()->first()); \ |
671 constant_##name##_.set(constant); \ | 682 constant_##name##_.set(constant); \ |
672 } \ | 683 } \ |
673 return constant_##name##_.get(); \ | 684 return ReinsertConstantIfNecessary(constant_##name##_.get()); \ |
674 } | 685 } |
675 | 686 |
676 | 687 |
| 688 DEFINE_GET_CONSTANT(Undefined, undefined, HType::Tagged(), false) |
677 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) | 689 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) |
678 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) | 690 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) |
679 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) | 691 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) |
680 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) | 692 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) |
681 | 693 |
682 | 694 |
683 #undef DEFINE_GET_CONSTANT | 695 #undef DEFINE_GET_CONSTANT |
684 | 696 |
685 | 697 |
686 HConstant* HGraph::GetInvalidContext() { | 698 HConstant* HGraph::GetInvalidContext() { |
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3199 } | 3211 } |
3200 return call; | 3212 return call; |
3201 } | 3213 } |
3202 | 3214 |
3203 | 3215 |
3204 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { | 3216 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
3205 // First special is HContext. | 3217 // First special is HContext. |
3206 HInstruction* context = Add<HContext>(); | 3218 HInstruction* context = Add<HContext>(); |
3207 environment()->BindContext(context); | 3219 environment()->BindContext(context); |
3208 | 3220 |
3209 HConstant* undefined_constant = HConstant::cast(Add<HConstant>( | |
3210 isolate()->factory()->undefined_value())); | |
3211 graph()->set_undefined_constant(undefined_constant); | |
3212 | |
3213 // Create an arguments object containing the initial parameters. Set the | 3221 // Create an arguments object containing the initial parameters. Set the |
3214 // initial values of parameters including "this" having parameter index 0. | 3222 // initial values of parameters including "this" having parameter index 0. |
3215 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count()); | 3223 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count()); |
3216 HArgumentsObject* arguments_object = | 3224 HArgumentsObject* arguments_object = |
3217 New<HArgumentsObject>(environment()->parameter_count()); | 3225 New<HArgumentsObject>(environment()->parameter_count()); |
3218 for (int i = 0; i < environment()->parameter_count(); ++i) { | 3226 for (int i = 0; i < environment()->parameter_count(); ++i) { |
3219 HInstruction* parameter = Add<HParameter>(i); | 3227 HInstruction* parameter = Add<HParameter>(i); |
3220 arguments_object->AddArgument(parameter, zone()); | 3228 arguments_object->AddArgument(parameter, zone()); |
3221 environment()->Bind(i, parameter); | 3229 environment()->Bind(i, parameter); |
3222 } | 3230 } |
3223 AddInstruction(arguments_object); | 3231 AddInstruction(arguments_object); |
3224 graph()->SetArgumentsObject(arguments_object); | 3232 graph()->SetArgumentsObject(arguments_object); |
3225 | 3233 |
| 3234 HConstant* undefined_constant = graph()->GetConstantUndefined(); |
3226 // Initialize specials and locals to undefined. | 3235 // Initialize specials and locals to undefined. |
3227 for (int i = environment()->parameter_count() + 1; | 3236 for (int i = environment()->parameter_count() + 1; |
3228 i < environment()->length(); | 3237 i < environment()->length(); |
3229 ++i) { | 3238 ++i) { |
3230 environment()->Bind(i, undefined_constant); | 3239 environment()->Bind(i, undefined_constant); |
3231 } | 3240 } |
3232 | 3241 |
3233 // Handle the arguments and arguments shadow variables specially (they do | 3242 // Handle the arguments and arguments shadow variables specially (they do |
3234 // not have declarations). | 3243 // not have declarations). |
3235 if (scope->arguments() != NULL) { | 3244 if (scope->arguments() != NULL) { |
(...skipping 6605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9841 if (ShouldProduceTraceOutput()) { | 9850 if (ShouldProduceTraceOutput()) { |
9842 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9851 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
9843 } | 9852 } |
9844 | 9853 |
9845 #ifdef DEBUG | 9854 #ifdef DEBUG |
9846 graph_->Verify(false); // No full verify. | 9855 graph_->Verify(false); // No full verify. |
9847 #endif | 9856 #endif |
9848 } | 9857 } |
9849 | 9858 |
9850 } } // namespace v8::internal | 9859 } } // namespace v8::internal |
OLD | NEW |