Index: src/wasm/wasm-module.h |
diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h |
index 366cca9d340431e7751d191b76b6014f93ebb39e..80cd98fa82663ed6d689896f818debf7f7fa75d7 100644 |
--- a/src/wasm/wasm-module.h |
+++ b/src/wasm/wasm-module.h |
@@ -159,6 +159,8 @@ struct WasmExport { |
enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin }; |
+class WasmCompiledModule; |
+ |
// Static representation of a module. |
struct WasmModule { |
static const uint32_t kPageSize = 0x10000; // Page size, 64kb. |
@@ -240,8 +242,8 @@ struct WasmModule { |
Isolate* isolate, ErrorThrower* thrower, Handle<JSObject> module_object, |
Handle<JSReceiver> ffi, Handle<JSArrayBuffer> memory); |
- MaybeHandle<FixedArray> CompileFunctions(Isolate* isolate, |
- ErrorThrower* thrower) const; |
+ MaybeHandle<WasmCompiledModule> CompileFunctions(Isolate* isolate, |
+ ErrorThrower* thrower) const; |
private: |
DISALLOW_COPY_AND_ASSIGN(WasmModule); |
@@ -339,6 +341,125 @@ typedef Result<WasmFunction*> FunctionResult; |
typedef std::vector<std::pair<int, int>> FunctionOffsets; |
typedef Result<FunctionOffsets> FunctionOffsetsResult; |
+class WasmCompiledModule : public FixedArray { |
+ public: |
+ static WasmCompiledModule* cast(Object* fixed_array) { |
+ return reinterpret_cast<WasmCompiledModule*>(fixed_array); |
+ } |
+ |
+#define WCM_OBJECT_OR_WEAK(TYPE, NAME, ID) \ |
+ Handle<TYPE> NAME() const { return handle(ptr_to_##NAME()); } \ |
+ \ |
+ MaybeHandle<TYPE> maybe_##NAME() const { \ |
+ if (has_##NAME()) return NAME(); \ |
+ return MaybeHandle<TYPE>(); \ |
+ } \ |
+ \ |
+ TYPE* ptr_to_##NAME() const { \ |
+ Object* obj = get(ID); \ |
+ if (!obj->Is##TYPE()) return nullptr; \ |
+ return TYPE::cast(obj); \ |
+ } \ |
+ \ |
+ void set_##NAME(Handle<TYPE> value) { set_ptr_to_##NAME(*value); } \ |
+ \ |
+ void set_ptr_to_##NAME(TYPE* value) { set(ID, value); } \ |
+ \ |
+ bool has_##NAME() const { return get(ID)->Is##TYPE(); } \ |
+ \ |
+ void reset_##NAME() { set_undefined(ID); } |
+ |
+#define WCM_OBJECT(TYPE, NAME) WCM_OBJECT_OR_WEAK(TYPE, NAME, kID_##NAME) |
+ |
+#define WCM_SMALL_NUMBER(TYPE, NAME) \ |
+ TYPE NAME() const { \ |
+ return static_cast<TYPE>(Smi::cast(get(kID_##NAME))->value()); \ |
+ } \ |
+ \ |
+ void set_##NAME(TYPE value) { \ |
+ set(kID_##NAME, Smi::FromInt(static_cast<int>(value))); \ |
+ } |
+ |
+#define WCM_LARGE_NUMBER(TYPE, NAME) \ |
+ TYPE NAME() const { \ |
+ return static_cast<TYPE>(HeapNumber::cast(get(kID_##NAME))->value()); \ |
+ } \ |
+ \ |
+ void set_##NAME(TYPE value) { \ |
+ HeapNumber::cast(get(kID_##NAME))->set_value(static_cast<double>(value)); \ |
+ } |
+ |
+#define WCM_WEAK_LINK(TYPE, NAME) \ |
+ WCM_OBJECT_OR_WEAK(WeakCell, weak_##NAME, kID_##NAME); \ |
+ \ |
+ Handle<TYPE> NAME() const { \ |
+ return handle(TYPE::cast(weak_##NAME()->value())); \ |
+ } |
+ |
+#define WCM_PROPERTY_TABLE(MACRO) \ |
+ MACRO(OBJECT, FixedArray, code_table) \ |
+ MACRO(OBJECT, FixedArray, import_data) \ |
+ MACRO(OBJECT, FixedArray, exports) \ |
+ MACRO(OBJECT, FixedArray, startup_function) \ |
+ MACRO(OBJECT, FixedArray, indirect_function_tables) \ |
+ MACRO(OBJECT, String, module_bytes) \ |
+ MACRO(OBJECT, ByteArray, function_names) \ |
+ MACRO(LARGE_NUMBER, uint32_t, min_required_memory) \ |
+ MACRO(OBJECT, FixedArray, data_segments_info) \ |
+ MACRO(OBJECT, ByteArray, data_segments) \ |
+ MACRO(LARGE_NUMBER, uint32_t, globals_size) \ |
+ MACRO(LARGE_NUMBER, uint32_t, mem_size) \ |
+ MACRO(OBJECT, JSArrayBuffer, mem_start) \ |
+ MACRO(SMALL_NUMBER, bool, export_memory) \ |
+ MACRO(SMALL_NUMBER, ModuleOrigin, origin) \ |
+ MACRO(WEAK_LINK, WasmCompiledModule, next_instance) \ |
+ MACRO(WEAK_LINK, WasmCompiledModule, prev_instance) \ |
+ MACRO(WEAK_LINK, JSObject, owning_instance) \ |
+ MACRO(WEAK_LINK, JSObject, module_object) |
+ |
+ private: |
+ enum PropertyIndices { |
+#define INDICES(IGNORE1, IGNORE2, NAME) kID_##NAME, |
+ WCM_PROPERTY_TABLE(INDICES) Count |
+#undef INDICES |
+ }; |
+ |
+ public: |
+ static Handle<WasmCompiledModule> New(Isolate* isolate) { |
+ Handle<FixedArray> ret = |
+ isolate->factory()->NewFixedArray(PropertyIndices::Count, TENURED); |
+ Handle<HeapNumber> number; |
+#define WCM_INIT_OBJECT(IGNORE1, IGNORE2) |
+#define WCM_INIT_WEAK_LINK(IGNORE1, IGNORE2) |
+#define WCM_INIT_SMALL_NUMBER(IGNORE1, IGNORE2) |
+#define WCM_INIT_LARGE_NUMBER(IGNORE, NAME) \ |
+ number = isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED); \ |
+ ret->set(kID_##NAME, *number); |
+ |
+#define INITIALIZER(KIND, TYPE, NAME) WCM_INIT_##KIND(TYPE, NAME) |
+ WCM_PROPERTY_TABLE(INITIALIZER) |
+#undef INITIALIZER |
+ return handle(WasmCompiledModule::cast(*ret)); |
+ } |
+ |
+ Handle<WasmCompiledModule> Clone(Isolate* isolate) { |
+ Handle<WasmCompiledModule> ret = handle(WasmCompiledModule::cast( |
+ *isolate->factory()->CopyFixedArray(handle(this)))); |
+ Handle<HeapNumber> number = |
+ isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED); |
+ ret->set(kID_mem_size, *number); |
+ ret->set_mem_size(mem_size()); |
+ return ret; |
+ } |
+ |
+#define DECLARATION(KIND, TYPE, NAME) WCM_##KIND(TYPE, NAME) |
+ WCM_PROPERTY_TABLE(DECLARATION) |
+#undef DECLARATION |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(WasmCompiledModule); |
+}; |
+ |
// Extract a function name from the given wasm object. |
// Returns "<WASM UNNAMED>" if the function is unnamed or the name is not a |
// valid UTF-8 string. |