feat: add va_list version of wrenCall and fix GC bug with return values

- Introduce wrenCallVarArgs as an explicit va_list variant, allowing variadic functions to forward their arguments directly without re-parsing.
- Fix a garbage collection issue in wrenCall where return values could be prematurely collected by ensuring proper root handling.
- Refactor the call API test to avoid re-entering the VM by moving test execution into an afterLoad callback instead of a foreign method.
This commit is contained in:
Bob Nystrom
2015-09-30 02:29:10 +00:00
parent b19d85f618
commit f6c36ec85b
9 changed files with 113 additions and 66 deletions
+6 -1
View File
@@ -12,6 +12,7 @@ static WrenVM* vm;
static WrenBindForeignMethodFn bindMethodFn = NULL;
static WrenBindForeignClassFn bindClassFn = NULL;
static WrenForeignMethodFn afterLoadFn = NULL;
static uv_loop_t* loop;
@@ -204,6 +205,8 @@ void runFile(const char* path)
WrenInterpretResult result = wrenInterpret(vm, path, source);
if (afterLoadFn != NULL) afterLoadFn(vm);
if (result == WREN_RESULT_SUCCESS)
{
uv_run(loop, UV_RUN_DEFAULT);
@@ -260,8 +263,10 @@ uv_loop_t* getLoop()
}
void setTestCallbacks(WrenBindForeignMethodFn bindMethod,
WrenBindForeignClassFn bindClass)
WrenBindForeignClassFn bindClass,
WrenForeignMethodFn afterLoad)
{
bindMethodFn = bindMethod;
bindClassFn = bindClass;
afterLoadFn = afterLoad;
}
+2 -1
View File
@@ -23,6 +23,7 @@ uv_loop_t* getLoop();
// Used by the API test executable to let it wire up its own foreign functions.
// This must be called before calling [createVM()].
void setTestCallbacks(WrenBindForeignMethodFn bindMethod,
WrenBindForeignClassFn bindClass);
WrenBindForeignClassFn bindClass,
void (*afterLoad)(WrenVM* vm));
#endif