for _, n := range exportlist {
sym := n.Sym
- if sym.Flags&SymExported != 0 {
+ if sym.Exported() {
continue
}
- sym.Flags |= SymExported
+ sym.SetExported(true)
// TODO(gri) Closures have dots in their names;
// e.g., TestFloatZeroValue.func1 in math/big tests.
}
// TODO(gri) Should we do this check?
- // if sym.Flags&SymExport == 0 {
+ // if !sym.Export() {
// continue
// }
// are different optimization opportunities, but factor
// eventually.
- if sym.Flags&SymExported != 0 {
+ if sym.Exported() {
continue
}
- sym.Flags |= SymExported
+ sym.SetExported(true)
// TODO(gri) Closures have dots in their names;
// e.g., TestFloatZeroValue.func1 in math/big tests.
}
// TODO(gri) Should we do this check?
- // if sym.Flags&SymExport == 0 {
+ // if !sym.Export() {
// continue
// }
xfunc := nod(ODCLFUNC, nil, nil)
xfunc.Func.Nname = newfuncname(closurename(func_))
- xfunc.Func.Nname.Sym.Flags |= SymExported // disable export
+ xfunc.Func.Nname.Sym.SetExported(true) // disable export
xfunc.Func.Nname.Name.Param.Ntype = xtype
xfunc.Func.Nname.Name.Defn = xfunc
declare(xfunc.Func.Nname, PFUNC)
sym := Pkglookup(p, spkg)
- if sym.Flags&SymUniq != 0 {
+ if sym.Uniq() {
return sym.Def
}
- sym.Flags |= SymUniq
+ sym.SetUniq(true)
savecurfn := Curfn
Curfn = nil
xfunc.Func.SetDupok(true)
xfunc.Func.Nname = newfuncname(sym)
- xfunc.Func.Nname.Sym.Flags |= SymExported // disable export
+ xfunc.Func.Nname.Sym.SetExported(true) // disable export
xfunc.Func.Nname.Name.Param.Ntype = xtype
xfunc.Func.Nname.Name.Defn = xfunc
declare(xfunc.Func.Nname, PFUNC)
func colasdefn(left []*Node, defn *Node) {
for _, n := range left {
if n.Sym != nil {
- n.Sym.Flags |= SymUniq
+ n.Sym.SetUniq(true)
}
}
continue
}
- if n.Sym.Flags&SymUniq == 0 {
+ if !n.Sym.Uniq() {
yyerrorl(defn.Pos, "%v repeated on left side of :=", n.Sym)
n.SetDiag(true)
nerr++
continue
}
- n.Sym.Flags &^= SymUniq
+ n.Sym.SetUniq(false)
if n.Sym.Block == block {
continue
}
if n == nil || n.Sym == nil {
return
}
- if n.Sym.Flags&(SymExport|SymPackage) != 0 {
- if n.Sym.Flags&SymPackage != 0 {
+ if n.Sym.Export() || n.Sym.Package() {
+ if n.Sym.Package() {
yyerror("export/package mismatch: %v", n.Sym)
}
return
}
- n.Sym.Flags |= SymExport
+ n.Sym.SetExport(true)
if Debug['E'] != 0 {
fmt.Printf("export symbol %v\n", n.Sym)
}
if exportname(n.Sym.Name) || initname(n.Sym.Name) {
exportsym(n)
}
- if asmhdr != "" && n.Sym.Pkg == localpkg && n.Sym.Flags&SymAsm == 0 {
- n.Sym.Flags |= SymAsm
+ if asmhdr != "" && n.Sym.Pkg == localpkg && !n.Sym.Asm() {
+ n.Sym.SetAsm(true)
asmlist = append(asmlist, n)
}
}
// mark the symbol so it is not reexported
if s.Def == nil {
if exportname(s.Name) || initname(s.Name) {
- s.Flags |= SymExport
+ s.SetExport(true)
} else {
- s.Flags |= SymPackage // package scope
+ s.SetPackage(true) // package scope
}
}
}
// allows using Sym pointer equality to test for Go identifier uniqueness when
// handling selector expressions.
type Sym struct {
- Flags SymFlags
Link *Sym
Importdef *Pkg // where imported definition was found
Linkname string // link name
Origpkg *Pkg // original package for . import
Lsym *obj.LSym
Fsym *Sym // funcsym
-}
-type SymFlags uint8
+ flags bitset8
+}
const (
- SymExport SymFlags = 1 << iota // to be exported
- SymPackage
- SymExported // already written out by export
- SymUniq
- SymSiggen
- SymAsm
- SymAlgGen
+ symExport = 1 << iota // to be exported
+ symPackage
+ symExported // already written out by export
+ 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) 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) isAlias() bool {
return sym.Def != nil && sym.Def.Sym != sym
}
sig.type_ = methodfunc(f.Type, t)
sig.mtype = methodfunc(f.Type, nil)
- if sig.isym.Flags&SymSiggen == 0 {
- sig.isym.Flags |= SymSiggen
+ if !sig.isym.Siggen() {
+ sig.isym.SetSiggen(true)
if !eqtype(this, it) || this.Width < Types[Tptr].Width {
compiling_wrappers = 1
genwrapper(it, f, sig.isym, 1)
}
}
- if sig.tsym.Flags&SymSiggen == 0 {
- sig.tsym.Flags |= SymSiggen
+ if !sig.tsym.Siggen() {
+ sig.tsym.SetSiggen(true)
if !eqtype(this, t) {
compiling_wrappers = 1
genwrapper(t, f, sig.tsym, 0)
// code can refer to it.
isym := methodsym(method, t, 0)
- if isym.Flags&SymSiggen == 0 {
- isym.Flags |= SymSiggen
+ if !isym.Siggen() {
+ isym.SetSiggen(true)
genwrapper(t, f, isym, 0)
}
}
}
s := typesym(t)
- if s.Flags&SymSiggen != 0 {
+ if s.Siggen() {
return s
}
- s.Flags |= SymSiggen
+ s.SetSiggen(true)
// special case (look for runtime below):
// when compiling package runtime,
s = Pkglookup(p, typepkg)
- if s.Flags&SymAlgGen != 0 {
+ if s.AlgGen() {
return s
}
- s.Flags |= SymAlgGen
+ s.SetAlgGen(true)
// make hash closure
p = fmt.Sprintf(".hashfunc%d", t.Width)
p := fmt.Sprintf("gcbits.%x", ptrmask)
sym := Pkglookup(p, Runtimepkg)
- if sym.Flags&SymUniq == 0 {
- sym.Flags |= SymUniq
+ if !sym.Uniq() {
+ sym.SetUniq(true)
for i, x := range ptrmask {
duint8(sym, i, x)
}
if u.IsInterface() {
for _, f := range u.Fields().Slice() {
- if f.Sym.Flags&SymUniq != 0 {
+ if f.Sym.Uniq() {
continue
}
- f.Sym.Flags |= SymUniq
+ f.Sym.SetUniq(true)
slist = append(slist, Symlink{field: f, followptr: followptr})
}
u = methtype(t)
if u != nil {
for _, f := range u.Methods().Slice() {
- if f.Sym.Flags&SymUniq != 0 {
+ if f.Sym.Uniq() {
continue
}
- f.Sym.Flags |= SymUniq
+ f.Sym.SetUniq(true)
slist = append(slist, Symlink{field: f, followptr: followptr})
}
}
// mark top-level method symbols
// so that expand1 doesn't consider them.
for _, f := range t.Methods().Slice() {
- f.Sym.Flags |= SymUniq
+ f.Sym.SetUniq(true)
}
// generate all reachable methods
var ms []*Field
for i, sl := range slist {
slist[i].field = nil
- sl.field.Sym.Flags &^= SymUniq
+ sl.field.Sym.SetUniq(false)
var f *Field
if path, _ := dotpath(sl.field.Sym, t, &f, false); path == nil {
}
for _, f := range t.Methods().Slice() {
- f.Sym.Flags &^= SymUniq
+ f.Sym.SetUniq(false)
}
ms = append(ms, t.Methods().Slice()...)