Chromium Code Reviews| 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. |