diff options
author | Shenghou Ma <minux.ma@gmail.com> | 2012-03-21 00:51:48 +0800 |
---|---|---|
committer | Shenghou Ma <minux.ma@gmail.com> | 2012-03-21 00:51:48 +0800 |
commit | 1abd8d8fd04fd64f90d3c1cbce675ab2317ec449 (patch) | |
tree | e63fe8f5130a33379a4955d0239d47be974b6c4a | |
parent | 4b1933dfb2a332a6a9744c7d5b05ea08f9909658 (diff) | |
download | go-1abd8d8fd04fd64f90d3c1cbce675ab2317ec449.tar.gz go-1abd8d8fd04fd64f90d3c1cbce675ab2317ec449.zip |
misc/cgo/gmp: update for Go 1
1. make the program go buildable
2. update os.EINVAL and runtime.Cgocalls()
3. wrap mpz_div_2exp() and mpz_mul_2exp to support both
pre-5.0 and post-5.0 gmp (we really have no reason to
restrict ourselves to gmp 5.0+)
R=golang-dev, remyoudompheng, iant
CC=golang-dev
https://golang.org/cl/5847061
-rw-r--r-- | misc/cgo/gmp/gmp.go | 24 | ||||
-rw-r--r-- | misc/cgo/gmp/pi.go | 2 |
2 files changed, 19 insertions, 7 deletions
diff --git a/misc/cgo/gmp/gmp.go b/misc/cgo/gmp/gmp.go index 9325d8bfde..3bcf99151d 100644 --- a/misc/cgo/gmp/gmp.go +++ b/misc/cgo/gmp/gmp.go @@ -98,8 +98,20 @@ Go to hang on to a reference to the pointer until C is done with it. */ package gmp -// #include <gmp.h> -// #include <stdlib.h> +/* +#cgo LDFLAGS: -lgmp +#include <gmp.h> +#include <stdlib.h> + +// gmp 5.0.0+ changed the type of the 3rd argument to mp_bitcnt_t, +// so, to support older versions, we wrap these two functions. +void _mpz_mul_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) { + mpz_mul_2exp(a, b, n); +} +void _mpz_div_2exp(mpz_ptr a, mpz_ptr b, unsigned long n) { + mpz_div_2exp(a, b, n); +} +*/ import "C" import ( @@ -182,12 +194,12 @@ func (z *Int) SetInt64(x int64) *Int { func (z *Int) SetString(s string, base int) error { z.doinit() if base < 2 || base > 36 { - return os.EINVAL + return os.ErrInvalid } p := C.CString(s) defer C.free(unsafe.Pointer(p)) if C.mpz_set_str(&z.i[0], p, C.int(base)) < 0 { - return os.EINVAL + return os.ErrInvalid } return nil } @@ -265,7 +277,7 @@ func (z *Int) Mod(x, y *Int) *Int { func (z *Int) Lsh(x *Int, s uint) *Int { x.doinit() z.doinit() - C.mpz_mul_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s)) + C._mpz_mul_2exp(&z.i[0], &x.i[0], C.ulong(s)) return z } @@ -273,7 +285,7 @@ func (z *Int) Lsh(x *Int, s uint) *Int { func (z *Int) Rsh(x *Int, s uint) *Int { x.doinit() z.doinit() - C.mpz_div_2exp(&z.i[0], &x.i[0], C.mp_bitcnt_t(s)) + C._mpz_div_2exp(&z.i[0], &x.i[0], C.ulong(s)) return z } diff --git a/misc/cgo/gmp/pi.go b/misc/cgo/gmp/pi.go index 019861e592..1914cf214f 100644 --- a/misc/cgo/gmp/pi.go +++ b/misc/cgo/gmp/pi.go @@ -102,5 +102,5 @@ func main() { } } - fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.Cgocalls(), numer.Len(), accum.Len(), denom.Len()) + fmt.Printf("\n%d calls; bit sizes: %d %d %d\n", runtime.NumCgoCall(), numer.Len(), accum.Len(), denom.Len()) } |