Chromium Code Reviews| Index: src/wasm/ast-decoder.cc |
| diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
| index cef1051981022d711e12f60467069fa7409ccdbe..9e943b0fa534b8b643aff485d6f6e04f8279288d 100644 |
| --- a/src/wasm/ast-decoder.cc |
| +++ b/src/wasm/ast-decoder.cc |
| @@ -14,6 +14,8 @@ |
| #include "src/wasm/wasm-module.h" |
| #include "src/wasm/wasm-opcodes.h" |
| +#include "src/ostreams.h" |
| + |
| #include "src/compiler/wasm-compiler.h" |
| namespace v8 { |
| @@ -401,10 +403,6 @@ class SR_WasmDecoder : public WasmDecoder { |
| } |
| if (ok()) { |
| - if (FLAG_trace_wasm_ast) { |
| - FunctionBody body = {module_, sig_, base_, start_, end_}; |
| - PrintAst(body); |
| - } |
| TRACE("wasm-decode ok\n"); |
| } else { |
| TRACE("wasm-error module+%-6d func+%d: %s\n\n", baserel(error_pc_), |
| @@ -1689,8 +1687,42 @@ int OpcodeArity(ModuleEnv* module, FunctionSig* sig, const byte* pc, |
| } |
| void PrintAst(FunctionBody& body) { |
| - WasmDecoder decoder(body.module, body.sig, body.start, body.end); |
| - const byte* pc = body.start; |
| + Zone zone; |
| + SR_WasmDecoder decoder(&zone, nullptr, body); |
| + |
| + OFStream os(stdout); |
| + |
| + // Print the function signature. |
| + if (body.sig) { |
| + os << "// signature: " << *body.sig << std::endl; |
| + } |
| + |
| + // Print the local declarations. |
| + std::vector<LocalType>* decls = decoder.DecodeLocalDeclsForTesting(); |
| + const byte* pc = decoder.pc(); |
| + if (body.start != decoder.pc()) { |
| + printf("// locals:"); |
|
ahaas
2016/03/15 14:24:55
Why do you mix streams and printf here?
titzer
2016/03/15 17:18:04
Meh, it's a mix because of some 0x%02x things belo
|
| + size_t pos = 0; |
| + while (pos < decls->size()) { |
| + LocalType type = decls->at(pos++); |
| + size_t count = 1; |
| + while (pos < decls->size() && decls->at(pos) == type) { |
| + pos++; |
| + count++; |
| + } |
| + |
| + os << " " << count << " " << WasmOpcodes::TypeName(type); |
| + } |
| + os << std::endl; |
| + |
| + for (const byte* locals = body.start; locals < pc; locals++) { |
| + printf(" 0x%02x,", *locals); |
| + } |
| + printf("\n"); |
| + } |
| + delete decls; |
| + |
| + printf("// body: \n"); |
| std::vector<int> arity_stack; |
| while (pc < body.end) { |
| int arity = decoder.OpcodeArity(pc); |
| @@ -1707,6 +1739,35 @@ void PrintAst(FunctionBody& body) { |
| for (size_t i = 1; i < length; i++) { |
| printf(" 0x%02x,", pc[i]); |
| } |
| + |
| + if (body.module) { |
| + switch (opcode) { |
| + case kExprCallIndirect: { |
| + SignatureIndexOperand operand(&decoder, pc); |
| + if (decoder.Validate(pc, operand)) { |
| + os << " // sig #" << operand.index << ": " << *operand.sig; |
| + } |
| + break; |
| + } |
| + case kExprCallImport: { |
| + ImportIndexOperand operand(&decoder, pc); |
| + if (decoder.Validate(pc, operand)) { |
| + os << " // import #" << operand.index << ": " << *operand.sig; |
| + } |
| + break; |
| + } |
| + case kExprCallFunction: { |
| + FunctionIndexOperand operand(&decoder, pc); |
| + if (decoder.Validate(pc, operand)) { |
| + os << " // function #" << operand.index << ": " << *operand.sig; |
| + } |
| + break; |
| + } |
| + default: |
| + break; |
| + } |
| + } |
| + |
| pc += length; |
| printf("\n"); |