mirror of
https://github.com/golang/go
synced 2024-11-23 22:50:05 -07:00
cmd/cgo: updated exported function parameter names
Functions that are exported through cgo will now retain their
parameter names provided that their parameter names use only
ASCII characters.
Fixes #37746
Change-Id: Ia5f643e7d872312e81c224febd1f81ce14425c32
GitHub-Last-Rev: 220959beba
GitHub-Pull-Request: golang/go#37750
Reviewed-on: https://go-review.googlesource.com/c/go/+/222619
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
a79ac2b819
commit
92d1fb7cb4
@ -22,6 +22,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"unicode"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -802,6 +803,24 @@ func (p *Package) packedAttribute() string {
|
|||||||
return s + "))"
|
return s + "))"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// exportParamName returns the value of param as it should be
|
||||||
|
// displayed in a c header file. If param contains any non-ASCII
|
||||||
|
// characters, this function will return the character p followed by
|
||||||
|
// the value of position; otherwise, this function will return the
|
||||||
|
// value of param.
|
||||||
|
func exportParamName(param string, position int) string {
|
||||||
|
pname := param
|
||||||
|
|
||||||
|
for i := 0; i < len(param); i++ {
|
||||||
|
if param[i] > unicode.MaxASCII {
|
||||||
|
pname = fmt.Sprintf("p%d", position)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pname
|
||||||
|
}
|
||||||
|
|
||||||
// Write out the various stubs we need to support functions exported
|
// Write out the various stubs we need to support functions exported
|
||||||
// from Go so that they are callable from C.
|
// from Go so that they are callable from C.
|
||||||
func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
|
func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
|
||||||
@ -915,7 +934,7 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
|
|||||||
if i > 0 || fn.Recv != nil {
|
if i > 0 || fn.Recv != nil {
|
||||||
s += ", "
|
s += ", "
|
||||||
}
|
}
|
||||||
s += fmt.Sprintf("%s p%d", p.cgoType(atype).C, i)
|
s += fmt.Sprintf("%s %s", p.cgoType(atype).C, exportParamName(aname, i))
|
||||||
})
|
})
|
||||||
s += ")"
|
s += ")"
|
||||||
|
|
||||||
@ -932,28 +951,28 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
|
|||||||
fmt.Fprintf(fgcc, "\n%s\n", s)
|
fmt.Fprintf(fgcc, "\n%s\n", s)
|
||||||
fmt.Fprintf(fgcc, "{\n")
|
fmt.Fprintf(fgcc, "{\n")
|
||||||
fmt.Fprintf(fgcc, "\t__SIZE_TYPE__ _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
|
fmt.Fprintf(fgcc, "\t__SIZE_TYPE__ _cgo_ctxt = _cgo_wait_runtime_init_done();\n")
|
||||||
fmt.Fprintf(fgcc, "\t%s %v a;\n", ctype, p.packedAttribute())
|
fmt.Fprintf(fgcc, "\t%s %v _cgo_a;\n", ctype, p.packedAttribute())
|
||||||
if gccResult != "void" && (len(fntype.Results.List) > 1 || len(fntype.Results.List[0].Names) > 1) {
|
if gccResult != "void" && (len(fntype.Results.List) > 1 || len(fntype.Results.List[0].Names) > 1) {
|
||||||
fmt.Fprintf(fgcc, "\t%s r;\n", gccResult)
|
fmt.Fprintf(fgcc, "\t%s r;\n", gccResult)
|
||||||
}
|
}
|
||||||
if fn.Recv != nil {
|
if fn.Recv != nil {
|
||||||
fmt.Fprintf(fgcc, "\ta.recv = recv;\n")
|
fmt.Fprintf(fgcc, "\t_cgo_a.recv = recv;\n")
|
||||||
}
|
}
|
||||||
forFieldList(fntype.Params,
|
forFieldList(fntype.Params,
|
||||||
func(i int, aname string, atype ast.Expr) {
|
func(i int, aname string, atype ast.Expr) {
|
||||||
fmt.Fprintf(fgcc, "\ta.p%d = p%d;\n", i, i)
|
fmt.Fprintf(fgcc, "\t_cgo_a.p%d = %s;\n", i, exportParamName(aname, i))
|
||||||
})
|
})
|
||||||
fmt.Fprintf(fgcc, "\t_cgo_tsan_release();\n")
|
fmt.Fprintf(fgcc, "\t_cgo_tsan_release();\n")
|
||||||
fmt.Fprintf(fgcc, "\tcrosscall2(_cgoexp%s_%s, &a, %d, _cgo_ctxt);\n", cPrefix, exp.ExpName, off)
|
fmt.Fprintf(fgcc, "\tcrosscall2(_cgoexp%s_%s, &_cgo_a, %d, _cgo_ctxt);\n", cPrefix, exp.ExpName, off)
|
||||||
fmt.Fprintf(fgcc, "\t_cgo_tsan_acquire();\n")
|
fmt.Fprintf(fgcc, "\t_cgo_tsan_acquire();\n")
|
||||||
fmt.Fprintf(fgcc, "\t_cgo_release_context(_cgo_ctxt);\n")
|
fmt.Fprintf(fgcc, "\t_cgo_release_context(_cgo_ctxt);\n")
|
||||||
if gccResult != "void" {
|
if gccResult != "void" {
|
||||||
if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 {
|
if len(fntype.Results.List) == 1 && len(fntype.Results.List[0].Names) <= 1 {
|
||||||
fmt.Fprintf(fgcc, "\treturn a.r0;\n")
|
fmt.Fprintf(fgcc, "\treturn _cgo_a.r0;\n")
|
||||||
} else {
|
} else {
|
||||||
forFieldList(fntype.Results,
|
forFieldList(fntype.Results,
|
||||||
func(i int, aname string, atype ast.Expr) {
|
func(i int, aname string, atype ast.Expr) {
|
||||||
fmt.Fprintf(fgcc, "\tr.r%d = a.r%d;\n", i, i)
|
fmt.Fprintf(fgcc, "\tr.r%d = _cgo_a.r%d;\n", i, i)
|
||||||
})
|
})
|
||||||
fmt.Fprintf(fgcc, "\treturn r;\n")
|
fmt.Fprintf(fgcc, "\treturn r;\n")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user