Index: src/jump-target.h |
=================================================================== |
--- src/jump-target.h (revision 1481) |
+++ src/jump-target.h (working copy) |
@@ -58,8 +58,31 @@ |
explicit JumpTarget(CodeGenerator* cgen, |
Directionality direction = FORWARD_ONLY); |
+ // Construct a jump target without a code generator. A code |
+ // generator must be supplied before using the jump target as a |
+ // label. This is useful, eg, when break targets are embedded in |
+ // AST nodes. |
+ JumpTarget(); |
+ |
+ // Supply a code generator and directionality to an already |
+ // constructed jump target. This function expects to be given a |
+ // non-null code generator, and to be called only when the code |
+ // generator is not yet set. |
+ virtual void Initialize(CodeGenerator* cgen, |
+ Directionality direction = FORWARD_ONLY); |
+ |
virtual ~JumpTarget() { Unuse(); } |
+ // Treat the jump target as a fresh one. The state is reset and |
+ // pointed-to virtual frames are deallocated. There should be no |
+ // dangling jumps to the target. |
+ void Unuse(); |
+ |
+ // Reset the internal state of this jump target. Pointed-to virtual |
+ // frames are not deallocated and dangling jumps to the target are |
+ // left dangling. |
+ void Reset(); |
+ |
// Accessors. |
CodeGenerator* code_generator() const { return cgen_; } |
@@ -77,19 +100,9 @@ |
bool is_linked() const { return is_linked_; } |
bool is_unused() const { return !is_bound() && !is_linked(); } |
- // Treat the jump target as a fresh one. The expected frame if any |
- // will be deallocated and there should be no dangling jumps to the |
- // target (thus no reaching frames). |
- void Unuse(); |
- |
- // Reset the internal state of this jump target. Pointed-to virtual |
- // frames are not deallocated and dangling jumps to the target are |
- // left dangling. |
- void Reset(); |
- |
// Emit a jump to the target. There must be a current frame at the |
// jump and there will be no current frame after the jump. |
- void Jump(); |
+ virtual void Jump(); |
void Jump(Result* arg); |
void Jump(Result* arg0, Result* arg1); |
void Jump(Result* arg0, Result* arg1, Result* arg2); |
@@ -97,7 +110,7 @@ |
// Emit a conditional branch to the target. There must be a current |
// frame at the branch. The current frame will fall through to the |
// code after the branch. |
- void Branch(Condition cc, Hint hint = no_hint); |
+ virtual void Branch(Condition cc, Hint hint = no_hint); |
void Branch(Condition cc, Result* arg, Hint hint = no_hint); |
void Branch(Condition cc, Result* arg0, Result* arg1, Hint hint = no_hint); |
void Branch(Condition cc, |
@@ -125,7 +138,7 @@ |
// A mergable elements argument of kAllElements indicates that all |
// frame elements must be mergable. Mergable elements are ignored |
// completely for forward-only jump targets. |
- void Bind(int mergable_elements = kAllElements); |
+ virtual void Bind(int mergable_elements = kAllElements); |
void Bind(Result* arg, int mergable_elements = kAllElements); |
void Bind(Result* arg0, Result* arg1, int mergable_elements = kAllElements); |
void Bind(Result* arg0, |
@@ -209,14 +222,14 @@ |
// generator must be supplied before using the break target as a |
// label. This is useful, eg, when break targets are embedded in AST |
// nodes. |
- BreakTarget(); |
+ BreakTarget() {} |
- // Supply a code generator and directionality to an already |
- // constructed jump target. This function expects to be given a |
- // non-null code generator, and to be called only when the code |
- // generator is not yet set. |
- void Initialize(CodeGenerator* cgen, |
- Directionality direction = FORWARD_ONLY); |
+ // Supply a code generator, expected expression stack height, and |
+ // directionality to an already constructed break target. This |
+ // function expects to be given a non-null code generator, and to be |
+ // called only when the code generator is not yet set. |
+ virtual void Initialize(CodeGenerator* cgen, |
+ Directionality direction = FORWARD_ONLY); |
// Copy the state of this break target to the destination. The |
// lists of forward-reaching frames and merge-point labels are |
@@ -225,7 +238,28 @@ |
// overwritten, without deallocating pointed-to virtual frames. |
void CopyTo(BreakTarget* destination); |
+ // Emit a jump to the target. There must be a current frame at the |
+ // jump and there will be no current frame after the jump. |
+ virtual void Jump(); |
+ |
+ // Emit a conditional branch to the target. There must be a current |
+ // frame at the branch. The current frame will fall through to the |
+ // code after the branch. |
+ virtual void Branch(Condition cc, Hint hint = no_hint); |
+ |
+ // Bind a break target. If there is no current frame at the binding |
+ // site, there must be at least one frame reaching via a forward |
+ // jump. |
+ virtual void Bind(int mergable_elements = kAllElements); |
+ |
+ // Setter for expected height. |
+ void set_expected_height(int expected) { expected_height_ = expected; } |
+ |
private: |
+ // The expected height of the expression stack where the target will |
+ // be bound, statically known at initialization time. |
+ int expected_height_; |
+ |
DISALLOW_COPY_AND_ASSIGN(BreakTarget); |
}; |