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); }
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 getSlots(WrenVM* vm) { bool result = true; if (wrenGetSlotBool(vm, 1) != true) result = false; // TODO: Test wrenGetSlotForeign(). 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) != 12.34) result = false; if (strcmp(wrenGetSlotString(vm, 4), "str") != 0) result = false; WrenHandle* handle = wrenGetSlotHandle(vm, 5); if (result) { // Otherwise, return the value so we can tell if we captured it correctly. wrenSetSlotHandle(vm, 0, handle); wrenReleaseHandle(vm, handle); } else { // If anything failed, return false. wrenSetSlotBool(vm, 0, false); } }
void fileAllocate(WrenVM* vm) { // Store the file descriptor in the foreign data, so that we can get to it // in the finalizer. int* fd = (int*)wrenSetSlotNewForeign(vm, 0, 0, sizeof(int)); *fd = (int)wrenGetSlotDouble(vm, 1); }
void fileReadBytes(WrenVM* vm) { uv_fs_t* request = createRequest(wrenGetSlotValue(vm, 3)); int fd = *(int*)wrenGetSlotForeign(vm, 0); // TODO: Assert fd != -1. FileRequestData* data = (FileRequestData*)request->data; size_t length = (size_t)wrenGetSlotDouble(vm, 1); size_t offset = (size_t)wrenGetSlotDouble(vm, 2); data->buffer.len = length; data->buffer.base = (char*)malloc(length); uv_fs_read(getLoop(), request, fd, &data->buffer, 1, offset, fileReadBytesCallback); }
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); }
static void wren_plusone(WrenVM* vm) { wrenSetSlotDouble(vm, 0, wrenGetSlotDouble(vm, 1) + 1); }
static void getListElement(WrenVM* vm) { int index = (int)wrenGetSlotDouble(vm, 2); wrenGetListElement(vm, 1, index, 0); }
static void counterAllocate(WrenVM* vm) { double* counter = (double*)wrenSetSlotNewForeign(vm, 0, 0, sizeof(double)); *counter = wrenGetSlotDouble(vm, 1); }