int runRepl() { initVM(); printf("\\\\/\"-\n"); printf(" \\_/ wren v0.0.0\n"); char line[MAX_LINE_LENGTH]; for (;;) { printf("> "); if (!fgets(line, MAX_LINE_LENGTH, stdin)) { printf("\n"); break; } // TODO: Handle failure. wrenInterpret(vm, line); // TODO: Automatically print the result of expressions. } freeVM(); return 0; }
bool VMUniverseMgr::allocVM(pid_t s_pid, ClassAd &ad, char const *execute_dir) { if( canCreateVM(&ad) == false ) { return false; } // Find memory for VM int vm_mem = 0; if( (ad.LookupInteger(ATTR_JOB_VM_MEMORY, vm_mem) != 1) && (ad.LookupInteger(ATTR_REQUEST_MEMORY, vm_mem) != 1) ) { dprintf(D_ALWAYS, "Can't find VM memory in Job ClassAd\n"); return false; } int vcpus = 0; if( (ad.LookupInteger(ATTR_JOB_VM_VCPUS, vcpus) != 1) && (ad.LookupInteger(ATTR_REQUEST_CPUS, vcpus) != 1) ) { dprintf(D_FULLDEBUG, "Defaulting to one CPU\n"); vcpus = 1; } // check whether this pid already exists VMStarterInfo *oldinfo = findVMStarterInfoWithStarterPid(s_pid); if( oldinfo ) { freeVM(s_pid); // oldinfo is freed oldinfo = NULL; } VMStarterInfo *newinfo = new VMStarterInfo; ASSERT(newinfo); m_vm_used_memory += vm_mem; newinfo->m_pid = s_pid; newinfo->m_memory = vm_mem; newinfo->m_job_ad = ad; newinfo->m_execute_dir = execute_dir; newinfo->m_vcpus = vcpus; // If there exists MAC or IP address for a checkpointed VM, // we use them as initial values. MyString string_value; if( ad.LookupString(ATTR_VM_CKPT_MAC, string_value) == 1 ) { newinfo->m_vm_mac = string_value; } /* string_value = ""; if( ad.LookupString(ATTR_VM_CKPT_IP, string_value) == 1 ) { newinfo->m_vm_ip = string_value; } */ m_vm_starter_list.Append(newinfo); return true; }
CSQLite3Statement::~CSQLite3Statement(void) { try { freeVM(); } catch (...) { } }
void test1() { printf("Test 1: Objects on stack are preserved.\n"); VM* vm = newVM(); pushInt(vm, 1); pushInt(vm, 2); gc(vm); assert(vm->numObjects == 2, "Should have preserved objects."); freeVM(vm); }
void test2() { printf("Test 2: Unreached objects are collected.\n"); VM* vm = newVM(); pushInt(vm, 1); pushInt(vm, 2); pop(vm); pop(vm); gc(vm); assert(vm->numObjects == 0, "Should have collected objects."); freeVM(vm); }
void perfTest() { printf("Performance Test.\n"); VM* vm = newVM(); for (int i = 0; i < 1000; i++) { for (int j = 0; j < 20; j++) { pushInt(vm, i); } for (int k = 0; k < 20; k++) { pop(vm); } } freeVM(vm); }
void test3() { printf("Test 3: Reach nested objects.\n"); VM* vm = newVM(); pushInt(vm, 1); pushInt(vm, 2); pushPair(vm); pushInt(vm, 3); pushInt(vm, 4); pushPair(vm); pushPair(vm); gc(vm); assert(vm->numObjects == 7, "Should have reached objects."); freeVM(vm); }
void test4() { printf("Test 4: Handle cycles.\n"); VM* vm = newVM(); pushInt(vm, 1); pushInt(vm, 2); Object* a = pushPair(vm); pushInt(vm, 3); pushInt(vm, 4); Object* b = pushPair(vm); a->tail = b; b->tail = a; gc(vm); assert(vm->numObjects == 4, "Should have collected objects."); freeVM(vm); }
void runFile(const char* path) { // Use the directory where the file is as the root to resolve imports // relative to. char* root = NULL; const char* lastSlash = strrchr(path, '/'); if (lastSlash != NULL) { root = (char*)malloc(lastSlash - path + 2); memcpy(root, path, lastSlash - path + 1); root[lastSlash - path + 1] = '\0'; rootDirectory = root; } char* source = readFile(path); if (source == NULL) { fprintf(stderr, "Could not find file \"%s\".\n", path); exit(66); } initVM(); WrenInterpretResult result = wrenInterpret(vm, source); if (afterLoadFn != NULL) afterLoadFn(vm); if (result == WREN_RESULT_SUCCESS) { uv_run(loop, UV_RUN_DEFAULT); } freeVM(); free(source); free(root); // Exit with an error code if the script failed. if (result == WREN_RESULT_COMPILE_ERROR) exit(65); // EX_DATAERR. if (result == WREN_RESULT_RUNTIME_ERROR) exit(70); // EX_SOFTWARE. if (defaultExitCode != 0) exit(defaultExitCode); }