diff --git a/gmp_big.go b/gmp_big.go index 555fc5d7bed1ebfcbd83f7fe73931f8cc9d3954e..8640831d2cdf3c1c55d29443df16ba361d37e09e 100644 --- a/gmp_big.go +++ b/gmp_big.go @@ -23,6 +23,17 @@ package pbc /* #include <gmp.h> +#include <stdlib.h> + +mpz_t* newMpzT() { + mpz_t* x = malloc(sizeof(mpz_t)); + mpz_init(*x); + return x; +} +void freeMpzT(mpz_t* x) { + mpz_clear(*x); + free(x); +} */ import "C" @@ -33,19 +44,19 @@ import ( ) type mpz struct { - i C.mpz_t + i *C.mpz_t } var wordSize C.size_t var bitsPerWord C.size_t func clearMpz(x *mpz) { - C.mpz_clear(&x.i[0]) + C.freeMpzT(x.i) } func newMpz() *mpz { out := &mpz{} - C.mpz_init(&out.i[0]) + out.i = C.newMpzT() runtime.SetFinalizer(out, clearMpz) return out } diff --git a/rand_hook.c b/rand_hook.c index f0d3a42dff112637275a61388073ac369070cc48..228d8c005f421fc28a384beed9b1d79baa827ca7 100644 --- a/rand_hook.c +++ b/rand_hook.c @@ -26,7 +26,7 @@ void pbc_init_random(); void goRandomHook(mpz_t out, mpz_t limit, void* data) { UNUSED_VAR(data); - goGenerateRandom(out, limit); + goGenerateRandom(&out, &limit); } void installRandomHook() { diff --git a/utils.go b/utils.go index 1af0252d79d073e85a79b18ed49b342091a785e8..2f36c1da4daabcef30547adc333bd1a98df800b1 100644 --- a/utils.go +++ b/utils.go @@ -81,8 +81,8 @@ func SetRandomProvider(provider RandomSource) { //export goGenerateRandom func goGenerateRandom(out, limit unsafe.Pointer) { - outMpz := &mpz{i: *(*C.mpz_t)(out)} - limitMpz := &mpz{i: *(*C.mpz_t)(limit)} + outMpz := &mpz{i: *(**C.mpz_t)(out)} + limitMpz := &mpz{i: *(**C.mpz_t)(limit)} r := randomProvider.Rand(mpz2big(limitMpz)) big2thisMpz(r, outMpz) }