| Index: src/jump-target.h
|
| ===================================================================
|
| --- src/jump-target.h (revision 1472)
|
| +++ src/jump-target.h (working copy)
|
| @@ -58,20 +58,8 @@
|
| 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 jump targets are embedded in AST nodes.
|
| - JumpTarget();
|
| -
|
| virtual ~JumpTarget() { Unuse(); }
|
|
|
| - // 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);
|
| -
|
| // Accessors.
|
| CodeGenerator* code_generator() const { return cgen_; }
|
|
|
| @@ -82,6 +70,8 @@
|
| entry_frame_ = frame;
|
| }
|
|
|
| + void make_bidirectional() { direction_ = BIDIRECTIONAL; }
|
| +
|
| // Predicates testing the state of the encapsulated label.
|
| bool is_bound() const { return is_bound_; }
|
| bool is_linked() const { return is_linked_; }
|
| @@ -97,13 +87,6 @@
|
| // left dangling.
|
| void Reset();
|
|
|
| - // Copy the state of this jump target to the destination. The lists
|
| - // of forward-reaching frames and merge-point labels are copied.
|
| - // All virtual frame pointers are copied, not the pointed-to frames.
|
| - // The previous state of the destination is overwritten, without
|
| - // deallocating pointed-to virtual frames.
|
| - void CopyTo(JumpTarget* 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.
|
| void Jump();
|
| @@ -170,7 +153,6 @@
|
| // Used to emit code.
|
| MacroAssembler* masm_;
|
|
|
| - private:
|
| // Directionality flag set at initialization time.
|
| Directionality direction_;
|
|
|
| @@ -194,6 +176,7 @@
|
| bool is_bound_;
|
| bool is_linked_;
|
|
|
| + private:
|
| // Add a virtual frame reaching this labeled block via a forward
|
| // jump, and a fresh label for its merge code.
|
| void AddReachingFrame(VirtualFrame* frame);
|
| @@ -211,22 +194,60 @@
|
|
|
|
|
| // -------------------------------------------------------------------------
|
| -// Shadow jump targets
|
| +// Break targets
|
| //
|
| -// Shadow jump targets represent a jump target that is temporarily shadowed
|
| -// by another one (represented by the original during shadowing). They are
|
| -// used to catch jumps to labels in certain contexts, e.g. try blocks.
|
| -// After shadowing ends, the formerly shadowed target is again represented
|
| -// by the original and the ShadowTarget can be used as a jump target in its
|
| -// own right, representing the formerly shadowing target.
|
| +// A break target is a jump target that can be used to break out of a
|
| +// statement that keeps extra state on the stack (eg, for/in or
|
| +// try/finally). They know the expected stack height at the target
|
| +// and will drop state from nested statements as part of merging.
|
| +//
|
| +// Break targets are used for return, break, and continue targets.
|
|
|
| -class ShadowTarget : public JumpTarget {
|
| +class BreakTarget : public JumpTarget {
|
| public:
|
| + // Construct a break target without a code generator. A code
|
| + // 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();
|
| +
|
| + // 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);
|
| +
|
| + // Copy the state of this break target to the destination. The
|
| + // lists of forward-reaching frames and merge-point labels are
|
| + // copied. All virtual frame pointers are copied, not the
|
| + // pointed-to frames. The previous state of the destination is
|
| + // overwritten, without deallocating pointed-to virtual frames.
|
| + void CopyTo(BreakTarget* destination);
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(BreakTarget);
|
| +};
|
| +
|
| +
|
| +// -------------------------------------------------------------------------
|
| +// Shadow break targets
|
| +//
|
| +// A shadow break target represents a break target that is temporarily
|
| +// shadowed by another one (represented by the original during
|
| +// shadowing). They are used to catch jumps to labels in certain
|
| +// contexts, e.g. try blocks. After shadowing ends, the formerly
|
| +// shadowed target is again represented by the original and the
|
| +// ShadowTarget can be used as a jump target in its own right,
|
| +// representing the formerly shadowing target.
|
| +
|
| +class ShadowTarget : public BreakTarget {
|
| + public:
|
| // Construct a shadow jump target. After construction the shadow
|
| - // target object holds the state of the original jump target, and
|
| - // the original target is actually a fresh one that intercepts jumps
|
| - // intended for the shadowed one.
|
| - explicit ShadowTarget(JumpTarget* shadowed);
|
| + // target object holds the state of the original target, and the
|
| + // original target is actually a fresh one that intercepts control
|
| + // flow intended for the shadowed one.
|
| + explicit ShadowTarget(BreakTarget* shadowed);
|
|
|
| virtual ~ShadowTarget() {
|
| ASSERT(!is_shadowing_);
|
| @@ -239,12 +260,12 @@
|
|
|
| // During shadowing, the currently shadowing target. After
|
| // shadowing, the target that was shadowed.
|
| - JumpTarget* other_target() const { return other_target_; }
|
| + BreakTarget* other_target() const { return other_target_; }
|
|
|
| private:
|
| // During shadowing, the currently shadowing target. After
|
| // shadowing, the target that was shadowed.
|
| - JumpTarget* other_target_;
|
| + BreakTarget* other_target_;
|
|
|
| #ifdef DEBUG
|
| bool is_shadowing_;
|
|
|