Index: src/wasm/wasm-module.cc |
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
index 514184b2f9d50ce87ac5f8747b8e15b2ade5ff3f..81ae133b687a987c12554664494f82f98f07e22a 100644 |
--- a/src/wasm/wasm-module.cc |
+++ b/src/wasm/wasm-module.cc |
@@ -12,6 +12,7 @@ |
#include "src/wasm/ast-decoder.h" |
#include "src/wasm/module-decoder.h" |
+#include "src/wasm/wasm-debug.h" |
#include "src/wasm/wasm-function-name-table.h" |
#include "src/wasm/wasm-module.h" |
#include "src/wasm/wasm-result.h" |
@@ -205,12 +206,15 @@ class WasmLinker { |
namespace { |
// Internal constants for the layout of the module object. |
-const int kWasmModuleInternalFieldCount = 5; |
const int kWasmModuleFunctionTable = 0; |
const int kWasmModuleCodeTable = 1; |
const int kWasmMemArrayBuffer = 2; |
const int kWasmGlobalsArrayBuffer = 3; |
+// TODO(clemensh): Remove function name array, extract names from module bytes. |
const int kWasmFunctionNamesArray = 4; |
+const int kWasmModuleBytesString = 5; |
+const int kWasmDebugInfo = 6; |
+const int kWasmModuleInternalFieldCount = 7; |
void LoadDataSegments(const WasmModule* module, byte* mem_addr, |
size_t mem_size) { |
@@ -701,6 +705,16 @@ MaybeHandle<JSObject> WasmModule::Instantiate( |
Handle<FixedArray> code_table = |
factory->NewFixedArray(static_cast<int>(functions.size()), TENURED); |
instance.js_object->SetInternalField(kWasmModuleCodeTable, *code_table); |
+ size_t module_bytes_len = |
+ instance.module->module_end - instance.module->module_start; |
+ DCHECK_LE(module_bytes_len, static_cast<size_t>(kMaxInt)); |
+ Vector<const uint8_t> module_bytes_vec(instance.module->module_start, |
+ static_cast<int>(module_bytes_len)); |
+ Handle<String> module_bytes_string = |
+ factory->NewStringFromOneByte(module_bytes_vec, TENURED) |
+ .ToHandleChecked(); |
+ instance.js_object->SetInternalField(kWasmModuleBytesString, |
+ *module_bytes_string); |
//------------------------------------------------------------------------- |
// Allocate and initialize the linear memory. |
@@ -1010,12 +1024,36 @@ Handle<String> GetWasmFunctionName(Isolate* isolate, Handle<Object> wasm, |
return isolate->factory()->NewStringFromStaticChars("<WASM UNNAMED>"); |
} |
-bool IsWasmObject(Handle<JSObject> object) { |
- // TODO(clemensh): Check wasm byte header once we store a copy of the bytes. |
- return object->GetInternalFieldCount() == kWasmModuleInternalFieldCount && |
- object->GetInternalField(kWasmModuleCodeTable)->IsFixedArray() && |
- object->GetInternalField(kWasmMemArrayBuffer)->IsJSArrayBuffer() && |
- object->GetInternalField(kWasmFunctionNamesArray)->IsByteArray(); |
+bool IsWasmObject(Object* object) { |
+ if (!object->IsJSObject()) return false; |
+ JSObject* obj = JSObject::cast(object); |
+ if (obj->GetInternalFieldCount() != kWasmModuleInternalFieldCount || |
+ !obj->GetInternalField(kWasmModuleCodeTable)->IsFixedArray() || |
+ !obj->GetInternalField(kWasmMemArrayBuffer)->IsJSArrayBuffer() || |
+ !obj->GetInternalField(kWasmFunctionNamesArray)->IsByteArray() || |
+ !obj->GetInternalField(kWasmModuleBytesString)->IsSeqOneByteString()) { |
+ return false; |
+ } |
+ DisallowHeapAllocation no_gc; |
+ SeqOneByteString* bytes = |
+ SeqOneByteString::cast(obj->GetInternalField(kWasmModuleBytesString)); |
+ if (bytes->length() < 4) return false; |
+ if (memcmp(bytes->GetChars(), "\0asm", 4)) return false; |
+ |
+ // All checks passed. |
+ return true; |
+} |
+ |
+SeqOneByteString* GetWasmBytes(JSObject* wasm) { |
+ return SeqOneByteString::cast(wasm->GetInternalField(kWasmModuleBytesString)); |
+} |
+ |
+WasmDebugInfo* GetDebugInfo(JSObject* wasm) { |
+ Object* info = wasm->GetInternalField(kWasmDebugInfo); |
+ if (!info->IsUndefined(wasm->GetIsolate())) return WasmDebugInfo::cast(info); |
+ Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(handle(wasm)); |
+ wasm->SetInternalField(kWasmDebugInfo, *new_info); |
+ return *new_info; |
} |
} // namespace wasm |