void fx_setTimeout(txMachine* the) { txTimeoutData* data; #if mxMacOSX CFRunLoopTimerContext context; #endif txNumber duration = fxToNumber(the, mxArgv(1)) / 1000; data = c_malloc(sizeof(txTimeoutData)); mxElseError(data); c_memset(data, 0, sizeof(txTimeoutData)); data->the = the; data->function.kind = mxArgv(0)->kind; data->function.value = mxArgv(0)->value; fxRemember(the, &(data->function)); if (mxArgc > 2) { data->argument.kind = mxArgv(2)->kind; data->argument.value = mxArgv(2)->value; } fxRemember(the, &(data->argument)); #if mxMacOSX memset(&context, 0, sizeof(context)); context.info = data; context.release = fx_setTimeoutRelease; data->timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + duration, 0, 0, 0, fx_setTimeoutCallback, &context); CFRunLoopAddTimer(CFRunLoopGetCurrent(), data->timer, gxRunLoopMode); #endif }
FskErr KprPromiseTargetNew(KprPromiseTarget* it, xsMachine* the, xsSlot* resolve, xsSlot* reject) { KprPromiseTarget self; FskErr err = kFskErrNone; bailIfError(FskMemPtrNewClear(sizeof(KprPromiseTargetRecord), it)); self = *it; self->the = the; self->resolve = *resolve; self->reject = *reject; fxRemember(self->the, &self->resolve); fxRemember(self->the, &self->reject); bail: return err; }
FskErr KprFunctionTargetNew(KprFunctionTarget* it, xsMachine* the, xsSlot* slot) { KprFunctionTarget self; FskErr err = kFskErrNone; bailIfError(FskMemPtrNewClear(sizeof(KprFunctionTargetRecord), it)); self = *it; self->the = the; self->slot = *slot; self->code = the->code; fxRemember(self->the, &self->slot); bail: return err; }