static void ensureOutsideForeign(WrenVM* vm) { // To test the behavior outside of a foreign method (which we're currently // in), create a new separate VM. WrenConfiguration config; wrenInitConfiguration(&config); WrenVM* otherVM = wrenNewVM(&config); int before = wrenGetSlotCount(otherVM); wrenEnsureSlots(otherVM, 20); int after = wrenGetSlotCount(otherVM); // Use the slots to make sure they're available. for (int i = 0; i < 20; i++) { wrenSetSlotDouble(otherVM, i, i); } int sum = 0; for (int i = 0; i < 20; i++) { sum += (int)wrenGetSlotDouble(otherVM, i); } wrenFreeVM(otherVM); char result[100]; sprintf(result, "%d -> %d (%d)", before, after, sum); wrenSetSlotString(vm, 0, result); }
static void ensure(WrenVM* vm) { int before = wrenGetSlotCount(vm); wrenEnsureSlots(vm, 20); int after = wrenGetSlotCount(vm); // Use the slots to make sure they're available. for (int i = 0; i < 20; i++) { wrenSetSlotDouble(vm, i, i); } int sum = 0; for (int i = 0; i < 20; i++) { sum += (int)wrenGetSlotDouble(vm, i); } char result[100]; sprintf(result, "%d -> %d (%d)", before, after, sum); wrenSetSlotString(vm, 0, result); }
// Called by libuv when the stat call completes. static void statPathCallback(uv_fs_t* request) { if (handleRequestError(request)) return; WrenVM* vm = getVM(); wrenEnsureSlots(vm, 4); wrenSetSlotNewList(vm, 2); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_dev); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_ino); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_mode); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_nlink); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_uid); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_gid); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_rdev); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_size); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_blksize); wrenInsertInList(vm, 2, -1, 3); wrenSetSlotDouble(vm, 3, (double)request->statbuf.st_blocks); wrenInsertInList(vm, 2, -1, 3); // TODO: Include access, modification, and change times once we figure out // how we want to represent it. // time_t st_atime; /* time of last access */ // time_t st_mtime; /* time of last modification */ // time_t st_ctime; /* time of last status change */ schedulerResume(freeRequest(request), true); schedulerFinishResume(); }
// Called by libuv when the stat call for size completes. static void fileSizeCallback(uv_fs_t* request) { if (handleRequestError(request)) return; double size = (double)request->statbuf.st_size; schedulerResume(freeRequest(request), true); wrenSetSlotDouble(getVM(), 2, size); schedulerFinishResume(); }
static void fileOpenCallback(uv_fs_t* request) { if (handleRequestError(request)) return; double fd = (double)request->result; schedulerResume(freeRequest(request), true); wrenSetSlotDouble(getVM(), 2, fd); schedulerFinishResume(); }
void resetStackAfterForeignConstructRunTests(WrenVM* vm) { wrenEnsureSlots(vm, 1); wrenGetVariable(vm, "main", "Test", 0); WrenHandle* testClass = wrenGetSlotHandle(vm, 0); WrenHandle* callConstruct = wrenMakeCallHandle(vm, "callConstruct()"); WrenHandle* afterConstruct = wrenMakeCallHandle(vm, "afterConstruct(_,_)"); wrenEnsureSlots(vm, 1); wrenSetSlotHandle(vm, 0, testClass); wrenCall(vm, callConstruct); wrenEnsureSlots(vm, 3); wrenSetSlotHandle(vm, 0, testClass); wrenSetSlotDouble(vm, 1, 1.0); wrenSetSlotDouble(vm, 2, 2.0); wrenCall(vm, afterConstruct); wrenReleaseHandle(vm, testClass); wrenReleaseHandle(vm, callConstruct); wrenReleaseHandle(vm, afterConstruct); }
static void setSlots(WrenVM* vm) { WrenHandle* handle = wrenGetSlotHandle(vm, 1); wrenSetSlotBool(vm, 1, true); wrenSetSlotBytes(vm, 2, "by\0te", 5); wrenSetSlotDouble(vm, 3, 1.5); wrenSetSlotString(vm, 4, "str"); // TODO: wrenSetSlotNull(). // Read the slots back to make sure they were set correctly. bool result = true; if (wrenGetSlotBool(vm, 1) != true) result = false; int length; const char* bytes = wrenGetSlotBytes(vm, 2, &length); if (length != 5) result = false; if (memcmp(bytes, "by\0te", length) != 0) result = false; if (wrenGetSlotDouble(vm, 3) != 1.5) result = false; if (strcmp(wrenGetSlotString(vm, 4), "str") != 0) result = false; if (result) { // Move the value into the return position. wrenSetSlotHandle(vm, 0, handle); } else { // If anything failed, return false. wrenSetSlotBool(vm, 0, false); } wrenReleaseHandle(vm, handle); }
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); }
static void wren_plusone(WrenVM* vm) { wrenSetSlotDouble(vm, 0, wrenGetSlotDouble(vm, 1) + 1); }
static void wren_count(WrenVM* vm) { wrenSetSlotDouble(vm, 0, count); }
static void getListCount(WrenVM* vm) { wrenSetSlotDouble(vm, 0, wrenGetListCount(vm, 1)); }
void fileDescriptor(WrenVM* vm) { int* foreign = (int*)wrenGetSlotForeign(vm, 0); int fd = *foreign; wrenSetSlotDouble(vm, 0, fd); }