gen = closurename_closgen
} else if n.Func.Outerfunc.Op == ODCLFUNC {
// The outermost closure inside of a named function.
- outer = n.Func.Outerfunc.Nname.Sym.Name
+ outer = n.Func.Outerfunc.Func.Nname.Sym.Name
prefix = "func"
// Yes, functions can be named _.
// Can't use function closgen in such case,
// because it would lead to name clashes.
- if !isblank(n.Func.Outerfunc.Nname) {
+ if !isblank(n.Func.Outerfunc.Func.Nname) {
n.Func.Outerfunc.Func.Closgen++
gen = n.Func.Outerfunc.Func.Closgen
} else {
// create the function
xfunc := Nod(ODCLFUNC, nil, nil)
- xfunc.Nname = newfuncname(closurename(func_))
- xfunc.Nname.Sym.Flags |= SymExported // disable export
- xfunc.Nname.Name.Param.Ntype = xtype
- xfunc.Nname.Name.Defn = xfunc
- declare(xfunc.Nname, PFUNC)
- xfunc.Nname.Name.Funcdepth = func_.Func.Depth
+ xfunc.Func.Nname = newfuncname(closurename(func_))
+ xfunc.Func.Nname.Sym.Flags |= SymExported // disable export
+ xfunc.Func.Nname.Name.Param.Ntype = xtype
+ xfunc.Func.Nname.Name.Defn = xfunc
+ declare(xfunc.Func.Nname, PFUNC)
+ xfunc.Func.Nname.Name.Funcdepth = func_.Func.Depth
xfunc.Func.Depth = func_.Func.Depth
xfunc.Func.Endlineno = func_.Func.Endlineno
if Debug['m'] > 1 {
var name *Sym
- if v.Name.Curfn != nil && v.Name.Curfn.Nname != nil {
- name = v.Name.Curfn.Nname.Sym
+ if v.Name.Curfn != nil && v.Name.Curfn.Func.Nname != nil {
+ name = v.Name.Curfn.Func.Nname.Sym
}
how := "ref"
if v.Name.Byval {
// }(42, byval, &byref)
// f is ONAME of the actual function.
- f := xfunc.Nname
+ f := xfunc.Func.Nname
// Get pointer to input arguments and rewind to the end.
// We are going to append captured variables to input args.
func walkclosure(func_ *Node, init **NodeList) *Node {
// If no closure vars, don't bother wrapping.
if func_.Func.Cvars == nil {
- return func_.Func.Closure.Nname
+ return func_.Func.Closure.Func.Nname
}
// Create closure in the form of a composite literal.
clos := Nod(OCOMPLIT, nil, Nod(OIND, typ, nil))
clos.Esc = func_.Esc
clos.Right.Implicit = true
- clos.List = concat(list1(Nod(OCFUNC, func_.Func.Closure.Nname, nil)), func_.Func.Enter)
+ clos.List = concat(list1(Nod(OCFUNC, func_.Func.Closure.Func.Nname, nil)), func_.Func.Enter)
// Force type conversion from *struct to the func type.
clos = Nod(OCONVNOP, clos, nil)
}
// Create top-level function.
- fn.Nname = makepartialcall(fn, fn.Type, sym)
-
+ xfunc := makepartialcall(fn, fn.Type, sym)
+ fn.Func = xfunc.Func
fn.Right = sym
fn.Op = OCALLPART
- fn.Type = fn.Nname.Type
+ fn.Type = xfunc.Type
}
var makepartialcall_gopkg *Pkg
xtype.Rlist = l
xfunc.Func.Dupok = true
- xfunc.Nname = newfuncname(sym)
- xfunc.Nname.Sym.Flags |= SymExported // disable export
- xfunc.Nname.Name.Param.Ntype = xtype
- xfunc.Nname.Name.Defn = xfunc
- declare(xfunc.Nname, PFUNC)
+ xfunc.Func.Nname = newfuncname(sym)
+ xfunc.Func.Nname.Sym.Flags |= SymExported // disable export
+ xfunc.Func.Nname.Name.Param.Ntype = xtype
+ xfunc.Func.Nname.Name.Defn = xfunc
+ declare(xfunc.Func.Nname, PFUNC)
// Declare and initialize variable holding receiver.
clos := Nod(OCOMPLIT, nil, Nod(OIND, typ, nil))
clos.Esc = n.Esc
clos.Right.Implicit = true
- clos.List = list1(Nod(OCFUNC, n.Nname.Nname, nil))
+ clos.List = list1(Nod(OCFUNC, n.Func.Nname, nil))
clos.List = list(clos.List, n.Left)
// Force type conversion from *struct to the func type.
n.Func.Outer = Curfn
Curfn = n
- if n.Nname != nil {
- funcargs(n.Nname.Name.Param.Ntype)
+ if n.Func.Nname != nil {
+ funcargs(n.Func.Nname.Name.Param.Ntype)
} else if n.Func.Ntype != nil {
funcargs(n.Func.Ntype)
} else {
checkwidth(n.Type)
if Curfn != nil {
- Fatal("funccompile %v inside %v", n.Nname.Sym, Curfn.Nname.Sym)
+ Fatal("funccompile %v inside %v", n.Func.Nname.Sym, Curfn.Func.Nname.Sym)
}
Stksize = 0
}
// funcSym returns n.Nname.Sym if no nils are encountered along the way.
-func funcSym(n *Node) *Sym {
- if n == nil || n.Nname == nil {
+func funcSym(fn *Node) *Sym {
+ if fn == nil || fn.Func.Nname == nil {
return nil
}
- return n.Nname.Sym
+ return fn.Func.Nname.Sym
}
// curfnSym returns n.Curfn.Nname.Sym if no nils are encountered along the way.
func escfunc(e *EscState, func_ *Node) {
// print("escfunc %N %s\n", func->nname, e->recursive?"(recursive)":"");
if func_.Esc != 1 {
- Fatal("repeat escfunc %v", func_.Nname)
+ Fatal("repeat escfunc %v", func_.Func.Nname)
}
func_.Esc = EscFuncStarted
t.Rlist = $5;
$$ = Nod(ODCLFUNC, nil, nil);
- $$.Nname = newfuncname($1);
- $$.Nname.Name.Defn = $$;
- $$.Nname.Param.Ntype = t; // TODO: check if nname already has an ntype
- declare($$.Nname, PFUNC);
+ $$.Func.Nname = newfuncname($1);
+ $$.Func.Nname.Name.Defn = $$;
+ $$.Func.Nname.Name.Param.Ntype = t; // TODO: check if nname already has an ntype
+ declare($$.Func.Nname, PFUNC);
funchdr($$);
}
$$ = Nod(ODCLFUNC, nil, nil);
$$.Func.Shortname = newfuncname($4);
- $$.Nname = methodname1($$.Func.Shortname, rcvr.Right);
- $$.Nname.Name.Defn = $$;
- $$.Nname.Param.Ntype = t;
- $$.Nname.Nointerface = nointerface;
- declare($$.Nname, PFUNC);
+ $$.Func.Nname = methodname1($$.Func.Shortname, rcvr.Right);
+ $$.Func.Nname.Name.Defn = $$;
+ $$.Func.Nname.Name.Param.Ntype = t;
+ $$.Func.Nname.Nointerface = nointerface;
+ declare($$.Func.Nname, PFUNC);
funchdr($$);
}
fn := Nod(ODCLFUNC, nil, nil)
initsym := Lookup("init")
- fn.Nname = newname(initsym)
- fn.Nname.Name.Defn = fn
- fn.Nname.Name.Param.Ntype = Nod(OTFUNC, nil, nil)
- declare(fn.Nname, PFUNC)
+ fn.Func.Nname = newname(initsym)
+ fn.Func.Nname.Name.Defn = fn
+ fn.Func.Nname.Name.Param.Ntype = Nod(OTFUNC, nil, nil)
+ declare(fn.Func.Nname, PFUNC)
funchdr(fn)
// (3)
a = Nod(ORETURN, nil, nil)
r = list(r, a)
- exportsym(fn.Nname)
+ exportsym(fn.Func.Nname)
fn.Nbody = r
funcbody(fn)
if fn.Op != ODCLFUNC {
Fatal("caninl %v", fn)
}
- if fn.Nname == nil {
+ if fn.Func.Nname == nil {
Fatal("caninl no nname %v", Nconv(fn, obj.FmtSign))
}
savefn := Curfn
Curfn = fn
- fn.Nname.Func.Inl = fn.Nbody
- fn.Nbody = inlcopylist(fn.Nname.Func.Inl)
- fn.Nname.Func.Inldcl = inlcopylist(fn.Nname.Name.Defn.Func.Dcl)
- fn.Nname.Func.InlCost = int32(maxBudget - budget)
+ fn.Func.Nname.Func.Inl = fn.Nbody
+ fn.Nbody = inlcopylist(fn.Func.Nname.Func.Inl)
+ fn.Func.Nname.Func.Inldcl = inlcopylist(fn.Func.Nname.Name.Defn.Func.Dcl)
+ fn.Func.Nname.Func.InlCost = int32(maxBudget - budget)
// hack, TODO, check for better way to link method nodes back to the thing with the ->inl
// this is so export can find the body of a method
- fn.Type.Nname = fn.Nname
+ fn.Type.Nname = fn.Func.Nname
if Debug['m'] > 1 {
- fmt.Printf("%v: can inline %v as: %v { %v }\n", fn.Line(), Nconv(fn.Nname, obj.FmtSharp), Tconv(fn.Type, obj.FmtSharp), Hconv(fn.Nname.Func.Inl, obj.FmtSharp))
+ fmt.Printf("%v: can inline %v as: %v { %v }\n", fn.Line(), Nconv(fn.Func.Nname, obj.FmtSharp), Tconv(fn.Type, obj.FmtSharp), Hconv(fn.Func.Nname.Func.Inl, obj.FmtSharp))
} else if Debug['m'] != 0 {
- fmt.Printf("%v: can inline %v\n", fn.Line(), fn.Nname)
+ fmt.Printf("%v: can inline %v\n", fn.Line(), fn.Func.Nname)
}
Curfn = savefn
p.From3.Offset = Types[Tptr].Width
p.To.Type = obj.TYPE_ADDR
- //print("%P\n", p);
+ //print("%v\n", p);
Nodconst(&nod1, Types[TINT], int64(len(sval)))
// described in the comment at the top of the file.
func order(fn *Node) {
if Debug['W'] > 1 {
- s := fmt.Sprintf("\nbefore order %v", fn.Nname.Sym)
+ s := fmt.Sprintf("\nbefore order %v", fn.Func.Nname.Sym)
dumplist(s, fn.Nbody)
}
}
func emitptrargsmap() {
- sym := Lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Nname.Sym.Name))
+ sym := Lookup(fmt.Sprintf("%s.args_stackmap", Curfn.Func.Nname.Sym.Name))
nptr := int(Curfn.Type.Argwid / int64(Widthptr))
bv := bvalloc(int32(nptr) * 2)
var gcargs *Sym
var gclocals *Sym
if fn.Nbody == nil {
- if pure_go != 0 || strings.HasPrefix(fn.Nname.Sym.Name, "init.") {
- Yyerror("missing function body for %q", fn.Nname.Sym.Name)
+ if pure_go != 0 || strings.HasPrefix(fn.Func.Nname.Sym.Name, "init.") {
+ Yyerror("missing function body for %q", fn.Func.Nname.Sym.Name)
goto ret
}
breakpc = nil
pl = newplist()
- pl.Name = Linksym(Curfn.Nname.Sym)
+ pl.Name = Linksym(Curfn.Func.Nname.Sym)
setlineno(Curfn)
Nodconst(&nod1, Types[TINT32], 0)
- nam = Curfn.Nname
+ nam = Curfn.Func.Nname
if isblank(nam) {
nam = nil
}
// See test/recover.go for test cases and src/reflect/value.go
// for the actual functions being considered.
if myimportpath != "" && myimportpath == "reflect" {
- if Curfn.Nname.Sym.Name == "callReflect" || Curfn.Nname.Sym.Name == "callMethod" {
+ if Curfn.Func.Nname.Sym.Name == "callReflect" || Curfn.Func.Nname.Sym.Name == "callMethod" {
ptxt.From3.Offset |= obj.WRAPPER
}
}
- Afunclit(&ptxt.From, Curfn.Nname)
+ Afunclit(&ptxt.From, Curfn.Func.Nname)
ginit()
if !n.Name.Needzero {
n.Name.Needzero = true
if debuglive >= 1 {
- Warnl(int(p.Lineno), "%v: %v is ambiguously live", Curfn.Nname, Nconv(n, obj.FmtLong))
+ Warnl(int(p.Lineno), "%v: %v is ambiguously live", Curfn.Func.Nname, Nconv(n, obj.FmtLong))
}
// Record in 'ambiguous' bitmap.
var numlive int32
var msg []string
for _, bb := range lv.cfg {
- if debuglive >= 1 && Curfn.Nname.Sym.Name != "init" && Curfn.Nname.Sym.Name[0] != '.' {
+ if debuglive >= 1 && Curfn.Func.Nname.Sym.Name != "init" && Curfn.Func.Nname.Sym.Name[0] != '.' {
nmsg = int32(len(lv.livepointers))
startmsg = nmsg
msg = make([]string, nmsg)
}
n = lv.vars[j]
if n.Class != PPARAM {
- yyerrorl(int(p.Lineno), "internal error: %v %v recorded as live on entry", Curfn.Nname, Nconv(n, obj.FmtLong))
+ yyerrorl(int(p.Lineno), "internal error: %v %v recorded as live on entry", Curfn.Func.Nname, Nconv(n, obj.FmtLong))
}
}
}
var locals Bvec
var n *Node
- fmt.Printf("liveness: %s\n", Curfn.Nname.Sym.Name)
+ fmt.Printf("liveness: %s\n", Curfn.Func.Nname.Sym.Name)
uevar := bvalloc(int32(len(lv.vars)))
varkill := bvalloc(int32(len(lv.vars)))
// Change name to dump debugging information only for a specific function.
debugdelta := 0
- if Curfn.Nname.Sym.Name == "!" {
+ if Curfn.Func.Nname.Sym.Name == "!" {
debugdelta = 2
}
debuglive += debugdelta
if debuglive >= 3 {
- fmt.Printf("liveness: %s\n", Curfn.Nname.Sym.Name)
+ fmt.Printf("liveness: %s\n", Curfn.Func.Nname.Sym.Name)
printprog(firstp)
}
if nf >= MaxFlowProg {
if Debug['v'] != 0 {
- Warn("%v is too big (%d instructions)", Curfn.Nname.Sym, nf)
+ Warn("%v is too big (%d instructions)", Curfn.Func.Nname.Sym, nf)
}
return nil
}
}
if debugmerge > 0 && Debug['v'] != 0 {
- fmt.Printf("%v [%d - %d]\n", Curfn.Nname.Sym, len(var_), nkill)
+ fmt.Printf("%v [%d - %d]\n", Curfn.Func.Nname.Sym, len(var_), nkill)
var v *TempVar
for i := 0; i < len(var_); i++ {
v = &var_[i]
Flowend(g)
if Debug_checknil > 1 {
- fmt.Printf("%v: removed %d of %d nil checks\n", Curfn.Nname.Sym, nkill, ncheck)
+ fmt.Printf("%v: removed %d of %d nil checks\n", Curfn.Func.Nname.Sym, nkill, ncheck)
}
}
// they might have been locked at the time of the fork. This means
// no rescheduling, no malloc calls, and no new stack segments.
// Race instrumentation does all of the above.
- return myimportpath != "" && myimportpath == "syscall" && fn.Nname.Sym.Name == "forkAndExecInChild"
+ return myimportpath != "" && myimportpath == "syscall" && fn.Func.Nname.Sym.Name == "forkAndExecInChild"
}
func racewalk(fn *Node) {
fn.Func.Exit = list(fn.Func.Exit, nd)
if Debug['W'] != 0 {
- s := fmt.Sprintf("after racewalk %v", fn.Nname.Sym)
+ s := fmt.Sprintf("after racewalk %v", fn.Func.Nname.Sym)
dumplist(s, fn.Nbody)
- s = fmt.Sprintf("enter %v", fn.Nname.Sym)
+ s = fmt.Sprintf("enter %v", fn.Func.Nname.Sym)
dumplist(s, fn.Func.Enter)
- s = fmt.Sprintf("exit %v", fn.Nname.Sym)
+ s = fmt.Sprintf("exit %v", fn.Func.Nname.Sym)
dumplist(s, fn.Func.Exit)
}
}
}
}
- if false && Debug['v'] != 0 && strings.Contains(Curfn.Nname.Sym.Name, "Parse") {
+ if false && Debug['v'] != 0 && strings.Contains(Curfn.Func.Nname.Sym.Name, "Parse") {
Warn("regions: %d\n", nregion)
}
if nregion >= MaxRgn {
fmt.Printf("--- external frame ---\n")
l = externdcl
} else if Curfn != nil {
- fmt.Printf("--- %v frame ---\n", Curfn.Nname.Sym)
+ fmt.Printf("--- %v frame ---\n", Curfn.Func.Nname.Sym)
l = Curfn.Func.Dcl
} else {
return
t.Rlist = out
fn := Nod(ODCLFUNC, nil, nil)
- fn.Nname = newname(newnam)
- fn.Nname.Name.Defn = fn
- fn.Nname.Name.Param.Ntype = t
- declare(fn.Nname, PFUNC)
+ fn.Func.Nname = newname(newnam)
+ fn.Func.Nname.Name.Defn = fn
+ fn.Func.Nname.Name.Param.Ntype = t
+ declare(fn.Func.Nname, PFUNC)
funchdr(fn)
// arg list
// func sym(p *T, h uintptr) uintptr
fn := Nod(ODCLFUNC, nil, nil)
- fn.Nname = newname(sym)
- fn.Nname.Class = PFUNC
+ fn.Func.Nname = newname(sym)
+ fn.Func.Nname.Class = PFUNC
tfn := Nod(OTFUNC, nil, nil)
- fn.Nname.Name.Param.Ntype = tfn
+ fn.Func.Nname.Name.Param.Ntype = tfn
n := Nod(ODCLFIELD, newname(Lookup("p")), typenod(Ptrto(t)))
tfn.List = list(tfn.List, n)
tfn.Rlist = list(tfn.Rlist, n)
funchdr(fn)
- typecheck(&fn.Nname.Name.Param.Ntype, Etype)
+ typecheck(&fn.Func.Nname.Name.Param.Ntype, Etype)
// genhash is only called for types that have equality but
// cannot be handled by the standard algorithms,
// func sym(p, q *T) bool
fn := Nod(ODCLFUNC, nil, nil)
- fn.Nname = newname(sym)
- fn.Nname.Class = PFUNC
+ fn.Func.Nname = newname(sym)
+ fn.Func.Nname.Class = PFUNC
tfn := Nod(OTFUNC, nil, nil)
- fn.Nname.Name.Param.Ntype = tfn
+ fn.Func.Nname.Name.Param.Ntype = tfn
n := Nod(ODCLFIELD, newname(Lookup("p")), typenod(Ptrto(t)))
tfn.List = list(tfn.List, n)
Top int // top context (Ecall, Eproc, etc)
Closure *Node // OCLOSURE <-> ODCLFUNC
FCurfn *Node
+ Nname *Node
Inl *NodeList // copy of the body for use in inlining
InlCost int32
* type check function definition
*/
func typecheckfunc(n *Node) {
- typecheck(&n.Nname, Erv|Easgn)
- t := n.Nname.Type
+ typecheck(&n.Func.Nname, Erv|Easgn)
+ t := n.Func.Nname.Type
if t == nil {
return
}
n.Type = t
- t.Nname = n.Nname
+ t.Nname = n.Func.Nname
rcvr := getthisx(t).Type
if rcvr != nil && n.Func.Shortname != nil && !isblank(n.Func.Shortname) {
- addmethod(n.Func.Shortname.Sym, t, true, n.Nname.Nointerface)
+ addmethod(n.Func.Shortname.Sym, t, true, n.Func.Nname.Nointerface)
}
for l := n.Func.Dcl; l != nil; l = l.Next {
Curfn = fn
if Debug['W'] != 0 {
- s := fmt.Sprintf("\nbefore %v", Curfn.Nname.Sym)
+ s := fmt.Sprintf("\nbefore %v", Curfn.Func.Nname.Sym)
dumplist(s, Curfn.Nbody)
}
}
walkstmtlist(Curfn.Nbody)
if Debug['W'] != 0 {
- s := fmt.Sprintf("after walk %v", Curfn.Nname.Sym)
+ s := fmt.Sprintf("after walk %v", Curfn.Func.Nname.Sym)
dumplist(s, Curfn.Nbody)
}
heapmoves()
if Debug['W'] != 0 && Curfn.Func.Enter != nil {
- s := fmt.Sprintf("enter %v", Curfn.Nname.Sym)
+ s := fmt.Sprintf("enter %v", Curfn.Func.Nname.Sym)
dumplist(s, Curfn.Func.Enter)
}
}
n.Left.Func.Enter = nil
// Replace OCLOSURE with ONAME/PFUNC.
- n.Left = n.Left.Func.Closure.Nname
+ n.Left = n.Left.Func.Closure.Func.Nname
// Update type of OCALLFUNC node.
// Output arguments had not changed, but their offsets could.
// cannot happen: caller checked that lists had same length
if ll != nil || lr != nil {
- Yyerror("error in shape across %v %v %v / %d %d [%s]", Hconv(nl, obj.FmtSign), Oconv(int(op), 0), Hconv(nr, obj.FmtSign), count(nl), count(nr), Curfn.Nname.Sym.Name)
+ Yyerror("error in shape across %v %v %v / %d %d [%s]", Hconv(nl, obj.FmtSign), Oconv(int(op), 0), Hconv(nr, obj.FmtSign), count(nl), count(nr), Curfn.Func.Nname.Sym.Name)
}
return nn
}
}
nn = list(nn, Nod(OAS, v.Name.Heapaddr, prealloc[v]))
if v.Class&^PHEAP != PPARAMOUT {
- as = Nod(OAS, v, v.Name.Stackparam)
+ as = Nod(OAS, v, v.Name.Param.Stackparam)
v.Name.Param.Stackparam.Typecheck = 1
typecheck(&as, Etop)
as = applywritebarrier(as, &nn)
fn := Nod(ODCLFUNC, nil, nil)
walkprintfunc_prgen++
buf = fmt.Sprintf("print·%d", walkprintfunc_prgen)
- fn.Nname = newname(Lookup(buf))
- fn.Nname.Name.Defn = fn
- fn.Nname.Name.Param.Ntype = t
- declare(fn.Nname, PFUNC)
+ fn.Func.Nname = newname(Lookup(buf))
+ fn.Func.Nname.Name.Defn = fn
+ fn.Func.Nname.Name.Param.Ntype = t
+ declare(fn.Func.Nname, PFUNC)
oldfn := Curfn
Curfn = nil
Curfn = oldfn
a = Nod(OCALL, nil, nil)
- a.Left = fn.Nname
+ a.Left = fn.Func.Nname
a.List = n.List
typecheck(&a, Etop)
walkexpr(&a, init)
t.Rlist = yyDollar[5].list
yyVAL.node = Nod(ODCLFUNC, nil, nil)
- yyVAL.node.Nname = newfuncname(yyDollar[1].sym)
- yyVAL.node.Nname.Name.Defn = yyVAL.node
- yyVAL.node.Nname.Name.Param.Ntype = t // TODO: check if nname already has an ntype
- declare(yyVAL.node.Nname, PFUNC)
+ yyVAL.node.Func.Nname = newfuncname(yyDollar[1].sym)
+ yyVAL.node.Func.Nname.Name.Defn = yyVAL.node
+ yyVAL.node.Func.Nname.Name.Param.Ntype = t // TODO: check if nname already has an ntype
+ declare(yyVAL.node.Func.Nname, PFUNC)
funchdr(yyVAL.node)
}
yyVAL.node = Nod(ODCLFUNC, nil, nil)
yyVAL.node.Func.Shortname = newfuncname(yyDollar[4].sym)
- yyVAL.node.Nname = methodname1(yyVAL.node.Func.Shortname, rcvr.Right)
- yyVAL.node.Nname.Name.Defn = yyVAL.node
- yyVAL.node.Nname.Name.Param.Ntype = t
- yyVAL.node.Nname.Nointerface = nointerface
- declare(yyVAL.node.Nname, PFUNC)
+ yyVAL.node.Func.Nname = methodname1(yyVAL.node.Func.Shortname, rcvr.Right)
+ yyVAL.node.Func.Nname.Name.Defn = yyVAL.node
+ yyVAL.node.Func.Nname.Name.Param.Ntype = t
+ yyVAL.node.Func.Nname.Nointerface = nointerface
+ declare(yyVAL.node.Func.Nname, PFUNC)
funchdr(yyVAL.node)
}