@@ -87,18 +87,22 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
8787 return false
8888 }
8989 anm := pySafeArg (arg .Name (), i )
90+
9091 if ifchandle && arg .sym .goname == "interface{}" {
9192 goArgs = append (goArgs , fmt .Sprintf ("%s %s" , anm , CGoHandle ))
9293 pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , PyHandle , anm ))
9394 } else {
9495 goArgs = append (goArgs , fmt .Sprintf ("%s %s" , anm , sarg .cgoname ))
9596 if sarg .cpyname == "PyObject*" {
96- pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s', transfer_ownership=False)" , sarg .cpyname , anm ))
97+ pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s%s ', transfer_ownership=False)" , sarg .cpyname , anm ))
9798 } else {
9899 pyArgs = append (pyArgs , fmt .Sprintf ("param('%s', '%s')" , sarg .cpyname , anm ))
99100 }
100101 }
101- wpArgs = append (wpArgs , anm )
102+
103+ if i != nargs - 1 || ! fsym .isVariadic {
104+ wpArgs = append (wpArgs , anm )
105+ }
102106 }
103107
104108 // support for optional arg to run in a separate go routine -- only if no return val
@@ -108,6 +112,11 @@ func (g *pyGen) genFuncSig(sym *symbol, fsym *Func) bool {
108112 wpArgs = append (wpArgs , "goRun=False" )
109113 }
110114
115+ // To support variadic args, we add *args at the end.
116+ if fsym .isVariadic {
117+ wpArgs = append (wpArgs , "*args" )
118+ }
119+
111120 // When building the pybindgen builder code, we start with
112121 // a function that adds function calls with exception checking.
113122 // But given specific return types, we may want to add more
@@ -276,25 +285,6 @@ if __err != nil {
276285 g .gofile .Printf ("var __err error\n " )
277286 }
278287
279- // pywrap output
280- mnm := fsym .ID ()
281- if isMethod {
282- mnm = sym .id + "_" + fsym .GoName ()
283- }
284- rvHasHandle := false
285- if nres > 0 {
286- ret := res [0 ]
287- if ! rvIsErr && ret .sym .hasHandle () {
288- rvHasHandle = true
289- cvnm := ret .sym .pyPkgId (g .pkg .pkg )
290- g .pywrap .Printf ("return %s(handle=_%s.%s(" , cvnm , pkgname , mnm )
291- } else {
292- g .pywrap .Printf ("return _%s.%s(" , pkgname , mnm )
293- }
294- } else {
295- g .pywrap .Printf ("_%s.%s(" , pkgname , mnm )
296- }
297-
298288 callArgs := []string {}
299289 wrapArgs := []string {}
300290 if isMethod {
@@ -313,6 +303,9 @@ if __err != nil {
313303 default :
314304 na = anm
315305 }
306+ if i == len (args ) - 1 && fsym .isVariadic {
307+ na = na + "..."
308+ }
316309 callArgs = append (callArgs , na )
317310 switch {
318311 case arg .sym .goname == "interface{}" :
@@ -326,6 +319,30 @@ if __err != nil {
326319 default :
327320 wrapArgs = append (wrapArgs , anm )
328321 }
322+
323+ // To support variadic args, we add *args at the end.
324+ if fsym .isVariadic && i == len (args )- 1 {
325+ g .pywrap .Printf ("%s = go.Slice_int(args)\n " , anm )
326+ }
327+ }
328+
329+ // pywrap output
330+ mnm := fsym .ID ()
331+ if isMethod {
332+ mnm = sym .id + "_" + fsym .GoName ()
333+ }
334+ rvHasHandle := false
335+ if nres > 0 {
336+ ret := res [0 ]
337+ if ! rvIsErr && ret .sym .hasHandle () {
338+ rvHasHandle = true
339+ cvnm := ret .sym .pyPkgId (g .pkg .pkg )
340+ g .pywrap .Printf ("return %s(handle=_%s.%s(" , cvnm , pkgname , mnm )
341+ } else {
342+ g .pywrap .Printf ("return _%s.%s(" , pkgname , mnm )
343+ }
344+ } else {
345+ g .pywrap .Printf ("_%s.%s(" , pkgname , mnm )
329346 }
330347
331348 hasRetCvt := false
0 commit comments