void freeVM(VM *vm) { vm->stackSize = 0; gc(vm); free(vm); } void test1() { printf("Test1: 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("Test2: Objects on stack 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 test3() { printf("Test3: 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("Test4: 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 perfTest() { printf("Performance Tsetn"); 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); } int main(int argc, const char * argv[]) { test1(); test2(); test3(); test4(); perfTest(); return 0; }
|