llpyg: pkg.NewFuncDecl

This commit is contained in:
xushiwei
2024-05-14 18:16:32 +08:00
parent 172a268e77
commit 091fee61e0
3 changed files with 24 additions and 10 deletions

View File

@@ -21,6 +21,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"go/ast" "go/ast"
"go/token"
"go/types" "go/types"
"log" "log"
"os" "os"
@@ -103,9 +104,13 @@ func (ctx *context) genFunc(pkg *gogen.Package, sym *symbol) {
if c := name[0]; c >= 'a' && c <= 'z' { if c := name[0]; c >= 'a' && c <= 'z' {
name = string(c+'A'-'a') + name[1:] name = string(c+'A'-'a') + name[1:]
} }
fn := pkg.NewFunc(nil, name, params, ctx.ret, variadic) sig := types.NewSignatureType(nil, nil, nil, params, ctx.ret, variadic)
fn.SetComments(pkg, ctx.genComment(sym.Doc)) fn := pkg.NewFuncDecl(token.NoPos, name, sig)
fn.BodyStart(pkg).End() list := ctx.genDoc(sym.Doc)
list = append(list, emptyCommentLine)
list = append(list, ctx.genLinkname(name, sym))
fn.SetComments(pkg, &ast.CommentGroup{List: list})
// fn.BodyStart(pkg).End()
} }
func (ctx *context) genParams(pkg *gogen.Package, sig string) (*types.Tuple, bool, bool) { func (ctx *context) genParams(pkg *gogen.Package, sig string) (*types.Tuple, bool, bool) {
@@ -134,11 +139,19 @@ func (ctx *context) genParams(pkg *gogen.Package, sig string) (*types.Tuple, boo
return types.NewTuple(list...), false, false return types.NewTuple(list...), false, false
} }
func (ctx *context) genComment(doc string) *ast.CommentGroup { func (ctx *context) genLinkname(name string, sym *symbol) *ast.Comment {
return &ast.Comment{Text: "//go:linkname " + name + " py." + sym.Name}
}
func (ctx *context) genDoc(doc string) []*ast.Comment {
lines := strings.Split(doc, "\n") lines := strings.Split(doc, "\n")
list := make([]*ast.Comment, len(lines)) list := make([]*ast.Comment, len(lines), len(lines)+2)
for i, line := range lines { for i, line := range lines {
list[i] = &ast.Comment{Text: "// " + line} list[i] = &ast.Comment{Text: "// " + line}
} }
return &ast.CommentGroup{List: list} return list
} }
var (
emptyCommentLine = &ast.Comment{Text: "//"}
)

View File

@@ -25,6 +25,7 @@ import (
// https://docs.python.org/3/c-api/import.html // https://docs.python.org/3/c-api/import.html
// https://docs.python.org/3/c-api/module.html // https://docs.python.org/3/c-api/module.html
/*
// llgo:type C // llgo:type C
type ModuleDefBase struct { type ModuleDefBase struct {
Unused [8]byte // TODO(xsw) Unused [8]byte // TODO(xsw)
@@ -35,6 +36,7 @@ type ModuleDef struct {
Base ModuleDefBase Base ModuleDefBase
// TODO(xsw) // TODO(xsw)
} }
*/
// Return the module object corresponding to a module name. The name argument // Return the module object corresponding to a module name. The name argument
// may be of the form package.module. First check the modules dictionary if // may be of the form package.module. First check the modules dictionary if

View File

@@ -22,9 +22,8 @@ import (
// https://docs.python.org/3/c-api/type.html // https://docs.python.org/3/c-api/type.html
type TypeObject struct { // TypeObject represents the Python type object.
Object type TypeObject = Object
}
// Return the types name. Equivalent to getting the types __name__ attribute. // Return the types name. Equivalent to getting the types __name__ attribute.
// //
@@ -54,4 +53,4 @@ func (t *TypeObject) Flags() uint32 { return 0 }
func (t *TypeObject) Module() *Object { return nil } func (t *TypeObject) Module() *Object { return nil }
// llgo:link (*TypeObject).ModuleByDef C.PyType_GetModuleByDef // llgo:link (*TypeObject).ModuleByDef C.PyType_GetModuleByDef
func (t *TypeObject) ModuleByDef(def *ModuleDef) *Object { return nil } // func (t *TypeObject) ModuleByDef(def *ModuleDef) *Object { return nil }