| Index: src/full-codegen.h
|
| diff --git a/src/full-codegen.h b/src/full-codegen.h
|
| index e8915fc8c2aca3ccc8cd4c391f3876869ac35191..c208acce125ba5d3eef835d4beac2951e5968736 100644
|
| --- a/src/full-codegen.h
|
| +++ b/src/full-codegen.h
|
| @@ -115,11 +115,7 @@ class FullCodeGenerator: public AstVisitor {
|
|
|
| class NestedStatement BASE_EMBEDDED {
|
| public:
|
| - explicit NestedStatement(FullCodeGenerator* codegen) : codegen_(codegen) {
|
| - // Link into codegen's nesting stack.
|
| - previous_ = codegen->nesting_stack_;
|
| - codegen->nesting_stack_ = this;
|
| - }
|
| + NestedStatement(FullCodeGenerator* codegen, int stack_delta);
|
| virtual ~NestedStatement() {
|
| // Unlink from codegen's nesting stack.
|
| ASSERT_EQ(this, codegen_->nesting_stack_);
|
| @@ -139,22 +135,33 @@ class FullCodeGenerator: public AstVisitor {
|
| // 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) {
|
| + *stack_depth += stack_delta_;
|
| return previous_;
|
| }
|
|
|
| + // The depth of the stack of block local variables and handlers
|
| + // above the locals during the execution of this nested statement.
|
| + int StackDepth() const { return stack_depth_; }
|
| + // The depth of the stack before and after executing this nested statement.
|
| + int StackDepthBase() const { return stack_depth_ - stack_delta_; }
|
| +
|
| protected:
|
| MacroAssembler* masm() { return codegen_->masm(); }
|
|
|
| FullCodeGenerator* codegen_;
|
| NestedStatement* previous_;
|
| + int stack_depth_;
|
| + int stack_delta_;
|
| DISALLOW_COPY_AND_ASSIGN(NestedStatement);
|
| };
|
|
|
| // A breakable statement such as a block.
|
| class Breakable : public NestedStatement {
|
| public:
|
| - Breakable(FullCodeGenerator* codegen, BreakableStatement* statement)
|
| - : NestedStatement(codegen), statement_(statement) {
|
| + Breakable(FullCodeGenerator* codegen,
|
| + BreakableStatement* statement,
|
| + int stack_delta = 0)
|
| + : NestedStatement(codegen, stack_delta), statement_(statement) {
|
| }
|
| virtual ~Breakable() {}
|
|
|
| @@ -174,8 +181,10 @@ class FullCodeGenerator: public AstVisitor {
|
| // An iteration statement such as a while, for, or do loop.
|
| class Iteration : public Breakable {
|
| public:
|
| - Iteration(FullCodeGenerator* codegen, IterationStatement* statement)
|
| - : Breakable(codegen, statement) {
|
| + Iteration(FullCodeGenerator* codegen,
|
| + IterationStatement* statement,
|
| + int stack_delta = 0)
|
| + : Breakable(codegen, statement, stack_delta) {
|
| }
|
| virtual ~Iteration() {}
|
|
|
| @@ -193,23 +202,21 @@ class FullCodeGenerator: public AstVisitor {
|
| // A nested block statement.
|
| class NestedBlock : public Breakable {
|
| public:
|
| - NestedBlock(FullCodeGenerator* codegen, Block* block)
|
| - : Breakable(codegen, block) {
|
| - }
|
| + NestedBlock(FullCodeGenerator* codegen, Block* block);
|
| +
|
| virtual ~NestedBlock() {}
|
|
|
| - virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
|
| - if (statement()->AsBlock()->block_scope() != NULL) {
|
| - ++(*context_length);
|
| - }
|
| - return previous_;
|
| - };
|
| + virtual NestedStatement* Exit(int* stack_depth, int* context_length);
|
| };
|
|
|
| // The try block of a try/catch statement.
|
| class TryCatch : public NestedStatement {
|
| public:
|
| - explicit TryCatch(FullCodeGenerator* codegen) : NestedStatement(codegen) {
|
| + static const int kElementCount =
|
| + StackHandlerConstants::kSize / kPointerSize;
|
| +
|
| + explicit TryCatch(FullCodeGenerator* codegen)
|
| + : NestedStatement(codegen, kElementCount) {
|
| }
|
| virtual ~TryCatch() {}
|
|
|
| @@ -219,8 +226,11 @@ class FullCodeGenerator: public AstVisitor {
|
| // The try block of a try/finally statement.
|
| class TryFinally : public NestedStatement {
|
| public:
|
| + static const int kElementCount = 5;
|
| +
|
| TryFinally(FullCodeGenerator* codegen, Label* finally_entry)
|
| - : NestedStatement(codegen), finally_entry_(finally_entry) {
|
| + : NestedStatement(codegen, kElementCount),
|
| + finally_entry_(finally_entry) {
|
| }
|
| virtual ~TryFinally() {}
|
|
|
| @@ -235,13 +245,9 @@ class FullCodeGenerator: public AstVisitor {
|
| public:
|
| static const int kElementCount = 2;
|
|
|
| - explicit Finally(FullCodeGenerator* codegen) : NestedStatement(codegen) { }
|
| + explicit Finally(FullCodeGenerator* codegen)
|
| + : NestedStatement(codegen, kElementCount) { }
|
| virtual ~Finally() {}
|
| -
|
| - virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
|
| - *stack_depth += kElementCount;
|
| - return previous_;
|
| - }
|
| };
|
|
|
| // The body of a for/in loop.
|
| @@ -250,14 +256,9 @@ class FullCodeGenerator: public AstVisitor {
|
| static const int kElementCount = 5;
|
|
|
| ForIn(FullCodeGenerator* codegen, ForInStatement* statement)
|
| - : Iteration(codegen, statement) {
|
| + : Iteration(codegen, statement, kElementCount) {
|
| }
|
| virtual ~ForIn() {}
|
| -
|
| - virtual NestedStatement* Exit(int* stack_depth, int* context_length) {
|
| - *stack_depth += kElementCount;
|
| - return previous_;
|
| - }
|
| };
|
|
|
|
|
| @@ -265,7 +266,7 @@ class FullCodeGenerator: public AstVisitor {
|
| class WithOrCatch : public NestedStatement {
|
| public:
|
| explicit WithOrCatch(FullCodeGenerator* codegen)
|
| - : NestedStatement(codegen) {
|
| + : NestedStatement(codegen, 0) {
|
| }
|
| virtual ~WithOrCatch() {}
|
|
|
|
|