bind: fwk for protocols. impl __str__

This commit is contained in:
Sebastien Binet 2015-07-29 12:36:45 +02:00
parent 36d61b0c8e
commit 6930d747dd
2 changed files with 48 additions and 1 deletions

View File

@ -248,6 +248,8 @@ func (g *cpyGen) genStruct(cpy Struct) {
g.genStructMembers(cpy)
g.genStructMethods(cpy)
g.genStructProtocols(cpy)
g.impl.Printf("static PyTypeObject _gopy_%sType = {\n", cpy.ID())
g.impl.Indent()
g.impl.Printf("PyObject_HEAD_INIT(NULL)\n")
@ -266,7 +268,7 @@ func (g *cpyGen) genStruct(cpy Struct) {
g.impl.Printf("0,\t/*tp_as_mapping*/\n")
g.impl.Printf("0,\t/*tp_hash */\n")
g.impl.Printf("0,\t/*tp_call*/\n")
g.impl.Printf("0,\t/*tp_str*/\n")
g.impl.Printf("_gopy_%s_tp_str,\t/*tp_str*/\n", cpy.ID())
g.impl.Printf("0,\t/*tp_getattro*/\n")
g.impl.Printf("0,\t/*tp_setattro*/\n")
g.impl.Printf("0,\t/*tp_as_buffer*/\n")
@ -651,6 +653,39 @@ func (g *cpyGen) genMethodBody(fct Func) {
g.genFuncBody(fct)
}
func (g *cpyGen) genStructProtocols(cpy Struct) {
g.genStructTPStr(cpy)
}
func (g *cpyGen) genStructTPStr(cpy Struct) {
g.decl.Printf("static PyObject*\n_gopy_%s_tp_str(PyObject *self);\n", cpy.ID())
g.impl.Printf("static PyObject*\n_gopy_%s_tp_str(PyObject *self) {\n",
cpy.ID(),
)
if (cpy.prots & ProtoStringer) == 0 {
g.impl.Indent()
g.impl.Printf("return PyObject_Repr(self);\n")
g.impl.Outdent()
g.impl.Printf("}\n\n")
return
}
var m Func
for _, f := range cpy.meths {
if f.GoName() == "String" {
m = f
break
}
}
g.impl.Indent()
g.impl.Printf("return gopy_%[1]s(self, 0);\n", m.ID())
g.impl.Outdent()
g.impl.Printf("}\n\n")
}
func (g *cpyGen) genPreamble() {
n := g.pkg.pkg.Name()
g.decl.Printf(cPreamble, n, g.pkg.pkg.Path(), filepath.Base(n))

View File

@ -211,6 +211,9 @@ func (p *Package) process() error {
return err
}
s.meths = append(s.meths, m)
if isStringer(meth.Obj()) {
s.prots |= ProtoStringer
}
}
p.addStruct(s)
}
@ -248,6 +251,13 @@ func (p *Package) Lookup(o types.Object) (Object, bool) {
return obj, ok
}
// Protocol encodes the various protocols a python type may implement
type Protocol int
const (
ProtoStringer Protocol = 1 << iota
)
// Struct collects informations about a go struct.
type Struct struct {
pkg *Package
@ -257,6 +267,8 @@ type Struct struct {
doc string
ctors []Func
meths []Func
prots Protocol
}
func newStruct(p *Package, obj *types.TypeName) (Struct, error) {