| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/module-decoder.h" | 5 #include "src/wasm/module-decoder.h" |
| 6 | 6 |
| 7 #include "src/base/functional.h" | 7 #include "src/base/functional.h" |
| 8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
| 9 #include "src/flags.h" | 9 #include "src/flags.h" |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1070 } | 1070 } |
| 1071 decoder.consume_bytes(section_iter.payload_length(), "section payload"); | 1071 decoder.consume_bytes(section_iter.payload_length(), "section payload"); |
| 1072 section_iter.advance(); | 1072 section_iter.advance(); |
| 1073 } | 1073 } |
| 1074 | 1074 |
| 1075 return Vector<const uint8_t>(); | 1075 return Vector<const uint8_t>(); |
| 1076 } | 1076 } |
| 1077 | 1077 |
| 1078 } // namespace | 1078 } // namespace |
| 1079 | 1079 |
| 1080 ModuleResult DecodeWasmModule(Isolate* isolate, Zone* zone, | 1080 ModuleResult DecodeWasmModule(Isolate* isolate, const byte* module_start, |
| 1081 const byte* module_start, const byte* module_end, | 1081 const byte* module_end, bool verify_functions, |
| 1082 bool verify_functions, ModuleOrigin origin) { | 1082 ModuleOrigin origin) { |
| 1083 size_t decode_memory_start = zone->allocation_size(); | |
| 1084 HistogramTimerScope wasm_decode_module_time_scope( | 1083 HistogramTimerScope wasm_decode_module_time_scope( |
| 1085 isolate->counters()->wasm_decode_module_time()); | 1084 isolate->counters()->wasm_decode_module_time()); |
| 1086 size_t size = module_end - module_start; | 1085 size_t size = module_end - module_start; |
| 1087 if (module_start > module_end) return ModuleError("start > end"); | 1086 if (module_start > module_end) return ModuleError("start > end"); |
| 1088 if (size >= kMaxModuleSize) return ModuleError("size > maximum module size"); | 1087 if (size >= kMaxModuleSize) return ModuleError("size > maximum module size"); |
| 1089 // TODO(bradnelson): Improve histogram handling of size_t. | 1088 // TODO(bradnelson): Improve histogram handling of size_t. |
| 1090 isolate->counters()->wasm_module_size_bytes()->AddSample( | 1089 isolate->counters()->wasm_module_size_bytes()->AddSample( |
| 1091 static_cast<int>(size)); | 1090 static_cast<int>(size)); |
| 1092 WasmModule* module = new WasmModule(); | 1091 // Signatures are stored in zone memory, which have the same lifetime |
| 1092 // as the {module}. |
| 1093 Zone* zone = new Zone(isolate->allocator(), ZONE_NAME); |
| 1094 WasmModule* module = new WasmModule(zone, module_start); |
| 1093 ModuleDecoder decoder(zone, module_start, module_end, origin); | 1095 ModuleDecoder decoder(zone, module_start, module_end, origin); |
| 1094 ModuleResult result = decoder.DecodeModule(module, verify_functions); | 1096 ModuleResult result = decoder.DecodeModule(module, verify_functions); |
| 1095 // TODO(bradnelson): Improve histogram handling of size_t. | 1097 // TODO(bradnelson): Improve histogram handling of size_t. |
| 1098 // TODO(titzer): this isn't accurate, since it doesn't count the data |
| 1099 // allocated on the C++ heap. |
| 1100 // https://bugs.chromium.org/p/chromium/issues/detail?id=657320 |
| 1096 isolate->counters()->wasm_decode_module_peak_memory_bytes()->AddSample( | 1101 isolate->counters()->wasm_decode_module_peak_memory_bytes()->AddSample( |
| 1097 static_cast<int>(zone->allocation_size() - decode_memory_start)); | 1102 static_cast<int>(zone->allocation_size())); |
| 1098 return result; | 1103 return result; |
| 1099 } | 1104 } |
| 1100 | 1105 |
| 1101 FunctionSig* DecodeWasmSignatureForTesting(Zone* zone, const byte* start, | 1106 FunctionSig* DecodeWasmSignatureForTesting(Zone* zone, const byte* start, |
| 1102 const byte* end) { | 1107 const byte* end) { |
| 1103 ModuleDecoder decoder(zone, start, end, kWasmOrigin); | 1108 ModuleDecoder decoder(zone, start, end, kWasmOrigin); |
| 1104 return decoder.DecodeFunctionSignature(start); | 1109 return decoder.DecodeFunctionSignature(start); |
| 1105 } | 1110 } |
| 1106 | 1111 |
| 1107 WasmInitExpr DecodeWasmInitExprForTesting(const byte* start, const byte* end) { | 1112 WasmInitExpr DecodeWasmInitExprForTesting(const byte* start, const byte* end) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1205 table.push_back(std::move(func_asm_offsets)); | 1210 table.push_back(std::move(func_asm_offsets)); |
| 1206 } | 1211 } |
| 1207 if (decoder.more()) decoder.error("unexpected additional bytes"); | 1212 if (decoder.more()) decoder.error("unexpected additional bytes"); |
| 1208 | 1213 |
| 1209 return decoder.toResult(std::move(table)); | 1214 return decoder.toResult(std::move(table)); |
| 1210 } | 1215 } |
| 1211 | 1216 |
| 1212 } // namespace wasm | 1217 } // namespace wasm |
| 1213 } // namespace internal | 1218 } // namespace internal |
| 1214 } // namespace v8 | 1219 } // namespace v8 |
| OLD | NEW |