on master help sign in
Calculate size allocation of BIGINT properly
3fe14c7Edwin Brady
rts/idris_gmp.c+24−33
@@ -10,9 +10,9 @@ 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
12
13− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
13+ VAL cl = allocate(vm, sizeof(Closure) +
14 sizeof(mpz_t), 0);
14 sizeof(mpz_t), 0);
15− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
15+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
16
16
17 mpz_init(*bigint);
17 mpz_init(*bigint);
18 mpz_set_str(*bigint, val, 10);
18 mpz_set_str(*bigint, val, 10);
@@ -25,9 +25,9 @@ VAL MKBIGC(VM* vm, char* val) {
25
25
26VAL MKBIGM(VM* vm, void* big) {
26VAL MKBIGM(VM* vm, void* big) {
27 mpz_t* bigint;
27 mpz_t* bigint;
28− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
28+ VAL cl = allocate(vm, sizeof(Closure) +
29 sizeof(mpz_t), 0);
29 sizeof(mpz_t), 0);
30− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
30+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
31
31
32 mpz_init(*bigint);
32 mpz_init(*bigint);
33 mpz_set(*bigint, *((mpz_t*)big));
33 mpz_set(*bigint, *((mpz_t*)big));
@@ -40,9 +40,9 @@ VAL MKBIGM(VM* vm, void* big) {
40
40
41VAL MKBIGMc(VM* vm, void* big) {
41VAL MKBIGMc(VM* vm, void* big) {
42 mpz_t* bigint;
42 mpz_t* bigint;
43− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
43+ VAL cl = allocate(vm, sizeof(Closure) +
44 sizeof(mpz_t), 0);
44 sizeof(mpz_t), 0);
45− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
45+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
46
46
47 mpz_init_set(*bigint, *((mpz_t*)big));
47 mpz_init_set(*bigint, *((mpz_t*)big));
48
48
@@ -54,9 +54,8 @@ VAL MKBIGMc(VM* vm, void* big) {
54
54
55VAL MKBIGUI(VM* vm, unsigned long val) {
55VAL MKBIGUI(VM* vm, unsigned long val) {
56 mpz_t* bigint;
56 mpz_t* bigint;
57− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
57+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
58− sizeof(mpz_t), 0);
59− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
58+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
60
59
61 mpz_init_set_ui(*bigint, val);
60 mpz_init_set_ui(*bigint, val);
62
61
@@ -68,9 +67,8 @@ VAL MKBIGUI(VM* vm, unsigned long val) {
68
67
69VAL MKBIGSI(VM* vm, signed long val) {
68VAL MKBIGSI(VM* vm, signed long val) {
70 mpz_t* bigint;
69 mpz_t* bigint;
71− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
70+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
72− sizeof(mpz_t), 0);
73− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
71+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
74
72
75 mpz_init_set_si(*bigint, val);
73 mpz_init_set_si(*bigint, val);
76
74
@@ -83,9 +81,8 @@ VAL MKBIGSI(VM* vm, signed long val) {
83VAL GETBIG(VM * vm, VAL x) {
81VAL GETBIG(VM * vm, VAL x) {
84 if (ISINT(x)) {
82 if (ISINT(x)) {
85 mpz_t* bigint;
83 mpz_t* bigint;
86− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
84+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
87− sizeof(mpz_t), 0);
88− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
85+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
89
86
90 mpz_init(*bigint);
87 mpz_init(*bigint);
91 mpz_set_si(*bigint, GETINT(x));
88 mpz_set_si(*bigint, GETINT(x));
@@ -101,9 +98,8 @@ VAL GETBIG(VM * vm, VAL x) {
101
98
102VAL bigAdd(VM* vm, VAL x, VAL y) {
99VAL bigAdd(VM* vm, VAL x, VAL y) {
103 mpz_t* bigint;
100 mpz_t* bigint;
104− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
101+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
105− sizeof(mpz_t), 0);
106− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
102+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
107 mpz_add(*bigint, GETMPZ(x), GETMPZ(y));
103 mpz_add(*bigint, GETMPZ(x), GETMPZ(y));
108 SETTY(cl, BIGINT);
104 SETTY(cl, BIGINT);
109 cl -> info.ptr = (void*)bigint;
105 cl -> info.ptr = (void*)bigint;
@@ -112,9 +108,8 @@ VAL bigAdd(VM* vm, VAL x, VAL y) {
112
108
113VAL bigSub(VM* vm, VAL x, VAL y) {
109VAL bigSub(VM* vm, VAL x, VAL y) {
114 mpz_t* bigint;
110 mpz_t* bigint;
115− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
111+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
116− sizeof(mpz_t), 0);
117− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
112+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
118 mpz_sub(*bigint, GETMPZ(x), GETMPZ(y));
113 mpz_sub(*bigint, GETMPZ(x), GETMPZ(y));
119 SETTY(cl, BIGINT);
114 SETTY(cl, BIGINT);
120 cl -> info.ptr = (void*)bigint;
115 cl -> info.ptr = (void*)bigint;
@@ -123,9 +118,8 @@ VAL bigSub(VM* vm, VAL x, VAL y) {
123
118
124VAL bigMul(VM* vm, VAL x, VAL y) {
119VAL bigMul(VM* vm, VAL x, VAL y) {
125 mpz_t* bigint;
120 mpz_t* bigint;
126− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
121+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
127− sizeof(mpz_t), 0);
128− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
122+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
129 mpz_mul(*bigint, GETMPZ(x), GETMPZ(y));
123 mpz_mul(*bigint, GETMPZ(x), GETMPZ(y));
130 SETTY(cl, BIGINT);
124 SETTY(cl, BIGINT);
131 cl -> info.ptr = (void*)bigint;
125 cl -> info.ptr = (void*)bigint;
@@ -134,9 +128,8 @@ VAL bigMul(VM* vm, VAL x, VAL y) {
134
128
135VAL bigDiv(VM* vm, VAL x, VAL y) {
129VAL bigDiv(VM* vm, VAL x, VAL y) {
136 mpz_t* bigint;
130 mpz_t* bigint;
137− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
131+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
138− sizeof(mpz_t), 0);
139− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
132+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
140 mpz_div(*bigint, GETMPZ(x), GETMPZ(y));
133 mpz_div(*bigint, GETMPZ(x), GETMPZ(y));
141 SETTY(cl, BIGINT);
134 SETTY(cl, BIGINT);
142 cl -> info.ptr = (void*)bigint;
135 cl -> info.ptr = (void*)bigint;
@@ -145,9 +138,8 @@ VAL bigDiv(VM* vm, VAL x, VAL y) {
145
138
146VAL bigMod(VM* vm, VAL x, VAL y) {
139VAL bigMod(VM* vm, VAL x, VAL y) {
147 mpz_t* bigint;
140 mpz_t* bigint;
148− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
141+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
149− sizeof(mpz_t), 0);
150− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
142+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
151 mpz_mod(*bigint, GETMPZ(x), GETMPZ(y));
143 mpz_mod(*bigint, GETMPZ(x), GETMPZ(y));
152 SETTY(cl, BIGINT);
144 SETTY(cl, BIGINT);
153 cl -> info.ptr = (void*)bigint;
145 cl -> info.ptr = (void*)bigint;
@@ -320,9 +312,8 @@ VAL idris_castFloatBig(VM* vm, VAL f) {
320 double val = GETFLOAT(f);
312 double val = GETFLOAT(f);
321
313
322 mpz_t* bigint;
314 mpz_t* bigint;
323− VAL cl = allocate(vm, sizeof(ClosureType) + sizeof(void*) +
315+ VAL cl = allocate(vm, sizeof(Closure) + sizeof(mpz_t), 0);
324− sizeof(mpz_t), 0);
325− bigint = (mpz_t*)(((char*)cl) + sizeof(ClosureType) + sizeof(void*));
316+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
326
317
327 mpz_init_set_d(*bigint, val);
318 mpz_init_set_d(*bigint, val);
328
319