@@ -19,10 +19,11 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
1919 return false
2020 }
2121
22- gname , _ , err := extractPythonName (fsym .GoName (), fsym .Doc ())
22+ gname , gdoc , err := extractPythonName (fsym .GoName (), fsym .Doc ())
2323 if err != nil {
2424 return false
2525 }
26+ ifchandle , gdoc := isIfaceHandle (gdoc )
2627
2728 sig := fsym .sig
2829 args := sig .Params ()
@@ -55,11 +56,16 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
5556 return false
5657 }
5758 anm := pySafeArg (arg .Name (), i )
58- goArgs = append ( goArgs , fmt . Sprintf ( "%s %s" , anm , sarg . cgoname ))
59- if sarg . cpyname == "PyObject*" {
60- pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s', transfer_ownership=False )" , sarg . cpyname , anm ))
59+ if ifchandle && arg . sym . goname == "interface{}" {
60+ goArgs = append ( goArgs , fmt . Sprintf ( "%s %s" , anm , CGoHandle ))
61+ pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , PyHandle , anm ))
6162 } else {
62- pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , sarg .cpyname , anm ))
63+ goArgs = append (goArgs , fmt .Sprintf ("%s %s" , anm , sarg .cgoname ))
64+ if sarg .cpyname == "PyObject*" {
65+ pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s', transfer_ownership=False)" , sarg .cpyname , anm ))
66+ } else {
67+ pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , sarg .cpyname , anm ))
68+ }
6369 }
6470 wpArgs = append (wpArgs , anm )
6571 }
@@ -138,6 +144,15 @@ func (g *pyGen) genMethod(s *symbol, o *Func) {
138144 }
139145}
140146
147+ func isIfaceHandle (gdoc string ) (bool , string ) {
148+ const PythonIface = "\n gopy:interface=handle"
149+ if idx := strings .Index (gdoc , PythonIface ); idx > 0 {
150+ gdoc = gdoc [:idx ] + gdoc [idx + len (PythonIface )+ 1 :]
151+ return true , gdoc
152+ }
153+ return false , gdoc
154+ }
155+
141156func (g * pyGen ) genFuncBody (sym * symbol , fsym * Func ) {
142157 isMethod := (sym != nil )
143158 isIface := false
@@ -153,6 +168,7 @@ func (g *pyGen) genFuncBody(sym *symbol, fsym *Func) {
153168 pkgname := g .outname
154169
155170 _ , gdoc , _ := extractPythonName (fsym .GoName (), fsym .Doc ())
171+ ifchandle , gdoc := isIfaceHandle (gdoc )
156172
157173 sig := fsym .Signature ()
158174 res := sig .Results ()
@@ -233,7 +249,9 @@ if err != nil {
233249 for i , arg := range args {
234250 na := ""
235251 anm := pySafeArg (arg .Name (), i )
236- if arg .sym .isSignature () {
252+ if ifchandle && arg .sym .goname == "interface{}" {
253+ na = fmt .Sprintf (`gopyh.VarFmHandle((gopyh.CGoHandle)(%s), "interface{}")` , anm )
254+ } else if arg .sym .isSignature () {
237255 na = fmt .Sprintf ("%s" , arg .sym .py2go )
238256 } else {
239257 if arg .sym .py2go != "" {
@@ -243,7 +261,13 @@ if err != nil {
243261 }
244262 }
245263 callArgs = append (callArgs , na )
246- if arg .sym .hasHandle () {
264+ if arg .sym .goname == "interface{}" {
265+ if ifchandle {
266+ wrapArgs = append (wrapArgs , fmt .Sprintf ("%s.handle" , anm ))
267+ } else {
268+ wrapArgs = append (wrapArgs , anm )
269+ }
270+ } else if arg .sym .hasHandle () {
247271 wrapArgs = append (wrapArgs , fmt .Sprintf ("%s.handle" , anm ))
248272 } else {
249273 wrapArgs = append (wrapArgs , anm )
0 commit comments