Stateify: register types with full package names

This is to avoid conflicts with types that share the same
[short] package and type names, e.g. proc.smapsData exist
in pkg/sentry/fs/proc and pkg/sentry/fsimpl/proc.

Updates #1663

PiperOrigin-RevId: 294485146
This commit is contained in:
gVisor bot 2020-02-11 11:40:51 -08:00
parent 115898e368
commit 9be46e55c2
3 changed files with 11 additions and 7 deletions

View File

@ -110,6 +110,8 @@ def go_library(name, srcs, deps = [], imports = [], stateify = True, marshal = F
"""
all_srcs = srcs
all_deps = deps
dirname, _, _ = native.package_name().rpartition("/")
full_pkg = dirname + "/" + name
if stateify:
# Only do stateification for non-state packages without manual autogen.
# First, we need to segregate the input files via the special suffixes,
@ -120,7 +122,7 @@ def go_library(name, srcs, deps = [], imports = [], stateify = True, marshal = F
name = name + suffix + "_state_autogen_with_imports",
srcs = srcs,
imports = imports,
package = name,
package = full_pkg,
out = name + suffix + "_state_autogen_with_imports.go",
)
go_imports(

View File

@ -6,7 +6,7 @@ def _go_stateify_impl(ctx):
# Run the stateify command.
args = ["-output=%s" % output.path]
args.append("-pkg=%s" % ctx.attr.package)
args.append("-fullpkg=%s" % ctx.attr.package)
if ctx.attr._statepkg:
args.append("-statepkg=%s" % ctx.attr._statepkg)
if ctx.attr.imports:
@ -43,7 +43,7 @@ for statified types.
mandatory = False,
),
"package": attr.string(
doc = "The package name for the input sources.",
doc = "The fully qualified package name for the input sources.",
mandatory = True,
),
"out": attr.output(

View File

@ -23,6 +23,7 @@ import (
"go/parser"
"go/token"
"os"
"path/filepath"
"reflect"
"strings"
"sync"
@ -31,7 +32,7 @@ import (
)
var (
pkg = flag.String("pkg", "", "output package")
fullPkg = flag.String("fullpkg", "", "fully qualified output package")
imports = flag.String("imports", "", "extra imports for the output file")
output = flag.String("output", "", "output file")
statePkg = flag.String("statepkg", "", "state import package; defaults to empty")
@ -170,7 +171,7 @@ func main() {
flag.Usage()
os.Exit(1)
}
if *pkg == "" {
if *fullPkg == "" {
fmt.Fprintf(os.Stderr, "Error: package required.")
os.Exit(1)
}
@ -202,7 +203,7 @@ func main() {
// Declare our emission closures.
emitRegister := func(name string) {
initCalls = append(initCalls, fmt.Sprintf("%sRegister(\"%s.%s\", (*%s)(nil), state.Fns{Save: (*%s).save, Load: (*%s).load})", statePrefix, *pkg, name, name, name, name))
initCalls = append(initCalls, fmt.Sprintf("%sRegister(\"%s.%s\", (*%s)(nil), state.Fns{Save: (*%s).save, Load: (*%s).load})", statePrefix, *fullPkg, name, name, name, name))
}
emitZeroCheck := func(name string) {
fmt.Fprintf(outputFile, " if !%sIsZeroValue(x.%s) { m.Failf(\"%s is %%v, expected zero\", x.%s) }\n", statePrefix, name, name, name)
@ -233,7 +234,8 @@ func main() {
}
// Emit the package name.
fmt.Fprintf(outputFile, "package %s\n\n", *pkg)
_, pkg := filepath.Split(*fullPkg)
fmt.Fprintf(outputFile, "package %s\n\n", pkg)
// Emit the imports lazily.
var once sync.Once