on master help sign in
Fix minigmp assertion failure
a38b7deEdwin Brady
rts/idris_gmp.c+17−12
@@ -23,20 +23,25 @@ VAL MKBIGI(int val) {
23}
23}
24
24
25VAL MKBIGC(VM* vm, char* val) {
25VAL MKBIGC(VM* vm, char* val) {
26+ if (*val == '\0') {
27+ return MKBIGI(0);
28+ }
29+ else {
26− idris_requireAlloc(IDRIS_MAXGMP);
30+ idris_requireAlloc(IDRIS_MAXGMP);
27− mpz_t* bigint;
31+ mpz_t* bigint;
28−
32+
29− VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
33+ VAL cl = allocate(sizeof(Closure) + sizeof(mpz_t), 0);
30− idris_doneAlloc();
34+ idris_doneAlloc();
31− bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
35+ bigint = (mpz_t*)(((char*)cl) + sizeof(Closure));
32−
36+
33− mpz_init(*bigint);
37+ mpz_init(*bigint);
34− mpz_set_str(*bigint, val, 10);
38+ mpz_set_str(*bigint, val, 10);
35
39
36− SETTY(cl, CT_BIGINT);
40+ SETTY(cl, CT_BIGINT);
37− cl -> info.ptr = (void*)bigint;
41+ cl -> info.ptr = (void*)bigint;
38
42
39− return cl;
43+ return cl;
44+ }
40}
45}
41
46
42VAL MKBIGM(VM* vm, void* big) {
47VAL MKBIGM(VM* vm, void* big) {