@@ -0,0 +1,91 @@
1+#include <stdlib.h>
2+#include <string.h>
3+
4+#include "closure.h"
5+
6+VM* init_vm(int stack_size, size_t heap_size) {
7+ VAL* valstack = malloc(stack_size*sizeof(VAL));
8+ int* intstack = malloc(stack_size*sizeof(int));
9+ double* floatstack = malloc(stack_size*sizeof(double));
10+
11+ VM* vm = malloc(sizeof(VM));
12+ vm -> valstack = valstack;
13+ vm -> valstack_ptr = valstack;
14+ vm -> intstack = intstack;
15+ vm -> intstack_ptr = intstack;
16+ vm -> floatstack = floatstack;
17+ vm -> floatstack_ptr = floatstack;
18+ vm -> stack_max = stack_size;
19+ vm -> heap = malloc(heap_size);
20+ return vm;
21+}
22+
23+void* allocate(VM* vm, int size) {
24+ return malloc(size); // TMP!
25+}
26+
27+void* allocThunk(VM* vm, int argspace) {
28+ Closure* cl = allocate(vm, sizeof(ClosureType) +
29+ sizeof(VAL) * (argspace + 1) +
30+ sizeof(int) * 2);
31+ cl -> ty = THUNK;
32+ return (void*)cl;
33+}
34+
35+void* allocCon(VM* vm, int arity) {
36+ Closure* cl = allocate(vm, sizeof(ClosureType) +
37+ sizeof(int) +
38+ sizeof(VAL) * arity);
39+ cl -> ty = CON;
40+ return (void*)cl;
41+}
42+
43+VAL mkInt(VM* vm, int val) {
44+ Closure* cl = allocate(vm, sizeof(ClosureType) + sizeof(int));
45+ cl -> ty = INT;
46+ cl -> info.i = val;
47+ return cl;
48+}
49+
50+VAL mkFloat(VM* vm, double val) {
51+ Closure* cl = allocate(vm, sizeof(ClosureType) + sizeof(double));
52+ cl -> ty = FLOAT;
53+ cl -> info.f = val;
54+ return cl;
55+}
56+
57+VAL mkStr(VM* vm, char* str) {
58+ Closure* cl = allocate(vm, sizeof(ClosureType) + sizeof(char*) * strlen(str));
59+ cl -> ty = STRING;
60+ strcpy(cl -> info.str, str);
61+ return cl;
62+}
63+
64+VAL mkThunk(VM* vm, func fn, int args, int arity) {
65+ int i;
66+ Closure* cl = allocThunk(vm, arity);
67+ cl -> info.t.fn = fn;
68+ cl -> info.t.arity = arity;
69+ cl -> info.t.numargs = args;
70+ VAL** argptr = &(cl -> info.t.args);
71+
72+ for (i = 0; i < args; ++i) {
73+ VAL* v = POP;
74+ *argptr++ = v;
75+ }
76+}
77+
78+VAL mkCon(VM* vm, int tag, int arity) {
79+ Closure* cl = allocCon(vm, arity);
80+
81+ int i;
82+ cl -> info.c.tag = tag;
83+ VAL** argptr = &(cl -> info.c.args);
84+
85+ for (i = 0; i < arity; ++i) {
86+ VAL* v = POP;
87+ *argptr++ = v;
88+ }
89+
90+}
91+