Fix for issue281 version 2 (#283)

* fix for issue 281

* Fixed recursive implicit `start` function calling; Moved checking and call `start` function from `m3_FindFunction` to `m3_Call*`

* Update: `start` function is clearing only after successful call

* minor changes

* fixed wrong `i_module->startFunction` checking
opam-2.0.0
skrphv 3 years ago committed by GitHub
parent 1f2e49251a
commit 1d440e53a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -543,6 +543,7 @@ M3Result m3_RunStart (IM3Module io_module)
#endif
M3Result result = m3Err_none;
i32 startFunctionTmp = -1;
if (io_module and io_module->startFunction >= 0)
{
@ -560,9 +561,17 @@ _ (CompileFunction (function));
IM3Module module = function->module;
IM3Runtime runtime = module->runtime;
_ ((M3Result) Call (function->compiled, (m3stack_t) runtime->stack, runtime->memory.mallocated, d_m3OpDefaultArgs));
startFunctionTmp = io_module->startFunction;
io_module->startFunction = -1;
result = (M3Result) Call (function->compiled, (m3stack_t) runtime->stack, runtime->memory.mallocated, d_m3OpDefaultArgs);
if (result)
{
io_module->startFunction = startFunctionTmp;
EXCEPTION_PRINT(result);
goto _catch;
}
}
_catch: return result;
@ -716,12 +725,6 @@ M3Result m3_FindFunction (IM3Function * o_function, IM3Runtime i_runtime, cons
{
_ (CompileFunction (function))
}
// Check if start function needs to be called
if (function->module->startFunction)
{
_ (m3_RunStart (function->module))
}
}
else _throw (ErrorModule (m3Err_functionLookupFailed, i_runtime->modules, "'%s'", i_functionName));
@ -734,6 +737,19 @@ _ (m3_RunStart (function->module))
return result;
}
static
M3Result checkStartFunction(IM3Module i_module)
{
M3Result result = m3Err_none; d_m3Assert(i_module);
// Check if start function needs to be called
if (i_module->startFunction >= 0)
{
result = m3_RunStart (i_module);
}
return result;
}
uint32_t m3_GetArgCount (IM3Function i_function)
{
@ -815,6 +831,7 @@ M3Result m3_CallVL (IM3Function i_function, va_list i_args)
{
IM3Runtime runtime = i_function->module->runtime;
IM3FuncType ftype = i_function->funcType;
M3Result result = m3Err_none;
if (!i_function->compiled) {
return m3Err_missingCompiledCode;
@ -839,18 +856,22 @@ M3Result m3_CallVL (IM3Function i_function, va_list i_args)
}
}
m3StackCheckInit();
M3Result r = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
_ (checkStartFunction(i_function->module))
result = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
ReportNativeStackUsage ();
runtime->lastCalled = r ? NULL : i_function;
runtime->lastCalled = result ? NULL : i_function;
return r;
_catch: return result;
}
M3Result m3_Call (IM3Function i_function, uint32_t i_argc, const void * i_argptrs[])
{
IM3Runtime runtime = i_function->module->runtime;
IM3FuncType ftype = i_function->funcType;
M3Result result = m3Err_none;
if (i_argc != ftype->numArgs) {
return m3Err_argumentCountMismatch;
@ -879,19 +900,22 @@ M3Result m3_Call (IM3Function i_function, uint32_t i_argc, const void * i_argp
}
m3StackCheckInit();
M3Result r = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
ReportNativeStackUsage ();
runtime->lastCalled = r ? NULL : i_function;
_ (checkStartFunction(i_function->module))
result = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
ReportNativeStackUsage ();
runtime->lastCalled = result ? NULL : i_function;
return r;
_catch: return result;
}
M3Result m3_CallArgv (IM3Function i_function, uint32_t i_argc, const char * i_argv[])
{
IM3FuncType ftype = i_function->funcType;
IM3Runtime runtime = i_function->module->runtime;
M3Result result = m3Err_none;
if (i_argc != ftype->numArgs) {
return m3Err_argumentCountMismatch;
@ -920,12 +944,15 @@ M3Result m3_CallArgv (IM3Function i_function, uint32_t i_argc, const char * i_
}
m3StackCheckInit();
M3Result r = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
_ (checkStartFunction(i_function->module))
result = (M3Result) Call (i_function->compiled, (m3stack_t)(runtime->stack), runtime->memory.mallocated, d_m3OpDefaultArgs);
ReportNativeStackUsage ();
runtime->lastCalled = r ? NULL : i_function;
runtime->lastCalled = result ? NULL : i_function;
return r;
_catch: return result;
}

Loading…
Cancel
Save