| Index: src/wasm/wasm-objects.h
|
| diff --git a/src/wasm/wasm-objects.h b/src/wasm/wasm-objects.h
|
| index b35f754d4a95718931a4827a5cb087d463770bde..09eef82a26cae13997fa15d95766c614c46e0c5b 100644
|
| --- a/src/wasm/wasm-objects.h
|
| +++ b/src/wasm/wasm-objects.h
|
| @@ -221,6 +221,30 @@ class WasmSharedModuleData : public FixedArray {
|
| friend class WasmCompiledModule;
|
| };
|
|
|
| +// This represents the set of wasm compiled functions, together
|
| +// with all the information necessary for re-specializing them.
|
| +//
|
| +// We specialize wasm functions to their instance by embedding:
|
| +// - raw interior pointers into the backing store of the array buffer
|
| +// used as memory of a particular WebAssembly.Instance object.
|
| +// - bounds check limits, computed at compile time, relative to the
|
| +// size of the memory.
|
| +// - the objects representing the function tables and signature tables
|
| +// - raw pointer to the globals buffer.
|
| +//
|
| +// Even without instantiating, we need values for all of these parameters.
|
| +// We need to track these values to be able to create new instances and
|
| +// to be able to serialize/deserialize.
|
| +// The design decisions for how we track these values is not too immediate,
|
| +// and it deserves a summary. The "tricky" ones are: memory, globals, and
|
| +// the tables (signature and functions).
|
| +// The first 2 (memory & globals) are embedded as raw pointers to native
|
| +// buffers. All we need to track them is the start addresses and, in the
|
| +// case of memory, the size. We model all of them as HeapNumbers, because
|
| +// we need to store size_t values (for addresses), and potentially full
|
| +// 32 bit unsigned values for the size. Smis are 31 bits.
|
| +// For tables, we need to hold a reference to the JS Heap object, because
|
| +// we embed them as objects, and they may move.
|
| class WasmCompiledModule : public FixedArray {
|
| public:
|
| enum Fields { kFieldCount };
|
| @@ -267,12 +291,19 @@ class WasmCompiledModule : public FixedArray {
|
| #define WCM_WASM_OBJECT(TYPE, NAME) \
|
| WCM_OBJECT_OR_WEAK(TYPE, NAME, kID_##NAME, TYPE::Is##TYPE(obj))
|
|
|
| -#define WCM_SMALL_NUMBER(TYPE, NAME) \
|
| +#define WCM_SMALL_FIXED_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(value)); }
|
|
|
| +#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(value)); } \
|
| + bool has_##NAME() const { return get(kID_##NAME)->IsSmi(); }
|
| +
|
| #define WCM_WEAK_LINK(TYPE, NAME) \
|
| WCM_OBJECT_OR_WEAK(WeakCell, weak_##NAME, kID_##NAME, obj->IsWeakCell()); \
|
| \
|
| @@ -280,21 +311,44 @@ class WasmCompiledModule : public FixedArray {
|
| return handle(TYPE::cast(weak_##NAME()->value())); \
|
| }
|
|
|
| -#define CORE_WCM_PROPERTY_TABLE(MACRO) \
|
| - MACRO(WASM_OBJECT, WasmSharedModuleData, shared) \
|
| - MACRO(OBJECT, Context, native_context) \
|
| - MACRO(SMALL_NUMBER, uint32_t, num_imported_functions) \
|
| - MACRO(OBJECT, FixedArray, code_table) \
|
| - MACRO(OBJECT, FixedArray, weak_exported_functions) \
|
| - MACRO(OBJECT, FixedArray, function_tables) \
|
| - MACRO(OBJECT, FixedArray, signature_tables) \
|
| - MACRO(OBJECT, FixedArray, empty_function_tables) \
|
| - MACRO(OBJECT, JSArrayBuffer, memory) \
|
| - MACRO(SMALL_NUMBER, uint32_t, min_mem_pages) \
|
| - MACRO(SMALL_NUMBER, uint32_t, max_mem_pages) \
|
| - MACRO(WEAK_LINK, WasmCompiledModule, next_instance) \
|
| - MACRO(WEAK_LINK, WasmCompiledModule, prev_instance) \
|
| - MACRO(WEAK_LINK, JSObject, owning_instance) \
|
| +#define WCM_LARGE_NUMBER(TYPE, NAME) \
|
| + TYPE NAME() const { \
|
| + Object* value = get(kID_##NAME); \
|
| + DCHECK(value->IsMutableHeapNumber()); \
|
| + return static_cast<TYPE>(HeapNumber::cast(value)->value()); \
|
| + } \
|
| + \
|
| + void set_##NAME(TYPE value) { \
|
| + Object* number = get(kID_##NAME); \
|
| + DCHECK(number->IsMutableHeapNumber()); \
|
| + HeapNumber::cast(number)->set_value(static_cast<double>(value)); \
|
| + } \
|
| + \
|
| + static void recreate_##NAME(Handle<WasmCompiledModule> obj, \
|
| + Factory* factory, TYPE init_val) { \
|
| + Handle<HeapNumber> number = factory->NewHeapNumber( \
|
| + static_cast<double>(init_val), MutableMode::MUTABLE, TENURED); \
|
| + obj->set(kID_##NAME, *number); \
|
| + } \
|
| + bool has_##NAME() const { return get(kID_##NAME)->IsMutableHeapNumber(); }
|
| +
|
| +#define CORE_WCM_PROPERTY_TABLE(MACRO) \
|
| + MACRO(WASM_OBJECT, WasmSharedModuleData, shared) \
|
| + MACRO(OBJECT, Context, native_context) \
|
| + MACRO(SMALL_FIXED_NUMBER, uint32_t, num_imported_functions) \
|
| + MACRO(OBJECT, FixedArray, code_table) \
|
| + MACRO(OBJECT, FixedArray, weak_exported_functions) \
|
| + MACRO(OBJECT, FixedArray, function_tables) \
|
| + MACRO(OBJECT, FixedArray, signature_tables) \
|
| + MACRO(OBJECT, FixedArray, empty_function_tables) \
|
| + MACRO(LARGE_NUMBER, size_t, embedded_mem_start) \
|
| + MACRO(LARGE_NUMBER, size_t, globals_start) \
|
| + MACRO(LARGE_NUMBER, uint32_t, embedded_mem_size) \
|
| + MACRO(SMALL_FIXED_NUMBER, uint32_t, min_mem_pages) \
|
| + MACRO(SMALL_FIXED_NUMBER, uint32_t, max_mem_pages) \
|
| + MACRO(WEAK_LINK, WasmCompiledModule, next_instance) \
|
| + MACRO(WEAK_LINK, WasmCompiledModule, prev_instance) \
|
| + MACRO(WEAK_LINK, JSObject, owning_instance) \
|
| MACRO(WEAK_LINK, WasmModuleObject, wasm_module)
|
|
|
| #if DEBUG
|
| @@ -320,20 +374,36 @@ class WasmCompiledModule : public FixedArray {
|
| Handle<WasmSharedModuleData> shared);
|
|
|
| static Handle<WasmCompiledModule> Clone(Isolate* isolate,
|
| - Handle<WasmCompiledModule> module) {
|
| - Handle<WasmCompiledModule> ret = Handle<WasmCompiledModule>::cast(
|
| - isolate->factory()->CopyFixedArray(module));
|
| - ret->InitId();
|
| - ret->reset_weak_owning_instance();
|
| - ret->reset_weak_next_instance();
|
| - ret->reset_weak_prev_instance();
|
| - ret->reset_weak_exported_functions();
|
| - return ret;
|
| + Handle<WasmCompiledModule> module);
|
| + static void Reset(Isolate* isolate, WasmCompiledModule* module);
|
| +
|
| + Address GetEmbeddedMemStartOrNull() const {
|
| + DisallowHeapAllocation no_gc;
|
| + if (has_embedded_mem_start()) {
|
| + return reinterpret_cast<Address>(embedded_mem_start());
|
| + }
|
| + return nullptr;
|
| + }
|
| +
|
| + Address GetGlobalsStartOrNull() const {
|
| + DisallowHeapAllocation no_gc;
|
| + if (has_globals_start()) {
|
| + return reinterpret_cast<Address>(globals_start());
|
| + }
|
| + return nullptr;
|
| }
|
|
|
| uint32_t mem_size() const;
|
| uint32_t default_mem_size() const;
|
|
|
| + void ResetSpecializationMemInfoIfNeeded();
|
| + static void SetSpecializationMemInfoFrom(
|
| + Factory* factory, Handle<WasmCompiledModule> compiled_module,
|
| + Handle<JSArrayBuffer> buffer);
|
| + static void SetGlobalsStartAddressFrom(
|
| + Factory* factory, Handle<WasmCompiledModule> compiled_module,
|
| + Handle<JSArrayBuffer> buffer);
|
| +
|
| #define DECLARATION(KIND, TYPE, NAME) WCM_##KIND(TYPE, NAME)
|
| WCM_PROPERTY_TABLE(DECLARATION)
|
| #undef DECLARATION
|
|
|