@@ -154,7 +154,7 @@ func wrapperInit(self, args *C.PyObject) C.int {
154154}
155155
156156//export getterMethod
157- func getterMethod (self * C.PyObject , closure unsafe.Pointer , methodId C.int ) * C.PyObject {
157+ func getterMethod (self * C.PyObject , _closure unsafe.Pointer , methodId C.int ) * C.PyObject {
158158 typeMeta := typeMetaMap [(* C .PyObject )(unsafe .Pointer (self .ob_type ))]
159159 if typeMeta == nil {
160160 SetError (fmt .Errorf ("type %v not registered" , FromPy (self )))
@@ -177,7 +177,7 @@ func getterMethod(self *C.PyObject, closure unsafe.Pointer, methodId C.int) *C.P
177177}
178178
179179//export setterMethod
180- func setterMethod (self , value * C.PyObject , closure unsafe.Pointer , methodId C.int ) C.int {
180+ func setterMethod (self , value * C.PyObject , _closure unsafe.Pointer , methodId C.int ) C.int {
181181 typeMeta := typeMetaMap [(* C .PyObject )(unsafe .Pointer (self .ob_type ))]
182182 if typeMeta == nil {
183183 SetError (fmt .Errorf ("type %v not registered" , FromPy (self )))
@@ -260,6 +260,7 @@ func wrapperMethod_(typeMeta *typeMeta, methodMeta *slotMeta, self, args *C.PyOb
260260
261261 for i := 0 ; i < int (argc ); i ++ {
262262 arg := C .PyTuple_GetItem (args , C .Py_ssize_t (i ))
263+ C .Py_IncRef (arg )
263264 argType := methodType .In (i + argIndex )
264265 argPy := FromPy (arg )
265266 goValue := reflect .New (argType ).Elem ()
@@ -316,7 +317,7 @@ func getMethods_(t reflect.Type, methods map[uint]*slotMeta) (ret []C.PyMethodDe
316317 methodPtr := C .wrapperMethods [methodId ]
317318
318319 ret = append (ret , C.PyMethodDef {
319- ml_name : C . CString (pythonName ),
320+ ml_name : AllocCStrDontFree (pythonName ),
320321 ml_meth : (C .PyCFunction )(unsafe .Pointer (methodPtr )),
321322 ml_flags : C .METH_VARARGS ,
322323 ml_doc : nil ,
@@ -402,7 +403,7 @@ func getMembers(t reflect.Type, methods map[uint]*slotMeta) (members *C.PyMember
402403 if memberType != - 1 {
403404 // create as member variable for C-compatible types
404405 membersList = append (membersList , C.PyMemberDef {
405- name : C . CString (pythonName ),
406+ name : AllocCStrDontFree (pythonName ),
406407 _type : memberType ,
407408 offset : C .Py_ssize_t (baseOffset + field .Offset ),
408409 })
@@ -429,7 +430,7 @@ func getMembers(t reflect.Type, methods map[uint]*slotMeta) (members *C.PyMember
429430 index : i ,
430431 }
431432 getsetsList = append (getsetsList , C.PyGetSetDef {
432- name : C . CString (pythonName ),
433+ name : AllocCStrDontFree (pythonName ),
433434 get : C .getterMethods [getId ],
434435 set : C .setterMethods [setId ],
435436 doc : nil ,
@@ -480,9 +481,6 @@ func AddType[T any](m Module, init any, name string, doc string) Object {
480481 methods : make (map [uint ]* slotMeta ),
481482 }
482483
483- cname := C .CString (name )
484- defer C .free (unsafe .Pointer (cname ))
485-
486484 slots := make ([]C.PyType_Slot , 0 )
487485 if init != nil {
488486 slots = append (slots , C.PyType_Slot {slot : C .Py_tp_init , pfunc : unsafe .Pointer (C .wrapperInit )})
@@ -512,7 +510,7 @@ func AddType[T any](m Module, init any, name string, doc string) Object {
512510 }
513511
514512 spec := & C.PyType_Spec {
515- name : cname ,
513+ name : C . CString ( name ) ,
516514 basicsize : C .int (unsafe .Sizeof (wrapper )),
517515 flags : C .Py_TPFLAGS_DEFAULT ,
518516 slots : slotsPtr ,
@@ -526,7 +524,7 @@ func AddType[T any](m Module, init any, name string, doc string) Object {
526524 typeMetaMap [typeObj ] = meta
527525 pyTypeMap [ty ] = typeObj
528526
529- if C .PyModule_AddObject (m .obj , cname , typeObj ) < 0 {
527+ if C .PyModule_AddObject (m .obj , C . CString ( name ) , typeObj ) < 0 {
530528 C .Py_DecRef (typeObj )
531529 panic (fmt .Sprintf ("Failed to add type %s to module" , name ))
532530 }
@@ -599,14 +597,14 @@ func (m Module) AddMethod(name string, fn any, doc string) Func {
599597
600598func SetError (err error ) {
601599 errStr := C .CString (err .Error ())
602- defer C .free (unsafe .Pointer (errStr ))
603600 C .PyErr_SetString (C .PyExc_RuntimeError , errStr )
601+ C .free (unsafe .Pointer (errStr ))
604602}
605603
606604func SetTypeError (err error ) {
607605 errStr := C .CString (err .Error ())
608- defer C .free (unsafe .Pointer (errStr ))
609606 C .PyErr_SetString (C .PyExc_TypeError , errStr )
607+ C .free (unsafe .Pointer (errStr ))
610608}
611609
612610// FetchError returns the current Python error as a Go error
0 commit comments