mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: add //go:embed support
This commit contains the compiler support for //go:embed lines. The go command passes to the compiler an "embed config" that maps literal patterns like *.txt to the set of files to embed. The compiler then lays out the content of those files as static data in the form of an embed.Files or string or []byte in the final object file. The test for this code is the end-to-end test hooking up the embed, cmd/compile, and cmd/go changes, in the next CL. For #41191. Change-Id: I916e57f8cc65871dc0044c13d3f90c252a3fe1bf Reviewed-on: https://go-review.googlesource.com/c/go/+/243944 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
400581b8b0
commit
8bde9b320e
8 changed files with 682 additions and 48 deletions
|
|
@ -480,11 +480,87 @@ type Param struct {
|
|||
Innermost *Node
|
||||
Outer *Node
|
||||
|
||||
// OTYPE
|
||||
//
|
||||
// TODO: Should Func pragmas also be stored on the Name?
|
||||
Pragma PragmaFlag
|
||||
Alias bool // node is alias for Ntype (only used when type-checking ODCLTYPE)
|
||||
// OTYPE & ONAME //go:embed info,
|
||||
// sharing storage to reduce gc.Param size.
|
||||
// Extra is nil, or else *Extra is a *paramType or an *embedFileList.
|
||||
Extra *interface{}
|
||||
}
|
||||
|
||||
type paramType struct {
|
||||
flag PragmaFlag
|
||||
alias bool
|
||||
}
|
||||
|
||||
type embedFileList []string
|
||||
|
||||
// Pragma returns the PragmaFlag for p, which must be for an OTYPE.
|
||||
func (p *Param) Pragma() PragmaFlag {
|
||||
if p.Extra == nil {
|
||||
return 0
|
||||
}
|
||||
return (*p.Extra).(*paramType).flag
|
||||
}
|
||||
|
||||
// SetPragma sets the PragmaFlag for p, which must be for an OTYPE.
|
||||
func (p *Param) SetPragma(flag PragmaFlag) {
|
||||
if p.Extra == nil {
|
||||
if flag == 0 {
|
||||
return
|
||||
}
|
||||
p.Extra = new(interface{})
|
||||
*p.Extra = ¶mType{flag: flag}
|
||||
return
|
||||
}
|
||||
(*p.Extra).(*paramType).flag = flag
|
||||
}
|
||||
|
||||
// Alias reports whether p, which must be for an OTYPE, is a type alias.
|
||||
func (p *Param) Alias() bool {
|
||||
if p.Extra == nil {
|
||||
return false
|
||||
}
|
||||
t, ok := (*p.Extra).(*paramType)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return t.alias
|
||||
}
|
||||
|
||||
// SetAlias sets whether p, which must be for an OTYPE, is a type alias.
|
||||
func (p *Param) SetAlias(alias bool) {
|
||||
if p.Extra == nil {
|
||||
if !alias {
|
||||
return
|
||||
}
|
||||
p.Extra = new(interface{})
|
||||
*p.Extra = ¶mType{alias: alias}
|
||||
return
|
||||
}
|
||||
(*p.Extra).(*paramType).alias = alias
|
||||
}
|
||||
|
||||
// EmbedFiles returns the list of embedded files for p,
|
||||
// which must be for an ONAME var.
|
||||
func (p *Param) EmbedFiles() []string {
|
||||
if p.Extra == nil {
|
||||
return nil
|
||||
}
|
||||
return *(*p.Extra).(*embedFileList)
|
||||
}
|
||||
|
||||
// SetEmbedFiles sets the list of embedded files for p,
|
||||
// which must be for an ONAME var.
|
||||
func (p *Param) SetEmbedFiles(list []string) {
|
||||
if p.Extra == nil {
|
||||
if len(list) == 0 {
|
||||
return
|
||||
}
|
||||
f := embedFileList(list)
|
||||
p.Extra = new(interface{})
|
||||
*p.Extra = &f
|
||||
return
|
||||
}
|
||||
*(*p.Extra).(*embedFileList) = list
|
||||
}
|
||||
|
||||
// Functions
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue