Replace RawFunction impl. with RawFunctionEx

extensions
Volodymyr Shymanskyy 4 years ago
parent 824ce5d9e1
commit 4b6ee387ea

@ -232,8 +232,8 @@ void print_usage() {
puts(" wasm3 [options] <file> [args...]");
puts(" wasm3 --repl [file]");
puts("Options:");
puts(" --func <function> function to run default: _start)");
puts(" --stack-size <size> stack size in bytes default: 64KB)");
puts(" --func <function> function to run default: _start");
puts(" --stack-size <size> stack size in bytes default: 64KB");
puts(" --dump-on-trap dump wasm memory");
}

@ -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; }

@ -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);
}

@ -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

@ -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;
}

@ -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

Loading…
Cancel
Save