github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/internal/pkgbits/sync.go (about)

     1  // Copyright 2021 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package pkgbits
     6  
     7  import (
     8  	"fmt"
     9  	"runtime"
    10  	"strings"
    11  )
    12  
    13  // fmtFrames formats a backtrace for reporting reader/writer desyncs.
    14  func fmtFrames(pcs ...uintptr) []string {
    15  	res := make([]string, 0, len(pcs))
    16  	walkFrames(pcs, func(file string, line int, name string, offset uintptr) {
    17  		// Trim package from function name. It's just redundant noise.
    18  		name = strings.TrimPrefix(name, "cmd/compile/internal/noder.")
    19  
    20  		res = append(res, fmt.Sprintf("%s:%v: %s +0x%v", file, line, name, offset))
    21  	})
    22  	return res
    23  }
    24  
    25  type frameVisitor func(file string, line int, name string, offset uintptr)
    26  
    27  // walkFrames calls visit for each call frame represented by pcs.
    28  //
    29  // pcs should be a slice of PCs, as returned by runtime.Callers.
    30  func walkFrames(pcs []uintptr, visit frameVisitor) {
    31  	if len(pcs) == 0 {
    32  		return
    33  	}
    34  
    35  	frames := runtime.CallersFrames(pcs)
    36  	for {
    37  		frame, more := frames.Next()
    38  		visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry)
    39  		if !more {
    40  			return
    41  		}
    42  	}
    43  }
    44  
    45  // SyncMarker is an enum type that represents markers that may be
    46  // written to export data to ensure the reader and writer stay
    47  // synchronized.
    48  type SyncMarker int
    49  
    50  //go:generate stringer -type=SyncMarker -trimprefix=Sync
    51  
    52  const (
    53  	_ SyncMarker = iota
    54  
    55  	// Public markers (known to go/types importers).
    56  
    57  	// Low-level coding markers.
    58  	SyncEOF
    59  	SyncBool
    60  	SyncInt64
    61  	SyncUint64
    62  	SyncString
    63  	SyncValue
    64  	SyncVal
    65  	SyncRelocs
    66  	SyncReloc
    67  	SyncUseReloc
    68  
    69  	// Higher-level object and type markers.
    70  	SyncPublic
    71  	SyncPos
    72  	SyncPosBase
    73  	SyncObject
    74  	SyncObject1
    75  	SyncPkg
    76  	SyncPkgDef
    77  	SyncMethod
    78  	SyncType
    79  	SyncTypeIdx
    80  	SyncTypeParamNames
    81  	SyncSignature
    82  	SyncParams
    83  	SyncParam
    84  	SyncCodeObj
    85  	SyncSym
    86  	SyncLocalIdent
    87  	SyncSelector
    88  
    89  	// Private markers (only known to cmd/compile).
    90  	SyncPrivate
    91  
    92  	SyncFuncExt
    93  	SyncVarExt
    94  	SyncTypeExt
    95  	SyncPragma
    96  
    97  	SyncExprList
    98  	SyncExprs
    99  	SyncExpr
   100  	SyncExprType
   101  	SyncAssign
   102  	SyncOp
   103  	SyncFuncLit
   104  	SyncCompLit
   105  
   106  	SyncDecl
   107  	SyncFuncBody
   108  	SyncOpenScope
   109  	SyncCloseScope
   110  	SyncCloseAnotherScope
   111  	SyncDeclNames
   112  	SyncDeclName
   113  
   114  	SyncStmts
   115  	SyncBlockStmt
   116  	SyncIfStmt
   117  	SyncForStmt
   118  	SyncSwitchStmt
   119  	SyncRangeStmt
   120  	SyncCaseClause
   121  	SyncCommClause
   122  	SyncSelectStmt
   123  	SyncDecls
   124  	SyncLabeledStmt
   125  	SyncUseObjLocal
   126  	SyncAddLocal
   127  	SyncLinkname
   128  	SyncStmt1
   129  	SyncStmtsEnd
   130  	SyncLabel
   131  	SyncOptLabel
   132  
   133  	SyncMultiExpr
   134  	SyncRType
   135  	SyncConvRTTI
   136  )