@@ -9,10 +9,11 @@ VAL MKBIGI(int val) {
10VAL MKBIGC(VM* vm, char* val) {
10VAL MKBIGC(VM* vm, char* val) {
11 mpz_t* bigint;
11 mpz_t* bigint;
12− // FIXME! what if GC happens after cl allocation?
12+
13− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
13+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
14− bigint = allocate(vm, sizeof(mpz_t), 0);
14+ sizeof(mpz_t), 0);
15−
15+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
16 mpz_init(*bigint);
17 mpz_init(*bigint);
17 mpz_set_str(*bigint, val, 10);
18 mpz_set_str(*bigint, val, 10);
@@ -24,9 +25,9 @@ VAL MKBIGC(VM* vm, char* val) {
25VAL MKBIGM(VM* vm, void* big) {
26VAL MKBIGM(VM* vm, void* big) {
26 mpz_t* bigint;
27 mpz_t* bigint;
27− // FIXME! what if GC happens after cl allocation?
28− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
28+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
29− bigint = allocate(vm, sizeof(mpz_t), 0);
29+ sizeof(mpz_t), 0);
30+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
31 mpz_init(*bigint);
32 mpz_init(*bigint);
32 mpz_set(*bigint, *((mpz_t*)big));
33 mpz_set(*bigint, *((mpz_t*)big));
@@ -39,8 +40,9 @@ VAL MKBIGM(VM* vm, void* big) {
40VAL MKBIGMc(VM* vm, void* big) {
41VAL MKBIGMc(VM* vm, void* big) {
41 mpz_t* bigint;
42 mpz_t* bigint;
42− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 1);
43+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
43− bigint = allocate(vm, sizeof(mpz_t), 1);
44+ sizeof(mpz_t), 0);
45+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
45 mpz_init(*bigint);
47 mpz_init(*bigint);
46 mpz_set(*bigint, *((mpz_t*)big));
48 mpz_set(*bigint, *((mpz_t*)big));
@@ -54,8 +56,9 @@ VAL MKBIGMc(VM* vm, void* big) {
54VAL GETBIG(VM * vm, VAL x) {
56VAL GETBIG(VM * vm, VAL x) {
55 if (ISINT(x)) {
57 if (ISINT(x)) {
56 mpz_t* bigint;
58 mpz_t* bigint;
57− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
59+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
58− bigint = allocate(vm, sizeof(mpz_t), 0);
60+ sizeof(mpz_t), 0);
61+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
60 mpz_init(*bigint);
63 mpz_init(*bigint);
61 mpz_set_si(*bigint, GETINT(x));
64 mpz_set_si(*bigint, GETINT(x));
@@ -71,8 +74,9 @@ VAL GETBIG(VM * vm, VAL x) {
72VAL bigAdd(VM* vm, VAL x, VAL y) {
75VAL bigAdd(VM* vm, VAL x, VAL y) {
73 mpz_t* bigint;
76 mpz_t* bigint;
74− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
77+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
75− bigint = allocate(vm, sizeof(mpz_t), 0);
78+ sizeof(mpz_t), 0);
79+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
76 mpz_add(*bigint, GETMPZ(x), GETMPZ(y));
80 mpz_add(*bigint, GETMPZ(x), GETMPZ(y));
77 SETTY(cl, BIGINT);
81 SETTY(cl, BIGINT);
78 cl -> info.ptr = (void*)bigint;
82 cl -> info.ptr = (void*)bigint;
@@ -81,8 +85,9 @@ VAL bigAdd(VM* vm, VAL x, VAL y) {
82VAL bigSub(VM* vm, VAL x, VAL y) {
86VAL bigSub(VM* vm, VAL x, VAL y) {
83 mpz_t* bigint;
87 mpz_t* bigint;
84− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
88+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
85− bigint = allocate(vm, sizeof(mpz_t), 0);
89+ sizeof(mpz_t), 0);
90+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
86 mpz_sub(*bigint, GETMPZ(x), GETMPZ(y));
91 mpz_sub(*bigint, GETMPZ(x), GETMPZ(y));
87 SETTY(cl, BIGINT);
92 SETTY(cl, BIGINT);
88 cl -> info.ptr = (void*)bigint;
93 cl -> info.ptr = (void*)bigint;
@@ -91,8 +96,9 @@ VAL bigSub(VM* vm, VAL x, VAL y) {
92VAL bigMul(VM* vm, VAL x, VAL y) {
97VAL bigMul(VM* vm, VAL x, VAL y) {
93 mpz_t* bigint;
98 mpz_t* bigint;
94− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
99+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
95− bigint = allocate(vm, sizeof(mpz_t), 0);
100+ sizeof(mpz_t), 0);
101+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
96 mpz_mul(*bigint, GETMPZ(x), GETMPZ(y));
102 mpz_mul(*bigint, GETMPZ(x), GETMPZ(y));
97 SETTY(cl, BIGINT);
103 SETTY(cl, BIGINT);
98 cl -> info.ptr = (void*)bigint;
104 cl -> info.ptr = (void*)bigint;
@@ -101,8 +107,9 @@ VAL bigMul(VM* vm, VAL x, VAL y) {
102VAL bigDiv(VM* vm, VAL x, VAL y) {
108VAL bigDiv(VM* vm, VAL x, VAL y) {
103 mpz_t* bigint;
109 mpz_t* bigint;
104− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*), 0);
110+ VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
105− bigint = allocate(vm, sizeof(mpz_t), 0);
111+ sizeof(mpz_t), 0);
112+ bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
106 mpz_div(*bigint, GETMPZ(x), GETMPZ(y));
113 mpz_div(*bigint, GETMPZ(x), GETMPZ(y));
107 SETTY(cl, BIGINT);
114 SETTY(cl, BIGINT);
108 cl -> info.ptr = (void*)bigint;
115 cl -> info.ptr = (void*)bigint;