| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/wasm/wasm-text.h" | 5 #include "src/wasm/wasm-text.h" |
| 6 | 6 |
| 7 #include "src/debug/interface-types.h" |
| 7 #include "src/ostreams.h" | 8 #include "src/ostreams.h" |
| 8 #include "src/vector.h" | 9 #include "src/vector.h" |
| 9 #include "src/wasm/ast-decoder.h" | 10 #include "src/wasm/ast-decoder.h" |
| 10 #include "src/wasm/wasm-module.h" | 11 #include "src/wasm/wasm-module.h" |
| 11 #include "src/wasm/wasm-opcodes.h" | 12 #include "src/wasm/wasm-opcodes.h" |
| 12 #include "src/zone/zone.h" | 13 #include "src/zone/zone.h" |
| 13 | 14 |
| 15 using namespace v8; |
| 14 using namespace v8::internal; | 16 using namespace v8::internal; |
| 15 using namespace v8::internal::wasm; | 17 using namespace v8::internal::wasm; |
| 16 | 18 |
| 17 namespace { | 19 namespace { |
| 18 const char *GetOpName(WasmOpcode opcode) { | 20 const char *GetOpName(WasmOpcode opcode) { |
| 19 #define CASE_OP(name, str) \ | 21 #define CASE_OP(name, str) \ |
| 20 case kExpr##name: \ | 22 case kExpr##name: \ |
| 21 return str; | 23 return str; |
| 22 #define CASE_I32_OP(name, str) CASE_OP(I32##name, "i32." str) | 24 #define CASE_I32_OP(name, str) CASE_OP(I32##name, "i32." str) |
| 23 #define CASE_I64_OP(name, str) CASE_OP(I64##name, "i64." str) | 25 #define CASE_I64_OP(name, str) CASE_OP(I64##name, "i64." str) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 for (char c : name) { | 122 for (char c : name) { |
| 121 bool valid_char = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || | 123 bool valid_char = (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || |
| 122 (c >= 'A' && c <= 'Z') || strchr(special_chars, c); | 124 (c >= 'A' && c <= 'Z') || strchr(special_chars, c); |
| 123 if (!valid_char) return false; | 125 if (!valid_char) return false; |
| 124 } | 126 } |
| 125 return true; | 127 return true; |
| 126 } | 128 } |
| 127 | 129 |
| 128 } // namespace | 130 } // namespace |
| 129 | 131 |
| 130 void wasm::PrintWasmText( | 132 void wasm::PrintWasmText(const WasmModule *module, |
| 131 const WasmModule *module, const ModuleWireBytes &wire_bytes, | 133 const ModuleWireBytes &wire_bytes, uint32_t func_index, |
| 132 uint32_t func_index, std::ostream &os, | 134 std::ostream &os, |
| 133 std::vector<std::tuple<uint32_t, int, int>> *offset_table) { | 135 debug::WasmDisassembly::OffsetTable *offset_table) { |
| 134 DCHECK_NOT_NULL(module); | 136 DCHECK_NOT_NULL(module); |
| 135 DCHECK_GT(module->functions.size(), func_index); | 137 DCHECK_GT(module->functions.size(), func_index); |
| 136 const WasmFunction *fun = &module->functions[func_index]; | 138 const WasmFunction *fun = &module->functions[func_index]; |
| 137 | 139 |
| 138 AccountingAllocator allocator; | 140 AccountingAllocator allocator; |
| 139 Zone zone(&allocator, ZONE_NAME); | 141 Zone zone(&allocator, ZONE_NAME); |
| 140 int line_nr = 0; | 142 int line_nr = 0; |
| 141 int control_depth = 0; | 143 int control_depth = 0; |
| 142 | 144 |
| 143 // Print the function signature. | 145 // Print the function signature. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 } | 183 } |
| 182 | 184 |
| 183 for (; i.has_next(); i.next()) { | 185 for (; i.has_next(); i.next()) { |
| 184 WasmOpcode opcode = i.current(); | 186 WasmOpcode opcode = i.current(); |
| 185 if (opcode == kExprElse || opcode == kExprEnd) --control_depth; | 187 if (opcode == kExprElse || opcode == kExprEnd) --control_depth; |
| 186 | 188 |
| 187 DCHECK_LE(0, control_depth); | 189 DCHECK_LE(0, control_depth); |
| 188 const int kMaxIndentation = 64; | 190 const int kMaxIndentation = 64; |
| 189 int indentation = std::min(kMaxIndentation, 2 * control_depth); | 191 int indentation = std::min(kMaxIndentation, 2 * control_depth); |
| 190 if (offset_table) { | 192 if (offset_table) { |
| 191 offset_table->push_back( | 193 offset_table->push_back(debug::WasmDisassemblyOffsetTableEntry( |
| 192 std::make_tuple(i.pc_offset(), line_nr, indentation)); | 194 i.pc_offset(), line_nr, indentation)); |
| 193 } | 195 } |
| 194 | 196 |
| 195 // 64 whitespaces | 197 // 64 whitespaces |
| 196 const char padding[kMaxIndentation + 1] = | 198 const char padding[kMaxIndentation + 1] = |
| 197 " "; | 199 " "; |
| 198 os.write(padding, indentation); | 200 os.write(padding, indentation); |
| 199 | 201 |
| 200 switch (opcode) { | 202 switch (opcode) { |
| 201 case kExprLoop: | 203 case kExprLoop: |
| 202 case kExprIf: | 204 case kExprIf: |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 default: | 303 default: |
| 302 UNREACHABLE(); | 304 UNREACHABLE(); |
| 303 break; | 305 break; |
| 304 } | 306 } |
| 305 os << '\n'; | 307 os << '\n'; |
| 306 ++line_nr; | 308 ++line_nr; |
| 307 } | 309 } |
| 308 DCHECK_EQ(0, control_depth); | 310 DCHECK_EQ(0, control_depth); |
| 309 DCHECK(i.ok()); | 311 DCHECK(i.ok()); |
| 310 } | 312 } |
| OLD | NEW |