| 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_;
|
| }
|
|
|