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); |