Index: src/full-codegen/full-codegen.h |
diff --git a/src/full-codegen/full-codegen.h b/src/full-codegen/full-codegen.h |
index 6ab02313bb4ad1c1d34d576e101bd1c1706ba6ea..e811e25cf818abb9f9816fc3a9b3321394aa91ce 100644 |
--- a/src/full-codegen/full-codegen.h |
+++ b/src/full-codegen/full-codegen.h |
@@ -108,7 +108,9 @@ class FullCodeGenerator: public AstVisitor { |
class NestedStatement BASE_EMBEDDED { |
public: |
- explicit NestedStatement(FullCodeGenerator* codegen) : codegen_(codegen) { |
+ explicit NestedStatement(FullCodeGenerator* codegen) |
+ : codegen_(codegen), |
+ stack_depth_at_target_(codegen->operand_stack_depth_) { |
// Link into codegen's nesting stack. |
previous_ = codegen->nesting_stack_; |
codegen->nesting_stack_ = this; |
@@ -130,18 +132,20 @@ class FullCodeGenerator: public AstVisitor { |
// Notify the statement that we are exiting it via break, continue, or |
// return and give it a chance to generate cleanup code. Return the |
// next outer statement in the nesting stack. We accumulate in |
- // *stack_depth the amount to drop the stack and in *context_length the |
- // number of context chain links to unwind as we traverse the nesting |
- // stack from an exit to its target. |
- virtual NestedStatement* Exit(int* stack_depth, int* context_length) { |
- return previous_; |
- } |
+ // {*context_length} the number of context chain links to unwind as we |
+ // traverse the nesting stack from an exit to its target. |
+ virtual NestedStatement* Exit(int* context_length) { return previous_; } |
+ |
+ // Determine the expected operand stack depth when this statement is being |
+ // used as the target of an exit. The caller will drop to this depth. |
+ int GetStackDepthAtTarget() { return stack_depth_at_target_; } |
protected: |
MacroAssembler* masm() { return codegen_->masm(); } |
FullCodeGenerator* codegen_; |
NestedStatement* previous_; |
+ int stack_depth_at_target_; |
private: |
DISALLOW_COPY_AND_ASSIGN(NestedStatement); |
@@ -192,7 +196,7 @@ class FullCodeGenerator: public AstVisitor { |
: Breakable(codegen, block) { |
} |
- NestedStatement* Exit(int* stack_depth, int* context_length) override { |
+ NestedStatement* Exit(int* context_length) override { |
auto block_scope = statement()->AsBlock()->scope(); |
if (block_scope != nullptr) { |
if (block_scope->ContextLocalCount() > 0) ++(*context_length); |
@@ -201,19 +205,6 @@ class FullCodeGenerator: public AstVisitor { |
} |
}; |
- // The try block of a try/catch statement. |
- class TryCatch : public NestedStatement { |
- public: |
- static const int kElementCount = TryBlockConstant::kElementCount; |
- |
- explicit TryCatch(FullCodeGenerator* codegen) : NestedStatement(codegen) {} |
- |
- NestedStatement* Exit(int* stack_depth, int* context_length) override { |
- *stack_depth += kElementCount; |
- return previous_; |
- } |
- }; |
- |
class DeferredCommands { |
public: |
enum Command { kReturn, kThrow, kBreak, kContinue }; |
@@ -254,12 +245,10 @@ class FullCodeGenerator: public AstVisitor { |
// The try block of a try/finally statement. |
class TryFinally : public NestedStatement { |
public: |
- static const int kElementCount = TryBlockConstant::kElementCount; |
- |
TryFinally(FullCodeGenerator* codegen, DeferredCommands* commands) |
: NestedStatement(codegen), deferred_commands_(commands) {} |
- NestedStatement* Exit(int* stack_depth, int* context_length) override; |
+ NestedStatement* Exit(int* context_length) override; |
bool IsTryFinally() override { return true; } |
TryFinally* AsTryFinally() override { return this; } |
@@ -270,35 +259,6 @@ class FullCodeGenerator: public AstVisitor { |
DeferredCommands* deferred_commands_; |
}; |
- // The finally block of a try/finally statement. |
- class Finally : public NestedStatement { |
- public: |
- static const int kElementCount = 3; |
- |
- explicit Finally(FullCodeGenerator* codegen) : NestedStatement(codegen) {} |
- |
- NestedStatement* Exit(int* stack_depth, int* context_length) override { |
- *stack_depth += kElementCount; |
- return previous_; |
- } |
- }; |
- |
- // The body of a for/in loop. |
- class ForIn : public Iteration { |
- public: |
- static const int kElementCount = 5; |
- |
- ForIn(FullCodeGenerator* codegen, ForInStatement* statement) |
- : Iteration(codegen, statement) { |
- } |
- |
- NestedStatement* Exit(int* stack_depth, int* context_length) override { |
- *stack_depth += kElementCount; |
- return previous_; |
- } |
- }; |
- |
- |
// The body of a with or catch. |
class WithOrCatch : public NestedStatement { |
public: |
@@ -306,7 +266,7 @@ class FullCodeGenerator: public AstVisitor { |
: NestedStatement(codegen) { |
} |
- NestedStatement* Exit(int* stack_depth, int* context_length) override { |
+ NestedStatement* Exit(int* context_length) override { |
++(*context_length); |
return previous_; |
} |