| Index: src/wasm/wasm-module.h
|
| diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h
|
| index 3dc58b8448660831542b9bce58389d3f8428fcba..bf4aa0abc011dd9a76a7ef31506f2b65ca57f430 100644
|
| --- a/src/wasm/wasm-module.h
|
| +++ b/src/wasm/wasm-module.h
|
| @@ -177,6 +177,7 @@ struct WasmExport {
|
| };
|
|
|
| enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin };
|
| +struct ModuleWireBytes;
|
|
|
| // Static representation of a module.
|
| struct V8_EXPORT_PRIVATE WasmModule {
|
| @@ -187,8 +188,6 @@ struct V8_EXPORT_PRIVATE WasmModule {
|
| static const size_t kV8MaxTableSize = 16 * 1024 * 1024;
|
|
|
| Zone* owned_zone;
|
| - const byte* module_start = nullptr; // starting address for the module bytes
|
| - const byte* module_end = nullptr; // end address for the module bytes
|
| uint32_t min_mem_pages = 0; // minimum size of the memory in 64k pages
|
| uint32_t max_mem_pages = 0; // maximum size of the memory in 64k pages
|
| bool has_memory = false; // true if the memory was defined or imported
|
| @@ -220,46 +219,12 @@ struct V8_EXPORT_PRIVATE WasmModule {
|
| // switch to libc-2.21 or higher.
|
| std::unique_ptr<base::Semaphore> pending_tasks;
|
|
|
| - WasmModule() : WasmModule(nullptr, nullptr) {}
|
| - WasmModule(Zone* owned_zone, const byte* module_start);
|
| + WasmModule() : WasmModule(nullptr) {}
|
| + WasmModule(Zone* owned_zone);
|
| ~WasmModule() {
|
| if (owned_zone) delete owned_zone;
|
| }
|
|
|
| - // Get a string stored in the module bytes representing a name.
|
| - WasmName GetName(uint32_t offset, uint32_t length) const {
|
| - if (length == 0) return {"<?>", 3}; // no name.
|
| - CHECK(BoundsCheck(offset, offset + length));
|
| - DCHECK_GE(static_cast<int>(length), 0);
|
| - return {reinterpret_cast<const char*>(module_start + offset),
|
| - static_cast<int>(length)};
|
| - }
|
| -
|
| - // Get a string stored in the module bytes representing a function name.
|
| - WasmName GetName(WasmFunction* function) const {
|
| - return GetName(function->name_offset, function->name_length);
|
| - }
|
| -
|
| - // Get a string stored in the module bytes representing a name.
|
| - WasmName GetNameOrNull(uint32_t offset, uint32_t length) const {
|
| - if (offset == 0 && length == 0) return {NULL, 0}; // no name.
|
| - CHECK(BoundsCheck(offset, offset + length));
|
| - DCHECK_GE(static_cast<int>(length), 0);
|
| - return {reinterpret_cast<const char*>(module_start + offset),
|
| - static_cast<int>(length)};
|
| - }
|
| -
|
| - // Get a string stored in the module bytes representing a function name.
|
| - WasmName GetNameOrNull(const WasmFunction* function) const {
|
| - return GetNameOrNull(function->name_offset, function->name_length);
|
| - }
|
| -
|
| - // Checks the given offset range is contained within the module bytes.
|
| - bool BoundsCheck(uint32_t start, uint32_t end) const {
|
| - size_t size = module_end - module_start;
|
| - return start <= size && end <= size;
|
| - }
|
| -
|
| // Creates a new instantiation of the module in the given isolate.
|
| static MaybeHandle<WasmInstanceObject> Instantiate(
|
| Isolate* isolate, ErrorThrower* thrower, Handle<JSObject> wasm_module,
|
| @@ -267,7 +232,7 @@ struct V8_EXPORT_PRIVATE WasmModule {
|
|
|
| MaybeHandle<WasmCompiledModule> CompileFunctions(
|
| Isolate* isolate, Handle<Managed<WasmModule>> module_wrapper,
|
| - ErrorThrower* thrower) const;
|
| + ErrorThrower* thrower, const ModuleWireBytes& wire_bytes) const;
|
| };
|
|
|
| typedef Managed<WasmModule> WasmModuleWrapper;
|
| @@ -294,12 +259,63 @@ struct WasmInstance {
|
| function_code(m->functions.size()) {}
|
| };
|
|
|
| +// Interface to the storage (wire bytes) of a wasm module.
|
| +// It is illegal for anyone receiving a ModuleWireBytes to store pointers based
|
| +// on module_bytes, as this storage is only guaranteed to be alive as long as
|
| +// this struct is alive.
|
| +struct V8_EXPORT_PRIVATE ModuleWireBytes {
|
| + ModuleWireBytes(Vector<const byte> module_bytes)
|
| + : module_bytes(module_bytes) {}
|
| + ModuleWireBytes(const byte* start, const byte* end)
|
| + : module_bytes(start, static_cast<int>(end - start)) {
|
| + DCHECK_GE(kMaxInt, end - start);
|
| + }
|
| +
|
| + const Vector<const byte> module_bytes;
|
| +
|
| + // Get a string stored in the module bytes representing a name.
|
| + WasmName GetName(uint32_t offset, uint32_t length) const {
|
| + if (length == 0) return {"<?>", 3}; // no name.
|
| + CHECK(BoundsCheck(offset, length));
|
| + DCHECK_GE(static_cast<int>(length), 0);
|
| + return Vector<const char>::cast(
|
| + module_bytes.SubVector(offset, offset + length));
|
| + }
|
| +
|
| + // Get a string stored in the module bytes representing a function name.
|
| + WasmName GetName(const WasmFunction* function) const {
|
| + return GetName(function->name_offset, function->name_length);
|
| + }
|
| +
|
| + // Get a string stored in the module bytes representing a name.
|
| + WasmName GetNameOrNull(uint32_t offset, uint32_t length) const {
|
| + if (offset == 0 && length == 0) return {NULL, 0}; // no name.
|
| + CHECK(BoundsCheck(offset, length));
|
| + DCHECK_GE(static_cast<int>(length), 0);
|
| + return Vector<const char>::cast(
|
| + module_bytes.SubVector(offset, offset + length));
|
| + }
|
| +
|
| + // Get a string stored in the module bytes representing a function name.
|
| + WasmName GetNameOrNull(const WasmFunction* function) const {
|
| + return GetNameOrNull(function->name_offset, function->name_length);
|
| + }
|
| +
|
| + // Checks the given offset range is contained within the module bytes.
|
| + bool BoundsCheck(uint32_t offset, uint32_t length) const {
|
| + uint32_t size = static_cast<uint32_t>(module_bytes.length());
|
| + return offset <= size && length <= size - offset;
|
| + }
|
| +};
|
| +
|
| // Interface provided to the decoder/graph builder which contains only
|
| // minimal information about the globals, functions, and function tables.
|
| struct V8_EXPORT_PRIVATE ModuleEnv {
|
| + ModuleEnv(const WasmModule* module, WasmInstance* instance)
|
| + : module(module), instance(instance) {}
|
| +
|
| const WasmModule* module;
|
| WasmInstance* instance;
|
| - ModuleOrigin origin;
|
|
|
| bool IsValidGlobal(uint32_t index) const {
|
| return module && index < module->globals.size();
|
| @@ -330,7 +346,7 @@ struct V8_EXPORT_PRIVATE ModuleEnv {
|
| return &module->function_tables[index];
|
| }
|
|
|
| - bool asm_js() { return origin == kAsmJsOrigin; }
|
| + bool asm_js() { return module->origin == kAsmJsOrigin; }
|
|
|
| Handle<Code> GetFunctionCode(uint32_t index) {
|
| DCHECK_NOT_NULL(instance);
|
| @@ -345,12 +361,23 @@ struct V8_EXPORT_PRIVATE ModuleEnv {
|
| Zone* zone, compiler::CallDescriptor* descriptor);
|
| };
|
|
|
| +// A ModuleEnv together with ModuleWireBytes.
|
| +struct ModuleBytesEnv : public ModuleEnv, public ModuleWireBytes {
|
| + ModuleBytesEnv(const WasmModule* module, WasmInstance* instance,
|
| + Vector<const byte> module_bytes)
|
| + : ModuleEnv(module, instance), ModuleWireBytes(module_bytes) {}
|
| + ModuleBytesEnv(const WasmModule* module, WasmInstance* instance,
|
| + const ModuleWireBytes& wire_bytes)
|
| + : ModuleEnv(module, instance), ModuleWireBytes(wire_bytes) {}
|
| +};
|
| +
|
| // A helper for printing out the names of functions.
|
| struct WasmFunctionName {
|
| + WasmFunctionName(const WasmFunction* function, ModuleBytesEnv* module_env)
|
| + : function_(function), name_(module_env->GetNameOrNull(function)) {}
|
| +
|
| const WasmFunction* function_;
|
| - const WasmModule* module_;
|
| - WasmFunctionName(const WasmFunction* function, const ModuleEnv* menv)
|
| - : function_(function), module_(menv ? menv->module : nullptr) {}
|
| + WasmName name_;
|
| };
|
|
|
| std::ostream& operator<<(std::ostream& os, const WasmModule& module);
|
|
|