mirror of https://github.com/go-python/gopy.git
bind/var: introduce new Var
This commit is contained in:
parent
a9624ab5da
commit
76f5f7d999
50
bind/vars.go
50
bind/vars.go
|
@ -11,23 +11,39 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Var struct {
|
type Var struct {
|
||||||
Var *types.Var
|
pkg *Package
|
||||||
|
id string
|
||||||
|
doc string
|
||||||
|
name string
|
||||||
|
obj types.Object
|
||||||
dtype typedesc
|
dtype typedesc
|
||||||
}
|
}
|
||||||
|
|
||||||
func newVars(tuple *types.Tuple) []*Var {
|
func (v *Var) Name() string {
|
||||||
|
return v.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func newVar(p *Package, obj types.Object, name, doc string) *Var {
|
||||||
|
return &Var{
|
||||||
|
pkg: p,
|
||||||
|
id: p.Name() + "_" + obj.Name(),
|
||||||
|
doc: doc,
|
||||||
|
name: name,
|
||||||
|
obj: obj,
|
||||||
|
dtype: getTypedesc(obj.Type()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func newVarsFrom(p *Package, tuple *types.Tuple) []*Var {
|
||||||
vars := make([]*Var, 0, tuple.Len())
|
vars := make([]*Var, 0, tuple.Len())
|
||||||
for i := 0; i < tuple.Len(); i++ {
|
for i := 0; i < tuple.Len(); i++ {
|
||||||
vars = append(vars, newVar(tuple.At(i)))
|
vars = append(vars, newVarFrom(p, tuple.At(i)))
|
||||||
}
|
}
|
||||||
return vars
|
return vars
|
||||||
}
|
}
|
||||||
|
|
||||||
func newVar(v *types.Var) *Var {
|
func newVarFrom(p *Package, v *types.Var) *Var {
|
||||||
return &Var{
|
return newVar(p, v, v.Name(), p.getDoc("", v))
|
||||||
Var: v,
|
|
||||||
dtype: getTypedesc(v.Type()),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTypedesc(t types.Type) typedesc {
|
func getTypedesc(t types.Type) typedesc {
|
||||||
|
@ -59,7 +75,7 @@ func getTypedesc(t types.Type) typedesc {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) GoType() types.Type {
|
func (v *Var) GoType() types.Type {
|
||||||
return v.Var.Type()
|
return v.obj.Type()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) CType() string {
|
func (v *Var) CType() string {
|
||||||
|
@ -84,18 +100,18 @@ func (v *Var) isGoString() bool {
|
||||||
|
|
||||||
func (v *Var) genDecl(g *printer) {
|
func (v *Var) genDecl(g *printer) {
|
||||||
if v.isGoString() {
|
if v.isGoString() {
|
||||||
g.Printf("const char* cgopy_%s;\n", v.Var.Name())
|
g.Printf("const char* cgopy_%s;\n", v.Name())
|
||||||
}
|
}
|
||||||
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Var.Name())
|
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) genRecvDecl(g *printer) {
|
func (v *Var) genRecvDecl(g *printer) {
|
||||||
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Var.Name())
|
g.Printf("%[1]s c_%[2]s;\n", v.CGoType(), v.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) genRecvImpl(g *printer) {
|
func (v *Var) genRecvImpl(g *printer) {
|
||||||
n := string(v.CGoType()[len("GoPy_"):])
|
n := string(v.CGoType()[len("GoPy_"):])
|
||||||
g.Printf("c_%[1]s = ((_gopy_%[2]s*)self)->cgopy;\n", v.Var.Name(), n)
|
g.Printf("c_%[1]s = ((_gopy_%[2]s*)self)->cgopy;\n", v.Name(), n)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) genRetDecl(g *printer) {
|
func (v *Var) genRetDecl(g *printer) {
|
||||||
|
@ -106,21 +122,21 @@ func (v *Var) genRetDecl(g *printer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) getArgParse() (string, string) {
|
func (v *Var) getArgParse() (string, string) {
|
||||||
addr := "&c_" + v.Var.Name()
|
addr := "&c_" + v.Name()
|
||||||
if v.isGoString() {
|
if v.isGoString() {
|
||||||
addr = "&cgopy_" + v.Var.Name()
|
addr = "&cgopy_" + v.Name()
|
||||||
}
|
}
|
||||||
return v.dtype.pyfmt, addr
|
return v.dtype.pyfmt, addr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) genFuncPreamble(g *printer) {
|
func (v *Var) genFuncPreamble(g *printer) {
|
||||||
if v.isGoString() {
|
if v.isGoString() {
|
||||||
g.Printf("c_%[1]s = CGoPy_GoString((char*)cgopy_%[1]s);\n", v.Var.Name())
|
g.Printf("c_%[1]s = CGoPy_GoString((char*)cgopy_%[1]s);\n", v.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) getFuncArg() string {
|
func (v *Var) getFuncArg() string {
|
||||||
return "c_" + v.Var.Name()
|
return "c_" + v.Name()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *Var) needWrap() bool {
|
func (v *Var) needWrap() bool {
|
||||||
|
|
Loading…
Reference in New Issue