aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShenghou Ma <minux.ma@gmail.com>2012-03-21 00:51:48 +0800
committerShenghou Ma <minux.ma@gmail.com>2012-03-21 00:51:48 +0800
commit1abd8d8fd04fd64f90d3c1cbce675ab2317ec449 (patch)
treee63fe8f5130a33379a4955d0239d47be974b6c4a
parent4b1933dfb2a332a6a9744c7d5b05ea08f9909658 (diff)
downloadgo-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.go24
-rw-r--r--misc/cgo/gmp/pi.go2
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())
}