Source file src/internal/pkgbits/version.go

     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  // Version indicates a version of a unified IR bitstream.
     8  // Each Version indicates the addition, removal, or change of
     9  // new data in the bitstream.
    10  //
    11  // These are serialized to disk and the interpretation remains fixed.
    12  type Version uint32
    13  
    14  const (
    15  	// V0: initial prototype.
    16  	//
    17  	// All data that is not assigned a Field is in version V0
    18  	// and has not been deprecated.
    19  	V0 Version = iota
    20  
    21  	// V1: adds the Flags uint32 word
    22  	V1
    23  
    24  	// V2: removes unused legacy fields and supports type parameters for aliases.
    25  	// - remove the legacy "has init" bool from the public root
    26  	// - remove obj's "derived func instance" bool
    27  	// - add a TypeParamNames field to ObjAlias
    28  	// - remove derived info "needed" bool
    29  	V2
    30  
    31  	// V3: introduces a more compact format for composite literal element lists
    32  	// - negative lengths indicate that (some) elements may have keys
    33  	// - positive lengths indicate that no element has a key
    34  	// - a negative struct field index indicates an embedded field
    35  	V3
    36  
    37  	// V4: encodes generic methods as standalone function objects
    38  	V4
    39  
    40  	numVersions = iota
    41  )
    42  
    43  // Field denotes a unit of data in the serialized unified IR bitstream.
    44  // It is conceptually a like field in a structure.
    45  //
    46  // We only really need Fields when the data may or may not be present
    47  // in a stream based on the Version of the bitstream.
    48  //
    49  // Unlike much of pkgbits, Fields are not serialized and
    50  // can change values as needed.
    51  type Field int
    52  
    53  const (
    54  	// Flags in a uint32 in the header of a bitstream
    55  	// that is used to indicate whether optional features are enabled.
    56  	Flags Field = iota
    57  
    58  	// Deprecated: HasInit was a bool indicating whether a package
    59  	// has any init functions.
    60  	HasInit
    61  
    62  	// Deprecated: DerivedFuncInstance was a bool indicating
    63  	// whether an object was a function instance.
    64  	DerivedFuncInstance
    65  
    66  	// ObjAlias has a list of TypeParamNames.
    67  	AliasTypeParamNames
    68  
    69  	// Deprecated: DerivedInfoNeeded was a bool indicating
    70  	// whether a type was a derived type.
    71  	DerivedInfoNeeded
    72  
    73  	// Composite literals use a more compact format for element lists.
    74  	CompactCompLiterals
    75  
    76  	// Generic methods may appear as standalone function objects.
    77  	GenericMethods
    78  
    79  	numFields = iota
    80  )
    81  
    82  // introduced is the version a field was added.
    83  var introduced = [numFields]Version{
    84  	Flags:               V1,
    85  	AliasTypeParamNames: V2,
    86  	CompactCompLiterals: V3,
    87  	GenericMethods:      V4,
    88  }
    89  
    90  // removed is the version a field was removed in or 0 for fields
    91  // that have not yet been deprecated.
    92  // (So removed[f]-1 is the last version it is included in.)
    93  var removed = [numFields]Version{
    94  	HasInit:             V2,
    95  	DerivedFuncInstance: V2,
    96  	DerivedInfoNeeded:   V2,
    97  }
    98  
    99  // Has reports whether field f is present in a bitstream at version v.
   100  func (v Version) Has(f Field) bool {
   101  	return introduced[f] <= v && (v < removed[f] || removed[f] == V0)
   102  }
   103  

View as plain text