]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: updated exported function parameter names
authorNathan Fiscaletti <nathan.fiscaletti@vrazo.com>
Tue, 10 Mar 2020 00:22:01 +0000 (00:22 +0000)
committerIan Lance Taylor <iant@golang.org>
Tue, 10 Mar 2020 00:47:23 +0000 (00:47 +0000)
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: 220959bebae7d654d96530498f40e3a2abe95080
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>
src/cmd/cgo/out.go

index 6c4c4ae9b3cd9e5d9ff2e757c51c249c6c49165f..1518e5fab8550c7319b22194cb7f6e299eefba0a 100644 (file)
@@ -22,6 +22,7 @@ import (
        "regexp"
        "sort"
        "strings"
+       "unicode"
 )
 
 var (
@@ -802,6 +803,24 @@ func (p *Package) packedAttribute() string {
        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
 // from Go so that they are callable from C.
 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 {
                                        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 += ")"
 
@@ -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")
                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) {
                        fmt.Fprintf(fgcc, "\t%s r;\n", gccResult)
                }
                if fn.Recv != nil {
-                       fmt.Fprintf(fgcc, "\ta.recv = recv;\n")
+                       fmt.Fprintf(fgcc, "\t_cgo_a.recv = recv;\n")
                }
                forFieldList(fntype.Params,
                        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, "\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_release_context(_cgo_ctxt);\n")
                if gccResult != "void" {
                        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 {
                                forFieldList(fntype.Results,
                                        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")
                        }