From dd16f69806ec00a95a555b128d90465c0e4023f9 Mon Sep 17 00:00:00 2001 From: Ben Carver Date: Sat, 20 Jul 2024 14:20:30 +0000 Subject: [PATCH 1/2] Resolved issue; need to acquire GIL before calling C.PyCallable_Check --- bind/symbols.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/bind/symbols.go b/bind/symbols.go index 0ddc8c7..28349f0 100644 --- a/bind/symbols.go +++ b/bind/symbols.go @@ -1083,24 +1083,32 @@ func (sym *symtab) addSignatureType(pkg *types.Package, obj types.Object, t type py2g := fmt.Sprintf("%s { ", nsig) + py2g += "_gstate := C.PyGILState_Ensure()\n" + // TODO: use strings.Builder if rets.Len() == 0 { - py2g += "if C.PyCallable_Check(_fun_arg) == 0 { return }\n" + py2g += "if C.PyCallable_Check(_fun_arg) == 0 {\n" + py2g += "C.PyGILState_Release(_gstate)\n" + py2g += "return\n" + py2g += "}" } else { zstr, err := sym.ZeroToGo(ret.Type(), rsym) if err != nil { return err } - py2g += fmt.Sprintf("if C.PyCallable_Check(_fun_arg) == 0 { return %s }\n", zstr) + py2g += "if C.PyCallable_Check(_fun_arg) == 0 {\n" + py2g += "C.PyGILState_Release(_gstate)\n" + py2g += fmt.Sprintf("return %s\n", zstr) + py2g += "}" } - py2g += "_gstate := C.PyGILState_Ensure()\n" + if nargs > 0 { bstr, err := sym.buildTuple(args, "_fcargs", "_fun_arg") if err != nil { return err } py2g += bstr + retstr - py2g += fmt.Sprintf("C.PyObject_CallObject(_fun_arg, _fcargs)\n") + py2g += "C.PyObject_CallObject(_fun_arg, _fcargs)\n" py2g += "C.gopy_decref(_fcargs)\n" } else { // TODO: methods not supported for no-args case -- requires self arg.. From c86786fc5e2a122ae9ed562e9af63154f5573943 Mon Sep 17 00:00:00 2001 From: Ben Carver Date: Sat, 20 Jul 2024 14:54:56 +0000 Subject: [PATCH 2/2] Added newline character to closing bracket --- bind/symbols.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bind/symbols.go b/bind/symbols.go index 28349f0..67bb6a5 100644 --- a/bind/symbols.go +++ b/bind/symbols.go @@ -1088,18 +1088,18 @@ func (sym *symtab) addSignatureType(pkg *types.Package, obj types.Object, t type // TODO: use strings.Builder if rets.Len() == 0 { py2g += "if C.PyCallable_Check(_fun_arg) == 0 {\n" - py2g += "C.PyGILState_Release(_gstate)\n" + py2g += "C.PyGILState_Release(_gstate)\n" // Release GIL py2g += "return\n" - py2g += "}" + py2g += "}\n" } else { zstr, err := sym.ZeroToGo(ret.Type(), rsym) if err != nil { return err } py2g += "if C.PyCallable_Check(_fun_arg) == 0 {\n" - py2g += "C.PyGILState_Release(_gstate)\n" + py2g += "C.PyGILState_Release(_gstate)\n" // Release GIL py2g += fmt.Sprintf("return %s\n", zstr) - py2g += "}" + py2g += "}\n" } if nargs > 0 {