@@ -9,10 +9,11 @@ VAL MKBIGI(int val) {
99
1010VAL MKBIGC(VM* vm, char* val) {
1111 mpz_t* bigint;
12− // FIXME! what if GC happens after cl allocation?
13− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
14− bigint = allocate(vm, sizeof(mpz_t), 0);
15−
12+
13+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
14+ sizeof(mpz_t), 0);
15+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
16+
1617 mpz_init(*bigint);
1718 mpz_set_str(*bigint, val, 10);
1819
@@ -24,9 +25,9 @@ VAL MKBIGC(VM* vm, char* val) {
2425
2526VAL MKBIGM(VM* vm, void* big) {
2627 mpz_t* bigint;
27− // FIXME! what if GC happens after cl allocation?
28− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
29− bigint = allocate(vm, sizeof(mpz_t), 0);
28+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
29+ sizeof(mpz_t), 0);
30+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
3031
3132 mpz_init(*bigint);
3233 mpz_set(*bigint, *((mpz_t*)big));
@@ -39,8 +40,9 @@ VAL MKBIGM(VM* vm, void* big) {
3940
4041VAL MKBIGMc(VM* vm, void* big) {
4142 mpz_t* bigint;
42− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 1);
43− bigint = allocate(vm, sizeof(mpz_t), 1);
43+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
44+ sizeof(mpz_t), 0);
45+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
4446
4547 mpz_init(*bigint);
4648 mpz_set(*bigint, *((mpz_t*)big));
@@ -54,8 +56,9 @@ VAL MKBIGMc(VM* vm, void* big) {
5456VAL GETBIG(VM * vm, VAL x) {
5557 if (ISINT(x)) {
5658 mpz_t* bigint;
57− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
58− bigint = allocate(vm, sizeof(mpz_t), 0);
59+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
60+ sizeof(mpz_t), 0);
61+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
5962
6063 mpz_init(*bigint);
6164 mpz_set_si(*bigint, GETINT(x));
@@ -71,8 +74,9 @@ VAL GETBIG(VM * vm, VAL x) {
7174
7275VAL bigAdd(VM* vm, VAL x, VAL y) {
7376 mpz_t* bigint;
74− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
75− bigint = allocate(vm, sizeof(mpz_t), 0);
77+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
78+ sizeof(mpz_t), 0);
79+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
7680 mpz_add(*bigint, GETMPZ(x), GETMPZ(y));
7781 SETTY(cl, BIGINT);
7882 cl -> info.ptr = (void*)bigint;
@@ -81,8 +85,9 @@ VAL bigAdd(VM* vm, VAL x, VAL y) {
8185
8286VAL bigSub(VM* vm, VAL x, VAL y) {
8387 mpz_t* bigint;
84− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
85− bigint = allocate(vm, sizeof(mpz_t), 0);
88+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
89+ sizeof(mpz_t), 0);
90+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
8691 mpz_sub(*bigint, GETMPZ(x), GETMPZ(y));
8792 SETTY(cl, BIGINT);
8893 cl -> info.ptr = (void*)bigint;
@@ -91,8 +96,9 @@ VAL bigSub(VM* vm, VAL x, VAL y) {
9196
9297VAL bigMul(VM* vm, VAL x, VAL y) {
9398 mpz_t* bigint;
94− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
95− bigint = allocate(vm, sizeof(mpz_t), 0);
99+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
100+ sizeof(mpz_t), 0);
101+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
96102 mpz_mul(*bigint, GETMPZ(x), GETMPZ(y));
97103 SETTY(cl, BIGINT);
98104 cl -> info.ptr = (void*)bigint;
@@ -101,8 +107,9 @@ VAL bigMul(VM* vm, VAL x, VAL y) {
101107
102108VAL bigDiv(VM* vm, VAL x, VAL y) {
103109 mpz_t* bigint;
104− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
105− bigint = allocate(vm, sizeof(mpz_t), 0);
110+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
111+ sizeof(mpz_t), 0);
112+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
106113 mpz_div(*bigint, GETMPZ(x), GETMPZ(y));
107114 SETTY(cl, BIGINT);
108115 cl -> info.ptr = (void*)bigint;