| Index: src/wasm/asm-wasm-builder.cc
|
| diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc
|
| index 5e3da290c5dddd9d3fe1cb0da5a8257e384f6793..69777b5e14123c9e3c9ea9b3bc122666409edeee 100644
|
| --- a/src/wasm/asm-wasm-builder.cc
|
| +++ b/src/wasm/asm-wasm-builder.cc
|
| @@ -92,8 +92,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
| }
|
| }
|
| DCHECK(in_function_);
|
| - BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false);
|
| - block_size_ = static_cast<byte>(stmt->statements()->length());
|
| + BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false,
|
| + static_cast<byte>(stmt->statements()->length()));
|
| RECURSE(VisitStatements(stmt->statements()));
|
| DCHECK(block_size_ >= 0);
|
| }
|
| @@ -106,12 +106,13 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
|
|
| public:
|
| BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt,
|
| - WasmOpcode opcode, bool is_loop)
|
| + WasmOpcode opcode, bool is_loop, int initial_block_size)
|
| : builder_(builder) {
|
| builder_->breakable_blocks_.push_back(std::make_pair(stmt, is_loop));
|
| builder_->current_function_builder_->Emit(opcode);
|
| index_ = builder_->current_function_builder_->EmitEditableImmediate(0);
|
| prev_block_size_ = builder_->block_size_;
|
| + builder_->block_size_ = initial_block_size;
|
| }
|
| ~BlockVisitor() {
|
| builder_->current_function_builder_->EditImmediate(index_,
|
| @@ -225,8 +226,7 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
| VisitLiteral(label);
|
| current_function_builder_->Emit(kExprGetLocal);
|
| AddLeb128(fall_through, true);
|
| - BlockVisitor visitor(this, nullptr, kExprBlock, false);
|
| - block_size_ = 0;
|
| + BlockVisitor visitor(this, nullptr, kExprBlock, false, 0);
|
| SetLocalTo(fall_through, 1);
|
| ZoneList<Statement*>* stmts = clause->statements();
|
| block_size_ += stmts->length();
|
| @@ -236,8 +236,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
| void VisitSwitchStatement(SwitchStatement* stmt) {
|
| VariableProxy* tag = stmt->tag()->AsVariableProxy();
|
| DCHECK(tag != NULL);
|
| - BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false);
|
| - block_size_ = 0;
|
| + BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false,
|
| + 0);
|
| uint16_t fall_through = current_function_builder_->AddLocal(kAstI32);
|
| SetLocalTo(fall_through, 0);
|
|
|
| @@ -258,8 +258,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
|
|
| void VisitDoWhileStatement(DoWhileStatement* stmt) {
|
| DCHECK(in_function_);
|
| - BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
|
| - block_size_ = 2;
|
| + BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
|
| + 2);
|
| RECURSE(Visit(stmt->body()));
|
| current_function_builder_->Emit(kExprIf);
|
| RECURSE(Visit(stmt->cond()));
|
| @@ -269,8 +269,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
|
|
| void VisitWhileStatement(WhileStatement* stmt) {
|
| DCHECK(in_function_);
|
| - BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
|
| - block_size_ = 1;
|
| + BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
|
| + 1);
|
| current_function_builder_->Emit(kExprIf);
|
| RECURSE(Visit(stmt->cond()));
|
| current_function_builder_->EmitWithU8(kExprBr, 0);
|
| @@ -283,8 +283,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
|
| block_size_++;
|
| RECURSE(Visit(stmt->init()));
|
| }
|
| - BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
|
| - block_size_ = 0;
|
| + BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true,
|
| + 0);
|
| if (stmt->cond() != nullptr) {
|
| block_size_++;
|
| current_function_builder_->Emit(kExprIf);
|
|
|