Index: src/wasm/wasm-module.h |
diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h |
index 0b9bc9762edec2834637c738356d4c160f5f6e71..0ee385e219a5b8f74ef3a6046dc0695de24cab12 100644 |
--- a/src/wasm/wasm-module.h |
+++ b/src/wasm/wasm-module.h |
@@ -160,6 +160,8 @@ struct WasmIndirectFunctionTable { |
enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin }; |
+class WasmCompiledModule; |
+ |
// Static representation of a module. |
struct WasmModule { |
static const uint32_t kPageSize = 0x10000; // Page size, 64kb. |
@@ -238,8 +240,8 @@ struct WasmModule { |
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); |
@@ -347,6 +349,82 @@ 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); |
+ } |
+ static Handle<WasmCompiledModule> New(Isolate* isolate) { |
+ Handle<FixedArray> ret = |
+ isolate->factory()->NewFixedArray(kTotalFieldCount, TENURED); |
+ ret->set(8, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED)); |
+ ret->set(11, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED)); |
+ ret->set(12, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED)); |
+ return handle(WasmCompiledModule::cast(*ret)); |
+ } |
+ |
+#define WCM_PROPERTY(ID, TYPE, NAME) \ |
+ Handle<TYPE> NAME() { return handle(ptr_to_##NAME()); } \ |
+ MaybeHandle<TYPE> maybe_##NAME() { \ |
+ if (has_##NAME()) return NAME(); \ |
+ return MaybeHandle<TYPE>(); \ |
+ } \ |
+ TYPE* ptr_to_##NAME() { \ |
+ 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() { return get(ID)->Is##TYPE(); } \ |
+ void reset_##NAME(Isolate* isolate) { \ |
+ set(ID, *isolate->factory()->undefined_value()); \ |
+ } |
+ |
+#define WCM_SMALL_NUMERIC_PROPERTY(ID, TYPE, NAME) \ |
+ TYPE NAME() { return static_cast<TYPE>(Smi::cast(get(ID))->value()); } \ |
+ void set_##NAME(TYPE value) { \ |
+ set(ID, Smi::FromInt(static_cast<int>(value))); \ |
+ } |
+ |
+#define WCM_LARGE_NUMERIC_PROPERTY(ID, TYPE, NAME) \ |
+ TYPE NAME() { \ |
+ return static_cast<TYPE>(HeapNumber::cast(get(ID))->value()); \ |
+ } \ |
+ void set_##NAME(TYPE value) { \ |
+ HeapNumber::cast(get(ID))->set_value(static_cast<double>(value)); \ |
+ } |
+ |
+#define WCM_WEAK_LINK(ID, TYPE, NAME) \ |
+ WCM_PROPERTY(ID, WeakCell, weak_##NAME); \ |
+ Handle<TYPE> NAME() { return handle(TYPE::cast(weak_##NAME()->value())); } |
+ |
+ WCM_PROPERTY(0, FixedArray, functions); |
bradnelson
2016/09/13 23:54:49
Use x-macros as discussed.
Mircea Trofin
2016/09/14 16:06:28
Done.
|
+ WCM_PROPERTY(1, FixedArray, import_data); |
+ WCM_PROPERTY(2, FixedArray, import_map); |
+ WCM_PROPERTY(3, FixedArray, exports); |
+ WCM_PROPERTY(4, FixedArray, startup_function); |
+ WCM_PROPERTY(5, FixedArray, indirect_function_tables); |
+ WCM_PROPERTY(6, String, module_bytes); |
+ WCM_PROPERTY(7, ByteArray, function_names); |
+ WCM_LARGE_NUMERIC_PROPERTY(8, uint32_t, min_required_memory); |
+ WCM_PROPERTY(9, FixedArray, data_segments_info); |
+ WCM_PROPERTY(10, ByteArray, data_segments); |
+ WCM_LARGE_NUMERIC_PROPERTY(11, uint32_t, globals_size); |
+ WCM_LARGE_NUMERIC_PROPERTY(12, uint32_t, mem_size); |
+ WCM_PROPERTY(13, JSArrayBuffer, mem_start); |
+ WCM_SMALL_NUMERIC_PROPERTY(14, bool, export_memory); |
+ WCM_SMALL_NUMERIC_PROPERTY(15, ModuleOrigin, origin); |
+ WCM_WEAK_LINK(16, WasmCompiledModule, next_instance); |
+ WCM_WEAK_LINK(17, WasmCompiledModule, prev_instance); |
+ WCM_WEAK_LINK(18, JSObject, owning_instance); |
+ WCM_WEAK_LINK(19, JSObject, module_object); |
+ |
+ private: |
+ static const int kTotalFieldCount = 20; |
+ 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. |