Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1362)

Unified Diff: src/wasm/asm-wasm-builder.cc

Issue 1537743003: refactor block loading and unloading (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@UnreachableNodes
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/asm-wasm-builder.cc
diff --git a/src/wasm/asm-wasm-builder.cc b/src/wasm/asm-wasm-builder.cc
index 70c5c1ef8b4eaad87f38c820dadb363d77278162..a6287b047a9ffdaf1fd7c8d7e85779b62650942e 100644
--- a/src/wasm/asm-wasm-builder.cc
+++ b/src/wasm/asm-wasm-builder.cc
@@ -92,19 +92,35 @@ class AsmWasmBuilderImpl : public AstVisitor {
}
}
DCHECK(in_function_);
- breakable_blocks_.push_back(
- std::make_pair(stmt->AsBreakableStatement(), false));
- current_function_builder_->Emit(kExprBlock);
- uint32_t index = current_function_builder_->EmitEditableImmediate(0);
- int prev_block_size = block_size_;
+ BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprBlock, false);
block_size_ = static_cast<byte>(stmt->statements()->length());
RECURSE(VisitStatements(stmt->statements()));
DCHECK(block_size_ >= 0);
- current_function_builder_->EditImmediate(index, block_size_);
- block_size_ = prev_block_size;
- breakable_blocks_.pop_back();
}
+ class BlockVisitor {
+ private:
+ int prev_block_size_;
+ uint32_t index_;
+ AsmWasmBuilderImpl* builder_;
+
+ public:
+ BlockVisitor(AsmWasmBuilderImpl* builder, BreakableStatement* stmt,
+ WasmOpcode opcode, bool is_loop)
+ : 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_;
+ }
+ ~BlockVisitor() {
+ builder_->current_function_builder_->EditImmediate(index_,
+ builder_->block_size_);
+ builder_->block_size_ = prev_block_size_;
+ builder_->breakable_blocks_.pop_back();
+ }
+ };
+
void VisitExpressionStatement(ExpressionStatement* stmt) {
RECURSE(Visit(stmt->expression()));
}
@@ -207,34 +223,23 @@ class AsmWasmBuilderImpl : public AstVisitor {
void VisitDoWhileStatement(DoWhileStatement* stmt) {
DCHECK(in_function_);
- current_function_builder_->Emit(kExprLoop);
- uint32_t index = current_function_builder_->EmitEditableImmediate(0);
- int prev_block_size = block_size_;
- block_size_ = 0;
- breakable_blocks_.push_back(
- std::make_pair(stmt->AsBreakableStatement(), true));
- block_size_++;
+ BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
+ block_size_ = 2;
RECURSE(Visit(stmt->body()));
- block_size_++;
current_function_builder_->Emit(kExprIf);
RECURSE(Visit(stmt->cond()));
current_function_builder_->EmitWithU8(kExprBr, 0);
current_function_builder_->Emit(kExprNop);
- current_function_builder_->EditImmediate(index, block_size_);
- block_size_ = prev_block_size;
- breakable_blocks_.pop_back();
}
void VisitWhileStatement(WhileStatement* stmt) {
DCHECK(in_function_);
- current_function_builder_->EmitWithU8(kExprLoop, 1);
- breakable_blocks_.push_back(
- std::make_pair(stmt->AsBreakableStatement(), true));
+ BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
+ block_size_ = 1;
current_function_builder_->Emit(kExprIf);
RECURSE(Visit(stmt->cond()));
current_function_builder_->EmitWithU8(kExprBr, 0);
RECURSE(Visit(stmt->body()));
- breakable_blocks_.pop_back();
}
void VisitForStatement(ForStatement* stmt) {
@@ -243,12 +248,8 @@ class AsmWasmBuilderImpl : public AstVisitor {
block_size_++;
RECURSE(Visit(stmt->init()));
}
- current_function_builder_->Emit(kExprLoop);
- uint32_t index = current_function_builder_->EmitEditableImmediate(0);
- int prev_block_size = block_size_;
+ BlockVisitor visitor(this, stmt->AsBreakableStatement(), kExprLoop, true);
block_size_ = 0;
- breakable_blocks_.push_back(
- std::make_pair(stmt->AsBreakableStatement(), true));
if (stmt->cond() != NULL) {
block_size_++;
current_function_builder_->Emit(kExprIf);
@@ -268,9 +269,6 @@ class AsmWasmBuilderImpl : public AstVisitor {
block_size_++;
current_function_builder_->EmitWithU8(kExprBr, 0);
current_function_builder_->Emit(kExprNop);
- current_function_builder_->EditImmediate(index, block_size_);
- block_size_ = prev_block_size;
- breakable_blocks_.pop_back();
}
void VisitForInStatement(ForInStatement* stmt) { UNREACHABLE(); }
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698