bind: declare/implement converters for basic types

Change-Id: If570b3d119a1ee8e7288915a4db8e4b18b6285ea
This commit is contained in:
Sebastien Binet 2015-08-05 17:40:41 +02:00
parent 03c7549090
commit 9b92f7de5d
3 changed files with 72 additions and 2 deletions

View File

@ -60,6 +60,43 @@ cgopy_cnv_c2py_string(GoString *addr) {
free((void*)str);
return pystr;
}
static int
cgopy_cnv_py2c_f32(PyObject *o, GoFloat32 *addr) {
GoFloat32 v = PyFloat_AsDouble(o);
*addr = v;
return 1;
}
static PyObject*
cgopy_cnv_c2py_f32(GoFloat32 *addr) {
GoFloat64 v = *addr;
return PyFloat_FromDouble(v);
}
static int
cgopy_cnv_py2c_complex64(PyObject *o, GoComplex64 *addr) {
Py_complex v = PyComplex_AsCComplex(o);
*addr = v.real + v.imag * _Complex_I;
return 1;
}
static PyObject*
cgopy_cnv_c2py_complex64(GoComplex64 *addr) {
return PyComplex_FromDoubles(creal(*addr), cimag(*addr));
}
static int
cgopy_cnv_py2c_complex128(PyObject *o, GoComplex128 *addr) {
Py_complex v = PyComplex_AsCComplex(o);
*addr = v.real + v.imag * _Complex_I;
return 1;
}
static PyObject*
cgopy_cnv_c2py_complex128(GoComplex128 *addr) {
return PyComplex_FromDoubles(creal(*addr), cimag(*addr));
}
`
)

View File

@ -23,6 +23,7 @@ package main
//#cgo pkg-config: python2 --cflags --libs
//#include <stdlib.h>
//#include <string.h>
//#include <complex.h>
import "C"
import (

View File

@ -81,7 +81,7 @@ func (s symbol) isStruct() bool {
}
func (s symbol) hasConverter() bool {
return s.c2py != "" || s.py2c != ""
return s.pyfmt == "O&" && (s.c2py != "" || s.py2c != "")
}
func (s symbol) cgotypename() string {
@ -356,6 +356,8 @@ func init() {
cgoname: "GoInt",
pyfmt: "i",
pysig: "int",
c2py: "PyInt_FromLong",
py2c: "PyInt_AsLong",
},
"int8": {
@ -366,6 +368,8 @@ func init() {
cgoname: "GoInt8",
pyfmt: "c",
pysig: "int",
c2py: "PyInt_FromLong",
py2c: "PyInt_AsLong",
},
"int16": {
@ -376,6 +380,8 @@ func init() {
cgoname: "GoInt16",
pyfmt: "h",
pysig: "int",
c2py: "PyInt_FromLong",
py2c: "PyInt_AsLong",
},
"int32": {
@ -385,7 +391,9 @@ func init() {
cpyname: "int32_t",
cgoname: "GoInt32",
pyfmt: "i",
pysig: "long",
pysig: "int",
c2py: "PyInt_FromLong",
py2c: "PyInt_AsLong",
},
"int64": {
@ -396,6 +404,8 @@ func init() {
cgoname: "GoInt64",
pyfmt: "k",
pysig: "long",
c2py: "PyLong_FromLong",
py2c: "PyLong_AsLong",
},
"uint": {
@ -406,6 +416,8 @@ func init() {
cgoname: "GoUint",
pyfmt: "I",
pysig: "int",
c2py: "PyInt_FromUnsignedLong",
py2c: "PyInt_AsUnsignedLong",
},
"uint8": {
@ -416,6 +428,8 @@ func init() {
cgoname: "GoUint8",
pyfmt: "b",
pysig: "int",
c2py: "PyInt_FromUnsignedLong",
py2c: "PyInt_AsUnsignedLong",
},
"uint16": {
goobj: look("uint16"),
@ -425,6 +439,8 @@ func init() {
cgoname: "GoUint16",
pyfmt: "H",
pysig: "int",
c2py: "PyInt_FromUnsignedLong",
py2c: "PyInt_AsUnsignedLong",
},
"uint32": {
goobj: look("uint32"),
@ -434,6 +450,8 @@ func init() {
cgoname: "GoUint32",
pyfmt: "I",
pysig: "long",
c2py: "PyInt_FromUnsignedLong",
py2c: "PyInt_AsUnsignedLong",
},
"uint64": {
@ -444,6 +462,8 @@ func init() {
cgoname: "GoUint64",
pyfmt: "K",
pysig: "long",
c2py: "PyLong_FromUnsignedLong",
py2c: "PyLong_AsUnsignedLong",
},
"float32": {
@ -454,6 +474,8 @@ func init() {
cgoname: "GoFloat32",
pyfmt: "f",
pysig: "float",
c2py: "cgopy_cnv_c2py_f32",
py2c: "cgopy_cnv_py2c_f32",
},
"float64": {
goobj: look("float64"),
@ -463,6 +485,8 @@ func init() {
cgoname: "GoFloat64",
pyfmt: "d",
pysig: "float",
c2py: "PyFloat_FromDouble",
py2c: "PyFloat_AsDouble",
},
"complex64": {
goobj: look("complex64"),
@ -472,6 +496,8 @@ func init() {
cgoname: "GoComplex64",
pyfmt: "D",
pysig: "float",
c2py: "cgopy_cnv_c2py_complex64",
py2c: "cgopy_cnv_py2c_complex64",
},
"complex128": {
goobj: look("complex128"),
@ -481,6 +507,8 @@ func init() {
cgoname: "GoComplex128",
pyfmt: "D",
pysig: "float",
c2py: "cgopy_cnv_c2py_complex128",
py2c: "cgopy_cnv_py2c_complex128",
},
"string": {
@ -529,6 +557,8 @@ func init() {
cgoname: "GoInt",
pyfmt: "k",
pysig: "int",
c2py: "PyLong_FromLong",
py2c: "PyLong_AsLong",
}
syms["uint"] = &symbol{
goobj: look("uint"),
@ -538,6 +568,8 @@ func init() {
cgoname: "GoUint",
pyfmt: "K",
pysig: "int",
c2py: "PyLong_FromUnsignedLong",
py2c: "PyLong_AsUnsignedLong",
}
}