diff --git a/platforms/app/main.c b/platforms/app/main.c index 3e8d2c9..82ab502 100644 --- a/platforms/app/main.c +++ b/platforms/app/main.c @@ -232,8 +232,8 @@ void print_usage() { puts(" wasm3 [options] [args...]"); puts(" wasm3 --repl [file]"); puts("Options:"); - puts(" --func function to run default: _start)"); - puts(" --stack-size stack size in bytes default: 64KB)"); + puts(" --func function to run default: _start"); + puts(" --stack-size stack size in bytes default: 64KB"); puts(" --dump-on-trap dump wasm memory"); } diff --git a/source/m3_api_defs.h b/source/m3_api_defs.h index a0fc478..33d028e 100644 --- a/source/m3_api_defs.h +++ b/source/m3_api_defs.h @@ -18,7 +18,7 @@ #define m3ApiGetArg(TYPE, NAME) TYPE NAME = * ((TYPE *) (_sp++)); #define m3ApiGetArgMem(TYPE, NAME) TYPE NAME = (TYPE)m3ApiOffsetToPtr(* ((u32 *) (_sp++))); -#define m3ApiRawFunction(NAME) const void * NAME (IM3Runtime runtime, uint64_t * _sp, void * _mem) +#define m3ApiRawFunction(NAME) const void * NAME (IM3Runtime runtime, uint64_t * _sp, void * _mem, void * userdata) #define m3ApiReturn(VALUE) { *raw_return = (VALUE); return m3Err_none; } #define m3ApiTrap(VALUE) { return VALUE; } #define m3ApiSuccess() { return m3Err_none; } diff --git a/source/m3_bind.c b/source/m3_bind.c index aa40b01..573c2eb 100644 --- a/source/m3_bind.c +++ b/source/m3_bind.c @@ -136,47 +136,14 @@ _ (SignatureToFuncType (& ftype, i_linkingSignature)); } -typedef M3Result (* M3Linker) (IM3Module io_module, IM3Function io_function, const char * const i_signature, const void * i_function); - -M3Result FindAndLinkFunction (IM3Module io_module, - ccstr_t i_moduleName, - ccstr_t i_functionName, - ccstr_t i_signature, - voidptr_t i_function, - const M3Linker i_linker) -{ - M3Result result = m3Err_functionLookupFailed; - - bool wildcardModule = (strcmp (i_moduleName, "*") == 0); - - for (u32 i = 0; i < io_module->numFunctions; ++i) - { - IM3Function f = & io_module->functions [i]; - - if (f->import.moduleUtf8 and f->import.fieldUtf8) - { - if (strcmp (f->import.fieldUtf8, i_functionName) == 0 and - (wildcardModule or strcmp (f->import.moduleUtf8, i_moduleName) == 0)) - { - result = i_linker (io_module, f, i_signature, i_function); - if (result) return result; - } - } - } - - return result; -} - -// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -M3Result LinkRawFunction (IM3Module io_module, IM3Function io_function, ccstr_t signature, const void * i_function) +M3Result LinkRawFunction (IM3Module io_module, IM3Function io_function, ccstr_t signature, const void * i_function, const void * i_userdata) { M3Result result = m3Err_none; d_m3Assert (io_module->runtime); _try { _ (ValidateSignature (io_function, signature)); - IM3CodePage page = AcquireCodePageWithCapacity (io_module->runtime, 2); + IM3CodePage page = AcquireCodePageWithCapacity (io_module->runtime, 4); if (page) { @@ -185,6 +152,8 @@ _ (ValidateSignature (io_function, signature)); EmitWord (page, op_CallRawFunction); EmitWord (page, i_function); + EmitWord (page, io_function); + EmitWord (page, i_userdata); ReleaseCodePage (io_module->runtime, page); } @@ -194,23 +163,15 @@ _ (ValidateSignature (io_function, signature)); return result; } - -M3Result m3_LinkRawFunction (IM3Module io_module, - const char * const i_moduleName, - const char * const i_functionName, - const char * const i_signature, - M3RawCall i_function) +M3Result FindAndLinkFunction (IM3Module io_module, + ccstr_t i_moduleName, + ccstr_t i_functionName, + ccstr_t i_signature, + voidptr_t i_function, + voidptr_t i_userdata) { - return FindAndLinkFunction (io_module, i_moduleName, i_functionName, i_signature, (voidptr_t)i_function, LinkRawFunction); -} - -// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + M3Result result = m3Err_functionLookupFailed; -IM3Function FindFunction (IM3Module io_module, - ccstr_t i_moduleName, - ccstr_t i_functionName, - ccstr_t i_signature) -{ bool wildcardModule = (strcmp (i_moduleName, "*") == 0); for (u32 i = 0; i < io_module->numFunctions; ++i) @@ -222,37 +183,12 @@ IM3Function FindFunction (IM3Module io_module, if (strcmp (f->import.fieldUtf8, i_functionName) == 0 and (wildcardModule or strcmp (f->import.moduleUtf8, i_moduleName) == 0)) { - return f; + result = LinkRawFunction (io_module, f, i_signature, i_function, i_userdata); + if (result) return result; } } } - return NULL; -} - -M3Result LinkRawFunctionEx (IM3Module io_module, IM3Function io_function, ccstr_t signature, const void * i_function, void * cookie) -{ - M3Result result = m3Err_none; d_m3Assert (io_module->runtime); - -_try { -_ (ValidateSignature (io_function, signature)); - - IM3CodePage page = AcquireCodePageWithCapacity (io_module->runtime, 3); - - if (page) - { - io_function->compiled = GetPagePC (page); - io_function->module = io_module; - - EmitWord (page, op_CallRawFunctionEx); - EmitWord (page, i_function); - EmitWord (page, cookie); - - ReleaseCodePage (io_module->runtime, page); - } - else _throw(m3Err_mallocFailedCodePage); - -} _catch: return result; } @@ -260,13 +196,18 @@ M3Result m3_LinkRawFunctionEx (IM3Module io_module, const char * const i_moduleName, const char * const i_functionName, const char * const i_signature, - M3RawCallEx i_function, - void * i_cookie) + M3RawCall i_function, + const void * i_userdata) { - IM3Function f = FindFunction(io_module, i_moduleName, i_functionName, i_signature); - if (f == NULL) - return m3Err_functionLookupFailed; + return FindAndLinkFunction (io_module, i_moduleName, i_functionName, i_signature, (voidptr_t)i_function, i_userdata); +} - M3Result result = LinkRawFunctionEx(io_module, f, i_signature, (voidptr_t)i_function, i_cookie); - return result; +M3Result m3_LinkRawFunction (IM3Module io_module, + const char * const i_moduleName, + const char * const i_functionName, + const char * const i_signature, + M3RawCall i_function) +{ + return FindAndLinkFunction (io_module, i_moduleName, i_functionName, i_signature, (voidptr_t)i_function, NULL); } + diff --git a/source/m3_config.h b/source/m3_config.h index 9eb94d0..c63323f 100644 --- a/source/m3_config.h +++ b/source/m3_config.h @@ -25,7 +25,7 @@ # endif # ifndef d_m3MaxFunctionSlots -# define d_m3MaxFunctionSlots 4000 // twice d_m3MaxFunctionStackHeight +# define d_m3MaxFunctionSlots ((d_m3MaxFunctionStackHeight)*2) # endif # ifndef d_m3MaxConstantTableSize diff --git a/source/m3_exec.c b/source/m3_exec.c index d032dc6..9bb72ac 100644 --- a/source/m3_exec.c +++ b/source/m3_exec.c @@ -117,17 +117,10 @@ d_m3OpDef (CallIndirect) d_m3OpDef (CallRawFunction) { M3RawCall call = (M3RawCall) (* _pc++); + IM3Function function = immediate (IM3Function); + void * userdata = immediate (void *); - m3ret_t possible_trap = call (m3MemRuntime(_mem), (u64 *) _sp, m3MemData(_mem)); - return possible_trap; -} - -d_m3OpDef (CallRawFunctionEx) -{ - M3RawCallEx call = (M3RawCallEx) (* _pc++); - void * cookie = immediate (void *); - - m3ret_t possible_trap = call (m3MemRuntime(_mem), (u64 *)_sp, m3MemData(_mem), cookie); + m3ret_t possible_trap = call (m3MemRuntime(_mem), (u64 *)_sp, m3MemData(_mem), userdata); return possible_trap; } diff --git a/source/wasm3.h b/source/wasm3.h index 7a56776..30472fe 100644 --- a/source/wasm3.h +++ b/source/wasm3.h @@ -184,24 +184,20 @@ d_m3ErrorConst (trapStackOverflow, "[trap] stack overflow") M3Result m3_LoadModule (IM3Runtime io_runtime, IM3Module io_module); // LoadModule transfers ownership of a module to the runtime. Do not free modules once successfully imported into the runtime - typedef const void * (* M3RawCall) (IM3Runtime runtime, uint64_t * _sp, void * _mem); + typedef const void * (* M3RawCall) (IM3Runtime runtime, uint64_t * _sp, void * _mem, void * userdata); M3Result m3_LinkRawFunction (IM3Module io_module, const char * const i_moduleName, const char * const i_functionName, const char * const i_signature, - M3RawCall i_function); + M3RawCall i_function); - typedef const void * (* M3RawCallEx) (IM3Runtime runtime, uint64_t * _sp, void * _mem, void * cookie); - - // m3_LinkRawFunctionEx links a native callback function that has a cookie parameter, allowing one native - // callback to receive multiple m3 function calls. This ease for dynamic routing in the callback. M3Result m3_LinkRawFunctionEx (IM3Module io_module, const char * const i_moduleName, const char * const i_functionName, const char * const i_signature, - M3RawCallEx i_function, - void * i_cookie); + M3RawCall i_function, + const void * i_userdata); //------------------------------------------------------------------------------------------------------------------------------- // functions