// encodeTuple translates a Go array to a Python object. func encodeTuple(array []interface{}) (pyTuple *C.PyObject, err error) { if len(array) == 0 { pyTuple = pyEmptyTuple C.INCREF(pyTuple) } else { pyTuple = C.PyTuple_New(C.Py_ssize_t(len(array))) var ok bool defer func() { if !ok { C.DECREF(pyTuple) pyTuple = nil } }() for i, item := range array { var pyItem *C.PyObject if pyItem, err = encode(item); err != nil { return } C.Tuple_SET_ITEM(pyTuple, C.Py_ssize_t(i), pyItem) } ok = true } return }
// newObject wraps a Python object. func newObject(pyObject *C.PyObject) (o Object) { t := C.getType(pyObject) o, _ = newObjectType(t, pyObject) if t > 3 { C.INCREF(pyObject) } return }
// encode translates a Go value (or a wrapped Python object) to a Python // object. func encode(x interface{}) (pyValue *C.PyObject, err error) { if x == nil { pyValue = C.None_INCREF() return } switch value := x.(type) { case bool: var i C.long if value { i = 1 } pyValue = C.PyBool_FromLong(i) case byte: // alias uint8 c := C.char(value) pyValue = C.PyString_FromStringAndSize(&c, 1) case complex64: pyValue = C.PyComplex_FromDoubles(C.double(real(value)), C.double(imag(value))) case complex128: pyValue = C.PyComplex_FromDoubles(C.double(real(value)), C.double(imag(value))) case float32: pyValue = C.PyFloat_FromDouble(C.double(value)) case float64: pyValue = C.PyFloat_FromDouble(C.double(value)) case int: // alias rune pyValue = C.PyInt_FromLong(C.long(value)) case int8: pyValue = C.PyInt_FromLong(C.long(value)) case int16: pyValue = C.PyInt_FromLong(C.long(value)) case int32: pyValue = C.PyInt_FromLong(C.long(value)) case int64: pyValue = C.Long_FromInt64(C.int64_t(value)) case string: pyValue = C.String_FromGoStringPtr(unsafe.Pointer(&value)) case uint: pyValue = C.Long_FromUint64(C.uint64_t(value)) case uint16: pyValue = C.PyInt_FromLong(C.long(value)) case uint32: pyValue = C.Long_FromUint64(C.uint64_t(value)) case uint64: pyValue = C.Long_FromUint64(C.uint64_t(value)) case uintptr: pyValue = C.Long_FromUint64(C.uint64_t(value)) case []interface{}: return encodeTuple(value) case map[interface{}]interface{}: return encodeDict(value) case *object: pyValue = value.pyObject C.INCREF(pyValue) default: err = fmt.Errorf("unable to translate %t to Python", x) return } if pyValue == nil { err = getError() } return }