#include <stdlib.h>
#include <string.h>
#include "uv.h"
#include "scheduler.h"
#include "wren.h"
#include "vm.h"
static WrenHandle* schedulerClass;
static WrenHandle* resume1;
static WrenHandle* resume2;
static WrenHandle* resumeError;
static void resume(WrenHandle* method)
{
WrenInterpretResult result = wrenCall(getVM(), method);
if (result == WREN_RESULT_RUNTIME_ERROR)
{
uv_stop(getLoop());
setExitCode(70); }
}
void schedulerCaptureMethods(WrenVM* vm)
{
wrenEnsureSlots(vm, 1);
wrenGetVariable(vm, "scheduler", "Scheduler", 0);
schedulerClass = wrenGetSlotHandle(vm, 0);
resume1 = wrenMakeCallHandle(vm, "resume_(_)");
resume2 = wrenMakeCallHandle(vm, "resume_(_,_)");
resumeError = wrenMakeCallHandle(vm, "resumeError_(_,_)");
}
void schedulerResume(WrenHandle* fiber, bool hasArgument)
{
WrenVM* vm = getVM();
wrenEnsureSlots(vm, 2 + (hasArgument ? 1 : 0));
wrenSetSlotHandle(vm, 0, schedulerClass);
wrenSetSlotHandle(vm, 1, fiber);
wrenReleaseHandle(vm, fiber);
if (!hasArgument) resume(resume1);
}
void schedulerFinishResume()
{
resume(resume2);
}
void schedulerResumeError(WrenHandle* fiber, const char* error)
{
schedulerResume(fiber, true);
wrenSetSlotString(getVM(), 2, error);
resume(resumeError);
}
void schedulerShutdown()
{
if (schedulerClass == NULL) return;
WrenVM* vm = getVM();
wrenReleaseHandle(vm, schedulerClass);
wrenReleaseHandle(vm, resume1);
wrenReleaseHandle(vm, resume2);
wrenReleaseHandle(vm, resumeError);
}