mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-12 20:51:21 +00:00
Add memory instance support apis (#3786)
Now that WAMR supports multiple memory instances, this PR adds some APIs to access them in a standard way. This involves moving some existing utility functions out from the `WASM_ENABLE_MULTI_MODULE` blocks they were nested in, but multi-memory and multi-module seem independent as far as I can tell so I assume that's okay. APIs added: ```C wasm_runtime_lookup_memory wasm_runtime_get_default_memory wasm_runtime_get_memory wasm_memory_get_cur_page_count wasm_memory_get_max_page_count wasm_memory_get_bytes_per_page wasm_memory_get_shared wasm_memory_get_base_address wasm_memory_enlarge ```
This commit is contained in:
parent
9aadbfee29
commit
926f662231
|
@ -1058,7 +1058,24 @@ fail1:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static AOTMemoryInstance *
|
AOTMemoryInstance *
|
||||||
|
aot_lookup_memory(AOTModuleInstance *module_inst, char const *name)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < module_inst->export_memory_count; i++)
|
||||||
|
if (!strcmp(module_inst->export_memories[i].name, name))
|
||||||
|
return module_inst->export_memories[i].memory;
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
(void)module_inst->export_memories;
|
||||||
|
if (!module_inst->memories)
|
||||||
|
return NULL;
|
||||||
|
return module_inst->memories[0];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
AOTMemoryInstance *
|
||||||
aot_get_default_memory(AOTModuleInstance *module_inst)
|
aot_get_default_memory(AOTModuleInstance *module_inst)
|
||||||
{
|
{
|
||||||
if (module_inst->memories)
|
if (module_inst->memories)
|
||||||
|
@ -1067,6 +1084,14 @@ aot_get_default_memory(AOTModuleInstance *module_inst)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AOTMemoryInstance *
|
||||||
|
aot_get_memory_with_index(AOTModuleInstance *module_inst, uint32 index)
|
||||||
|
{
|
||||||
|
if ((index >= module_inst->memory_count) || !module_inst->memories)
|
||||||
|
return NULL;
|
||||||
|
return module_inst->memories[index];
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
memories_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent,
|
memories_instantiate(AOTModuleInstance *module_inst, AOTModuleInstance *parent,
|
||||||
AOTModule *module, uint32 heap_size,
|
AOTModule *module, uint32 heap_size,
|
||||||
|
|
|
@ -532,6 +532,15 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst);
|
||||||
AOTFunctionInstance *
|
AOTFunctionInstance *
|
||||||
aot_lookup_function(const AOTModuleInstance *module_inst, const char *name);
|
aot_lookup_function(const AOTModuleInstance *module_inst, const char *name);
|
||||||
|
|
||||||
|
AOTMemoryInstance *
|
||||||
|
aot_lookup_memory(AOTModuleInstance *module_inst, char const *name);
|
||||||
|
|
||||||
|
AOTMemoryInstance *
|
||||||
|
aot_get_default_memory(AOTModuleInstance *module_inst);
|
||||||
|
|
||||||
|
AOTMemoryInstance *
|
||||||
|
aot_get_memory_with_index(AOTModuleInstance *module_inst, uint32 index);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a function in the AOT module instance.
|
* Get a function in the AOT module instance.
|
||||||
*
|
*
|
||||||
|
|
|
@ -673,11 +673,9 @@ wasm_get_default_memory(WASMModuleInstance *module_inst)
|
||||||
WASMMemoryInstance *
|
WASMMemoryInstance *
|
||||||
wasm_get_memory_with_idx(WASMModuleInstance *module_inst, uint32 index)
|
wasm_get_memory_with_idx(WASMModuleInstance *module_inst, uint32 index)
|
||||||
{
|
{
|
||||||
bh_assert(index < module_inst->memory_count);
|
if ((index >= module_inst->memory_count) || !module_inst->memories)
|
||||||
if (module_inst->memories)
|
|
||||||
return module_inst->memories[index];
|
|
||||||
else
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
return module_inst->memories[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -756,15 +754,10 @@ wasm_mmap_linear_memory(uint64_t map_size, uint64 commit_size)
|
||||||
return wasm_mremap_linear_memory(NULL, 0, map_size, commit_size);
|
return wasm_mremap_linear_memory(NULL, 0, map_size, commit_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
static bool
|
||||||
wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count,
|
wasm_enlarge_memory_internal(WASMModuleInstanceCommon *module,
|
||||||
uint32 memidx)
|
WASMMemoryInstance *memory, uint32 inc_page_count)
|
||||||
{
|
{
|
||||||
#if WASM_ENABLE_MULTI_MEMORY != 0
|
|
||||||
WASMMemoryInstance *memory = wasm_get_memory_with_idx(module, memidx);
|
|
||||||
#else
|
|
||||||
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
|
||||||
#endif
|
|
||||||
uint8 *memory_data_old, *memory_data_new, *heap_data_old;
|
uint8 *memory_data_old, *memory_data_new, *heap_data_old;
|
||||||
uint32 num_bytes_per_page, heap_size;
|
uint32 num_bytes_per_page, heap_size;
|
||||||
uint32 cur_page_count, max_page_count, total_page_count;
|
uint32 cur_page_count, max_page_count, total_page_count;
|
||||||
|
@ -913,7 +906,7 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count,
|
||||||
wasm_runtime_set_mem_bound_check_bytes(memory, total_size_new);
|
wasm_runtime_set_mem_bound_check_bytes(memory, total_size_new);
|
||||||
|
|
||||||
return_func:
|
return_func:
|
||||||
if (!ret && enlarge_memory_error_cb) {
|
if (!ret && module && enlarge_memory_error_cb) {
|
||||||
WASMExecEnv *exec_env = NULL;
|
WASMExecEnv *exec_env = NULL;
|
||||||
|
|
||||||
#if WASM_ENABLE_INTERP != 0
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
@ -926,8 +919,7 @@ return_func:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enlarge_memory_error_cb(inc_page_count, total_size_old, 0,
|
enlarge_memory_error_cb(inc_page_count, total_size_old, 0,
|
||||||
failure_reason,
|
failure_reason, module, exec_env,
|
||||||
(WASMModuleInstanceCommon *)module, exec_env,
|
|
||||||
enlarge_memory_error_user_data);
|
enlarge_memory_error_user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -971,15 +963,16 @@ wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
|
if (module->memory_count > 0) {
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (module->memory_count > 0)
|
|
||||||
shared_memory_lock(module->memories[0]);
|
shared_memory_lock(module->memories[0]);
|
||||||
#endif
|
#endif
|
||||||
ret = wasm_enlarge_memory_internal(module, inc_page_count, 0);
|
ret = wasm_enlarge_memory_internal((WASMModuleInstanceCommon *)module,
|
||||||
|
module->memories[0], inc_page_count);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (module->memory_count > 0)
|
|
||||||
shared_memory_unlock(module->memories[0]);
|
shared_memory_unlock(module->memories[0]);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -990,15 +983,117 @@ wasm_enlarge_memory_with_idx(WASMModuleInstance *module, uint32 inc_page_count,
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
|
if (memidx < module->memory_count) {
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (memidx < module->memory_count)
|
|
||||||
shared_memory_lock(module->memories[memidx]);
|
shared_memory_lock(module->memories[memidx]);
|
||||||
#endif
|
#endif
|
||||||
ret = wasm_enlarge_memory_internal(module, inc_page_count, memidx);
|
ret = wasm_enlarge_memory_internal((WASMModuleInstanceCommon *)module,
|
||||||
|
module->memories[memidx],
|
||||||
|
inc_page_count);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (memidx < module->memory_count)
|
|
||||||
shared_memory_unlock(module->memories[memidx]);
|
shared_memory_unlock(module->memories[memidx]);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASMMemoryInstance *
|
||||||
|
wasm_runtime_lookup_memory(WASMModuleInstanceCommon *module_inst,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode)
|
||||||
|
return wasm_lookup_memory((WASMModuleInstance *)module_inst, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT)
|
||||||
|
return aot_lookup_memory((WASMModuleInstance *)module_inst, name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASMMemoryInstance *
|
||||||
|
wasm_runtime_get_default_memory(WASMModuleInstanceCommon *module_inst)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode)
|
||||||
|
return wasm_get_default_memory((WASMModuleInstance *)module_inst);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT)
|
||||||
|
return aot_get_default_memory((AOTModuleInstance *)module_inst);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASMMemoryInstance *
|
||||||
|
wasm_runtime_get_memory(WASMModuleInstanceCommon *module_inst, uint32 index)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode)
|
||||||
|
return wasm_get_memory_with_idx((WASMModuleInstance *)module_inst,
|
||||||
|
index);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT)
|
||||||
|
return aot_get_memory_with_index((AOTModuleInstance *)module_inst,
|
||||||
|
index);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64
|
||||||
|
wasm_memory_get_cur_page_count(WASMMemoryInstance *memory)
|
||||||
|
{
|
||||||
|
return memory->cur_page_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64
|
||||||
|
wasm_memory_get_max_page_count(WASMMemoryInstance *memory)
|
||||||
|
{
|
||||||
|
return memory->max_page_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64
|
||||||
|
wasm_memory_get_bytes_per_page(WASMMemoryInstance *memory)
|
||||||
|
{
|
||||||
|
return memory->num_bytes_per_page;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_memory_get_shared(WASMMemoryInstance *memory)
|
||||||
|
{
|
||||||
|
return memory->is_shared_memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
wasm_memory_get_base_address(WASMMemoryInstance *memory)
|
||||||
|
{
|
||||||
|
return memory->memory_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_memory_enlarge(WASMMemoryInstance *memory, uint64 inc_page_count)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
|
||||||
|
if (memory) {
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
shared_memory_lock(memory);
|
||||||
|
#endif
|
||||||
|
ret =
|
||||||
|
wasm_enlarge_memory_internal(NULL, memory, (uint32)inc_page_count);
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
shared_memory_unlock(memory);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,6 +120,10 @@ typedef struct WASMModuleInstanceCommon *wasm_module_inst_t;
|
||||||
typedef void WASMFunctionInstanceCommon;
|
typedef void WASMFunctionInstanceCommon;
|
||||||
typedef WASMFunctionInstanceCommon *wasm_function_inst_t;
|
typedef WASMFunctionInstanceCommon *wasm_function_inst_t;
|
||||||
|
|
||||||
|
/* Memory instance */
|
||||||
|
struct WASMMemoryInstance;
|
||||||
|
typedef struct WASMMemoryInstance *wasm_memory_inst_t;
|
||||||
|
|
||||||
/* WASM section */
|
/* WASM section */
|
||||||
typedef struct wasm_section_t {
|
typedef struct wasm_section_t {
|
||||||
struct wasm_section_t *next;
|
struct wasm_section_t *next;
|
||||||
|
@ -939,6 +943,100 @@ WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_set_module_inst(wasm_exec_env_t exec_env,
|
wasm_runtime_set_module_inst(wasm_exec_env_t exec_env,
|
||||||
const wasm_module_inst_t module_inst);
|
const wasm_module_inst_t module_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Lookup a memory instance by name
|
||||||
|
*
|
||||||
|
* @param module_inst The module instance
|
||||||
|
* @param name The name of the memory instance
|
||||||
|
*
|
||||||
|
* @return The memory instance if found, NULL otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN wasm_memory_inst_t
|
||||||
|
wasm_runtime_lookup_memory(const wasm_module_inst_t module_inst,
|
||||||
|
const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the default memory instance
|
||||||
|
*
|
||||||
|
* @param module_inst The module instance
|
||||||
|
*
|
||||||
|
* @return The memory instance if found, NULL otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN wasm_memory_inst_t
|
||||||
|
wasm_runtime_get_default_memory(const wasm_module_inst_t module_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get a memory instance by index
|
||||||
|
*
|
||||||
|
* @param module_inst The module instance
|
||||||
|
* @param index The index of the memory instance
|
||||||
|
*
|
||||||
|
* @return The memory instance if found, NULL otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN wasm_memory_inst_t
|
||||||
|
wasm_runtime_get_memory(const wasm_module_inst_t module_inst, uint32_t index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the current number of pages for a memory instance
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
*
|
||||||
|
* @return The current number of pages
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN uint64_t
|
||||||
|
wasm_memory_get_cur_page_count(const wasm_memory_inst_t memory_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the maximum number of pages for a memory instance
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
*
|
||||||
|
* @return The maximum number of pages
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN uint64_t
|
||||||
|
wasm_memory_get_max_page_count(const wasm_memory_inst_t memory_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the number of bytes per page for a memory instance
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
*
|
||||||
|
* @return The number of bytes per page
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN uint64_t
|
||||||
|
wasm_memory_get_bytes_per_page(const wasm_memory_inst_t memory_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the shared status for a memory instance
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
*
|
||||||
|
* @return True if shared, false otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN bool
|
||||||
|
wasm_memory_get_shared(const wasm_memory_inst_t memory_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get the base address for a memory instance
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
*
|
||||||
|
* @return The base address on success, false otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN void *
|
||||||
|
wasm_memory_get_base_address(const wasm_memory_inst_t memory_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enlarge a memory instance by a number of pages
|
||||||
|
*
|
||||||
|
* @param memory_inst The memory instance
|
||||||
|
* @param inc_page_count The number of pages to add
|
||||||
|
*
|
||||||
|
* @return True if successful, false otherwise
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN bool
|
||||||
|
wasm_memory_enlarge(wasm_memory_inst_t memory_inst, uint64_t inc_page_count);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call the given WASM function of a WASM module instance with
|
* Call the given WASM function of a WASM module instance with
|
||||||
* arguments (bytecode and AoT).
|
* arguments (bytecode and AoT).
|
||||||
|
|
|
@ -1323,42 +1323,6 @@ export_tags_instantiate(const WASMModule *module,
|
||||||
}
|
}
|
||||||
#endif /* end of WASM_ENABLE_TAGS != 0 */
|
#endif /* end of WASM_ENABLE_TAGS != 0 */
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
|
||||||
static void
|
|
||||||
export_globals_deinstantiate(WASMExportGlobInstance *globals)
|
|
||||||
{
|
|
||||||
if (globals)
|
|
||||||
wasm_runtime_free(globals);
|
|
||||||
}
|
|
||||||
|
|
||||||
static WASMExportGlobInstance *
|
|
||||||
export_globals_instantiate(const WASMModule *module,
|
|
||||||
WASMModuleInstance *module_inst,
|
|
||||||
uint32 export_glob_count, char *error_buf,
|
|
||||||
uint32 error_buf_size)
|
|
||||||
{
|
|
||||||
WASMExportGlobInstance *export_globals, *export_global;
|
|
||||||
WASMExport *export = module->exports;
|
|
||||||
uint32 i;
|
|
||||||
uint64 total_size =
|
|
||||||
sizeof(WASMExportGlobInstance) * (uint64)export_glob_count;
|
|
||||||
|
|
||||||
if (!(export_global = export_globals =
|
|
||||||
runtime_malloc(total_size, error_buf, error_buf_size))) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < module->export_count; i++, export ++)
|
|
||||||
if (export->kind == EXPORT_KIND_GLOBAL) {
|
|
||||||
export_global->name = export->name;
|
|
||||||
export_global->global = &module_inst->e->globals[export->index];
|
|
||||||
export_global++;
|
|
||||||
}
|
|
||||||
|
|
||||||
bh_assert((uint32)(export_global - export_globals) == export_glob_count);
|
|
||||||
return export_globals;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MEMORY != 0
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
||||||
static void
|
static void
|
||||||
export_memories_deinstantiate(WASMExportMemInstance *memories)
|
export_memories_deinstantiate(WASMExportMemInstance *memories)
|
||||||
|
@ -1396,6 +1360,42 @@ export_memories_instantiate(const WASMModule *module,
|
||||||
}
|
}
|
||||||
#endif /* end of if WASM_ENABLE_MULTI_MEMORY != 0 */
|
#endif /* end of if WASM_ENABLE_MULTI_MEMORY != 0 */
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
static void
|
||||||
|
export_globals_deinstantiate(WASMExportGlobInstance *globals)
|
||||||
|
{
|
||||||
|
if (globals)
|
||||||
|
wasm_runtime_free(globals);
|
||||||
|
}
|
||||||
|
|
||||||
|
static WASMExportGlobInstance *
|
||||||
|
export_globals_instantiate(const WASMModule *module,
|
||||||
|
WASMModuleInstance *module_inst,
|
||||||
|
uint32 export_glob_count, char *error_buf,
|
||||||
|
uint32 error_buf_size)
|
||||||
|
{
|
||||||
|
WASMExportGlobInstance *export_globals, *export_global;
|
||||||
|
WASMExport *export = module->exports;
|
||||||
|
uint32 i;
|
||||||
|
uint64 total_size =
|
||||||
|
sizeof(WASMExportGlobInstance) * (uint64)export_glob_count;
|
||||||
|
|
||||||
|
if (!(export_global = export_globals =
|
||||||
|
runtime_malloc(total_size, error_buf, error_buf_size))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < module->export_count; i++, export ++)
|
||||||
|
if (export->kind == EXPORT_KIND_GLOBAL) {
|
||||||
|
export_global->name = export->name;
|
||||||
|
export_global->global = &module_inst->e->globals[export->index];
|
||||||
|
export_global++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bh_assert((uint32)(export_global - export_globals) == export_glob_count);
|
||||||
|
return export_globals;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* end of if WASM_ENABLE_MULTI_MODULE != 0 */
|
#endif /* end of if WASM_ENABLE_MULTI_MODULE != 0 */
|
||||||
|
|
||||||
static WASMFunctionInstance *
|
static WASMFunctionInstance *
|
||||||
|
@ -2388,11 +2388,13 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
|
||||||
|
|
||||||
/* export */
|
/* export */
|
||||||
module_inst->export_func_count = get_export_count(module, EXPORT_KIND_FUNC);
|
module_inst->export_func_count = get_export_count(module, EXPORT_KIND_FUNC);
|
||||||
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
||||||
|
module_inst->export_memory_count =
|
||||||
|
get_export_count(module, EXPORT_KIND_MEMORY);
|
||||||
|
#endif
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
module_inst->export_table_count =
|
module_inst->export_table_count =
|
||||||
get_export_count(module, EXPORT_KIND_TABLE);
|
get_export_count(module, EXPORT_KIND_TABLE);
|
||||||
module_inst->export_memory_count =
|
|
||||||
get_export_count(module, EXPORT_KIND_MEMORY);
|
|
||||||
#if WASM_ENABLE_TAGS != 0
|
#if WASM_ENABLE_TAGS != 0
|
||||||
module_inst->e->export_tag_count =
|
module_inst->e->export_tag_count =
|
||||||
get_export_count(module, EXPORT_KIND_TAG);
|
get_export_count(module, EXPORT_KIND_TAG);
|
||||||
|
@ -2432,7 +2434,7 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
|
||||||
module, module_inst, module_inst->export_global_count,
|
module, module_inst, module_inst->export_global_count,
|
||||||
error_buf, error_buf_size)))
|
error_buf, error_buf_size)))
|
||||||
#endif
|
#endif
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0 && WASM_ENABLE_MULTI_MEMORY != 0
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
||||||
|| (module_inst->export_memory_count > 0
|
|| (module_inst->export_memory_count > 0
|
||||||
&& !(module_inst->export_memories = export_memories_instantiate(
|
&& !(module_inst->export_memories = export_memories_instantiate(
|
||||||
module, module_inst, module_inst->export_memory_count,
|
module, module_inst, module_inst->export_memory_count,
|
||||||
|
@ -3240,7 +3242,7 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||||
export_globals_deinstantiate(module_inst->export_globals);
|
export_globals_deinstantiate(module_inst->export_globals);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0 && WASM_ENABLE_MULTI_MEMORY != 0
|
#if WASM_ENABLE_MULTI_MEMORY != 0
|
||||||
export_memories_deinstantiate(module_inst->export_memories);
|
export_memories_deinstantiate(module_inst->export_memories);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -3292,17 +3294,6 @@ wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
|
||||||
WASMGlobalInstance *
|
|
||||||
wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name)
|
|
||||||
{
|
|
||||||
uint32 i;
|
|
||||||
for (i = 0; i < module_inst->export_global_count; i++)
|
|
||||||
if (!strcmp(module_inst->export_globals[i].name, name))
|
|
||||||
return module_inst->export_globals[i].global;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
WASMMemoryInstance *
|
WASMMemoryInstance *
|
||||||
wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name)
|
wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -3314,10 +3305,23 @@ wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
#else
|
#else
|
||||||
(void)module_inst->export_memories;
|
(void)module_inst->export_memories;
|
||||||
|
if (!module_inst->memories)
|
||||||
|
return NULL;
|
||||||
return module_inst->memories[0];
|
return module_inst->memories[0];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
WASMGlobalInstance *
|
||||||
|
wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name)
|
||||||
|
{
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < module_inst->export_global_count; i++)
|
||||||
|
if (!strcmp(module_inst->export_globals[i].name, name))
|
||||||
|
return module_inst->export_globals[i].global;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
WASMTableInstance *
|
WASMTableInstance *
|
||||||
wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name)
|
wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -539,13 +539,13 @@ wasm_set_running_mode(WASMModuleInstance *module_inst,
|
||||||
WASMFunctionInstance *
|
WASMFunctionInstance *
|
||||||
wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name);
|
wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name);
|
||||||
|
|
||||||
|
WASMMemoryInstance *
|
||||||
|
wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name);
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
WASMGlobalInstance *
|
WASMGlobalInstance *
|
||||||
wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name);
|
wasm_lookup_global(const WASMModuleInstance *module_inst, const char *name);
|
||||||
|
|
||||||
WASMMemoryInstance *
|
|
||||||
wasm_lookup_memory(const WASMModuleInstance *module_inst, const char *name);
|
|
||||||
|
|
||||||
WASMTableInstance *
|
WASMTableInstance *
|
||||||
wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name);
|
wasm_lookup_table(const WASMModuleInstance *module_inst, const char *name);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user