Ejemplo n.º 1
0
void schedulerShutdown()
{
  // If the module was never loaded, we don't have anything to release.
  if (schedulerClass == NULL) return;
  
  WrenVM* vm = getVM();
  wrenReleaseValue(vm, schedulerClass);
  wrenReleaseValue(vm, resume1);
  wrenReleaseValue(vm, resume2);
  wrenReleaseValue(vm, resumeError);
}
Ejemplo n.º 2
0
void Method::release_() {
    if ( refCount_ ) {
        *refCount_ -= 1u;
        if ( *refCount_ == 0u ) {
            wrenReleaseValue( vm_, method_ );
            delete refCount_;
            refCount_ = nullptr;
        }
    }
}
Ejemplo n.º 3
0
void schedulerResume(WrenValue* fiber, bool hasArgument)
{
  WrenVM* vm = getVM();
  wrenEnsureSlots(vm, 2 + (hasArgument ? 1 : 0));
  wrenSetSlotValue(vm, 0, schedulerClass);
  wrenSetSlotValue(vm, 1, fiber);
  wrenReleaseValue(vm, fiber);
  
  // If we don't need to wait for an argument to be stored on the stack, resume
  // it now.
  if (!hasArgument) resume(resume1);
}
Ejemplo n.º 4
0
// Frees all resources related to stdin.
static void shutdownStdin()
{
  if (stdinStream != NULL)
  {
    uv_close((uv_handle_t*)stdinStream, NULL);
    free(stdinStream);
    stdinStream = NULL;
  }
  
  if (stdinClass != NULL)
  {
    wrenReleaseValue(getVM(), stdinClass);
    stdinClass = NULL;
  }
  
  if (stdinOnData != NULL)
  {
    wrenReleaseValue(getVM(), stdinOnData);
    stdinOnData = NULL;
  }
}
Ejemplo n.º 5
0
static void callResume(WrenValue* resumeMethod, WrenValue* fiber,
                       const char* argTypes, ...)
{
  va_list args;
  va_start(args, argTypes);
  WrenInterpretResult result = wrenCallVarArgs(getVM(), resumeMethod, NULL,
                                               argTypes, args);
  va_end(args);
  
  wrenReleaseValue(getVM(), fiber);
  
  // If a runtime error occurs in response to an async operation and nothing
  // catches the error in the fiber, then exit the CLI.
  if (result == WREN_RESULT_RUNTIME_ERROR)
  {
    uv_stop(getLoop());
    setExitCode(70); // EX_SOFTWARE.
  }
}
Ejemplo n.º 6
0
Archivo: call.c Proyecto: 0x73/wren
void callRunTests(WrenVM* vm)
{
  wrenEnsureSlots(vm, 1);
  wrenGetVariable(vm, "main", "Call", 0);
  WrenValue* callClass = wrenGetSlotValue(vm, 0);
  
  WrenValue* noParams = wrenMakeCallHandle(vm, "noParams");
  WrenValue* zero = wrenMakeCallHandle(vm, "zero()");
  WrenValue* one = wrenMakeCallHandle(vm, "one(_)");
  WrenValue* two = wrenMakeCallHandle(vm, "two(_,_)");
  
  // Different arity.
  wrenEnsureSlots(vm, 1);
  wrenSetSlotValue(vm, 0, callClass);
  wrenCall(vm, noParams);
  
  wrenEnsureSlots(vm, 1);
  wrenSetSlotValue(vm, 0, callClass);
  wrenCall(vm, zero);
  
  wrenEnsureSlots(vm, 2);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotDouble(vm, 1, 1.0);
  wrenCall(vm, one);
  
  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotDouble(vm, 1, 1.0);
  wrenSetSlotDouble(vm, 2, 2.0);
  wrenCall(vm, two);
  
  // Returning a value.
  WrenValue* getValue = wrenMakeCallHandle(vm, "getValue()");
  wrenEnsureSlots(vm, 1);
  wrenSetSlotValue(vm, 0, callClass);
  wrenCall(vm, getValue);
  WrenValue* value = wrenGetSlotValue(vm, 0);
  
  // Different argument types.
  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotBool(vm, 1, true);
  wrenSetSlotBool(vm, 2, false);
  wrenCall(vm, two);

  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotDouble(vm, 1, 1.2);
  wrenSetSlotDouble(vm, 2, 3.4);
  wrenCall(vm, two);
  
  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotString(vm, 1, "string");
  wrenSetSlotString(vm, 2, "another");
  wrenCall(vm, two);
  
  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotNull(vm, 1);
  wrenSetSlotValue(vm, 2, value);
  wrenCall(vm, two);
  
  // Truncate a string, or allow null bytes.
  wrenEnsureSlots(vm, 3);
  wrenSetSlotValue(vm, 0, callClass);
  wrenSetSlotBytes(vm, 1, "string", 3);
  wrenSetSlotBytes(vm, 2, "b\0y\0t\0e", 7);
  wrenCall(vm, two);
  
  // Call ignores with extra temporary slots on stack.
  wrenEnsureSlots(vm, 10);
  wrenSetSlotValue(vm, 0, callClass);
  for (int i = 1; i < 10; i++)
  {
    wrenSetSlotDouble(vm, i, i * 0.1);
  }
  wrenCall(vm, one);
  
  wrenReleaseValue(vm, callClass);
  wrenReleaseValue(vm, noParams);
  wrenReleaseValue(vm, zero);
  wrenReleaseValue(vm, one);
  wrenReleaseValue(vm, two);
  wrenReleaseValue(vm, getValue);
  wrenReleaseValue(vm, value);
}
Ejemplo n.º 7
0
void schedulerReleaseMethods()
{
  if (resume != NULL) wrenReleaseValue(getVM(), resume);
  if (resumeWithArg != NULL) wrenReleaseValue(getVM(), resumeWithArg);
  if (resumeError != NULL) wrenReleaseValue(getVM(), resumeError);
}