OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 23 matching lines...) Expand all Loading... |
34 | 34 |
35 // ------------------------------------------------------------------------- | 35 // ------------------------------------------------------------------------- |
36 // JumpTarget implementation. | 36 // JumpTarget implementation. |
37 | 37 |
38 bool JumpTarget::compiling_deferred_code_ = false; | 38 bool JumpTarget::compiling_deferred_code_ = false; |
39 | 39 |
40 | 40 |
41 JumpTarget::JumpTarget(CodeGenerator* cgen, Directionality direction) | 41 JumpTarget::JumpTarget(CodeGenerator* cgen, Directionality direction) |
42 : cgen_(cgen), | 42 : cgen_(cgen), |
43 direction_(direction), | 43 direction_(direction), |
| 44 is_bound_(false), |
| 45 is_linked_(false), |
44 reaching_frames_(0), | 46 reaching_frames_(0), |
45 merge_labels_(0), | 47 merge_labels_(0), |
46 entry_frame_(NULL), | 48 entry_frame_(NULL) { |
47 is_bound_(false), | |
48 is_linked_(false) { | |
49 ASSERT(cgen != NULL); | 49 ASSERT(cgen != NULL); |
50 masm_ = cgen->masm(); | 50 masm_ = cgen->masm(); |
51 } | 51 } |
52 | 52 |
53 | 53 |
54 JumpTarget::JumpTarget() | 54 JumpTarget::JumpTarget() |
55 : cgen_(NULL), | 55 : cgen_(NULL), |
56 masm_(NULL), | 56 masm_(NULL), |
57 direction_(FORWARD_ONLY), | 57 direction_(FORWARD_ONLY), |
| 58 is_bound_(false), |
| 59 is_linked_(false), |
58 reaching_frames_(0), | 60 reaching_frames_(0), |
59 merge_labels_(0), | 61 merge_labels_(0), |
60 entry_frame_(NULL), | 62 entry_frame_(NULL) { |
61 is_bound_(false), | |
62 is_linked_(false) { | |
63 } | 63 } |
64 | 64 |
65 | 65 |
66 void JumpTarget::Initialize(CodeGenerator* cgen, Directionality direction) { | 66 void JumpTarget::Initialize(CodeGenerator* cgen, Directionality direction) { |
67 ASSERT(cgen != NULL); | 67 ASSERT(cgen != NULL); |
68 ASSERT(cgen_ == NULL); | 68 ASSERT(cgen_ == NULL); |
69 cgen_ = cgen; | 69 cgen_ = cgen; |
70 masm_ = cgen->masm(); | 70 masm_ = cgen->masm(); |
71 direction_ = direction; | 71 direction_ = direction; |
72 } | 72 } |
73 | 73 |
74 | 74 |
75 void JumpTarget::Unuse() { | 75 void JumpTarget::Unuse() { |
76 // We should not deallocate jump targets that have unresolved jumps | |
77 // to them. In the event of a compile-time stack overflow or an | |
78 // uninitialized jump target, we don't care. | |
79 ASSERT(!is_linked() || cgen_ == NULL || cgen_->HasStackOverflow()); | |
80 for (int i = 0; i < reaching_frames_.length(); i++) { | |
81 delete reaching_frames_[i]; | |
82 } | |
83 delete entry_frame_; | |
84 Reset(); | |
85 } | |
86 | |
87 | |
88 void JumpTarget::Reset() { | |
89 reaching_frames_.Clear(); | 76 reaching_frames_.Clear(); |
90 merge_labels_.Clear(); | 77 merge_labels_.Clear(); |
91 entry_frame_ = NULL; | 78 entry_frame_ = NULL; |
92 entry_label_.Unuse(); | 79 entry_label_.Unuse(); |
93 is_bound_ = false; | 80 is_bound_ = false; |
94 is_linked_ = false; | 81 is_linked_ = false; |
95 } | 82 } |
96 | 83 |
97 | 84 |
98 void JumpTarget::ComputeEntryFrame(int mergable_elements) { | 85 void JumpTarget::ComputeEntryFrame(int mergable_elements) { |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 ShadowTarget::ShadowTarget(BreakTarget* shadowed) { | 642 ShadowTarget::ShadowTarget(BreakTarget* shadowed) { |
656 ASSERT(shadowed != NULL); | 643 ASSERT(shadowed != NULL); |
657 other_target_ = shadowed; | 644 other_target_ = shadowed; |
658 | 645 |
659 #ifdef DEBUG | 646 #ifdef DEBUG |
660 is_shadowing_ = true; | 647 is_shadowing_ = true; |
661 #endif | 648 #endif |
662 // While shadowing this shadow target saves the state of the original. | 649 // While shadowing this shadow target saves the state of the original. |
663 shadowed->CopyTo(this); | 650 shadowed->CopyTo(this); |
664 | 651 |
665 // The original's state is reset. We do not Unuse it because that | 652 // The original's state is reset. |
666 // would delete the expected frame and assert that the target is not | 653 shadowed->Unuse(); |
667 // linked. | |
668 shadowed->Reset(); | |
669 ASSERT(cgen_ != NULL); | 654 ASSERT(cgen_ != NULL); |
670 ASSERT(cgen_->has_valid_frame()); | 655 ASSERT(cgen_->has_valid_frame()); |
671 shadowed->set_expected_height(cgen_->frame()->height()); | 656 shadowed->set_expected_height(cgen_->frame()->height()); |
672 | 657 |
673 // Setting the code generator to null prevents the shadow target from | 658 // Setting the code generator to null prevents the shadow target from |
674 // being used until shadowing stops. | 659 // being used until shadowing stops. |
675 cgen_ = NULL; | 660 cgen_ = NULL; |
676 masm_ = NULL; | 661 masm_ = NULL; |
677 } | 662 } |
678 | 663 |
679 | 664 |
680 void ShadowTarget::StopShadowing() { | 665 void ShadowTarget::StopShadowing() { |
681 ASSERT(is_shadowing_); | 666 ASSERT(is_shadowing_); |
682 | 667 |
683 // This target does not have a valid code generator yet. | 668 // This target does not have a valid code generator yet. |
684 cgen_ = other_target_->code_generator(); | 669 cgen_ = other_target_->code_generator(); |
685 ASSERT(cgen_ != NULL); | 670 ASSERT(cgen_ != NULL); |
686 masm_ = cgen_->masm(); | 671 masm_ = cgen_->masm(); |
687 | 672 |
688 // The states of this target, which was shadowed, and the original | 673 // The states of this target, which was shadowed, and the original |
689 // target, which was shadowing, are swapped. | 674 // target, which was shadowing, are swapped. |
690 BreakTarget temp; | 675 BreakTarget temp; |
691 other_target_->CopyTo(&temp); | 676 other_target_->CopyTo(&temp); |
692 CopyTo(other_target_); | 677 CopyTo(other_target_); |
693 temp.CopyTo(this); | 678 temp.CopyTo(this); |
694 temp.Reset(); // So the destructor does not deallocate virtual frames. | 679 temp.Unuse(); |
695 | 680 |
696 #ifdef DEBUG | 681 #ifdef DEBUG |
697 is_shadowing_ = false; | 682 is_shadowing_ = false; |
698 #endif | 683 #endif |
699 } | 684 } |
700 | 685 |
701 | 686 |
702 } } // namespace v8::internal | 687 } } // namespace v8::internal |
OLD | NEW |