]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: improving the documentation of various fields and functions
authorDan Scales <danscales@google.com>
Mon, 26 Apr 2021 21:32:23 +0000 (14:32 -0700)
committerDan Scales <danscales@google.com>
Fri, 7 May 2021 21:35:41 +0000 (21:35 +0000)
This is only changes to comments, so should be fine to go into 1.17.

Change-Id: I01e28dc76b03fb3ca846d976f8ac84bc2acb2ea2
Reviewed-on: https://go-review.googlesource.com/c/go/+/318009
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/inline/inl.go
src/cmd/compile/internal/ir/func.go
src/cmd/compile/internal/typecheck/func.go
src/cmd/compile/internal/typecheck/iimport.go
src/cmd/compile/internal/typecheck/typecheck.go
src/cmd/compile/internal/types/sym.go
src/cmd/compile/internal/types/type.go

index e07bb3b3242c9699e4de92529e476eb63fc4c3ef..a6829e9835f3d35e4d873d64f7b89c703b821b45 100644 (file)
@@ -53,8 +53,8 @@ const (
        inlineBigFunctionMaxCost = 20   // Max cost of inlinee when inlining into a "big" function.
 )
 
+// InlinePackage finds functions that can be inlined and clones them before walk expands them.
 func InlinePackage() {
-       // Find functions that can be inlined and clone them before walk expands them.
        ir.VisitFuncsBottomUp(typecheck.Target.Decls, func(list []*ir.Func, recursive bool) {
                numfns := numNonClosures(list)
                for _, n := range list {
@@ -74,8 +74,8 @@ func InlinePackage() {
 }
 
 // CanInline determines whether fn is inlineable.
-// If so, CanInline saves fn->nbody in fn->inl and substitutes it with a copy.
-// fn and ->nbody will already have been typechecked.
+// If so, CanInline saves copies of fn.Body and fn.Dcl in fn.Inl.
+// fn and fn.Body will already have been typechecked.
 func CanInline(fn *ir.Func) {
        if fn.Nname == nil {
                base.Fatalf("CanInline no nname %+v", fn)
@@ -520,7 +520,7 @@ func inlcopy(n ir.Node) ir.Node {
        return edit(n)
 }
 
-// Inlcalls/nodelist/node walks fn's statements and expressions and substitutes any
+// InlineCalls/inlnode walks fn's statements and expressions and substitutes any
 // calls made to inlineable functions. This is the external entry point.
 func InlineCalls(fn *ir.Func) {
        savefn := ir.CurFunc
index 385866b3c87c6da89ff5846a04d59de98cb2522f..20fe965711df33896e2f8025ea91b450a863dc4d 100644 (file)
@@ -160,7 +160,10 @@ func (f *Func) LinksymABI(abi obj.ABI) *obj.LSym { return f.Nname.LinksymABI(abi
 type Inline struct {
        Cost int32 // heuristic cost of inlining this function
 
-       // Copies of Func.Dcl and Nbody for use during inlining.
+       // Copies of Func.Dcl and Func.Body for use during inlining. Copies are
+       // needed because the function's dcl/body may be changed by later compiler
+       // transformations. These fields are also populated when a function from
+       // another package is imported.
        Dcl  []*Name
        Body []Node
 }
index e154c392691052677829e542ee5ff0a5837c5a1a..f381e1dbdc49db47c600280f4e376e24af10cc94 100644 (file)
@@ -105,8 +105,9 @@ func PartialCallType(n *ir.SelectorExpr) *types.Type {
 // typechecking an inline body, as opposed to the body of a real function.
 var inTypeCheckInl bool
 
-// Lazy typechecking of imported bodies. For local functions, CanInline will set ->typecheck
-// because they're a copy of an already checked body.
+// ImportedBody returns immediately if the inlining information for fn is
+// populated. Otherwise, fn must be an imported function. If so, ImportedBody
+// loads in the dcls and body for fn, and typechecks as needed.
 func ImportedBody(fn *ir.Func) {
        if fn.Inl.Body != nil {
                return
@@ -180,7 +181,7 @@ func fnpkg(fn *ir.Name) *types.Pkg {
        return fn.Sym().Pkg
 }
 
-// closurename generates a new unique name for a closure within
+// ClosureName generates a new unique name for a closure within
 // outerfunc.
 func ClosureName(outerfunc *ir.Func) *types.Sym {
        outer := "glob."
index 00f6a6e483446a9922ead71f169520acf0a3bacd..a5ddbb5a74c97e2542d1e52fbf8735a422f29526 100644 (file)
@@ -42,6 +42,9 @@ var (
        inlineImporter = map[*types.Sym]iimporterAndOffset{}
 )
 
+// expandDecl returns immediately if n is already a Name node. Otherwise, n should
+// be an Ident node, and expandDecl reads in the definition of the specified
+// identifier from the appropriate package.
 func expandDecl(n ir.Node) ir.Node {
        if n, ok := n.(*ir.Name); ok {
                return n
@@ -61,6 +64,8 @@ func expandDecl(n ir.Node) ir.Node {
        return r.doDecl(n.Sym())
 }
 
+// ImportBody reads in the dcls and body of an imported function (which should not
+// yet have been read in).
 func ImportBody(fn *ir.Func) {
        if fn.Inl.Body != nil {
                base.Fatalf("%v already has inline body", fn)
index 4c5472137a58cf3022de467ba50b4a0412500769..95f7b50259fde3193d53ef33c83b6b74e275040e 100644 (file)
@@ -66,6 +66,8 @@ func FuncBody(n *ir.Func) {
 
 var importlist []*ir.Func
 
+// AllImportedBodies reads in the bodies of all imported functions and typechecks
+// them, if needed.
 func AllImportedBodies() {
        for _, n := range importlist {
                if n.Inl != nil {
index 9a32a01a1aceb611fc2c2c8df6d1aa935312a5eb..534cf7e2376d726e9d3cb3568de4b4d7c5ea9125 100644 (file)
@@ -32,8 +32,12 @@ type Sym struct {
        Pkg  *Pkg
        Name string // object name
 
-       // saved and restored by Pushdcl/Popdcl
-       Def        Object   // definition: ONAME OTYPE OPACK or OLITERAL
+       // Def, Block, and Lastlineno are saved and restored by Pushdcl/Popdcl.
+
+       // The unique ONAME, OTYPE, OPACK, or OLITERAL node that this symbol is
+       // bound to within the current scope. (Most parts of the compiler should
+       // prefer passing the Node directly, rather than relying on this field.)
+       Def        Object
        Block      int32    // blocknumber to catch redeclaration
        Lastlineno src.XPos // last declaration for diagnostic
 
index 88fc4097336500b6c66bd7f119ae7005b08227e2..1a9aa6916a2faca5a12a999226cea51cef0c4234 100644 (file)
@@ -11,9 +11,9 @@ import (
        "sync"
 )
 
-// IRNode represents an ir.Node, but without needing to import cmd/compile/internal/ir,
+// Object represents an ir.Node, but without needing to import cmd/compile/internal/ir,
 // which would cause an import cycle. The uses in other packages must type assert
-// values of type IRNode to ir.Node or a more specific type.
+// values of type Object to ir.Node or a more specific type.
 type Object interface {
        Pos() src.XPos
        Sym() *Sym
@@ -157,12 +157,15 @@ type Type struct {
        // Width is the width of this Type in bytes.
        Width int64 // valid if Align > 0
 
-       methods    Fields
+       // list of base methods (excluding embedding)
+       methods Fields
+       // list of all methods (including embedding)
        allMethods Fields
 
        // canonical OTYPE node for a named type (should be an ir.Name node with same sym)
-       nod        Object
-       underlying *Type // original type (type literal or predefined type)
+       nod Object
+       // the underlying type (type literal or predeclared type) for a defined type
+       underlying *Type
 
        // Cache of composite types, with this type being the element type.
        cache struct {
@@ -423,8 +426,11 @@ type Slice struct {
        Elem *Type // element type
 }
 
-// A Field represents a field in a struct or a method in an interface or
-// associated with a named type.
+// A Field is a (Sym, Type) pairing along with some other information, and,
+// depending on the context, is used to represent:
+//  - a field in a struct
+//  - a method in an interface or associated with a named type
+//  - a function parameter
 type Field struct {
        flags bitset8
 
@@ -1656,9 +1662,10 @@ var (
 )
 
 // NewNamed returns a new named type for the given type name. obj should be an
-// ir.Name. The new type is incomplete, and the underlying type should be set
-// later via SetUnderlying(). References to the type are maintained until the type
-// is filled in, so those references can be updated when the type is complete.
+// ir.Name. The new type is incomplete (marked as TFORW kind), and the underlying
+// type should be set later via SetUnderlying(). References to the type are
+// maintained until the type is filled in, so those references can be updated when
+// the type is complete.
 func NewNamed(obj Object) *Type {
        t := New(TFORW)
        t.sym = obj.Sym()