bind: refactor gen{Method,Func}Body

This commit is contained in:
Sebastien Binet 2015-07-28 10:04:36 +02:00
parent 63da525aa1
commit 43f0028eb5
2 changed files with 25 additions and 8 deletions

View File

@ -112,18 +112,23 @@ gopy_%[3]s(PyObject *self, PyObject *args) {
)
g.impl.Indent()
g.genFuncBody(o)
g.genFuncBody(o.id, o.typ.Type().(*types.Signature))
g.impl.Outdent()
g.impl.Printf("}\n\n")
}
func (g *cpyGen) genFuncBody(fct Func) {
o := fct.typ
func (g *cpyGen) genFuncBody(id string, sig *types.Signature) {
funcArgs := []string{}
sig := o.Type().(*types.Signature)
res := newVars(sig.Results())
args := newVars(sig.Params())
var recv *Var
if sig.Recv() != nil {
recv = newVar(sig.Recv())
recv.genRecvDecl(g.impl)
funcArgs = append(funcArgs, recv.getFuncArg())
}
for _, arg := range args {
arg.genDecl(g.impl)
funcArgs = append(funcArgs, arg.getFuncArg())
@ -136,7 +141,7 @@ func (g *cpyGen) genFuncBody(fct Func) {
ret := res[0]
ret.genRetDecl(g.impl)
default:
g.impl.Printf("struct %[1]s_return c_gopy_ret;\n", fct.id)
g.impl.Printf("struct %[1]s_return c_gopy_ret;\n", id)
/*
for i := 0; i < res.Len(); i++ {
ret := res.At(i)
@ -152,6 +157,10 @@ func (g *cpyGen) genFuncBody(fct Func) {
g.impl.Printf("\n")
if recv != nil {
recv.genRecvImpl(g.impl)
}
if len(args) > 0 {
g.impl.Printf("if (!PyArg_ParseTuple(args, ")
format := []string{}
@ -179,7 +188,7 @@ func (g *cpyGen) genFuncBody(fct Func) {
g.impl.Printf("c_gopy_ret = ")
}
g.impl.Printf("GoPy_%[1]s(%[2]s);\n", fct.id, strings.Join(funcArgs, ", "))
g.impl.Printf("GoPy_%[1]s(%[2]s);\n", id, strings.Join(funcArgs, ", "))
g.impl.Printf("\n")
@ -526,8 +535,7 @@ func (g *cpyGen) genMethod(cpy Struct, m Method) {
}
func (g *cpyGen) genMethodBody(cpy Struct, m Method) {
//FIXME(sbinet)
g.impl.Printf("Py_INCREF(Py_None);\nreturn Py_None;\n")
g.genFuncBody(m.id, m.sel.Type().(*types.Signature))
}
func (g *cpyGen) genPreamble() {

View File

@ -86,6 +86,15 @@ func (v *Var) genDecl(g *printer) {
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Var.Name())
}
func (v *Var) genRecvDecl(g *printer) {
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Var.Name())
}
func (v *Var) genRecvImpl(g *printer) {
n := string(v.CGoType()[len("GoPy_"):])
g.Printf("c_%[1]s = ((_gopy_%[2]s*)self)->cgopy;\n", v.Var.Name(), n)
}
func (v *Var) genRetDecl(g *printer) {
if v.isGoString() {
g.Printf("const char* cgopy_gopy_ret;\n")