p.marked = make(map[*types.Type]bool)
for _, n := range exportlist {
sym := n.Sym
- if sym.Exported() {
- // Closures are added to exportlist, but with Exported
- // already set. The export code below skips over them, so
- // we have to here as well.
- // TODO(mdempsky): Investigate why. This seems suspicious.
- continue
- }
p.markType(asNode(sym.Def).Type)
}
p.marked = nil
for _, n := range exportlist[:numglobals] {
sym := n.Sym
- if sym.Exported() {
- continue
- }
- sym.SetExported(true)
-
// TODO(gri) Closures have dots in their names;
// e.g., TestFloatZeroValue.func1 in math/big tests.
if strings.Contains(sym.Name, ".") {
// are different optimization opportunities, but factor
// eventually.
- if sym.Exported() {
- continue
- }
- sym.SetExported(true)
-
// TODO(gri) Closures have dots in their names;
// e.g., TestFloatZeroValue.func1 in math/big tests.
if strings.Contains(sym.Name, ".") {
}
xfunc.Func.Nname.Sym = closurename(Curfn)
- xfunc.Func.Nname.Sym.SetExported(true) // disable export
+ xfunc.Func.Nname.Sym.SetOnExportList(true) // disable export
declare(xfunc.Func.Nname, PFUNC)
xfunc = typecheck(xfunc, Etop)
xfunc.Func.SetDupok(true)
xfunc.Func.Nname = newfuncname(sym)
- xfunc.Func.Nname.Sym.SetExported(true) // disable export
+ xfunc.Func.Nname.Sym.SetOnExportList(true) // disable export
xfunc.Func.Nname.Name.Param.Ntype = xtype
xfunc.Func.Nname.Name.Defn = xfunc
declare(xfunc.Func.Nname, PFUNC)
var asmlist []*Node
-// Mark n's symbol as exported
+// exportsym marks n for export (or reexport).
func exportsym(n *Node) {
- if n == nil || n.Sym == nil {
- return
- }
- if n.Sym.Export() || n.Sym.Package() {
- if n.Sym.Package() {
- Fatalf("export/package mismatch: %v", n.Sym)
- }
+ if n.Sym.OnExportList() {
return
}
+ n.Sym.SetOnExportList(true)
- n.Sym.SetExport(true)
if Debug['E'] != 0 {
- fmt.Printf("export symbol %v\n", n.Sym)
- }
-
- // Ensure original types are on exportlist before type aliases.
- if IsAlias(n.Sym) {
- exportlist = append(exportlist, asNode(n.Sym.Def))
- }
-
- exportlist = append(exportlist, n)
-}
-
-// reexportsym marks n for reexport.
-func reexportsym(n *Node) {
- if exportedsym(n.Sym) {
- return
+ if n.Sym.Pkg == localpkg {
+ fmt.Printf("export symbol %v\n", n.Sym)
+ } else {
+ fmt.Printf("reexport name %v\n", n.Sym)
+ }
}
- if Debug['E'] != 0 {
- fmt.Printf("reexport name %v\n", n.Sym)
- }
exportlist = append(exportlist, n)
}
return s == "init"
}
-// exportedsym reports whether a symbol will be visible
-// to files that import our package.
-func exportedsym(sym *types.Sym) bool {
- // Builtins are visible everywhere.
- if sym.Pkg == builtinpkg || sym.Origpkg == builtinpkg {
- return true
- }
-
- return sym.Pkg == localpkg && exportname(sym.Name)
-}
-
func autoexport(n *Node, ctxt Class) {
- if n == nil || n.Sym == nil {
+ if n.Sym.Pkg != localpkg {
return
}
if (ctxt != PEXTERN && ctxt != PFUNC) || dclcontext != PEXTERN {
if exportname(n.Sym.Name) || initname(n.Sym.Name) {
exportsym(n)
}
- if asmhdr != "" && n.Sym.Pkg == localpkg && !n.Sym.Asm() {
+ if asmhdr != "" && !n.Sym.Asm() {
n.Sym.SetAsm(true)
asmlist = append(asmlist, n)
}
pkgstr := fmt.Sprintf("during import %q", pkg.Path)
redeclare(s, pkgstr)
}
-
- // mark the symbol so it is not reexported
- if asNode(s.Def) == nil {
- if exportname(s.Name) || initname(s.Name) {
- s.SetExport(true)
- } else {
- s.SetPackage(true) // package scope
- }
- }
}
// pkgtype returns the named type declared by symbol s.
// because they're reexported alongside their
// receiver type.
if n.Class() == PEXTERN || n.Class() == PFUNC && !n.isMethodExpression() {
- reexportsym(n)
+ exportsym(n)
}
case OCALLFUNC, OCALLMETH:
t.List.Set(append(l, in...))
t.Rlist.Set(out)
+ newnam.SetOnExportList(true) // prevent export; see closure.go
fn := dclfunc(newnam, t)
fn.Func.SetDupok(true)
- fn.Func.Nname.Sym.SetExported(true) // prevent export; see closure.go
// arg list
var args []*Node
}
const (
- symExport = 1 << iota // added to exportlist (no need to add again)
- symPackage
- symExported // already written out by export
+ symOnExportList = 1 << iota // added to exportlist (no need to add again)
symUniq
symSiggen
symAsm
symAlgGen
)
-func (sym *Sym) Export() bool { return sym.flags&symExport != 0 }
-func (sym *Sym) Package() bool { return sym.flags&symPackage != 0 }
-func (sym *Sym) Exported() bool { return sym.flags&symExported != 0 }
-func (sym *Sym) Uniq() bool { return sym.flags&symUniq != 0 }
-func (sym *Sym) Siggen() bool { return sym.flags&symSiggen != 0 }
-func (sym *Sym) Asm() bool { return sym.flags&symAsm != 0 }
-func (sym *Sym) AlgGen() bool { return sym.flags&symAlgGen != 0 }
+func (sym *Sym) OnExportList() bool { return sym.flags&symOnExportList != 0 }
+func (sym *Sym) Uniq() bool { return sym.flags&symUniq != 0 }
+func (sym *Sym) Siggen() bool { return sym.flags&symSiggen != 0 }
+func (sym *Sym) Asm() bool { return sym.flags&symAsm != 0 }
+func (sym *Sym) AlgGen() bool { return sym.flags&symAlgGen != 0 }
-func (sym *Sym) SetExport(b bool) { sym.flags.set(symExport, b) }
-func (sym *Sym) SetPackage(b bool) { sym.flags.set(symPackage, b) }
-func (sym *Sym) SetExported(b bool) { sym.flags.set(symExported, b) }
-func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) }
-func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) }
-func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) }
-func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) }
+func (sym *Sym) SetOnExportList(b bool) { sym.flags.set(symOnExportList, b) }
+func (sym *Sym) SetUniq(b bool) { sym.flags.set(symUniq, b) }
+func (sym *Sym) SetSiggen(b bool) { sym.flags.set(symSiggen, b) }
+func (sym *Sym) SetAsm(b bool) { sym.flags.set(symAsm, b) }
+func (sym *Sym) SetAlgGen(b bool) { sym.flags.set(symAlgGen, b) }
func (sym *Sym) IsBlank() bool {
return sym != nil && sym.Name == "_"