mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
Refine wgl lib and refine wasm function index check (#122)
Refine wgl lib: remove module_inst parameter from widget functions Refine wasm function check: move function index check from interpreter call_indirect to runtime instantiate
This commit is contained in:
parent
ff0267b7e6
commit
6e99a37bf2
|
@ -51,7 +51,8 @@ wasm_btn_native_call(wasm_module_inst_t module_inst,
|
|||
{
|
||||
uint32 size = sizeof(btn_native_func_defs) / sizeof(WGLNativeFuncDef);
|
||||
|
||||
wgl_native_func_call(btn_native_func_defs,
|
||||
wgl_native_func_call(module_inst,
|
||||
btn_native_func_defs,
|
||||
size,
|
||||
func_id,
|
||||
argv_offset,
|
||||
|
|
|
@ -23,12 +23,14 @@
|
|||
/* -------------------------------------------------------------------------
|
||||
* Label widget native function wrappers
|
||||
* -------------------------------------------------------------------------*/
|
||||
static int32 _cb_create(lv_obj_t *par, lv_obj_t *copy)
|
||||
static int32
|
||||
_cb_create(lv_obj_t *par, lv_obj_t *copy)
|
||||
{
|
||||
return wgl_native_wigdet_create(WIDGET_TYPE_CB, par, copy);
|
||||
}
|
||||
|
||||
static int32 _cb_get_text_length(lv_obj_t *cb)
|
||||
static int32
|
||||
_cb_get_text_length(lv_obj_t *cb)
|
||||
{
|
||||
const char *text = lv_cb_get_text(cb);
|
||||
|
||||
|
@ -38,9 +40,9 @@ static int32 _cb_get_text_length(lv_obj_t *cb)
|
|||
return strlen(text);
|
||||
}
|
||||
|
||||
static int32 _cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len)
|
||||
static char *
|
||||
_cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst();
|
||||
const char *text = lv_cb_get_text(cb);
|
||||
|
||||
if (text == NULL)
|
||||
|
@ -49,7 +51,7 @@ static int32 _cb_get_text(lv_obj_t *cb, char *buffer, int buffer_len)
|
|||
strncpy(buffer, text, buffer_len - 1);
|
||||
buffer[buffer_len - 1] = '\0';
|
||||
|
||||
return addr_native_to_app(buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static WGLNativeFuncDef cb_native_func_defs[] = {
|
||||
|
@ -57,7 +59,7 @@ static WGLNativeFuncDef cb_native_func_defs[] = {
|
|||
{ CB_FUNC_ID_SET_TEXT, lv_cb_set_text, NO_RET, 2, {0, -1}, {1, -1} },
|
||||
{ CB_FUNC_ID_SET_STATIC_TEXT, lv_cb_set_static_text, NO_RET, 2, {0, -1}, {1, -1} },
|
||||
{ CB_FUNC_ID_GET_TEXT_LENGTH, _cb_get_text_length, HAS_RET, 1, {0, -1}, {-1} },
|
||||
{ CB_FUNC_ID_GET_TEXT, _cb_get_text, HAS_RET, 3, {0, -1}, {1, -1} },
|
||||
{ CB_FUNC_ID_GET_TEXT, _cb_get_text, RET_PTR, 3, {0, -1}, {1, -1} },
|
||||
};
|
||||
|
||||
/*************** Native Interface to Wasm App ***********/
|
||||
|
@ -67,7 +69,8 @@ wasm_cb_native_call(wasm_module_inst_t module_inst,
|
|||
{
|
||||
uint32 size = sizeof(cb_native_func_defs) / sizeof(WGLNativeFuncDef);
|
||||
|
||||
wgl_native_func_call(cb_native_func_defs,
|
||||
wgl_native_func_call(module_inst,
|
||||
cb_native_func_defs,
|
||||
size,
|
||||
func_id,
|
||||
argv_offset,
|
||||
|
|
|
@ -23,12 +23,14 @@
|
|||
/* -------------------------------------------------------------------------
|
||||
* Label widget native function wrappers
|
||||
* -------------------------------------------------------------------------*/
|
||||
static int32 _label_create(lv_obj_t *par, lv_obj_t *copy)
|
||||
static int32
|
||||
_label_create(lv_obj_t *par, lv_obj_t *copy)
|
||||
{
|
||||
return wgl_native_wigdet_create(WIDGET_TYPE_LABEL, par, copy);
|
||||
}
|
||||
|
||||
static int32 _label_get_text_length(lv_obj_t *label)
|
||||
static int32
|
||||
_label_get_text_length(lv_obj_t *label)
|
||||
{
|
||||
char *text = lv_label_get_text(label);
|
||||
|
||||
|
@ -38,9 +40,9 @@ static int32 _label_get_text_length(lv_obj_t *label)
|
|||
return strlen(text);
|
||||
}
|
||||
|
||||
static int32 _label_get_text(lv_obj_t *label, char *buffer, int buffer_len)
|
||||
static char *
|
||||
_label_get_text(lv_obj_t *label, char *buffer, int buffer_len)
|
||||
{
|
||||
wasm_module_inst_t module_inst = get_module_inst();
|
||||
char *text = lv_label_get_text(label);
|
||||
|
||||
if (text == NULL)
|
||||
|
@ -49,14 +51,14 @@ static int32 _label_get_text(lv_obj_t *label, char *buffer, int buffer_len)
|
|||
strncpy(buffer, text, buffer_len - 1);
|
||||
buffer[buffer_len - 1] = '\0';
|
||||
|
||||
return addr_native_to_app(buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static WGLNativeFuncDef label_native_func_defs[] = {
|
||||
{ LABEL_FUNC_ID_CREATE, _label_create, HAS_RET, 2, {0 | NULL_OK, 1 | NULL_OK, -1}, {-1} },
|
||||
{ LABEL_FUNC_ID_SET_TEXT, lv_label_set_text, NO_RET, 2, {0, -1}, {1, -1} },
|
||||
{ LABEL_FUNC_ID_GET_TEXT_LENGTH, _label_get_text_length, HAS_RET, 1, {0, -1}, {-1} },
|
||||
{ LABEL_FUNC_ID_GET_TEXT, _label_get_text, HAS_RET, 3, {0, -1}, {1, -1} },
|
||||
{ LABEL_FUNC_ID_GET_TEXT, _label_get_text, RET_PTR, 3, {0, -1}, {1, -1} },
|
||||
};
|
||||
|
||||
/*************** Native Interface to Wasm App ***********/
|
||||
|
@ -66,7 +68,8 @@ wasm_label_native_call(wasm_module_inst_t module_inst,
|
|||
{
|
||||
uint32 size = sizeof(label_native_func_defs) / sizeof(WGLNativeFuncDef);
|
||||
|
||||
wgl_native_func_call(label_native_func_defs,
|
||||
wgl_native_func_call(module_inst,
|
||||
label_native_func_defs,
|
||||
size,
|
||||
func_id,
|
||||
argv_offset,
|
||||
|
|
|
@ -57,7 +57,8 @@ wasm_list_native_call(wasm_module_inst_t module_inst,
|
|||
{
|
||||
uint32 size = sizeof(list_native_func_defs) / sizeof(WGLNativeFuncDef);
|
||||
|
||||
wgl_native_func_call(list_native_func_defs,
|
||||
wgl_native_func_call(module_inst,
|
||||
list_native_func_defs,
|
||||
size,
|
||||
func_id,
|
||||
argv_offset,
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
#define THROW_EXC(msg) wasm_runtime_set_exception(get_module_inst(), msg);
|
||||
#define THROW_EXC(msg) wasm_runtime_set_exception(module_inst, msg);
|
||||
|
||||
void
|
||||
wasm_runtime_set_exception(wasm_module_inst_t module, const char *exception);
|
||||
|
@ -44,7 +44,8 @@ uint32 wgl_native_wigdet_create(int8 widget_type, lv_obj_t *par, lv_obj_t *copy)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void invokeNative(intptr_t argv[], uint32 argc, void (*native_code)())
|
||||
static void invokeNative(wasm_module_inst_t module_inst,
|
||||
intptr_t argv[], uint32 argc, void (*native_code)())
|
||||
{
|
||||
switch(argc) {
|
||||
case 0:
|
||||
|
@ -87,20 +88,20 @@ static void invokeNative(intptr_t argv[], uint32 argc, void (*native_code)())
|
|||
|
||||
default:
|
||||
/* FIXME: If this happen, add more cases. */
|
||||
wasm_runtime_set_exception(get_module_inst(),
|
||||
"the argument number of native function exceeds maximum");
|
||||
THROW_EXC("the argument number of native function exceeds maximum");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
typedef void (*GenericFunctionPointer)();
|
||||
typedef int32 (*Int32FuncPtr)(intptr_t *, uint32, GenericFunctionPointer);
|
||||
typedef void (*VoidFuncPtr)(intptr_t *, uint32, GenericFunctionPointer);
|
||||
typedef int32 (*Int32FuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer);
|
||||
typedef void (*VoidFuncPtr)(wasm_module_inst_t, intptr_t *, uint32, GenericFunctionPointer);
|
||||
|
||||
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)invokeNative;
|
||||
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)invokeNative;
|
||||
|
||||
void wgl_native_func_call(WGLNativeFuncDef *funcs,
|
||||
void wgl_native_func_call(wasm_module_inst_t module_inst,
|
||||
WGLNativeFuncDef *funcs,
|
||||
uint32 size,
|
||||
int32 func_id,
|
||||
uint32 argv_offset,
|
||||
|
@ -109,7 +110,6 @@ void wgl_native_func_call(WGLNativeFuncDef *funcs,
|
|||
WGLNativeFuncDef *func_def = funcs;
|
||||
WGLNativeFuncDef *func_def_end = func_def + size;
|
||||
uint32 *argv;
|
||||
wasm_module_inst_t module_inst = get_module_inst();
|
||||
|
||||
if (!validate_app_addr(argv_offset, argc * sizeof(uint32)))
|
||||
return;
|
||||
|
@ -173,13 +173,20 @@ void wgl_native_func_call(WGLNativeFuncDef *funcs,
|
|||
}
|
||||
|
||||
if (func_def->has_ret == NO_RET)
|
||||
invokeNative_Void(argv_copy,
|
||||
invokeNative_Void(module_inst,
|
||||
argv_copy,
|
||||
func_def->arg_num,
|
||||
func_def->func_ptr);
|
||||
else
|
||||
argv[0] = invokeNative_Int32(argv_copy,
|
||||
else {
|
||||
argv[0] = invokeNative_Int32(module_inst,
|
||||
argv_copy,
|
||||
func_def->arg_num,
|
||||
func_def->func_ptr);
|
||||
/* Convert to app memory offset if return value is a
|
||||
* native address pointer */
|
||||
if (func_def->has_ret == RET_PTR)
|
||||
argv[0] = addr_native_to_app((char *)(intptr_t)argv[0]);
|
||||
}
|
||||
|
||||
if (argv_copy != argv_copy_buf)
|
||||
bh_free(argv_copy);
|
||||
|
|
|
@ -17,8 +17,12 @@ extern "C" {
|
|||
#define NULL_OK 0x80
|
||||
|
||||
enum {
|
||||
/* The function has a normal return value (not a pointer) */
|
||||
HAS_RET,
|
||||
NO_RET
|
||||
/* The function doesn't have return value */
|
||||
NO_RET,
|
||||
/* The function's return value is a native address pointer */
|
||||
RET_PTR
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -61,15 +65,13 @@ uint32 wgl_native_wigdet_create(int8 widget_type,
|
|||
lv_obj_t *par,
|
||||
lv_obj_t *copy);
|
||||
|
||||
void wgl_native_func_call(WGLNativeFuncDef *funcs,
|
||||
void wgl_native_func_call(wasm_module_inst_t module_inst,
|
||||
WGLNativeFuncDef *funcs,
|
||||
uint32 size,
|
||||
int32 func_id,
|
||||
uint32 argv_offset,
|
||||
uint32 argc);
|
||||
|
||||
wasm_module_inst_t wasm_runtime_get_current_module_inst();
|
||||
#define get_module_inst() wasm_runtime_get_current_module_inst()
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -347,7 +347,8 @@ wasm_obj_native_call(wasm_module_inst_t module_inst,
|
|||
{
|
||||
uint32 size = sizeof(obj_native_func_defs) / sizeof(WGLNativeFuncDef);
|
||||
|
||||
wgl_native_func_call(obj_native_func_defs,
|
||||
wgl_native_func_call(module_inst,
|
||||
obj_native_func_defs,
|
||||
size,
|
||||
func_id,
|
||||
argv_offset,
|
||||
|
|
|
@ -880,11 +880,8 @@ wasm_interp_call_func_bytecode(WASMThread *self,
|
|||
}
|
||||
|
||||
fidx = ((uint32*)table->base_addr)[val];
|
||||
if (fidx >= module->function_count) {
|
||||
wasm_runtime_set_exception(module, "function index is overflow");
|
||||
goto got_exception;
|
||||
}
|
||||
|
||||
/* Skip function index check, it has been checked
|
||||
in wasm module instantiate */
|
||||
cur_func = module->functions + fidx;
|
||||
|
||||
if (cur_func->is_import_func)
|
||||
|
|
|
@ -741,7 +741,7 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
WASMTableSeg *table_seg;
|
||||
WASMDataSeg *data_seg;
|
||||
WASMGlobalInstance *globals = NULL, *global;
|
||||
uint32 global_count, addr_data_size = 0, global_data_size = 0, i;
|
||||
uint32 global_count, addr_data_size = 0, global_data_size = 0, i, j;
|
||||
uint32 base_offset, length, memory_size;
|
||||
uint8 *global_data, *global_data_end, *addr_data, *addr_data_end;
|
||||
uint8 *memory_data;
|
||||
|
@ -927,6 +927,15 @@ wasm_runtime_instantiate(WASMModule *module,
|
|||
module_inst->default_table->cur_size)
|
||||
length = module_inst->default_table->cur_size
|
||||
- table_seg->base_offset.u.i32;
|
||||
/* Check function index */
|
||||
for (j = 0; j < length; j++) {
|
||||
if (table_seg->func_indexes[j] >= module_inst->function_count) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
"function index is overflow");
|
||||
wasm_runtime_deinstantiate(module_inst);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
memcpy(table_data + table_seg->base_offset.u.i32,
|
||||
table_seg->func_indexes, length * sizeof(uint32));
|
||||
}
|
||||
|
@ -1618,9 +1627,9 @@ wasm_runtime_invoke_native(void *func_ptr, WASMType *func_type,
|
|||
break;
|
||||
case VALUE_TYPE_F32:
|
||||
if (n_fps < MAX_REG_FLOATS)
|
||||
*(float64*)&fps[n_fps++] = *(float32*)argv_src++;
|
||||
*(float32*)&fps[n_fps++] = *(float32*)argv_src++;
|
||||
else
|
||||
*(float64*)&stacks[n_stacks++] = *(float32*)argv_src++;
|
||||
*(float32*)&stacks[n_stacks++] = *(float32*)argv_src++;
|
||||
break;
|
||||
case VALUE_TYPE_F64:
|
||||
if (n_fps < MAX_REG_FLOATS)
|
||||
|
|
Loading…
Reference in New Issue
Block a user