|
|
|
@ -31,3 +31,157 @@ u32 GetFuncTypeNumReturns (const IM3FuncType i_funcType)
|
|
|
|
|
return i_funcType ? i_funcType->numRets : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void FreeImportInfo (M3ImportInfo * i_info)
|
|
|
|
|
{
|
|
|
|
|
m3_Free (i_info->moduleUtf8);
|
|
|
|
|
m3_Free (i_info->fieldUtf8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Function_Release (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
m3_Free (i_function->constants);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < i_function->numNames; i++)
|
|
|
|
|
{
|
|
|
|
|
// name can be an alias of fieldUtf8
|
|
|
|
|
if (i_function->names[i] != i_function->import.fieldUtf8)
|
|
|
|
|
{
|
|
|
|
|
m3_Free (i_function->names[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FreeImportInfo (& i_function->import);
|
|
|
|
|
|
|
|
|
|
if (i_function->ownsWasmCode)
|
|
|
|
|
m3_Free (i_function->wasm);
|
|
|
|
|
|
|
|
|
|
// Function_FreeCompiledCode (func);
|
|
|
|
|
|
|
|
|
|
# if (d_m3EnableCodePageRefCounting)
|
|
|
|
|
{
|
|
|
|
|
m3_Free (i_function->codePageRefs);
|
|
|
|
|
i_function->numCodePageRefs = 0;
|
|
|
|
|
}
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Function_FreeCompiledCode (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
# if (d_m3EnableCodePageRefCounting)
|
|
|
|
|
{
|
|
|
|
|
i_function->compiled = NULL;
|
|
|
|
|
|
|
|
|
|
while (i_function->numCodePageRefs--)
|
|
|
|
|
{
|
|
|
|
|
IM3CodePage page = i_function->codePageRefs [i_function->numCodePageRefs];
|
|
|
|
|
|
|
|
|
|
if (--(page->info.usageCount) == 0)
|
|
|
|
|
{
|
|
|
|
|
// printf ("free %p\n", page);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m3_Free (i_function->codePageRefs);
|
|
|
|
|
|
|
|
|
|
Runtime_ReleaseCodePages (i_function->module->runtime);
|
|
|
|
|
}
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cstr_t m3_GetFunctionName (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
u16 numNames = 0;
|
|
|
|
|
cstr_t *names = GetFunctionNames(i_function, &numNames);
|
|
|
|
|
if (numNames > 0)
|
|
|
|
|
return names[0];
|
|
|
|
|
else
|
|
|
|
|
return "<unnamed>";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IM3Module m3_GetFunctionModule (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
return i_function ? i_function->module : NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cstr_t * GetFunctionNames (IM3Function i_function, u16 * o_numNames)
|
|
|
|
|
{
|
|
|
|
|
if (!i_function || !o_numNames)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (i_function->import.fieldUtf8)
|
|
|
|
|
{
|
|
|
|
|
*o_numNames = 1;
|
|
|
|
|
return &i_function->import.fieldUtf8;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*o_numNames = i_function->numNames;
|
|
|
|
|
return i_function->names;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cstr_t GetFunctionImportModuleName (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
return (i_function->import.moduleUtf8) ? i_function->import.moduleUtf8 : "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u32 GetFunctionNumArgs (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
u32 numArgs = 0;
|
|
|
|
|
|
|
|
|
|
if (i_function)
|
|
|
|
|
{
|
|
|
|
|
if (i_function->funcType)
|
|
|
|
|
numArgs = i_function->funcType->numArgs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return numArgs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u32 GetFunctionNumReturns (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
u32 numReturns = 0;
|
|
|
|
|
|
|
|
|
|
if (i_function)
|
|
|
|
|
{
|
|
|
|
|
if (i_function->funcType)
|
|
|
|
|
numReturns = i_function->funcType->numRets;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return numReturns;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u8 GetFunctionReturnType (IM3Function i_function, u32 i_index)
|
|
|
|
|
{
|
|
|
|
|
u8 type = c_m3Type_none;
|
|
|
|
|
|
|
|
|
|
if (i_index < GetFunctionNumReturns (i_function))
|
|
|
|
|
{
|
|
|
|
|
type = i_function->funcType->types [i_index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u32 GetFunctionNumArgsAndLocals (IM3Function i_function)
|
|
|
|
|
{
|
|
|
|
|
if (i_function)
|
|
|
|
|
return i_function->numLocals + GetFunctionNumArgs (i_function);
|
|
|
|
|
else
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|