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

Unified Diff: src/wasm/ast-decoder.cc

Issue 2135693002: [wasm] Add a BytecodeIterator and use in non-performance-critical situations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add C++ iterator Created 4 years, 5 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
Index: src/wasm/ast-decoder.cc
diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc
index fe773630ec024c3dbd48f6af849fe0a096e285b2..70f7bfdd1d7306dd8908feef1a054dbcd1ac9337 100644
--- a/src/wasm/ast-decoder.cc
+++ b/src/wasm/ast-decoder.cc
@@ -1464,6 +1464,17 @@ bool DecodeLocalDecls(AstLocalDecls& decls, const byte* start,
return decoder.DecodeLocalDecls(decls);
}
+BytecodeIterator::BytecodeIterator(const byte* start, const byte* end,
+ AstLocalDecls* decls)
+ : Decoder(start, end) {
+ if (decls != nullptr) {
+ if (DecodeLocalDecls(*decls, start, end)) {
+ pc_ += decls->decls_encoded_size;
+ if (pc_ > end_) pc_ = end_;
+ }
+ }
+}
+
DecodeResult VerifyWasmCode(base::AccountingAllocator* allocator,
FunctionBody& body) {
Zone zone(allocator);
@@ -1511,9 +1522,8 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
// Print the local declarations.
AstLocalDecls decls(&zone);
- decoder.DecodeLocalDecls(decls);
- const byte* pc = decoder.pc();
- if (body.start != decoder.pc()) {
+ BytecodeIterator i(body.start, body.end, &decls);
+ if (body.start != i.pc()) {
os << "// locals: ";
for (auto p : decls.local_types) {
LocalType type = p.first;
@@ -1523,7 +1533,7 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
os << std::endl;
++line_nr;
- for (const byte* locals = body.start; locals < pc; locals++) {
+ for (const byte* locals = body.start; locals < i.pc(); locals++) {
os << (locals == body.start ? "0x" : " 0x") << AsHex(*locals, 2) << ",";
}
os << std::endl;
@@ -1533,16 +1543,16 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
os << "// body: " << std::endl;
++line_nr;
unsigned control_depth = 0;
- while (pc < body.end) {
- unsigned length = decoder.OpcodeLength(pc);
+ for (; i.has_next(); i.next()) {
+ unsigned length = decoder.OpcodeLength(i.pc());
- WasmOpcode opcode = static_cast<WasmOpcode>(*pc);
+ WasmOpcode opcode = i.current();
if (opcode == kExprElse) control_depth--;
int num_whitespaces = control_depth < 32 ? 2 * control_depth : 64;
if (offset_table) {
offset_table->push_back(
- std::make_tuple(pc - body.start, line_nr, num_whitespaces));
+ std::make_tuple(i.pc_offset(), line_nr, num_whitespaces));
}
// 64 whitespaces
@@ -1551,8 +1561,8 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
os.write(padding, num_whitespaces);
os << "k" << WasmOpcodes::OpcodeName(opcode) << ",";
- for (size_t i = 1; i < length; ++i) {
- os << " " << AsHex(pc[i], 2) << ",";
+ for (size_t j = 1; j < length; ++j) {
+ os << " " << AsHex(i.pc()[j], 2) << ",";
}
switch (opcode) {
@@ -1560,32 +1570,32 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
case kExprElse:
case kExprLoop:
case kExprBlock:
- os << " // @" << static_cast<int>(pc - body.start);
+ os << " // @" << i.pc_offset();
control_depth++;
break;
case kExprEnd:
- os << " // @" << static_cast<int>(pc - body.start);
+ os << " // @" << i.pc_offset();
control_depth--;
break;
case kExprBr: {
- BreakDepthOperand operand(&decoder, pc);
+ BreakDepthOperand operand(&i, i.pc());
os << " // arity=" << operand.arity << " depth=" << operand.depth;
break;
}
case kExprBrIf: {
- BreakDepthOperand operand(&decoder, pc);
+ BreakDepthOperand operand(&i, i.pc());
os << " // arity=" << operand.arity << " depth" << operand.depth;
break;
}
case kExprBrTable: {
- BranchTableOperand operand(&decoder, pc);
+ BranchTableOperand operand(&i, i.pc());
os << " // arity=" << operand.arity
<< " entries=" << operand.table_count;
break;
}
case kExprCallIndirect: {
- CallIndirectOperand operand(&decoder, pc);
- if (decoder.Complete(pc, operand)) {
+ CallIndirectOperand operand(&i, i.pc());
+ if (decoder.Complete(i.pc(), operand)) {
os << " // sig #" << operand.index << ": " << *operand.sig;
} else {
os << " // arity=" << operand.arity << " sig #" << operand.index;
@@ -1593,8 +1603,8 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
break;
}
case kExprCallImport: {
- CallImportOperand operand(&decoder, pc);
- if (decoder.Complete(pc, operand)) {
+ CallImportOperand operand(&i, i.pc());
+ if (decoder.Complete(i.pc(), operand)) {
os << " // import #" << operand.index << ": " << *operand.sig;
} else {
os << " // arity=" << operand.arity << " import #" << operand.index;
@@ -1602,8 +1612,8 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
break;
}
case kExprCallFunction: {
- CallFunctionOperand operand(&decoder, pc);
- if (decoder.Complete(pc, operand)) {
+ CallFunctionOperand operand(&i, i.pc());
+ if (decoder.Complete(i.pc(), operand)) {
os << " // function #" << operand.index << ": " << *operand.sig;
} else {
os << " // arity=" << operand.arity << " function #" << operand.index;
@@ -1611,15 +1621,13 @@ bool PrintAst(base::AccountingAllocator* allocator, const FunctionBody& body,
break;
}
case kExprReturn: {
- ReturnArityOperand operand(&decoder, pc);
+ ReturnArityOperand operand(&i, i.pc());
os << " // arity=" << operand.arity;
break;
}
default:
break;
}
-
- pc += length;
os << std::endl;
++line_nr;
}

Powered by Google App Engine
This is Rietveld 408576698