github.com/ugorji/go/codec@v1.2.13-0.20240307214044-07c54c229a5a/helper.go (about)

     1  // Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
     2  // Use of this source code is governed by a MIT license found in the LICENSE file.
     3  
     4  package codec
     5  
     6  // Contains code shared by both encode and decode.
     7  
     8  // Some shared ideas around encoding/decoding
     9  // ------------------------------------------
    10  //
    11  // If an interface{} is passed, we first do a type assertion to see if it is
    12  // a primitive type or a map/slice of primitive types, and use a fastpath to handle it.
    13  //
    14  // If we start with a reflect.Value, we are already in reflect.Value land and
    15  // will try to grab the function for the underlying Type and directly call that function.
    16  // This is more performant than calling reflect.Value.Interface().
    17  //
    18  // This still helps us bypass many layers of reflection, and give best performance.
    19  //
    20  // Containers
    21  // ------------
    22  // Containers in the stream are either associative arrays (key-value pairs) or
    23  // regular arrays (indexed by incrementing integers).
    24  //
    25  // Some streams support indefinite-length containers, and use a breaking
    26  // byte-sequence to denote that the container has come to an end.
    27  //
    28  // Some streams also are text-based, and use explicit separators to denote the
    29  // end/beginning of different values.
    30  //
    31  // Philosophy
    32  // ------------
    33  // On decode, this codec will update containers appropriately:
    34  //    - If struct, update fields from stream into fields of struct.
    35  //      If field in stream not found in struct, handle appropriately (based on option).
    36  //      If a struct field has no corresponding value in the stream, leave it AS IS.
    37  //      If nil in stream, set value to nil/zero value.
    38  //    - If map, update map from stream.
    39  //      If the stream value is NIL, set the map to nil.
    40  //    - if slice, try to update up to length of array in stream.
    41  //      if container len is less than stream array length,
    42  //      and container cannot be expanded, handled (based on option).
    43  //      This means you can decode 4-element stream array into 1-element array.
    44  //
    45  // ------------------------------------
    46  // On encode, user can specify omitEmpty. This means that the value will be omitted
    47  // if the zero value. The problem may occur during decode, where omitted values do not affect
    48  // the value being decoded into. This means that if decoding into a struct with an
    49  // int field with current value=5, and the field is omitted in the stream, then after
    50  // decoding, the value will still be 5 (not 0).
    51  // omitEmpty only works if you guarantee that you always decode into zero-values.
    52  //
    53  // ------------------------------------
    54  // We could have truncated a map to remove keys not available in the stream,
    55  // or set values in the struct which are not in the stream to their zero values.
    56  // We decided against it because there is no efficient way to do it.
    57  // We may introduce it as an option later.
    58  // However, that will require enabling it for both runtime and code generation modes.
    59  //
    60  // To support truncate, we need to do 2 passes over the container:
    61  //   map
    62  //   - first collect all keys (e.g. in k1)
    63  //   - for each key in stream, mark k1 that the key should not be removed
    64  //   - after updating map, do second pass and call delete for all keys in k1 which are not marked
    65  //   struct:
    66  //   - for each field, track the *typeInfo s1
    67  //   - iterate through all s1, and for each one not marked, set value to zero
    68  //   - this involves checking the possible anonymous fields which are nil ptrs.
    69  //     too much work.
    70  //
    71  // ------------------------------------------
    72  // Error Handling is done within the library using panic.
    73  //
    74  // This way, the code doesn't have to keep checking if an error has happened,
    75  // and we don't have to keep sending the error value along with each call
    76  // or storing it in the En|Decoder and checking it constantly along the way.
    77  //
    78  // We considered storing the error is En|Decoder.
    79  //   - once it has its err field set, it cannot be used again.
    80  //   - panicing will be optional, controlled by const flag.
    81  //   - code should always check error first and return early.
    82  //
    83  // We eventually decided against it as it makes the code clumsier to always
    84  // check for these error conditions.
    85  //
    86  // ------------------------------------------
    87  // We use sync.Pool only for the aid of long-lived objects shared across multiple goroutines.
    88  // Encoder, Decoder, enc|decDriver, reader|writer, etc do not fall into this bucket.
    89  //
    90  // Also, GC is much better now, eliminating some of the reasons to use a shared pool structure.
    91  // Instead, the short-lived objects use free-lists that live as long as the object exists.
    92  //
    93  // ------------------------------------------
    94  // Performance is affected by the following:
    95  //    - Bounds Checking
    96  //    - Inlining
    97  //    - Pointer chasing
    98  // This package tries hard to manage the performance impact of these.
    99  //
   100  // ------------------------------------------
   101  // To alleviate performance due to pointer-chasing:
   102  //    - Prefer non-pointer values in a struct field
   103  //    - Refer to these directly within helper classes
   104  //      e.g. json.go refers directly to d.d.decRd
   105  //
   106  // We made the changes to embed En/Decoder in en/decDriver,
   107  // but we had to explicitly reference the fields as opposed to using a function
   108  // to get the better performance that we were looking for.
   109  // For example, we explicitly call d.d.decRd.fn() instead of d.d.r().fn().
   110  //
   111  // ------------------------------------------
   112  // Bounds Checking
   113  //    - Allow bytesDecReader to incur "bounds check error", and recover that as an io error.
   114  //      This allows the bounds check branch to always be taken by the branch predictor,
   115  //      giving better performance (in theory), while ensuring that the code is shorter.
   116  //
   117  // ------------------------------------------
   118  // Escape Analysis
   119  //    - Prefer to return non-pointers if the value is used right away.
   120  //      Newly allocated values returned as pointers will be heap-allocated as they escape.
   121  //
   122  // Prefer functions and methods that
   123  //    - take no parameters and
   124  //    - return no results and
   125  //    - do not allocate.
   126  // These are optimized by the runtime.
   127  // For example, in json, we have dedicated functions for ReadMapElemKey, etc
   128  // which do not delegate to readDelim, as readDelim takes a parameter.
   129  // The difference in runtime was as much as 5%.
   130  //
   131  // ------------------------------------------
   132  // Handling Nil
   133  //   - In dynamic (reflection) mode, decodeValue and encodeValue handle nil at the top
   134  //   - Consequently, methods used with them as a parent in the chain e.g. kXXX
   135  //     methods do not handle nil.
   136  //   - Fastpath methods also do not handle nil.
   137  //     The switch called in (en|de)code(...) handles it so the dependent calls don't have to.
   138  //   - codecgen will handle nil before calling into the library for further work also.
   139  //
   140  // ------------------------------------------
   141  // Passing reflect.Kind to functions that take a reflect.Value
   142  //   - Note that reflect.Value.Kind() is very cheap, as its fundamentally a binary AND of 2 numbers
   143  //
   144  // ------------------------------------------
   145  // Transient values during decoding
   146  //
   147  // With reflection, the stack is not used. Consequently, values which may be stack-allocated in
   148  // normal use will cause a heap allocation when using reflection.
   149  //
   150  // There are cases where we know that a value is transient, and we just need to decode into it
   151  // temporarily so we can right away use its value for something else.
   152  //
   153  // In these situations, we can elide the heap allocation by being deliberate with use of a pre-cached
   154  // scratch memory or scratch value.
   155  //
   156  // We use this for situations:
   157  // - decode into a temp value x, and then set x into an interface
   158  // - decode into a temp value, for use as a map key, to lookup up a map value
   159  // - decode into a temp value, for use as a map value, to set into a map
   160  // - decode into a temp value, for sending into a channel
   161  //
   162  // By definition, Transient values are NEVER pointer-shaped values,
   163  // like pointer, func, map, chan. Using transient for pointer-shaped values
   164  // can lead to data corruption when GC tries to follow what it saw as a pointer at one point.
   165  //
   166  // In general, transient values are values which can be decoded as an atomic value
   167  // using a single call to the decDriver. This naturally includes bool or numeric types.
   168  //
   169  // Note that some values which "contain" pointers, specifically string and slice,
   170  // can also be transient. In the case of string, it is decoded as an atomic value.
   171  // In the case of a slice, decoding into its elements always uses an addressable
   172  // value in memory ie we grow the slice, and then decode directly into the memory
   173  // address corresponding to that index in the slice.
   174  //
   175  // To handle these string and slice values, we have to use a scratch value
   176  // which has the same shape of a string or slice.
   177  //
   178  // Consequently, the full range of types which can be transient is:
   179  // - numbers
   180  // - bool
   181  // - string
   182  // - slice
   183  //
   184  // and whbut we MUST use a scratch space with that element
   185  // being defined as an unsafe.Pointer to start with.
   186  //
   187  // We have to be careful with maps. Because we iterate map keys and values during a range,
   188  // we must have 2 variants of the scratch space/value for maps and keys separately.
   189  //
   190  // These are the TransientAddrK and TransientAddr2K methods of decPerType.
   191  
   192  import (
   193  	"encoding"
   194  	"encoding/binary"
   195  	"errors"
   196  	"fmt"
   197  	"io"
   198  	"math"
   199  	"reflect"
   200  	"runtime"
   201  	"sort"
   202  	"strconv"
   203  	"strings"
   204  	"sync"
   205  	"sync/atomic"
   206  	"time"
   207  	"unicode/utf8"
   208  )
   209  
   210  // if debugging is true, then
   211  //   - within Encode/Decode, do not recover from panic's
   212  //   - etc
   213  //
   214  // Note: Negative tests that check for errors will fail, so only use this
   215  // when debugging, and run only one test at a time preferably.
   216  //
   217  // Note: RPC tests depend on getting the error from an Encode/Decode call.
   218  // Consequently, they will always fail if debugging = true.
   219  const debugging = false
   220  
   221  const (
   222  	// containerLenUnknown is length returned from Read(Map|Array)Len
   223  	// when a format doesn't know apiori.
   224  	// For example, json doesn't pre-determine the length of a container (sequence/map).
   225  	containerLenUnknown = -1
   226  
   227  	// containerLenNil is length returned from Read(Map|Array)Len
   228  	// when a 'nil' was encountered in the stream.
   229  	containerLenNil = math.MinInt32
   230  
   231  	// [N]byte is handled by converting to []byte first,
   232  	// and sending to the dedicated fast-path function for []byte.
   233  	//
   234  	// Code exists in case our understanding is wrong.
   235  	// keep the defensive code behind this flag, so we can remove/hide it if needed.
   236  	// For now, we enable the defensive code (ie set it to true).
   237  	handleBytesWithinKArray = true
   238  
   239  	// Support encoding.(Binary|Text)(Unm|M)arshaler.
   240  	// This constant flag will enable or disable it.
   241  	supportMarshalInterfaces = true
   242  
   243  	// bytesFreeListNoCache is used for debugging, when we want to skip using a cache of []byte.
   244  	bytesFreeListNoCache = false
   245  
   246  	// size of the cacheline: defaulting to value for archs: amd64, arm64, 386
   247  	// should use "runtime/internal/sys".CacheLineSize, but that is not exposed.
   248  	cacheLineSize = 64
   249  
   250  	wordSizeBits = 32 << (^uint(0) >> 63) // strconv.IntSize
   251  	wordSize     = wordSizeBits / 8
   252  
   253  	// MARKER: determines whether to skip calling fastpath(En|De)codeTypeSwitch.
   254  	// Calling the fastpath switch in encode() or decode() could be redundant,
   255  	// as we still have to introspect it again within fnLoad
   256  	// to determine the function to use for values of that type.
   257  	skipFastpathTypeSwitchInDirectCall = false
   258  )
   259  
   260  const cpu32Bit = ^uint(0)>>32 == 0
   261  
   262  type rkind byte
   263  
   264  const (
   265  	rkindPtr    = rkind(reflect.Ptr)
   266  	rkindString = rkind(reflect.String)
   267  	rkindChan   = rkind(reflect.Chan)
   268  )
   269  
   270  type mapKeyFastKind uint8
   271  
   272  const (
   273  	mapKeyFastKind32 = iota + 1
   274  	mapKeyFastKind32ptr
   275  	mapKeyFastKind64
   276  	mapKeyFastKind64ptr
   277  	mapKeyFastKindStr
   278  )
   279  
   280  var (
   281  	// use a global mutex to ensure each Handle is initialized.
   282  	// We do this, so we don't have to store the basicHandle mutex
   283  	// directly in BasicHandle, so it can be shallow-copied.
   284  	handleInitMu sync.Mutex
   285  
   286  	must mustHdl
   287  	halt panicHdl
   288  
   289  	digitCharBitset      bitset256
   290  	numCharBitset        bitset256
   291  	whitespaceCharBitset bitset256
   292  	asciiAlphaNumBitset  bitset256
   293  
   294  	// numCharWithExpBitset64 bitset64
   295  	// numCharNoExpBitset64   bitset64
   296  	// whitespaceCharBitset64 bitset64
   297  	//
   298  	// // hasptrBitset sets bit for all kinds which always have internal pointers
   299  	// hasptrBitset bitset32
   300  
   301  	// refBitset sets bit for all kinds which are direct internal references
   302  	refBitset bitset32
   303  
   304  	// isnilBitset sets bit for all kinds which can be compared to nil
   305  	isnilBitset bitset32
   306  
   307  	// numBoolBitset sets bit for all number and bool kinds
   308  	numBoolBitset bitset32
   309  
   310  	// numBoolStrSliceBitset sets bits for all kinds which are numbers, bool, strings and slices
   311  	numBoolStrSliceBitset bitset32
   312  
   313  	// scalarBitset sets bit for all kinds which are scalars/primitives and thus immutable
   314  	scalarBitset bitset32
   315  
   316  	mapKeyFastKindVals [32]mapKeyFastKind
   317  
   318  	// codecgen is set to true by codecgen, so that tests, etc can use this information as needed.
   319  	codecgen bool
   320  
   321  	oneByteArr    [1]byte
   322  	zeroByteSlice = oneByteArr[:0:0]
   323  
   324  	eofReader devNullReader
   325  )
   326  
   327  var (
   328  	errMapTypeNotMapKind     = errors.New("MapType MUST be of Map Kind")
   329  	errSliceTypeNotSliceKind = errors.New("SliceType MUST be of Slice Kind")
   330  
   331  	errExtFnWriteExtUnsupported   = errors.New("BytesExt.WriteExt is not supported")
   332  	errExtFnReadExtUnsupported    = errors.New("BytesExt.ReadExt is not supported")
   333  	errExtFnConvertExtUnsupported = errors.New("InterfaceExt.ConvertExt is not supported")
   334  	errExtFnUpdateExtUnsupported  = errors.New("InterfaceExt.UpdateExt is not supported")
   335  
   336  	errPanicUndefined = errors.New("panic: undefined error")
   337  
   338  	errHandleInited = errors.New("cannot modify initialized Handle")
   339  
   340  	errNoFormatHandle = errors.New("no handle (cannot identify format)")
   341  )
   342  
   343  var pool4tiload = sync.Pool{
   344  	New: func() interface{} {
   345  		return &typeInfoLoad{
   346  			etypes:   make([]uintptr, 0, 4),
   347  			sfis:     make([]structFieldInfo, 0, 4),
   348  			sfiNames: make(map[string]uint16, 4),
   349  		}
   350  	},
   351  }
   352  
   353  func init() {
   354  	xx := func(f mapKeyFastKind, k ...reflect.Kind) {
   355  		for _, v := range k {
   356  			mapKeyFastKindVals[byte(v)&31] = f // 'v % 32' equal to 'v & 31'
   357  		}
   358  	}
   359  
   360  	var f mapKeyFastKind
   361  
   362  	f = mapKeyFastKind64
   363  	if wordSizeBits == 32 {
   364  		f = mapKeyFastKind32
   365  	}
   366  	xx(f, reflect.Int, reflect.Uint, reflect.Uintptr)
   367  
   368  	f = mapKeyFastKind64ptr
   369  	if wordSizeBits == 32 {
   370  		f = mapKeyFastKind32ptr
   371  	}
   372  	xx(f, reflect.Ptr)
   373  
   374  	xx(mapKeyFastKindStr, reflect.String)
   375  	xx(mapKeyFastKind32, reflect.Uint32, reflect.Int32, reflect.Float32)
   376  	xx(mapKeyFastKind64, reflect.Uint64, reflect.Int64, reflect.Float64)
   377  
   378  	numBoolBitset.
   379  		set(byte(reflect.Bool)).
   380  		set(byte(reflect.Int)).
   381  		set(byte(reflect.Int8)).
   382  		set(byte(reflect.Int16)).
   383  		set(byte(reflect.Int32)).
   384  		set(byte(reflect.Int64)).
   385  		set(byte(reflect.Uint)).
   386  		set(byte(reflect.Uint8)).
   387  		set(byte(reflect.Uint16)).
   388  		set(byte(reflect.Uint32)).
   389  		set(byte(reflect.Uint64)).
   390  		set(byte(reflect.Uintptr)).
   391  		set(byte(reflect.Float32)).
   392  		set(byte(reflect.Float64)).
   393  		set(byte(reflect.Complex64)).
   394  		set(byte(reflect.Complex128))
   395  
   396  	numBoolStrSliceBitset = numBoolBitset
   397  
   398  	numBoolStrSliceBitset.
   399  		set(byte(reflect.String)).
   400  		set(byte(reflect.Slice))
   401  
   402  	scalarBitset = numBoolBitset
   403  
   404  	scalarBitset.
   405  		set(byte(reflect.String))
   406  
   407  	// MARKER: reflect.Array is not a scalar, as its contents can be modified.
   408  
   409  	refBitset.
   410  		set(byte(reflect.Map)).
   411  		set(byte(reflect.Ptr)).
   412  		set(byte(reflect.Func)).
   413  		set(byte(reflect.Chan)).
   414  		set(byte(reflect.UnsafePointer))
   415  
   416  	isnilBitset = refBitset
   417  
   418  	isnilBitset.
   419  		set(byte(reflect.Interface)).
   420  		set(byte(reflect.Slice))
   421  
   422  	// hasptrBitset = isnilBitset
   423  	//
   424  	// hasptrBitset.
   425  	// 	set(byte(reflect.String))
   426  
   427  	for i := byte(0); i <= utf8.RuneSelf; i++ {
   428  		if (i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z') {
   429  			asciiAlphaNumBitset.set(i)
   430  		}
   431  		switch i {
   432  		case ' ', '\t', '\r', '\n':
   433  			whitespaceCharBitset.set(i)
   434  		case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
   435  			digitCharBitset.set(i)
   436  			numCharBitset.set(i)
   437  		case '.', '+', '-':
   438  			numCharBitset.set(i)
   439  		case 'e', 'E':
   440  			numCharBitset.set(i)
   441  		}
   442  	}
   443  }
   444  
   445  // driverStateManager supports the runtime state of an (enc|dec)Driver.
   446  //
   447  // During a side(En|De)code call, we can capture the state, reset it,
   448  // and then restore it later to continue the primary encoding/decoding.
   449  type driverStateManager interface {
   450  	resetState()
   451  	captureState() interface{}
   452  	restoreState(state interface{})
   453  }
   454  
   455  type bdAndBdread struct {
   456  	bdRead bool
   457  	bd     byte
   458  }
   459  
   460  func (x bdAndBdread) captureState() interface{}   { return x }
   461  func (x *bdAndBdread) resetState()                { x.bd, x.bdRead = 0, false }
   462  func (x *bdAndBdread) reset()                     { x.resetState() }
   463  func (x *bdAndBdread) restoreState(v interface{}) { *x = v.(bdAndBdread) }
   464  
   465  type clsErr struct {
   466  	err    error // error on closing
   467  	closed bool  // is it closed?
   468  }
   469  
   470  type charEncoding uint8
   471  
   472  const (
   473  	_ charEncoding = iota // make 0 unset
   474  	cUTF8
   475  	cUTF16LE
   476  	cUTF16BE
   477  	cUTF32LE
   478  	cUTF32BE
   479  	// Deprecated: not a true char encoding value
   480  	cRAW charEncoding = 255
   481  )
   482  
   483  // valueType is the stream type
   484  type valueType uint8
   485  
   486  const (
   487  	valueTypeUnset valueType = iota
   488  	valueTypeNil
   489  	valueTypeInt
   490  	valueTypeUint
   491  	valueTypeFloat
   492  	valueTypeBool
   493  	valueTypeString
   494  	valueTypeSymbol
   495  	valueTypeBytes
   496  	valueTypeMap
   497  	valueTypeArray
   498  	valueTypeTime
   499  	valueTypeExt
   500  
   501  	// valueTypeInvalid = 0xff
   502  )
   503  
   504  var valueTypeStrings = [...]string{
   505  	"Unset",
   506  	"Nil",
   507  	"Int",
   508  	"Uint",
   509  	"Float",
   510  	"Bool",
   511  	"String",
   512  	"Symbol",
   513  	"Bytes",
   514  	"Map",
   515  	"Array",
   516  	"Timestamp",
   517  	"Ext",
   518  }
   519  
   520  func (x valueType) String() string {
   521  	if int(x) < len(valueTypeStrings) {
   522  		return valueTypeStrings[x]
   523  	}
   524  	return strconv.FormatInt(int64(x), 10)
   525  }
   526  
   527  // note that containerMapStart and containerArraySend are not sent.
   528  // This is because the ReadXXXStart and EncodeXXXStart already does these.
   529  type containerState uint8
   530  
   531  const (
   532  	_ containerState = iota
   533  
   534  	containerMapStart
   535  	containerMapKey
   536  	containerMapValue
   537  	containerMapEnd
   538  	containerArrayStart
   539  	containerArrayElem
   540  	containerArrayEnd
   541  )
   542  
   543  // do not recurse if a containing type refers to an embedded type
   544  // which refers back to its containing type (via a pointer).
   545  // The second time this back-reference happens, break out,
   546  // so as not to cause an infinite loop.
   547  const rgetMaxRecursion = 2
   548  
   549  // fauxUnion is used to keep track of the primitives decoded.
   550  //
   551  // Without it, we would have to decode each primitive and wrap it
   552  // in an interface{}, causing an allocation.
   553  // In this model, the primitives are decoded in a "pseudo-atomic" fashion,
   554  // so we can rest assured that no other decoding happens while these
   555  // primitives are being decoded.
   556  //
   557  // maps and arrays are not handled by this mechanism.
   558  type fauxUnion struct {
   559  	// r RawExt // used for RawExt, uint, []byte.
   560  
   561  	// primitives below
   562  	u uint64
   563  	i int64
   564  	f float64
   565  	l []byte
   566  	s string
   567  
   568  	// ---- cpu cache line boundary?
   569  	t time.Time
   570  	b bool
   571  
   572  	// state
   573  	v valueType
   574  }
   575  
   576  // typeInfoLoad is a transient object used while loading up a typeInfo.
   577  type typeInfoLoad struct {
   578  	etypes   []uintptr
   579  	sfis     []structFieldInfo
   580  	sfiNames map[string]uint16
   581  }
   582  
   583  func (x *typeInfoLoad) reset() {
   584  	x.etypes = x.etypes[:0]
   585  	x.sfis = x.sfis[:0]
   586  	for k := range x.sfiNames { // optimized to zero the map
   587  		delete(x.sfiNames, k)
   588  	}
   589  }
   590  
   591  // mirror json.Marshaler and json.Unmarshaler here,
   592  // so we don't import the encoding/json package
   593  
   594  type jsonMarshaler interface {
   595  	MarshalJSON() ([]byte, error)
   596  }
   597  type jsonUnmarshaler interface {
   598  	UnmarshalJSON([]byte) error
   599  }
   600  
   601  type isZeroer interface {
   602  	IsZero() bool
   603  }
   604  
   605  type isCodecEmptyer interface {
   606  	IsCodecEmpty() bool
   607  }
   608  
   609  type codecError struct {
   610  	err    error
   611  	name   string
   612  	pos    int
   613  	encode bool
   614  }
   615  
   616  func (e *codecError) Cause() error {
   617  	return e.err
   618  }
   619  
   620  func (e *codecError) Unwrap() error {
   621  	return e.err
   622  }
   623  
   624  func (e *codecError) Error() string {
   625  	if e.encode {
   626  		return fmt.Sprintf("%s encode error: %v", e.name, e.err)
   627  	}
   628  	return fmt.Sprintf("%s decode error [pos %d]: %v", e.name, e.pos, e.err)
   629  }
   630  
   631  func wrapCodecErr(in error, name string, numbytesread int, encode bool) (out error) {
   632  	x, ok := in.(*codecError)
   633  	if ok && x.pos == numbytesread && x.name == name && x.encode == encode {
   634  		return in
   635  	}
   636  	return &codecError{in, name, numbytesread, encode}
   637  }
   638  
   639  var (
   640  	bigen bigenHelper
   641  
   642  	bigenstd = binary.BigEndian
   643  
   644  	structInfoFieldName = "_struct"
   645  
   646  	mapStrIntfTyp  = reflect.TypeOf(map[string]interface{}(nil))
   647  	mapIntfIntfTyp = reflect.TypeOf(map[interface{}]interface{}(nil))
   648  	intfSliceTyp   = reflect.TypeOf([]interface{}(nil))
   649  	intfTyp        = intfSliceTyp.Elem()
   650  
   651  	reflectValTyp = reflect.TypeOf((*reflect.Value)(nil)).Elem()
   652  
   653  	stringTyp     = reflect.TypeOf("")
   654  	timeTyp       = reflect.TypeOf(time.Time{})
   655  	rawExtTyp     = reflect.TypeOf(RawExt{})
   656  	rawTyp        = reflect.TypeOf(Raw{})
   657  	uintptrTyp    = reflect.TypeOf(uintptr(0))
   658  	uint8Typ      = reflect.TypeOf(uint8(0))
   659  	uint8SliceTyp = reflect.TypeOf([]uint8(nil))
   660  	uintTyp       = reflect.TypeOf(uint(0))
   661  	intTyp        = reflect.TypeOf(int(0))
   662  
   663  	mapBySliceTyp = reflect.TypeOf((*MapBySlice)(nil)).Elem()
   664  
   665  	binaryMarshalerTyp   = reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem()
   666  	binaryUnmarshalerTyp = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem()
   667  
   668  	textMarshalerTyp   = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
   669  	textUnmarshalerTyp = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
   670  
   671  	jsonMarshalerTyp   = reflect.TypeOf((*jsonMarshaler)(nil)).Elem()
   672  	jsonUnmarshalerTyp = reflect.TypeOf((*jsonUnmarshaler)(nil)).Elem()
   673  
   674  	selferTyp                = reflect.TypeOf((*Selfer)(nil)).Elem()
   675  	missingFielderTyp        = reflect.TypeOf((*MissingFielder)(nil)).Elem()
   676  	iszeroTyp                = reflect.TypeOf((*isZeroer)(nil)).Elem()
   677  	isCodecEmptyerTyp        = reflect.TypeOf((*isCodecEmptyer)(nil)).Elem()
   678  	isSelferViaCodecgenerTyp = reflect.TypeOf((*isSelferViaCodecgener)(nil)).Elem()
   679  
   680  	uint8TypId      = rt2id(uint8Typ)
   681  	uint8SliceTypId = rt2id(uint8SliceTyp)
   682  	rawExtTypId     = rt2id(rawExtTyp)
   683  	rawTypId        = rt2id(rawTyp)
   684  	intfTypId       = rt2id(intfTyp)
   685  	timeTypId       = rt2id(timeTyp)
   686  	stringTypId     = rt2id(stringTyp)
   687  
   688  	mapStrIntfTypId  = rt2id(mapStrIntfTyp)
   689  	mapIntfIntfTypId = rt2id(mapIntfIntfTyp)
   690  	intfSliceTypId   = rt2id(intfSliceTyp)
   691  	// mapBySliceTypId  = rt2id(mapBySliceTyp)
   692  
   693  	intBitsize  = uint8(intTyp.Bits())
   694  	uintBitsize = uint8(uintTyp.Bits())
   695  
   696  	// bsAll0x00 = []byte{0, 0, 0, 0, 0, 0, 0, 0}
   697  	bsAll0xff = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
   698  
   699  	chkOvf checkOverflow
   700  )
   701  
   702  var defTypeInfos = NewTypeInfos([]string{"codec", "json"})
   703  
   704  // SelfExt is a sentinel extension signifying that types
   705  // registered with it SHOULD be encoded and decoded
   706  // based on the native mode of the format.
   707  //
   708  // This allows users to define a tag for an extension,
   709  // but signify that the types should be encoded/decoded as the native encoding.
   710  // This way, users need not also define how to encode or decode the extension.
   711  var SelfExt = &extFailWrapper{}
   712  
   713  // Selfer defines methods by which a value can encode or decode itself.
   714  //
   715  // Any type which implements Selfer will be able to encode or decode itself.
   716  // Consequently, during (en|de)code, this takes precedence over
   717  // (text|binary)(M|Unm)arshal or extension support.
   718  //
   719  // By definition, it is not allowed for a Selfer to directly call Encode or Decode on itself.
   720  // If that is done, Encode/Decode will rightfully fail with a Stack Overflow style error.
   721  // For example, the snippet below will cause such an error.
   722  //
   723  //	type testSelferRecur struct{}
   724  //	func (s *testSelferRecur) CodecEncodeSelf(e *Encoder) { e.MustEncode(s) }
   725  //	func (s *testSelferRecur) CodecDecodeSelf(d *Decoder) { d.MustDecode(s) }
   726  //
   727  // Note: *the first set of bytes of any value MUST NOT represent nil in the format*.
   728  // This is because, during each decode, we first check the the next set of bytes
   729  // represent nil, and if so, we just set the value to nil.
   730  type Selfer interface {
   731  	CodecEncodeSelf(*Encoder)
   732  	CodecDecodeSelf(*Decoder)
   733  }
   734  
   735  type isSelferViaCodecgener interface {
   736  	codecSelferViaCodecgen()
   737  }
   738  
   739  // MissingFielder defines the interface allowing structs to internally decode or encode
   740  // values which do not map to struct fields.
   741  //
   742  // We expect that this interface is bound to a pointer type (so the mutation function works).
   743  //
   744  // A use-case is if a version of a type unexports a field, but you want compatibility between
   745  // both versions during encoding and decoding.
   746  //
   747  // Note that the interface is completely ignored during codecgen.
   748  type MissingFielder interface {
   749  	// CodecMissingField is called to set a missing field and value pair.
   750  	//
   751  	// It returns true if the missing field was set on the struct.
   752  	CodecMissingField(field []byte, value interface{}) bool
   753  
   754  	// CodecMissingFields returns the set of fields which are not struct fields.
   755  	//
   756  	// Note that the returned map may be mutated by the caller.
   757  	CodecMissingFields() map[string]interface{}
   758  }
   759  
   760  // MapBySlice is a tag interface that denotes the slice or array value should encode as a map
   761  // in the stream, and can be decoded from a map in the stream.
   762  //
   763  // The slice or array must contain a sequence of key-value pairs.
   764  // The length of the slice or array must be even (fully divisible by 2).
   765  //
   766  // This affords storing a map in a specific sequence in the stream.
   767  //
   768  // Example usage:
   769  //
   770  //	type T1 []string         // or []int or []Point or any other "slice" type
   771  //	func (_ T1) MapBySlice{} // T1 now implements MapBySlice, and will be encoded as a map
   772  //	type T2 struct { KeyValues T1 }
   773  //
   774  //	var kvs = []string{"one", "1", "two", "2", "three", "3"}
   775  //	var v2 = T2{ KeyValues: T1(kvs) }
   776  //	// v2 will be encoded like the map: {"KeyValues": {"one": "1", "two": "2", "three": "3"} }
   777  //
   778  // The support of MapBySlice affords the following:
   779  //   - A slice or array type which implements MapBySlice will be encoded as a map
   780  //   - A slice can be decoded from a map in the stream
   781  type MapBySlice interface {
   782  	MapBySlice()
   783  }
   784  
   785  // basicHandleRuntimeState holds onto all BasicHandle runtime and cached config information.
   786  //
   787  // Storing this outside BasicHandle allows us create shallow copies of a Handle,
   788  // which can be used e.g. when we need to modify config fields temporarily.
   789  // Shallow copies are used within tests, so we can modify some config fields for a test
   790  // temporarily when running tests in parallel, without running the risk that a test executing
   791  // in parallel with other tests does not see a transient modified values not meant for it.
   792  type basicHandleRuntimeState struct {
   793  	// these are used during runtime.
   794  	// At init time, they should have nothing in them.
   795  	rtidFns      atomicRtidFnSlice
   796  	rtidFnsNoExt atomicRtidFnSlice
   797  
   798  	// Note: basicHandleRuntimeState is not comparable, due to these slices here (extHandle, intf2impls).
   799  	// If *[]T is used instead, this becomes comparable, at the cost of extra indirection.
   800  	// Thses slices are used all the time, so keep as slices (not pointers).
   801  
   802  	extHandle
   803  
   804  	intf2impls
   805  
   806  	mu sync.Mutex
   807  
   808  	jsonHandle   bool
   809  	binaryHandle bool
   810  
   811  	// timeBuiltin is initialized from TimeNotBuiltin, and used internally.
   812  	// once initialized, it cannot be changed, as the function for encoding/decoding time.Time
   813  	// will have been cached and the TimeNotBuiltin value will not be consulted thereafter.
   814  	timeBuiltin bool
   815  	_           bool // padding
   816  }
   817  
   818  // BasicHandle encapsulates the common options and extension functions.
   819  //
   820  // Deprecated: DO NOT USE DIRECTLY. EXPORTED FOR GODOC BENEFIT. WILL BE REMOVED.
   821  type BasicHandle struct {
   822  	// BasicHandle is always a part of a different type.
   823  	// It doesn't have to fit into it own cache lines.
   824  
   825  	// TypeInfos is used to get the type info for any type.
   826  	//
   827  	// If not configured, the default TypeInfos is used, which uses struct tag keys: codec, json
   828  	TypeInfos *TypeInfos
   829  
   830  	*basicHandleRuntimeState
   831  
   832  	// ---- cache line
   833  
   834  	DecodeOptions
   835  
   836  	// ---- cache line
   837  
   838  	EncodeOptions
   839  
   840  	RPCOptions
   841  
   842  	// TimeNotBuiltin configures whether time.Time should be treated as a builtin type.
   843  	//
   844  	// All Handlers should know how to encode/decode time.Time as part of the core
   845  	// format specification, or as a standard extension defined by the format.
   846  	//
   847  	// However, users can elect to handle time.Time as a custom extension, or via the
   848  	// standard library's encoding.Binary(M|Unm)arshaler or Text(M|Unm)arshaler interface.
   849  	// To elect this behavior, users can set TimeNotBuiltin=true.
   850  	//
   851  	// Note: Setting TimeNotBuiltin=true can be used to enable the legacy behavior
   852  	// (for Cbor and Msgpack), where time.Time was not a builtin supported type.
   853  	//
   854  	// Note: DO NOT CHANGE AFTER FIRST USE.
   855  	//
   856  	// Once a Handle has been initialized (used), do not modify this option. It will be ignored.
   857  	TimeNotBuiltin bool
   858  
   859  	// ExplicitRelease is ignored and has no effect.
   860  	//
   861  	// Deprecated: Pools are only used for long-lived objects shared across goroutines.
   862  	// It is maintained for backward compatibility.
   863  	ExplicitRelease bool
   864  
   865  	// ---- cache line
   866  	inited uint32 // holds if inited, and also handle flags (binary encoding, json handler, etc)
   867  
   868  }
   869  
   870  // initHandle does a one-time initialization of the handle.
   871  // After this is run, do not modify the Handle, as some modifications are ignored
   872  // e.g. extensions, registered interfaces, TimeNotBuiltIn, etc
   873  func initHandle(hh Handle) {
   874  	x := hh.getBasicHandle()
   875  
   876  	// MARKER: We need to simulate once.Do, to ensure no data race within the block.
   877  	// Consequently, below would not work.
   878  	//
   879  	// if atomic.CompareAndSwapUint32(&x.inited, 0, 1) {
   880  	// 	x.be = hh.isBinary()
   881  	// 	x.js = hh.isJson
   882  	// 	x.n = hh.Name()[0]
   883  	// }
   884  
   885  	// simulate once.Do using our own stored flag and mutex as a CompareAndSwap
   886  	// is not sufficient, since a race condition can occur within init(Handle) function.
   887  	// init is made noinline, so that this function can be inlined by its caller.
   888  	if atomic.LoadUint32(&x.inited) == 0 {
   889  		x.initHandle(hh)
   890  	}
   891  }
   892  
   893  func (x *BasicHandle) basicInit() {
   894  	x.rtidFns.store(nil)
   895  	x.rtidFnsNoExt.store(nil)
   896  	x.timeBuiltin = !x.TimeNotBuiltin
   897  }
   898  
   899  func (x *BasicHandle) init() {}
   900  
   901  func (x *BasicHandle) isInited() bool {
   902  	return atomic.LoadUint32(&x.inited) != 0
   903  }
   904  
   905  // clearInited: DANGEROUS - only use in testing, etc
   906  func (x *BasicHandle) clearInited() {
   907  	atomic.StoreUint32(&x.inited, 0)
   908  }
   909  
   910  // TimeBuiltin returns whether time.Time OOTB support is used,
   911  // based on the initial configuration of TimeNotBuiltin
   912  func (x *basicHandleRuntimeState) TimeBuiltin() bool {
   913  	return x.timeBuiltin
   914  }
   915  
   916  func (x *basicHandleRuntimeState) isJs() bool {
   917  	return x.jsonHandle
   918  }
   919  
   920  func (x *basicHandleRuntimeState) isBe() bool {
   921  	return x.binaryHandle
   922  }
   923  
   924  func (x *basicHandleRuntimeState) setExt(rt reflect.Type, tag uint64, ext Ext) (err error) {
   925  	rk := rt.Kind()
   926  	for rk == reflect.Ptr {
   927  		rt = rt.Elem()
   928  		rk = rt.Kind()
   929  	}
   930  
   931  	if rt.PkgPath() == "" || rk == reflect.Interface { // || rk == reflect.Ptr {
   932  		return fmt.Errorf("codec.Handle.SetExt: Takes named type, not a pointer or interface: %v", rt)
   933  	}
   934  
   935  	rtid := rt2id(rt)
   936  	// handle all natively supported type appropriately, so they cannot have an extension.
   937  	// However, we do not return an error for these, as we do not document that.
   938  	// Instead, we silently treat as a no-op, and return.
   939  	switch rtid {
   940  	case rawTypId, rawExtTypId:
   941  		return
   942  	case timeTypId:
   943  		if x.timeBuiltin {
   944  			return
   945  		}
   946  	}
   947  
   948  	for i := range x.extHandle {
   949  		v := &x.extHandle[i]
   950  		if v.rtid == rtid {
   951  			v.tag, v.ext = tag, ext
   952  			return
   953  		}
   954  	}
   955  	rtidptr := rt2id(reflect.PtrTo(rt))
   956  	x.extHandle = append(x.extHandle, extTypeTagFn{rtid, rtidptr, rt, tag, ext})
   957  	return
   958  }
   959  
   960  // initHandle should be called only from codec.initHandle global function.
   961  // make it uninlineable, as it is called at most once for each handle.
   962  //
   963  //go:noinline
   964  func (x *BasicHandle) initHandle(hh Handle) {
   965  	handleInitMu.Lock()
   966  	defer handleInitMu.Unlock() // use defer, as halt may panic below
   967  	if x.inited == 0 {
   968  		if x.basicHandleRuntimeState == nil {
   969  			x.basicHandleRuntimeState = new(basicHandleRuntimeState)
   970  		}
   971  		x.jsonHandle = hh.isJson()
   972  		x.binaryHandle = hh.isBinary()
   973  		// ensure MapType and SliceType are of correct type
   974  		if x.MapType != nil && x.MapType.Kind() != reflect.Map {
   975  			halt.onerror(errMapTypeNotMapKind)
   976  		}
   977  		if x.SliceType != nil && x.SliceType.Kind() != reflect.Slice {
   978  			halt.onerror(errSliceTypeNotSliceKind)
   979  		}
   980  		x.basicInit()
   981  		hh.init()
   982  		atomic.StoreUint32(&x.inited, 1)
   983  	}
   984  }
   985  
   986  func (x *BasicHandle) getBasicHandle() *BasicHandle {
   987  	return x
   988  }
   989  
   990  func (x *BasicHandle) typeInfos() *TypeInfos {
   991  	if x.TypeInfos != nil {
   992  		return x.TypeInfos
   993  	}
   994  	return defTypeInfos
   995  }
   996  
   997  func (x *BasicHandle) getTypeInfo(rtid uintptr, rt reflect.Type) (pti *typeInfo) {
   998  	return x.typeInfos().get(rtid, rt)
   999  }
  1000  
  1001  func findRtidFn(s []codecRtidFn, rtid uintptr) (i uint, fn *codecFn) {
  1002  	// binary search. adapted from sort/search.go.
  1003  	// Note: we use goto (instead of for loop) so this can be inlined.
  1004  
  1005  	// h, i, j := 0, 0, len(s)
  1006  	var h uint // var h, i uint
  1007  	var j = uint(len(s))
  1008  LOOP:
  1009  	if i < j {
  1010  		h = (i + j) >> 1 // avoid overflow when computing h // h = i + (j-i)/2
  1011  		if s[h].rtid < rtid {
  1012  			i = h + 1
  1013  		} else {
  1014  			j = h
  1015  		}
  1016  		goto LOOP
  1017  	}
  1018  	if i < uint(len(s)) && s[i].rtid == rtid {
  1019  		fn = s[i].fn
  1020  	}
  1021  	return
  1022  }
  1023  
  1024  func (x *BasicHandle) fn(rt reflect.Type) (fn *codecFn) {
  1025  	return x.fnVia(rt, x.typeInfos(), &x.rtidFns, x.CheckCircularRef, true)
  1026  }
  1027  
  1028  func (x *BasicHandle) fnNoExt(rt reflect.Type) (fn *codecFn) {
  1029  	return x.fnVia(rt, x.typeInfos(), &x.rtidFnsNoExt, x.CheckCircularRef, false)
  1030  }
  1031  
  1032  func (x *basicHandleRuntimeState) fnVia(rt reflect.Type, tinfos *TypeInfos, fs *atomicRtidFnSlice, checkCircularRef, checkExt bool) (fn *codecFn) {
  1033  	rtid := rt2id(rt)
  1034  	sp := fs.load()
  1035  	if sp != nil {
  1036  		if _, fn = findRtidFn(sp, rtid); fn != nil {
  1037  			return
  1038  		}
  1039  	}
  1040  
  1041  	fn = x.fnLoad(rt, rtid, tinfos, checkCircularRef, checkExt)
  1042  	x.mu.Lock()
  1043  	sp = fs.load()
  1044  	// since this is an atomic load/store, we MUST use a different array each time,
  1045  	// else we have a data race when a store is happening simultaneously with a findRtidFn call.
  1046  	if sp == nil {
  1047  		sp = []codecRtidFn{{rtid, fn}}
  1048  		fs.store(sp)
  1049  	} else {
  1050  		idx, fn2 := findRtidFn(sp, rtid)
  1051  		if fn2 == nil {
  1052  			sp2 := make([]codecRtidFn, len(sp)+1)
  1053  			copy(sp2[idx+1:], sp[idx:])
  1054  			copy(sp2, sp[:idx])
  1055  			sp2[idx] = codecRtidFn{rtid, fn}
  1056  			fs.store(sp2)
  1057  		}
  1058  	}
  1059  	x.mu.Unlock()
  1060  	return
  1061  }
  1062  
  1063  func fnloadFastpathUnderlying(ti *typeInfo) (f *fastpathE, u reflect.Type) {
  1064  	var rtid uintptr
  1065  	var idx int
  1066  	rtid = rt2id(ti.fastpathUnderlying)
  1067  	idx = fastpathAvIndex(rtid)
  1068  	if idx == -1 {
  1069  		return
  1070  	}
  1071  	f = &fastpathAv[idx]
  1072  	if uint8(reflect.Array) == ti.kind {
  1073  		u = reflectArrayOf(ti.rt.Len(), ti.elem)
  1074  	} else {
  1075  		u = f.rt
  1076  	}
  1077  	return
  1078  }
  1079  
  1080  func (x *basicHandleRuntimeState) fnLoad(rt reflect.Type, rtid uintptr, tinfos *TypeInfos, checkCircularRef, checkExt bool) (fn *codecFn) {
  1081  	fn = new(codecFn)
  1082  	fi := &(fn.i)
  1083  	ti := tinfos.get(rtid, rt)
  1084  	fi.ti = ti
  1085  	rk := reflect.Kind(ti.kind)
  1086  
  1087  	// anything can be an extension except the built-in ones: time, raw and rawext.
  1088  	// ensure we check for these types, then if extension, before checking if
  1089  	// it implementes one of the pre-declared interfaces.
  1090  
  1091  	fi.addrDf = true
  1092  	// fi.addrEf = true
  1093  
  1094  	if rtid == timeTypId && x.timeBuiltin {
  1095  		fn.fe = (*Encoder).kTime
  1096  		fn.fd = (*Decoder).kTime
  1097  	} else if rtid == rawTypId {
  1098  		fn.fe = (*Encoder).raw
  1099  		fn.fd = (*Decoder).raw
  1100  	} else if rtid == rawExtTypId {
  1101  		fn.fe = (*Encoder).rawExt
  1102  		fn.fd = (*Decoder).rawExt
  1103  		fi.addrD = true
  1104  		fi.addrE = true
  1105  	} else if xfFn := x.getExt(rtid, checkExt); xfFn != nil {
  1106  		fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext
  1107  		fn.fe = (*Encoder).ext
  1108  		fn.fd = (*Decoder).ext
  1109  		fi.addrD = true
  1110  		if rk == reflect.Struct || rk == reflect.Array {
  1111  			fi.addrE = true
  1112  		}
  1113  	} else if (ti.flagSelfer || ti.flagSelferPtr) &&
  1114  		!(checkCircularRef && ti.flagSelferViaCodecgen && ti.kind == byte(reflect.Struct)) {
  1115  		// do not use Selfer generated by codecgen if it is a struct and CheckCircularRef=true
  1116  		fn.fe = (*Encoder).selferMarshal
  1117  		fn.fd = (*Decoder).selferUnmarshal
  1118  		fi.addrD = ti.flagSelferPtr
  1119  		fi.addrE = ti.flagSelferPtr
  1120  	} else if supportMarshalInterfaces && x.isBe() &&
  1121  		(ti.flagBinaryMarshaler || ti.flagBinaryMarshalerPtr) &&
  1122  		(ti.flagBinaryUnmarshaler || ti.flagBinaryUnmarshalerPtr) {
  1123  		fn.fe = (*Encoder).binaryMarshal
  1124  		fn.fd = (*Decoder).binaryUnmarshal
  1125  		fi.addrD = ti.flagBinaryUnmarshalerPtr
  1126  		fi.addrE = ti.flagBinaryMarshalerPtr
  1127  	} else if supportMarshalInterfaces && !x.isBe() && x.isJs() &&
  1128  		(ti.flagJsonMarshaler || ti.flagJsonMarshalerPtr) &&
  1129  		(ti.flagJsonUnmarshaler || ti.flagJsonUnmarshalerPtr) {
  1130  		//If JSON, we should check JSONMarshal before textMarshal
  1131  		fn.fe = (*Encoder).jsonMarshal
  1132  		fn.fd = (*Decoder).jsonUnmarshal
  1133  		fi.addrD = ti.flagJsonUnmarshalerPtr
  1134  		fi.addrE = ti.flagJsonMarshalerPtr
  1135  	} else if supportMarshalInterfaces && !x.isBe() &&
  1136  		(ti.flagTextMarshaler || ti.flagTextMarshalerPtr) &&
  1137  		(ti.flagTextUnmarshaler || ti.flagTextUnmarshalerPtr) {
  1138  		fn.fe = (*Encoder).textMarshal
  1139  		fn.fd = (*Decoder).textUnmarshal
  1140  		fi.addrD = ti.flagTextUnmarshalerPtr
  1141  		fi.addrE = ti.flagTextMarshalerPtr
  1142  	} else {
  1143  		if fastpathEnabled && (rk == reflect.Map || rk == reflect.Slice || rk == reflect.Array) {
  1144  			// by default (without using unsafe),
  1145  			// if an array is not addressable, converting from an array to a slice
  1146  			// requires an allocation (see helper_not_unsafe.go: func rvGetSlice4Array).
  1147  			//
  1148  			// (Non-addressable arrays mostly occur as keys/values from a map).
  1149  			//
  1150  			// However, fastpath functions are mostly for slices of numbers or strings,
  1151  			// which are small by definition and thus allocation should be fast/cheap in time.
  1152  			//
  1153  			// Consequently, the value of doing this quick allocation to elide the overhead cost of
  1154  			// non-optimized (not-unsafe) reflection is a fair price.
  1155  			var rtid2 uintptr
  1156  			if !ti.flagHasPkgPath { // un-named type (slice or mpa or array)
  1157  				rtid2 = rtid
  1158  				if rk == reflect.Array {
  1159  					rtid2 = rt2id(ti.key) // ti.key for arrays = reflect.SliceOf(ti.elem)
  1160  				}
  1161  				if idx := fastpathAvIndex(rtid2); idx != -1 {
  1162  					fn.fe = fastpathAv[idx].encfn
  1163  					fn.fd = fastpathAv[idx].decfn
  1164  					fi.addrD = true
  1165  					fi.addrDf = false
  1166  					if rk == reflect.Array {
  1167  						fi.addrD = false // decode directly into array value (slice made from it)
  1168  					}
  1169  				}
  1170  			} else { // named type (with underlying type of map or slice or array)
  1171  				// try to use mapping for underlying type
  1172  				xfe, xrt := fnloadFastpathUnderlying(ti)
  1173  				if xfe != nil {
  1174  					xfnf := xfe.encfn
  1175  					xfnf2 := xfe.decfn
  1176  					if rk == reflect.Array {
  1177  						fi.addrD = false // decode directly into array value (slice made from it)
  1178  						fn.fd = func(d *Decoder, xf *codecFnInfo, xrv reflect.Value) {
  1179  							xfnf2(d, xf, rvConvert(xrv, xrt))
  1180  						}
  1181  					} else {
  1182  						fi.addrD = true
  1183  						fi.addrDf = false // meaning it can be an address(ptr) or a value
  1184  						xptr2rt := reflect.PtrTo(xrt)
  1185  						fn.fd = func(d *Decoder, xf *codecFnInfo, xrv reflect.Value) {
  1186  							if xrv.Kind() == reflect.Ptr {
  1187  								xfnf2(d, xf, rvConvert(xrv, xptr2rt))
  1188  							} else {
  1189  								xfnf2(d, xf, rvConvert(xrv, xrt))
  1190  							}
  1191  						}
  1192  					}
  1193  					fn.fe = func(e *Encoder, xf *codecFnInfo, xrv reflect.Value) {
  1194  						xfnf(e, xf, rvConvert(xrv, xrt))
  1195  					}
  1196  				}
  1197  			}
  1198  		}
  1199  		if fn.fe == nil && fn.fd == nil {
  1200  			switch rk {
  1201  			case reflect.Bool:
  1202  				fn.fe = (*Encoder).kBool
  1203  				fn.fd = (*Decoder).kBool
  1204  			case reflect.String:
  1205  				// Do not use different functions based on StringToRaw option, as that will statically
  1206  				// set the function for a string type, and if the Handle is modified thereafter,
  1207  				// behaviour is non-deterministic
  1208  				// i.e. DO NOT DO:
  1209  				//   if x.StringToRaw {
  1210  				//   	fn.fe = (*Encoder).kStringToRaw
  1211  				//   } else {
  1212  				//   	fn.fe = (*Encoder).kStringEnc
  1213  				//   }
  1214  
  1215  				fn.fe = (*Encoder).kString
  1216  				fn.fd = (*Decoder).kString
  1217  			case reflect.Int:
  1218  				fn.fd = (*Decoder).kInt
  1219  				fn.fe = (*Encoder).kInt
  1220  			case reflect.Int8:
  1221  				fn.fe = (*Encoder).kInt8
  1222  				fn.fd = (*Decoder).kInt8
  1223  			case reflect.Int16:
  1224  				fn.fe = (*Encoder).kInt16
  1225  				fn.fd = (*Decoder).kInt16
  1226  			case reflect.Int32:
  1227  				fn.fe = (*Encoder).kInt32
  1228  				fn.fd = (*Decoder).kInt32
  1229  			case reflect.Int64:
  1230  				fn.fe = (*Encoder).kInt64
  1231  				fn.fd = (*Decoder).kInt64
  1232  			case reflect.Uint:
  1233  				fn.fd = (*Decoder).kUint
  1234  				fn.fe = (*Encoder).kUint
  1235  			case reflect.Uint8:
  1236  				fn.fe = (*Encoder).kUint8
  1237  				fn.fd = (*Decoder).kUint8
  1238  			case reflect.Uint16:
  1239  				fn.fe = (*Encoder).kUint16
  1240  				fn.fd = (*Decoder).kUint16
  1241  			case reflect.Uint32:
  1242  				fn.fe = (*Encoder).kUint32
  1243  				fn.fd = (*Decoder).kUint32
  1244  			case reflect.Uint64:
  1245  				fn.fe = (*Encoder).kUint64
  1246  				fn.fd = (*Decoder).kUint64
  1247  			case reflect.Uintptr:
  1248  				fn.fe = (*Encoder).kUintptr
  1249  				fn.fd = (*Decoder).kUintptr
  1250  			case reflect.Float32:
  1251  				fn.fe = (*Encoder).kFloat32
  1252  				fn.fd = (*Decoder).kFloat32
  1253  			case reflect.Float64:
  1254  				fn.fe = (*Encoder).kFloat64
  1255  				fn.fd = (*Decoder).kFloat64
  1256  			case reflect.Complex64:
  1257  				fn.fe = (*Encoder).kComplex64
  1258  				fn.fd = (*Decoder).kComplex64
  1259  			case reflect.Complex128:
  1260  				fn.fe = (*Encoder).kComplex128
  1261  				fn.fd = (*Decoder).kComplex128
  1262  			case reflect.Chan:
  1263  				fn.fe = (*Encoder).kChan
  1264  				fn.fd = (*Decoder).kChan
  1265  			case reflect.Slice:
  1266  				fn.fe = (*Encoder).kSlice
  1267  				fn.fd = (*Decoder).kSlice
  1268  			case reflect.Array:
  1269  				fi.addrD = false // decode directly into array value (slice made from it)
  1270  				fn.fe = (*Encoder).kArray
  1271  				fn.fd = (*Decoder).kArray
  1272  			case reflect.Struct:
  1273  				if ti.anyOmitEmpty ||
  1274  					ti.flagMissingFielder ||
  1275  					ti.flagMissingFielderPtr {
  1276  					fn.fe = (*Encoder).kStruct
  1277  				} else {
  1278  					fn.fe = (*Encoder).kStructNoOmitempty
  1279  				}
  1280  				fn.fd = (*Decoder).kStruct
  1281  			case reflect.Map:
  1282  				fn.fe = (*Encoder).kMap
  1283  				fn.fd = (*Decoder).kMap
  1284  			case reflect.Interface:
  1285  				// encode: reflect.Interface are handled already by preEncodeValue
  1286  				fn.fd = (*Decoder).kInterface
  1287  				fn.fe = (*Encoder).kErr
  1288  			default:
  1289  				// reflect.Ptr and reflect.Interface are handled already by preEncodeValue
  1290  				fn.fe = (*Encoder).kErr
  1291  				fn.fd = (*Decoder).kErr
  1292  			}
  1293  		}
  1294  	}
  1295  	return
  1296  }
  1297  
  1298  // Handle defines a specific encoding format. It also stores any runtime state
  1299  // used during an Encoding or Decoding session e.g. stored state about Types, etc.
  1300  //
  1301  // Once a handle is configured, it can be shared across multiple Encoders and Decoders.
  1302  //
  1303  // Note that a Handle is NOT safe for concurrent modification.
  1304  //
  1305  // A Handle also should not be modified after it is configured and has
  1306  // been used at least once. This is because stored state may be out of sync with the
  1307  // new configuration, and a data race can occur when multiple goroutines access it.
  1308  // i.e. multiple Encoders or Decoders in different goroutines.
  1309  //
  1310  // Consequently, the typical usage model is that a Handle is pre-configured
  1311  // before first time use, and not modified while in use.
  1312  // Such a pre-configured Handle is safe for concurrent access.
  1313  type Handle interface {
  1314  	Name() string
  1315  	getBasicHandle() *BasicHandle
  1316  	newEncDriver() encDriver
  1317  	newDecDriver() decDriver
  1318  	isBinary() bool
  1319  	isJson() bool // json is special for now, so track it
  1320  	// desc describes the current byte descriptor, or returns "unknown[XXX]" if not understood.
  1321  	desc(bd byte) string
  1322  	// init initializes the handle based on handle-specific info (beyond what is in BasicHandle)
  1323  	init()
  1324  }
  1325  
  1326  // Raw represents raw formatted bytes.
  1327  // We "blindly" store it during encode and retrieve the raw bytes during decode.
  1328  // Note: it is dangerous during encode, so we may gate the behaviour
  1329  // behind an Encode flag which must be explicitly set.
  1330  type Raw []byte
  1331  
  1332  // RawExt represents raw unprocessed extension data.
  1333  // Some codecs will decode extension data as a *RawExt
  1334  // if there is no registered extension for the tag.
  1335  //
  1336  // Only one of Data or Value is nil.
  1337  // If Data is nil, then the content of the RawExt is in the Value.
  1338  type RawExt struct {
  1339  	Tag uint64
  1340  	// Data is the []byte which represents the raw ext. If nil, ext is exposed in Value.
  1341  	// Data is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of types
  1342  	Data []byte
  1343  	// Value represents the extension, if Data is nil.
  1344  	// Value is used by codecs (e.g. cbor, json) which leverage the format to do
  1345  	// custom serialization of the types.
  1346  	Value interface{}
  1347  }
  1348  
  1349  func (re *RawExt) setData(xbs []byte, zerocopy bool) {
  1350  	if zerocopy {
  1351  		re.Data = xbs
  1352  	} else {
  1353  		re.Data = append(re.Data[:0], xbs...)
  1354  	}
  1355  }
  1356  
  1357  // BytesExt handles custom (de)serialization of types to/from []byte.
  1358  // It is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of the types.
  1359  type BytesExt interface {
  1360  	// WriteExt converts a value to a []byte.
  1361  	//
  1362  	// Note: v is a pointer iff the registered extension type is a struct or array kind.
  1363  	WriteExt(v interface{}) []byte
  1364  
  1365  	// ReadExt updates a value from a []byte.
  1366  	//
  1367  	// Note: dst is always a pointer kind to the registered extension type.
  1368  	ReadExt(dst interface{}, src []byte)
  1369  }
  1370  
  1371  // InterfaceExt handles custom (de)serialization of types to/from another interface{} value.
  1372  // The Encoder or Decoder will then handle the further (de)serialization of that known type.
  1373  //
  1374  // It is used by codecs (e.g. cbor, json) which use the format to do custom serialization of types.
  1375  type InterfaceExt interface {
  1376  	// ConvertExt converts a value into a simpler interface for easy encoding
  1377  	// e.g. convert time.Time to int64.
  1378  	//
  1379  	// Note: v is a pointer iff the registered extension type is a struct or array kind.
  1380  	ConvertExt(v interface{}) interface{}
  1381  
  1382  	// UpdateExt updates a value from a simpler interface for easy decoding
  1383  	// e.g. convert int64 to time.Time.
  1384  	//
  1385  	// Note: dst is always a pointer kind to the registered extension type.
  1386  	UpdateExt(dst interface{}, src interface{})
  1387  }
  1388  
  1389  // Ext handles custom (de)serialization of custom types / extensions.
  1390  type Ext interface {
  1391  	BytesExt
  1392  	InterfaceExt
  1393  }
  1394  
  1395  // addExtWrapper is a wrapper implementation to support former AddExt exported method.
  1396  type addExtWrapper struct {
  1397  	encFn func(reflect.Value) ([]byte, error)
  1398  	decFn func(reflect.Value, []byte) error
  1399  }
  1400  
  1401  func (x addExtWrapper) WriteExt(v interface{}) []byte {
  1402  	bs, err := x.encFn(reflect.ValueOf(v))
  1403  	halt.onerror(err)
  1404  	return bs
  1405  }
  1406  
  1407  func (x addExtWrapper) ReadExt(v interface{}, bs []byte) {
  1408  	halt.onerror(x.decFn(reflect.ValueOf(v), bs))
  1409  }
  1410  
  1411  func (x addExtWrapper) ConvertExt(v interface{}) interface{} {
  1412  	return x.WriteExt(v)
  1413  }
  1414  
  1415  func (x addExtWrapper) UpdateExt(dest interface{}, v interface{}) {
  1416  	x.ReadExt(dest, v.([]byte))
  1417  }
  1418  
  1419  type bytesExtFailer struct{}
  1420  
  1421  func (bytesExtFailer) WriteExt(v interface{}) []byte {
  1422  	halt.onerror(errExtFnWriteExtUnsupported)
  1423  	return nil
  1424  }
  1425  func (bytesExtFailer) ReadExt(v interface{}, bs []byte) {
  1426  	halt.onerror(errExtFnReadExtUnsupported)
  1427  }
  1428  
  1429  type interfaceExtFailer struct{}
  1430  
  1431  func (interfaceExtFailer) ConvertExt(v interface{}) interface{} {
  1432  	halt.onerror(errExtFnConvertExtUnsupported)
  1433  	return nil
  1434  }
  1435  func (interfaceExtFailer) UpdateExt(dest interface{}, v interface{}) {
  1436  	halt.onerror(errExtFnUpdateExtUnsupported)
  1437  }
  1438  
  1439  type bytesExtWrapper struct {
  1440  	interfaceExtFailer
  1441  	BytesExt
  1442  }
  1443  
  1444  type interfaceExtWrapper struct {
  1445  	bytesExtFailer
  1446  	InterfaceExt
  1447  }
  1448  
  1449  type extFailWrapper struct {
  1450  	bytesExtFailer
  1451  	interfaceExtFailer
  1452  }
  1453  
  1454  type binaryEncodingType struct{}
  1455  
  1456  func (binaryEncodingType) isBinary() bool { return true }
  1457  func (binaryEncodingType) isJson() bool   { return false }
  1458  
  1459  type textEncodingType struct{}
  1460  
  1461  func (textEncodingType) isBinary() bool { return false }
  1462  func (textEncodingType) isJson() bool   { return false }
  1463  
  1464  type notJsonType struct{}
  1465  
  1466  func (notJsonType) isJson() bool { return false }
  1467  
  1468  // noBuiltInTypes is embedded into many types which do not support builtins
  1469  // e.g. msgpack, simple, cbor.
  1470  
  1471  type noBuiltInTypes struct{}
  1472  
  1473  func (noBuiltInTypes) EncodeBuiltin(rt uintptr, v interface{}) {}
  1474  func (noBuiltInTypes) DecodeBuiltin(rt uintptr, v interface{}) {}
  1475  
  1476  // bigenHelper handles ByteOrder operations directly using
  1477  // arrays of bytes (not slice of bytes).
  1478  //
  1479  // Since byteorder operations are very common for encoding and decoding
  1480  // numbers, lengths, etc - it is imperative that this operation is as
  1481  // fast as possible. Removing indirection (pointer chasing) to look
  1482  // at up to 8 bytes helps a lot here.
  1483  //
  1484  // For times where it is expedient to use a slice, delegate to the
  1485  // bigenstd (equal to the binary.BigEndian value).
  1486  //
  1487  // retrofitted from stdlib: encoding/binary/BigEndian (ByteOrder)
  1488  type bigenHelper struct{}
  1489  
  1490  func (z bigenHelper) PutUint16(v uint16) (b [2]byte) {
  1491  	return [...]byte{
  1492  		byte(v >> 8),
  1493  		byte(v),
  1494  	}
  1495  }
  1496  
  1497  func (z bigenHelper) PutUint32(v uint32) (b [4]byte) {
  1498  	return [...]byte{
  1499  		byte(v >> 24),
  1500  		byte(v >> 16),
  1501  		byte(v >> 8),
  1502  		byte(v),
  1503  	}
  1504  }
  1505  
  1506  func (z bigenHelper) PutUint64(v uint64) (b [8]byte) {
  1507  	return [...]byte{
  1508  		byte(v >> 56),
  1509  		byte(v >> 48),
  1510  		byte(v >> 40),
  1511  		byte(v >> 32),
  1512  		byte(v >> 24),
  1513  		byte(v >> 16),
  1514  		byte(v >> 8),
  1515  		byte(v),
  1516  	}
  1517  }
  1518  
  1519  func (z bigenHelper) Uint16(b [2]byte) (v uint16) {
  1520  	return uint16(b[1]) |
  1521  		uint16(b[0])<<8
  1522  }
  1523  
  1524  func (z bigenHelper) Uint32(b [4]byte) (v uint32) {
  1525  	return uint32(b[3]) |
  1526  		uint32(b[2])<<8 |
  1527  		uint32(b[1])<<16 |
  1528  		uint32(b[0])<<24
  1529  }
  1530  
  1531  func (z bigenHelper) Uint64(b [8]byte) (v uint64) {
  1532  	return uint64(b[7]) |
  1533  		uint64(b[6])<<8 |
  1534  		uint64(b[5])<<16 |
  1535  		uint64(b[4])<<24 |
  1536  		uint64(b[3])<<32 |
  1537  		uint64(b[2])<<40 |
  1538  		uint64(b[1])<<48 |
  1539  		uint64(b[0])<<56
  1540  }
  1541  
  1542  func (z bigenHelper) writeUint16(w *encWr, v uint16) {
  1543  	x := z.PutUint16(v)
  1544  	w.writen2(x[0], x[1])
  1545  }
  1546  
  1547  func (z bigenHelper) writeUint32(w *encWr, v uint32) {
  1548  	// w.writeb((z.PutUint32(v))[:])
  1549  	// x := z.PutUint32(v)
  1550  	// w.writeb(x[:])
  1551  	// w.writen4(x[0], x[1], x[2], x[3])
  1552  	w.writen4(z.PutUint32(v))
  1553  }
  1554  
  1555  func (z bigenHelper) writeUint64(w *encWr, v uint64) {
  1556  	w.writen8(z.PutUint64(v))
  1557  }
  1558  
  1559  type extTypeTagFn struct {
  1560  	rtid    uintptr
  1561  	rtidptr uintptr
  1562  	rt      reflect.Type
  1563  	tag     uint64
  1564  	ext     Ext
  1565  }
  1566  
  1567  type extHandle []extTypeTagFn
  1568  
  1569  // AddExt registes an encode and decode function for a reflect.Type.
  1570  // To deregister an Ext, call AddExt with nil encfn and/or nil decfn.
  1571  //
  1572  // Deprecated: Use SetBytesExt or SetInterfaceExt on the Handle instead.
  1573  func (x *BasicHandle) AddExt(rt reflect.Type, tag byte,
  1574  	encfn func(reflect.Value) ([]byte, error),
  1575  	decfn func(reflect.Value, []byte) error) (err error) {
  1576  	if encfn == nil || decfn == nil {
  1577  		return x.SetExt(rt, uint64(tag), nil)
  1578  	}
  1579  	return x.SetExt(rt, uint64(tag), addExtWrapper{encfn, decfn})
  1580  }
  1581  
  1582  // SetExt will set the extension for a tag and reflect.Type.
  1583  // Note that the type must be a named type, and specifically not a pointer or Interface.
  1584  // An error is returned if that is not honored.
  1585  // To Deregister an ext, call SetExt with nil Ext.
  1586  //
  1587  // Deprecated: Use SetBytesExt or SetInterfaceExt on the Handle instead.
  1588  func (x *BasicHandle) SetExt(rt reflect.Type, tag uint64, ext Ext) (err error) {
  1589  	if x.isInited() {
  1590  		return errHandleInited
  1591  	}
  1592  	if x.basicHandleRuntimeState == nil {
  1593  		x.basicHandleRuntimeState = new(basicHandleRuntimeState)
  1594  	}
  1595  	return x.basicHandleRuntimeState.setExt(rt, tag, ext)
  1596  }
  1597  
  1598  func (o extHandle) getExtForI(x interface{}) (v *extTypeTagFn) {
  1599  	if len(o) > 0 {
  1600  		v = o.getExt(i2rtid(x), true)
  1601  	}
  1602  	return
  1603  }
  1604  
  1605  func (o extHandle) getExt(rtid uintptr, check bool) (v *extTypeTagFn) {
  1606  	if !check {
  1607  		return
  1608  	}
  1609  	for i := range o {
  1610  		v = &o[i]
  1611  		if v.rtid == rtid || v.rtidptr == rtid {
  1612  			return
  1613  		}
  1614  	}
  1615  	return nil
  1616  }
  1617  
  1618  func (o extHandle) getExtForTag(tag uint64) (v *extTypeTagFn) {
  1619  	for i := range o {
  1620  		v = &o[i]
  1621  		if v.tag == tag {
  1622  			return
  1623  		}
  1624  	}
  1625  	return nil
  1626  }
  1627  
  1628  type intf2impl struct {
  1629  	rtid uintptr // for intf
  1630  	impl reflect.Type
  1631  }
  1632  
  1633  type intf2impls []intf2impl
  1634  
  1635  // Intf2Impl maps an interface to an implementing type.
  1636  // This allows us support infering the concrete type
  1637  // and populating it when passed an interface.
  1638  // e.g. var v io.Reader can be decoded as a bytes.Buffer, etc.
  1639  //
  1640  // Passing a nil impl will clear the mapping.
  1641  func (o *intf2impls) Intf2Impl(intf, impl reflect.Type) (err error) {
  1642  	if impl != nil && !impl.Implements(intf) {
  1643  		return fmt.Errorf("Intf2Impl: %v does not implement %v", impl, intf)
  1644  	}
  1645  	rtid := rt2id(intf)
  1646  	o2 := *o
  1647  	for i := range o2 {
  1648  		v := &o2[i]
  1649  		if v.rtid == rtid {
  1650  			v.impl = impl
  1651  			return
  1652  		}
  1653  	}
  1654  	*o = append(o2, intf2impl{rtid, impl})
  1655  	return
  1656  }
  1657  
  1658  func (o intf2impls) intf2impl(rtid uintptr) (rv reflect.Value) {
  1659  	for i := range o {
  1660  		v := &o[i]
  1661  		if v.rtid == rtid {
  1662  			if v.impl == nil {
  1663  				return
  1664  			}
  1665  			vkind := v.impl.Kind()
  1666  			if vkind == reflect.Ptr {
  1667  				return reflect.New(v.impl.Elem())
  1668  			}
  1669  			return rvZeroAddrK(v.impl, vkind)
  1670  		}
  1671  	}
  1672  	return
  1673  }
  1674  
  1675  // structFieldinfopathNode is a node in a tree, which allows us easily
  1676  // walk the anonymous path.
  1677  //
  1678  // In the typical case, the node is not embedded/anonymous, and thus the parent
  1679  // will be nil and this information becomes a value (not needing any indirection).
  1680  type structFieldInfoPathNode struct {
  1681  	parent *structFieldInfoPathNode
  1682  
  1683  	offset   uint16
  1684  	index    uint16
  1685  	kind     uint8
  1686  	numderef uint8
  1687  
  1688  	// encNameAsciiAlphaNum and omitEmpty should be in structFieldInfo,
  1689  	// but are kept here for tighter packaging.
  1690  
  1691  	encNameAsciiAlphaNum bool // the encName only contains ascii alphabet and numbers
  1692  	omitEmpty            bool
  1693  
  1694  	typ reflect.Type
  1695  }
  1696  
  1697  // depth returns number of valid nodes in the hierachy
  1698  func (path *structFieldInfoPathNode) depth() (d int) {
  1699  TOP:
  1700  	if path != nil {
  1701  		d++
  1702  		path = path.parent
  1703  		goto TOP
  1704  	}
  1705  	return
  1706  }
  1707  
  1708  // field returns the field of the struct.
  1709  func (path *structFieldInfoPathNode) field(v reflect.Value) (rv2 reflect.Value) {
  1710  	if parent := path.parent; parent != nil {
  1711  		v = parent.field(v)
  1712  		for j, k := uint8(0), parent.numderef; j < k; j++ {
  1713  			if rvIsNil(v) {
  1714  				return
  1715  			}
  1716  			v = v.Elem()
  1717  		}
  1718  	}
  1719  	return path.rvField(v)
  1720  }
  1721  
  1722  // fieldAlloc returns the field of the struct.
  1723  // It allocates if a nil value was seen while searching.
  1724  func (path *structFieldInfoPathNode) fieldAlloc(v reflect.Value) (rv2 reflect.Value) {
  1725  	if parent := path.parent; parent != nil {
  1726  		v = parent.fieldAlloc(v)
  1727  		for j, k := uint8(0), parent.numderef; j < k; j++ {
  1728  			if rvIsNil(v) {
  1729  				rvSetDirect(v, reflect.New(v.Type().Elem()))
  1730  			}
  1731  			v = v.Elem()
  1732  		}
  1733  	}
  1734  	return path.rvField(v)
  1735  }
  1736  
  1737  type structFieldInfo struct {
  1738  	encName string // encode name
  1739  
  1740  	// encNameHash uintptr
  1741  
  1742  	// fieldName string // currently unused
  1743  
  1744  	// encNameAsciiAlphaNum and omitEmpty should be here,
  1745  	// but are stored in structFieldInfoPathNode for tighter packaging.
  1746  
  1747  	path structFieldInfoPathNode
  1748  }
  1749  
  1750  func parseStructInfo(stag string) (toArray, omitEmpty bool, keytype valueType) {
  1751  	keytype = valueTypeString // default
  1752  	if stag == "" {
  1753  		return
  1754  	}
  1755  	ss := strings.Split(stag, ",")
  1756  	if len(ss) < 2 {
  1757  		return
  1758  	}
  1759  	for _, s := range ss[1:] {
  1760  		switch s {
  1761  		case "omitempty":
  1762  			omitEmpty = true
  1763  		case "toarray":
  1764  			toArray = true
  1765  		case "int":
  1766  			keytype = valueTypeInt
  1767  		case "uint":
  1768  			keytype = valueTypeUint
  1769  		case "float":
  1770  			keytype = valueTypeFloat
  1771  			// case "bool":
  1772  			// 	keytype = valueTypeBool
  1773  		case "string":
  1774  			keytype = valueTypeString
  1775  		}
  1776  	}
  1777  	return
  1778  }
  1779  
  1780  func (si *structFieldInfo) parseTag(stag string) {
  1781  	if stag == "" {
  1782  		return
  1783  	}
  1784  	for i, s := range strings.Split(stag, ",") {
  1785  		if i == 0 {
  1786  			if s != "" {
  1787  				si.encName = s
  1788  			}
  1789  		} else {
  1790  			switch s {
  1791  			case "omitempty":
  1792  				si.path.omitEmpty = true
  1793  			}
  1794  		}
  1795  	}
  1796  }
  1797  
  1798  type sfiSortedByEncName []*structFieldInfo
  1799  
  1800  func (p sfiSortedByEncName) Len() int           { return len(p) }
  1801  func (p sfiSortedByEncName) Swap(i, j int)      { p[uint(i)], p[uint(j)] = p[uint(j)], p[uint(i)] }
  1802  func (p sfiSortedByEncName) Less(i, j int) bool { return p[uint(i)].encName < p[uint(j)].encName }
  1803  
  1804  // typeInfo4Container holds information that is only available for
  1805  // containers like map, array, chan, slice.
  1806  type typeInfo4Container struct {
  1807  	elem reflect.Type
  1808  	// key is:
  1809  	//   - if map kind: map key
  1810  	//   - if array kind: sliceOf(elem)
  1811  	//   - if chan kind: sliceof(elem)
  1812  	key reflect.Type
  1813  
  1814  	// fastpathUnderlying is underlying type of a named slice/map/array, as defined by go spec,
  1815  	// that is used by fastpath where we defined fastpath functions for the underlying type.
  1816  	//
  1817  	// for a map, it's a map; for a slice or array, it's a slice; else its nil.
  1818  	fastpathUnderlying reflect.Type
  1819  
  1820  	tikey  *typeInfo
  1821  	tielem *typeInfo
  1822  }
  1823  
  1824  // typeInfo keeps static (non-changing readonly)information
  1825  // about each (non-ptr) type referenced in the encode/decode sequence.
  1826  //
  1827  // During an encode/decode sequence, we work as below:
  1828  //   - If base is a built in type, en/decode base value
  1829  //   - If base is registered as an extension, en/decode base value
  1830  //   - If type is binary(M/Unm)arshaler, call Binary(M/Unm)arshal method
  1831  //   - If type is text(M/Unm)arshaler, call Text(M/Unm)arshal method
  1832  //   - Else decode appropriately based on the reflect.Kind
  1833  type typeInfo struct {
  1834  	rt  reflect.Type
  1835  	ptr reflect.Type
  1836  
  1837  	// pkgpath string
  1838  
  1839  	rtid uintptr
  1840  
  1841  	numMeth uint16 // number of methods
  1842  	kind    uint8
  1843  	chandir uint8
  1844  
  1845  	anyOmitEmpty bool      // true if a struct, and any of the fields are tagged "omitempty"
  1846  	toArray      bool      // whether this (struct) type should be encoded as an array
  1847  	keyType      valueType // if struct, how is the field name stored in a stream? default is string
  1848  	mbs          bool      // base type (T or *T) is a MapBySlice
  1849  
  1850  	sfi4Name map[string]*structFieldInfo // map. used for finding sfi given a name
  1851  
  1852  	*typeInfo4Container
  1853  
  1854  	// ---- cpu cache line boundary?
  1855  
  1856  	size, keysize, elemsize uint32
  1857  
  1858  	keykind, elemkind uint8
  1859  
  1860  	flagHasPkgPath   bool // Type.PackagePath != ""
  1861  	flagComparable   bool
  1862  	flagCanTransient bool
  1863  
  1864  	flagMarshalInterface  bool // does this have custom (un)marshal implementation?
  1865  	flagSelferViaCodecgen bool
  1866  
  1867  	// custom implementation flags
  1868  	flagIsZeroer    bool
  1869  	flagIsZeroerPtr bool
  1870  
  1871  	flagIsCodecEmptyer    bool
  1872  	flagIsCodecEmptyerPtr bool
  1873  
  1874  	flagBinaryMarshaler    bool
  1875  	flagBinaryMarshalerPtr bool
  1876  
  1877  	flagBinaryUnmarshaler    bool
  1878  	flagBinaryUnmarshalerPtr bool
  1879  
  1880  	flagTextMarshaler    bool
  1881  	flagTextMarshalerPtr bool
  1882  
  1883  	flagTextUnmarshaler    bool
  1884  	flagTextUnmarshalerPtr bool
  1885  
  1886  	flagJsonMarshaler    bool
  1887  	flagJsonMarshalerPtr bool
  1888  
  1889  	flagJsonUnmarshaler    bool
  1890  	flagJsonUnmarshalerPtr bool
  1891  
  1892  	flagSelfer    bool
  1893  	flagSelferPtr bool
  1894  
  1895  	flagMissingFielder    bool
  1896  	flagMissingFielderPtr bool
  1897  
  1898  	infoFieldOmitempty bool
  1899  
  1900  	sfi structFieldInfos
  1901  }
  1902  
  1903  func (ti *typeInfo) siForEncName(name []byte) (si *structFieldInfo) {
  1904  	return ti.sfi4Name[string(name)]
  1905  }
  1906  
  1907  func (ti *typeInfo) resolve(x []structFieldInfo, ss map[string]uint16) (n int) {
  1908  	n = len(x)
  1909  
  1910  	for i := range x {
  1911  		ui := uint16(i)
  1912  		xn := x[i].encName
  1913  		j, ok := ss[xn]
  1914  		if ok {
  1915  			i2clear := ui                              // index to be cleared
  1916  			if x[i].path.depth() < x[j].path.depth() { // this one is shallower
  1917  				ss[xn] = ui
  1918  				i2clear = j
  1919  			}
  1920  			if x[i2clear].encName != "" {
  1921  				x[i2clear].encName = ""
  1922  				n--
  1923  			}
  1924  		} else {
  1925  			ss[xn] = ui
  1926  		}
  1927  	}
  1928  
  1929  	return
  1930  }
  1931  
  1932  func (ti *typeInfo) init(x []structFieldInfo, n int) {
  1933  	var anyOmitEmpty bool
  1934  
  1935  	// remove all the nils (non-ready)
  1936  	m := make(map[string]*structFieldInfo, n)
  1937  	w := make([]structFieldInfo, n)
  1938  	y := make([]*structFieldInfo, n+n)
  1939  	z := y[n:]
  1940  	y = y[:n]
  1941  	n = 0
  1942  	for i := range x {
  1943  		if x[i].encName == "" {
  1944  			continue
  1945  		}
  1946  		if !anyOmitEmpty && x[i].path.omitEmpty {
  1947  			anyOmitEmpty = true
  1948  		}
  1949  		w[n] = x[i]
  1950  		y[n] = &w[n]
  1951  		m[x[i].encName] = &w[n]
  1952  		n++
  1953  	}
  1954  	if n != len(y) {
  1955  		halt.errorf("failure reading struct %v - expecting %d of %d valid fields, got %d", ti.rt, len(y), len(x), n)
  1956  	}
  1957  
  1958  	copy(z, y)
  1959  	sort.Sort(sfiSortedByEncName(z))
  1960  
  1961  	ti.anyOmitEmpty = anyOmitEmpty
  1962  	ti.sfi.load(y, z)
  1963  	ti.sfi4Name = m
  1964  }
  1965  
  1966  // Handling flagCanTransient
  1967  //
  1968  // We support transient optimization if the kind of the type is
  1969  // a number, bool, string, or slice (of number/bool).
  1970  // In addition, we also support if the kind is struct or array,
  1971  // and the type does not contain any pointers recursively).
  1972  //
  1973  // Noteworthy that all reference types (string, slice, func, map, ptr, interface, etc) have pointers.
  1974  //
  1975  // If using transient for a type with a pointer, there is the potential for data corruption
  1976  // when GC tries to follow a "transient" pointer which may become a non-pointer soon after.
  1977  //
  1978  
  1979  func transientBitsetFlags() *bitset32 {
  1980  	if transientValueHasStringSlice {
  1981  		return &numBoolStrSliceBitset
  1982  	}
  1983  	return &numBoolBitset
  1984  }
  1985  
  1986  func isCanTransient(t reflect.Type, k reflect.Kind) (v bool) {
  1987  	var bs = transientBitsetFlags()
  1988  	if bs.isset(byte(k)) {
  1989  		v = true
  1990  	} else if k == reflect.Slice {
  1991  		elem := t.Elem()
  1992  		v = numBoolBitset.isset(byte(elem.Kind()))
  1993  	} else if k == reflect.Array {
  1994  		elem := t.Elem()
  1995  		v = isCanTransient(elem, elem.Kind())
  1996  	} else if k == reflect.Struct {
  1997  		v = true
  1998  		for j, jlen := 0, t.NumField(); j < jlen; j++ {
  1999  			f := t.Field(j)
  2000  			if !isCanTransient(f.Type, f.Type.Kind()) {
  2001  				v = false
  2002  				return
  2003  			}
  2004  		}
  2005  	} else {
  2006  		v = false
  2007  	}
  2008  	return
  2009  }
  2010  
  2011  func (ti *typeInfo) doSetFlagCanTransient() {
  2012  	if transientSizeMax > 0 {
  2013  		ti.flagCanTransient = ti.size <= transientSizeMax
  2014  	} else {
  2015  		ti.flagCanTransient = true
  2016  	}
  2017  	if ti.flagCanTransient {
  2018  		if !transientBitsetFlags().isset(ti.kind) {
  2019  			ti.flagCanTransient = isCanTransient(ti.rt, reflect.Kind(ti.kind))
  2020  		}
  2021  	}
  2022  }
  2023  
  2024  type rtid2ti struct {
  2025  	rtid uintptr
  2026  	ti   *typeInfo
  2027  }
  2028  
  2029  // TypeInfos caches typeInfo for each type on first inspection.
  2030  //
  2031  // It is configured with a set of tag keys, which are used to get
  2032  // configuration for the type.
  2033  type TypeInfos struct {
  2034  	infos atomicTypeInfoSlice
  2035  	mu    sync.Mutex
  2036  	_     uint64 // padding (cache-aligned)
  2037  	tags  []string
  2038  	_     uint64 // padding (cache-aligned)
  2039  }
  2040  
  2041  // NewTypeInfos creates a TypeInfos given a set of struct tags keys.
  2042  //
  2043  // This allows users customize the struct tag keys which contain configuration
  2044  // of their types.
  2045  func NewTypeInfos(tags []string) *TypeInfos {
  2046  	return &TypeInfos{tags: tags}
  2047  }
  2048  
  2049  func (x *TypeInfos) structTag(t reflect.StructTag) (s string) {
  2050  	// check for tags: codec, json, in that order.
  2051  	// this allows seamless support for many configured structs.
  2052  	for _, x := range x.tags {
  2053  		s = t.Get(x)
  2054  		if s != "" {
  2055  			return s
  2056  		}
  2057  	}
  2058  	return
  2059  }
  2060  
  2061  func findTypeInfo(s []rtid2ti, rtid uintptr) (i uint, ti *typeInfo) {
  2062  	// binary search. adapted from sort/search.go.
  2063  	// Note: we use goto (instead of for loop) so this can be inlined.
  2064  
  2065  	var h uint
  2066  	var j = uint(len(s))
  2067  LOOP:
  2068  	if i < j {
  2069  		h = (i + j) >> 1 // avoid overflow when computing h // h = i + (j-i)/2
  2070  		if s[h].rtid < rtid {
  2071  			i = h + 1
  2072  		} else {
  2073  			j = h
  2074  		}
  2075  		goto LOOP
  2076  	}
  2077  	if i < uint(len(s)) && s[i].rtid == rtid {
  2078  		ti = s[i].ti
  2079  	}
  2080  	return
  2081  }
  2082  
  2083  func (x *TypeInfos) get(rtid uintptr, rt reflect.Type) (pti *typeInfo) {
  2084  	if pti = x.find(rtid); pti == nil {
  2085  		pti = x.load(rt)
  2086  	}
  2087  	return
  2088  }
  2089  
  2090  func (x *TypeInfos) find(rtid uintptr) (pti *typeInfo) {
  2091  	sp := x.infos.load()
  2092  	if sp != nil {
  2093  		_, pti = findTypeInfo(sp, rtid)
  2094  	}
  2095  	return
  2096  }
  2097  
  2098  func (x *TypeInfos) load(rt reflect.Type) (pti *typeInfo) {
  2099  	rk := rt.Kind()
  2100  
  2101  	if rk == reflect.Ptr { // || (rk == reflect.Interface && rtid != intfTypId) {
  2102  		halt.errorf("invalid kind passed to TypeInfos.get: %v - %v", rk, rt)
  2103  	}
  2104  
  2105  	rtid := rt2id(rt)
  2106  
  2107  	// do not hold lock while computing this.
  2108  	// it may lead to duplication, but that's ok.
  2109  	ti := typeInfo{
  2110  		rt:      rt,
  2111  		ptr:     reflect.PtrTo(rt),
  2112  		rtid:    rtid,
  2113  		kind:    uint8(rk),
  2114  		size:    uint32(rt.Size()),
  2115  		numMeth: uint16(rt.NumMethod()),
  2116  		keyType: valueTypeString, // default it - so it's never 0
  2117  
  2118  		// pkgpath: rt.PkgPath(),
  2119  		flagHasPkgPath: rt.PkgPath() != "",
  2120  	}
  2121  
  2122  	// bset sets custom implementation flags
  2123  	bset := func(when bool, b *bool) {
  2124  		if when {
  2125  			*b = true
  2126  		}
  2127  	}
  2128  
  2129  	var b1, b2 bool
  2130  
  2131  	b1, b2 = implIntf(rt, binaryMarshalerTyp)
  2132  	bset(b1, &ti.flagBinaryMarshaler)
  2133  	bset(b2, &ti.flagBinaryMarshalerPtr)
  2134  	b1, b2 = implIntf(rt, binaryUnmarshalerTyp)
  2135  	bset(b1, &ti.flagBinaryUnmarshaler)
  2136  	bset(b2, &ti.flagBinaryUnmarshalerPtr)
  2137  	b1, b2 = implIntf(rt, textMarshalerTyp)
  2138  	bset(b1, &ti.flagTextMarshaler)
  2139  	bset(b2, &ti.flagTextMarshalerPtr)
  2140  	b1, b2 = implIntf(rt, textUnmarshalerTyp)
  2141  	bset(b1, &ti.flagTextUnmarshaler)
  2142  	bset(b2, &ti.flagTextUnmarshalerPtr)
  2143  	b1, b2 = implIntf(rt, jsonMarshalerTyp)
  2144  	bset(b1, &ti.flagJsonMarshaler)
  2145  	bset(b2, &ti.flagJsonMarshalerPtr)
  2146  	b1, b2 = implIntf(rt, jsonUnmarshalerTyp)
  2147  	bset(b1, &ti.flagJsonUnmarshaler)
  2148  	bset(b2, &ti.flagJsonUnmarshalerPtr)
  2149  	b1, b2 = implIntf(rt, selferTyp)
  2150  	bset(b1, &ti.flagSelfer)
  2151  	bset(b2, &ti.flagSelferPtr)
  2152  	b1, b2 = implIntf(rt, missingFielderTyp)
  2153  	bset(b1, &ti.flagMissingFielder)
  2154  	bset(b2, &ti.flagMissingFielderPtr)
  2155  	b1, b2 = implIntf(rt, iszeroTyp)
  2156  	bset(b1, &ti.flagIsZeroer)
  2157  	bset(b2, &ti.flagIsZeroerPtr)
  2158  	b1, b2 = implIntf(rt, isCodecEmptyerTyp)
  2159  	bset(b1, &ti.flagIsCodecEmptyer)
  2160  	bset(b2, &ti.flagIsCodecEmptyerPtr)
  2161  
  2162  	b1, b2 = implIntf(rt, isSelferViaCodecgenerTyp)
  2163  	ti.flagSelferViaCodecgen = b1 || b2
  2164  
  2165  	ti.flagMarshalInterface = ti.flagSelfer || ti.flagSelferPtr ||
  2166  		ti.flagSelferViaCodecgen ||
  2167  		ti.flagBinaryMarshaler || ti.flagBinaryMarshalerPtr ||
  2168  		ti.flagBinaryUnmarshaler || ti.flagBinaryUnmarshalerPtr ||
  2169  		ti.flagTextMarshaler || ti.flagTextMarshalerPtr ||
  2170  		ti.flagTextUnmarshaler || ti.flagTextUnmarshalerPtr ||
  2171  		ti.flagJsonMarshaler || ti.flagJsonMarshalerPtr ||
  2172  		ti.flagJsonUnmarshaler || ti.flagJsonUnmarshalerPtr
  2173  
  2174  	b1 = rt.Comparable()
  2175  	// bset(b1, &ti.flagComparable)
  2176  	ti.flagComparable = b1
  2177  
  2178  	ti.doSetFlagCanTransient()
  2179  
  2180  	var tt reflect.Type
  2181  	switch rk {
  2182  	case reflect.Struct:
  2183  		var omitEmpty bool
  2184  		if f, ok := rt.FieldByName(structInfoFieldName); ok {
  2185  			ti.toArray, omitEmpty, ti.keyType = parseStructInfo(x.structTag(f.Tag))
  2186  			ti.infoFieldOmitempty = omitEmpty
  2187  		} else {
  2188  			ti.keyType = valueTypeString
  2189  		}
  2190  		pp, pi := &pool4tiload, pool4tiload.Get()
  2191  		pv := pi.(*typeInfoLoad)
  2192  		pv.reset()
  2193  		pv.etypes = append(pv.etypes, ti.rtid)
  2194  		x.rget(rt, rtid, nil, pv, omitEmpty)
  2195  		n := ti.resolve(pv.sfis, pv.sfiNames)
  2196  		ti.init(pv.sfis, n)
  2197  		pp.Put(pi)
  2198  	case reflect.Map:
  2199  		ti.typeInfo4Container = new(typeInfo4Container)
  2200  		ti.elem = rt.Elem()
  2201  		for tt = ti.elem; tt.Kind() == reflect.Ptr; tt = tt.Elem() {
  2202  		}
  2203  		ti.tielem = x.get(rt2id(tt), tt)
  2204  		ti.elemkind = uint8(ti.elem.Kind())
  2205  		ti.elemsize = uint32(ti.elem.Size())
  2206  		ti.key = rt.Key()
  2207  		for tt = ti.key; tt.Kind() == reflect.Ptr; tt = tt.Elem() {
  2208  		}
  2209  		ti.tikey = x.get(rt2id(tt), tt)
  2210  		ti.keykind = uint8(ti.key.Kind())
  2211  		ti.keysize = uint32(ti.key.Size())
  2212  		if ti.flagHasPkgPath {
  2213  			ti.fastpathUnderlying = reflect.MapOf(ti.key, ti.elem)
  2214  		}
  2215  	case reflect.Slice:
  2216  		ti.typeInfo4Container = new(typeInfo4Container)
  2217  		ti.mbs, b2 = implIntf(rt, mapBySliceTyp)
  2218  		if !ti.mbs && b2 {
  2219  			ti.mbs = b2
  2220  		}
  2221  		ti.elem = rt.Elem()
  2222  		for tt = ti.elem; tt.Kind() == reflect.Ptr; tt = tt.Elem() {
  2223  		}
  2224  		ti.tielem = x.get(rt2id(tt), tt)
  2225  		ti.elemkind = uint8(ti.elem.Kind())
  2226  		ti.elemsize = uint32(ti.elem.Size())
  2227  		if ti.flagHasPkgPath {
  2228  			ti.fastpathUnderlying = reflect.SliceOf(ti.elem)
  2229  		}
  2230  	case reflect.Chan:
  2231  		ti.typeInfo4Container = new(typeInfo4Container)
  2232  		ti.elem = rt.Elem()
  2233  		for tt = ti.elem; tt.Kind() == reflect.Ptr; tt = tt.Elem() {
  2234  		}
  2235  		ti.tielem = x.get(rt2id(tt), tt)
  2236  		ti.elemkind = uint8(ti.elem.Kind())
  2237  		ti.elemsize = uint32(ti.elem.Size())
  2238  		ti.chandir = uint8(rt.ChanDir())
  2239  		ti.key = reflect.SliceOf(ti.elem)
  2240  		ti.keykind = uint8(reflect.Slice)
  2241  	case reflect.Array:
  2242  		ti.typeInfo4Container = new(typeInfo4Container)
  2243  		ti.mbs, b2 = implIntf(rt, mapBySliceTyp)
  2244  		if !ti.mbs && b2 {
  2245  			ti.mbs = b2
  2246  		}
  2247  		ti.elem = rt.Elem()
  2248  		ti.elemkind = uint8(ti.elem.Kind())
  2249  		ti.elemsize = uint32(ti.elem.Size())
  2250  		for tt = ti.elem; tt.Kind() == reflect.Ptr; tt = tt.Elem() {
  2251  		}
  2252  		ti.tielem = x.get(rt2id(tt), tt)
  2253  		ti.key = reflect.SliceOf(ti.elem)
  2254  		ti.keykind = uint8(reflect.Slice)
  2255  		ti.keysize = uint32(ti.key.Size())
  2256  		if ti.flagHasPkgPath {
  2257  			ti.fastpathUnderlying = ti.key
  2258  		}
  2259  
  2260  		// MARKER: reflect.Ptr cannot happen here, as we halt early if reflect.Ptr passed in
  2261  		// case reflect.Ptr:
  2262  		// 	ti.elem = rt.Elem()
  2263  		// 	ti.elemkind = uint8(ti.elem.Kind())
  2264  		// 	ti.elemsize = uint32(ti.elem.Size())
  2265  	}
  2266  
  2267  	x.mu.Lock()
  2268  	sp := x.infos.load()
  2269  	// since this is an atomic load/store, we MUST use a different array each time,
  2270  	// else we have a data race when a store is happening simultaneously with a findRtidFn call.
  2271  	if sp == nil {
  2272  		pti = &ti
  2273  		sp = []rtid2ti{{rtid, pti}}
  2274  		x.infos.store(sp)
  2275  	} else {
  2276  		var idx uint
  2277  		idx, pti = findTypeInfo(sp, rtid)
  2278  		if pti == nil {
  2279  			pti = &ti
  2280  			sp2 := make([]rtid2ti, len(sp)+1)
  2281  			copy(sp2[idx+1:], sp[idx:])
  2282  			copy(sp2, sp[:idx])
  2283  			sp2[idx] = rtid2ti{rtid, pti}
  2284  			x.infos.store(sp2)
  2285  		}
  2286  	}
  2287  	x.mu.Unlock()
  2288  	return
  2289  }
  2290  
  2291  func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr,
  2292  	path *structFieldInfoPathNode, pv *typeInfoLoad, omitEmpty bool) {
  2293  	// Read up fields and store how to access the value.
  2294  	//
  2295  	// It uses go's rules for message selectors,
  2296  	// which say that the field with the shallowest depth is selected.
  2297  	//
  2298  	// Note: we consciously use slices, not a map, to simulate a set.
  2299  	//       Typically, types have < 16 fields,
  2300  	//       and iteration using equals is faster than maps there
  2301  	flen := rt.NumField()
  2302  LOOP:
  2303  	for j, jlen := uint16(0), uint16(flen); j < jlen; j++ {
  2304  		f := rt.Field(int(j))
  2305  		fkind := f.Type.Kind()
  2306  
  2307  		// skip if a func type, or is unexported, or structTag value == "-"
  2308  		switch fkind {
  2309  		case reflect.Func, reflect.UnsafePointer:
  2310  			continue LOOP
  2311  		}
  2312  
  2313  		isUnexported := f.PkgPath != ""
  2314  		if isUnexported && !f.Anonymous {
  2315  			continue
  2316  		}
  2317  		stag := x.structTag(f.Tag)
  2318  		if stag == "-" {
  2319  			continue
  2320  		}
  2321  		var si structFieldInfo
  2322  
  2323  		var numderef uint8 = 0
  2324  		for xft := f.Type; xft.Kind() == reflect.Ptr; xft = xft.Elem() {
  2325  			numderef++
  2326  		}
  2327  
  2328  		var parsed bool
  2329  		// if anonymous and no struct tag (or it's blank),
  2330  		// and a struct (or pointer to struct), inline it.
  2331  		if f.Anonymous && fkind != reflect.Interface {
  2332  			// ^^ redundant but ok: per go spec, an embedded pointer type cannot be to an interface
  2333  			ft := f.Type
  2334  			isPtr := ft.Kind() == reflect.Ptr
  2335  			for ft.Kind() == reflect.Ptr {
  2336  				ft = ft.Elem()
  2337  			}
  2338  			isStruct := ft.Kind() == reflect.Struct
  2339  
  2340  			// Ignore embedded fields of unexported non-struct types.
  2341  			// Also, from go1.10, ignore pointers to unexported struct types
  2342  			// because unmarshal cannot assign a new struct to an unexported field.
  2343  			// See https://golang.org/issue/21357
  2344  			if (isUnexported && !isStruct) || (!allowSetUnexportedEmbeddedPtr && isUnexported && isPtr) {
  2345  				continue
  2346  			}
  2347  			doInline := stag == ""
  2348  			if !doInline {
  2349  				si.parseTag(stag)
  2350  				parsed = true
  2351  				doInline = si.encName == "" // si.isZero()
  2352  			}
  2353  			if doInline && isStruct {
  2354  				// if etypes contains this, don't call rget again (as fields are already seen here)
  2355  				ftid := rt2id(ft)
  2356  				// We cannot recurse forever, but we need to track other field depths.
  2357  				// So - we break if we see a type twice (not the first time).
  2358  				// This should be sufficient to handle an embedded type that refers to its
  2359  				// owning type, which then refers to its embedded type.
  2360  				processIt := true
  2361  				numk := 0
  2362  				for _, k := range pv.etypes {
  2363  					if k == ftid {
  2364  						numk++
  2365  						if numk == rgetMaxRecursion {
  2366  							processIt = false
  2367  							break
  2368  						}
  2369  					}
  2370  				}
  2371  				if processIt {
  2372  					pv.etypes = append(pv.etypes, ftid)
  2373  					path2 := &structFieldInfoPathNode{
  2374  						parent:   path,
  2375  						typ:      f.Type,
  2376  						offset:   uint16(f.Offset),
  2377  						index:    j,
  2378  						kind:     uint8(fkind),
  2379  						numderef: numderef,
  2380  					}
  2381  					x.rget(ft, ftid, path2, pv, omitEmpty)
  2382  				}
  2383  				continue
  2384  			}
  2385  		}
  2386  
  2387  		// after the anonymous dance: if an unexported field, skip
  2388  		if isUnexported || f.Name == "" { // f.Name cannot be "", but defensively handle it
  2389  			continue
  2390  		}
  2391  
  2392  		si.path = structFieldInfoPathNode{
  2393  			parent:   path,
  2394  			typ:      f.Type,
  2395  			offset:   uint16(f.Offset),
  2396  			index:    j,
  2397  			kind:     uint8(fkind),
  2398  			numderef: numderef,
  2399  			// set asciiAlphaNum to true (default); checked and may be set to false below
  2400  			encNameAsciiAlphaNum: true,
  2401  			// note: omitEmpty might have been set in an earlier parseTag call, etc - so carry it forward
  2402  			omitEmpty: si.path.omitEmpty,
  2403  		}
  2404  
  2405  		if !parsed {
  2406  			si.encName = f.Name
  2407  			si.parseTag(stag)
  2408  			parsed = true
  2409  		} else if si.encName == "" {
  2410  			si.encName = f.Name
  2411  		}
  2412  
  2413  		// si.encNameHash = maxUintptr() // hashShortString(bytesView(si.encName))
  2414  
  2415  		if omitEmpty {
  2416  			si.path.omitEmpty = true
  2417  		}
  2418  
  2419  		for i := len(si.encName) - 1; i >= 0; i-- { // bounds-check elimination
  2420  			if !asciiAlphaNumBitset.isset(si.encName[i]) {
  2421  				si.path.encNameAsciiAlphaNum = false
  2422  				break
  2423  			}
  2424  		}
  2425  
  2426  		pv.sfis = append(pv.sfis, si)
  2427  	}
  2428  }
  2429  
  2430  func implIntf(rt, iTyp reflect.Type) (base bool, indir bool) {
  2431  	// return rt.Implements(iTyp), reflect.PtrTo(rt).Implements(iTyp)
  2432  
  2433  	// if I's method is defined on T (ie T implements I), then *T implements I.
  2434  	// The converse is not true.
  2435  
  2436  	// Type.Implements can be expensive, as it does a simulataneous linear search across 2 lists
  2437  	// with alphanumeric string comparisons.
  2438  	// If we can avoid running one of these 2 calls, we should.
  2439  
  2440  	base = rt.Implements(iTyp)
  2441  	if base {
  2442  		indir = true
  2443  	} else {
  2444  		indir = reflect.PtrTo(rt).Implements(iTyp)
  2445  	}
  2446  	return
  2447  }
  2448  
  2449  func bool2int(b bool) (v uint8) {
  2450  	// MARKER: optimized to be a single instruction
  2451  	if b {
  2452  		v = 1
  2453  	}
  2454  	return
  2455  }
  2456  
  2457  func isSliceBoundsError(s string) bool {
  2458  	return strings.Contains(s, "index out of range") ||
  2459  		strings.Contains(s, "slice bounds out of range")
  2460  }
  2461  
  2462  func sprintf(format string, v ...interface{}) string {
  2463  	return fmt.Sprintf(format, v...)
  2464  }
  2465  
  2466  func panicValToErr(h errDecorator, v interface{}, err *error) {
  2467  	if v == *err {
  2468  		return
  2469  	}
  2470  	switch xerr := v.(type) {
  2471  	case nil:
  2472  	case runtime.Error:
  2473  		d, dok := h.(*Decoder)
  2474  		if dok && d.bytes && isSliceBoundsError(xerr.Error()) {
  2475  			*err = io.ErrUnexpectedEOF
  2476  		} else {
  2477  			h.wrapErr(xerr, err)
  2478  		}
  2479  	case error:
  2480  		switch xerr {
  2481  		case nil:
  2482  		case io.EOF, io.ErrUnexpectedEOF, errEncoderNotInitialized, errDecoderNotInitialized:
  2483  			// treat as special (bubble up)
  2484  			*err = xerr
  2485  		default:
  2486  			h.wrapErr(xerr, err)
  2487  		}
  2488  	default:
  2489  		// we don't expect this to happen (as this library always panics with an error)
  2490  		h.wrapErr(fmt.Errorf("%v", v), err)
  2491  	}
  2492  }
  2493  
  2494  func usableByteSlice(bs []byte, slen int) (out []byte, changed bool) {
  2495  	const maxCap = 1024 * 1024 * 64 // 64MB
  2496  	const skipMaxCap = false        // allow to test
  2497  	if slen <= 0 {
  2498  		return []byte{}, true
  2499  	}
  2500  	if slen <= cap(bs) {
  2501  		return bs[:slen], false
  2502  	}
  2503  	// slen > cap(bs) ... handle memory overload appropriately
  2504  	if skipMaxCap || slen <= maxCap {
  2505  		return make([]byte, slen), true
  2506  	}
  2507  	return make([]byte, maxCap), true
  2508  }
  2509  
  2510  func mapKeyFastKindFor(k reflect.Kind) mapKeyFastKind {
  2511  	return mapKeyFastKindVals[k&31]
  2512  }
  2513  
  2514  // ----
  2515  
  2516  type codecFnInfo struct {
  2517  	ti     *typeInfo
  2518  	xfFn   Ext
  2519  	xfTag  uint64
  2520  	addrD  bool
  2521  	addrDf bool // force: if addrD, then decode function MUST take a ptr
  2522  	addrE  bool
  2523  	// addrEf bool // force: if addrE, then encode function MUST take a ptr
  2524  }
  2525  
  2526  // codecFn encapsulates the captured variables and the encode function.
  2527  // This way, we only do some calculations one times, and pass to the
  2528  // code block that should be called (encapsulated in a function)
  2529  // instead of executing the checks every time.
  2530  type codecFn struct {
  2531  	i  codecFnInfo
  2532  	fe func(*Encoder, *codecFnInfo, reflect.Value)
  2533  	fd func(*Decoder, *codecFnInfo, reflect.Value)
  2534  	// _  [1]uint64 // padding (cache-aligned)
  2535  }
  2536  
  2537  type codecRtidFn struct {
  2538  	rtid uintptr
  2539  	fn   *codecFn
  2540  }
  2541  
  2542  func makeExt(ext interface{}) Ext {
  2543  	switch t := ext.(type) {
  2544  	case Ext:
  2545  		return t
  2546  	case BytesExt:
  2547  		return &bytesExtWrapper{BytesExt: t}
  2548  	case InterfaceExt:
  2549  		return &interfaceExtWrapper{InterfaceExt: t}
  2550  	}
  2551  	return &extFailWrapper{}
  2552  }
  2553  
  2554  func baseRV(v interface{}) (rv reflect.Value) {
  2555  	// use reflect.ValueOf, not rv4i, as of go 1.16beta, rv4i was not inlineable
  2556  	for rv = reflect.ValueOf(v); rv.Kind() == reflect.Ptr; rv = rv.Elem() {
  2557  	}
  2558  	return
  2559  }
  2560  
  2561  // ----
  2562  
  2563  // these "checkOverflow" functions must be inlinable, and not call anybody.
  2564  // Overflow means that the value cannot be represented without wrapping/overflow.
  2565  // Overflow=false does not mean that the value can be represented without losing precision
  2566  // (especially for floating point).
  2567  
  2568  type checkOverflow struct{}
  2569  
  2570  func (checkOverflow) Float32(v float64) (overflow bool) {
  2571  	if v < 0 {
  2572  		v = -v
  2573  	}
  2574  	return math.MaxFloat32 < v && v <= math.MaxFloat64
  2575  }
  2576  func (checkOverflow) Uint(v uint64, bitsize uint8) (overflow bool) {
  2577  	if v != 0 && v != (v<<(64-bitsize))>>(64-bitsize) {
  2578  		overflow = true
  2579  	}
  2580  	return
  2581  }
  2582  func (checkOverflow) Int(v int64, bitsize uint8) (overflow bool) {
  2583  	if v != 0 && v != (v<<(64-bitsize))>>(64-bitsize) {
  2584  		overflow = true
  2585  	}
  2586  	return
  2587  }
  2588  
  2589  func (checkOverflow) Uint2Int(v uint64, neg bool) (overflow bool) {
  2590  	return (neg && v > 1<<63) || (!neg && v >= 1<<63)
  2591  }
  2592  
  2593  func (checkOverflow) SignedInt(v uint64) (overflow bool) {
  2594  	//e.g. -127 to 128 for int8
  2595  	// pos := (v >> 63) == 0
  2596  	// ui2 := v & 0x7fffffffffffffff
  2597  	// if pos {
  2598  	// 	if ui2 > math.MaxInt64 {
  2599  	// 		overflow = true
  2600  	// 	}
  2601  	// } else {
  2602  	// 	if ui2 > math.MaxInt64-1 {
  2603  	// 		overflow = true
  2604  	// 	}
  2605  	// }
  2606  
  2607  	// a signed integer has overflow if the sign (first) bit is 1 (negative)
  2608  	// and the numbers after the sign bit is > maxint64 - 1
  2609  	overflow = (v>>63) != 0 && v&0x7fffffffffffffff > math.MaxInt64-1
  2610  
  2611  	return
  2612  }
  2613  
  2614  func (x checkOverflow) Float32V(v float64) float64 {
  2615  	if x.Float32(v) {
  2616  		halt.errorf("float32 overflow: %v", v)
  2617  	}
  2618  	return v
  2619  }
  2620  func (x checkOverflow) UintV(v uint64, bitsize uint8) uint64 {
  2621  	if x.Uint(v, bitsize) {
  2622  		halt.errorf("uint64 overflow: %v", v)
  2623  	}
  2624  	return v
  2625  }
  2626  func (x checkOverflow) IntV(v int64, bitsize uint8) int64 {
  2627  	if x.Int(v, bitsize) {
  2628  		halt.errorf("int64 overflow: %v", v)
  2629  	}
  2630  	return v
  2631  }
  2632  func (x checkOverflow) SignedIntV(v uint64) int64 {
  2633  	if x.SignedInt(v) {
  2634  		halt.errorf("uint64 to int64 overflow: %v", v)
  2635  	}
  2636  	return int64(v)
  2637  }
  2638  
  2639  // ------------------ FLOATING POINT -----------------
  2640  
  2641  func isNaN64(f float64) bool { return f != f }
  2642  
  2643  func isWhitespaceChar(v byte) bool {
  2644  	// these are in order of speed below ...
  2645  
  2646  	return v < 33
  2647  	// return v < 33 && whitespaceCharBitset64.isset(v)
  2648  	// return v < 33 && (v == ' ' || v == '\n' || v == '\t' || v == '\r')
  2649  	// return v == ' ' || v == '\n' || v == '\t' || v == '\r'
  2650  	// return whitespaceCharBitset.isset(v)
  2651  }
  2652  
  2653  func isNumberChar(v byte) bool {
  2654  	// these are in order of speed below ...
  2655  
  2656  	return numCharBitset.isset(v)
  2657  	// return v < 64 && numCharNoExpBitset64.isset(v) || v == 'e' || v == 'E'
  2658  	// return v > 42 && v < 102 && numCharWithExpBitset64.isset(v-42)
  2659  }
  2660  
  2661  // -----------------------
  2662  
  2663  type ioFlusher interface {
  2664  	Flush() error
  2665  }
  2666  
  2667  type ioBuffered interface {
  2668  	Buffered() int
  2669  }
  2670  
  2671  // -----------------------
  2672  
  2673  type sfiRv struct {
  2674  	v *structFieldInfo
  2675  	r reflect.Value
  2676  }
  2677  
  2678  // ------
  2679  
  2680  // bitset types are better than [256]bool, because they permit the whole
  2681  // bitset array being on a single cache line and use less memory.
  2682  //
  2683  // Also, since pos is a byte (0-255), there's no bounds checks on indexing (cheap).
  2684  //
  2685  // We previously had bitset128 [16]byte, and bitset32 [4]byte, but those introduces
  2686  // bounds checking, so we discarded them, and everyone uses bitset256.
  2687  //
  2688  // given x > 0 and n > 0 and x is exactly 2^n, then pos/x === pos>>n AND pos%x === pos&(x-1).
  2689  // consequently, pos/32 === pos>>5, pos/16 === pos>>4, pos/8 === pos>>3, pos%8 == pos&7
  2690  //
  2691  // Note that using >> or & is faster than using / or %, as division is quite expensive if not optimized.
  2692  
  2693  // MARKER:
  2694  // We noticed a little performance degradation when using bitset256 as [32]byte (or bitset32 as uint32).
  2695  // For example, json encoding went from 188K ns/op to 168K ns/op (~ 10% reduction).
  2696  // Consequently, we are using a [NNN]bool for bitsetNNN.
  2697  // To eliminate bounds-checking, we use x % v as that is guaranteed to be within bounds.
  2698  
  2699  // ----
  2700  type bitset32 [32]bool
  2701  
  2702  func (x *bitset32) set(pos byte) *bitset32 {
  2703  	x[pos&31] = true // x[pos%32] = true
  2704  	return x
  2705  }
  2706  func (x *bitset32) isset(pos byte) bool {
  2707  	return x[pos&31] // x[pos%32]
  2708  }
  2709  
  2710  type bitset256 [256]bool
  2711  
  2712  func (x *bitset256) set(pos byte) *bitset256 {
  2713  	x[pos] = true
  2714  	return x
  2715  }
  2716  func (x *bitset256) isset(pos byte) bool {
  2717  	return x[pos]
  2718  }
  2719  
  2720  // ------------
  2721  
  2722  type panicHdl struct{}
  2723  
  2724  // errorv will panic if err is defined (not nil)
  2725  func (panicHdl) onerror(err error) {
  2726  	if err != nil {
  2727  		panic(err)
  2728  	}
  2729  }
  2730  
  2731  // errorf will always panic, using the parameters passed.
  2732  //
  2733  // Note: it is ok to pass in a stringView, as it will just pass it directly
  2734  // to a fmt.Sprintf call and not hold onto it.
  2735  //
  2736  //go:noinline
  2737  func (panicHdl) errorf(format string, params ...interface{}) {
  2738  	if format == "" {
  2739  		panic(errPanicUndefined)
  2740  	}
  2741  	if len(params) == 0 {
  2742  		panic(errors.New(format))
  2743  	}
  2744  	panic(fmt.Errorf(format, params...))
  2745  }
  2746  
  2747  // ----------------------------------------------------
  2748  
  2749  type errDecorator interface {
  2750  	wrapErr(in error, out *error)
  2751  }
  2752  
  2753  type errDecoratorDef struct{}
  2754  
  2755  func (errDecoratorDef) wrapErr(v error, e *error) { *e = v }
  2756  
  2757  // ----------------------------------------------------
  2758  
  2759  type mustHdl struct{}
  2760  
  2761  func (mustHdl) String(s string, err error) string {
  2762  	halt.onerror(err)
  2763  	return s
  2764  }
  2765  func (mustHdl) Int(s int64, err error) int64 {
  2766  	halt.onerror(err)
  2767  	return s
  2768  }
  2769  func (mustHdl) Uint(s uint64, err error) uint64 {
  2770  	halt.onerror(err)
  2771  	return s
  2772  }
  2773  func (mustHdl) Float(s float64, err error) float64 {
  2774  	halt.onerror(err)
  2775  	return s
  2776  }
  2777  
  2778  // -------------------
  2779  
  2780  func freelistCapacity(length int) (capacity int) {
  2781  	for capacity = 8; capacity <= length; capacity *= 2 {
  2782  	}
  2783  	return
  2784  }
  2785  
  2786  // bytesFreelist is a list of byte buffers, sorted by cap.
  2787  //
  2788  // In anecdotal testing (running go test -tsd 1..6), we couldn't get
  2789  // the length of the list > 4 at any time. So we believe a linear search
  2790  // without bounds checking is sufficient.
  2791  //
  2792  // Typical usage model:
  2793  //
  2794  //	peek may go together with put, iff pop=true. peek gets largest byte slice temporarily.
  2795  //	check is used to switch a []byte if necessary
  2796  //	get/put go together
  2797  //
  2798  // Given that folks may get a []byte, and then append to it a lot which may re-allocate
  2799  // a new []byte, we should try to return both (one received from blist and new one allocated).
  2800  //
  2801  // Typical usage model for get/put, when we don't know whether we may need more than requested
  2802  //
  2803  //	v0 := blist.get()
  2804  //	v1 := v0
  2805  //	... use v1 ...
  2806  //	blist.put(v1)
  2807  //	if !byteSliceSameData(v0, v1) {
  2808  //	  blist.put(v0)
  2809  //	}
  2810  type bytesFreelist [][]byte
  2811  
  2812  // peek returns a slice of possibly non-zero'ed bytes, with len=0,
  2813  // and with the largest capacity from the list.
  2814  func (x *bytesFreelist) peek(length int, pop bool) (out []byte) {
  2815  	if bytesFreeListNoCache {
  2816  		return make([]byte, 0, freelistCapacity(length))
  2817  	}
  2818  	y := *x
  2819  	if len(y) > 0 {
  2820  		out = y[len(y)-1]
  2821  	}
  2822  	// start buf with a minimum of 64 bytes
  2823  	const minLenBytes = 64
  2824  	if length < minLenBytes {
  2825  		length = minLenBytes
  2826  	}
  2827  	if cap(out) < length {
  2828  		out = make([]byte, 0, freelistCapacity(length))
  2829  		y = append(y, out)
  2830  		*x = y
  2831  	}
  2832  	if pop && len(y) > 0 {
  2833  		y = y[:len(y)-1]
  2834  		*x = y
  2835  	}
  2836  	return
  2837  }
  2838  
  2839  // get returns a slice of possibly non-zero'ed bytes, with len=0,
  2840  // and with cap >= length requested.
  2841  func (x *bytesFreelist) get(length int) (out []byte) {
  2842  	if bytesFreeListNoCache {
  2843  		return make([]byte, 0, freelistCapacity(length))
  2844  	}
  2845  	y := *x
  2846  	// MARKER: do not use range, as range is not currently inlineable as of go 1.16-beta
  2847  	// for i, v := range y {
  2848  	for i := 0; i < len(y); i++ {
  2849  		v := y[i]
  2850  		if cap(v) >= length {
  2851  			// *x = append(y[:i], y[i+1:]...)
  2852  			copy(y[i:], y[i+1:])
  2853  			*x = y[:len(y)-1]
  2854  			return v
  2855  		}
  2856  	}
  2857  	return make([]byte, 0, freelistCapacity(length))
  2858  }
  2859  
  2860  func (x *bytesFreelist) put(v []byte) {
  2861  	if bytesFreeListNoCache || cap(v) == 0 {
  2862  		return
  2863  	}
  2864  	if len(v) != 0 {
  2865  		v = v[:0]
  2866  	}
  2867  	// append the new value, then try to put it in a better position
  2868  	y := append(*x, v)
  2869  	*x = y
  2870  	// MARKER: do not use range, as range is not currently inlineable as of go 1.16-beta
  2871  	// for i, z := range y[:len(y)-1] {
  2872  	for i := 0; i < len(y)-1; i++ {
  2873  		z := y[i]
  2874  		if cap(z) > cap(v) {
  2875  			copy(y[i+1:], y[i:])
  2876  			y[i] = v
  2877  			return
  2878  		}
  2879  	}
  2880  }
  2881  
  2882  func (x *bytesFreelist) check(v []byte, length int) (out []byte) {
  2883  	// ensure inlineable, by moving slow-path out to its own function
  2884  	if cap(v) >= length {
  2885  		return v[:0]
  2886  	}
  2887  	return x.checkPutGet(v, length)
  2888  }
  2889  
  2890  func (x *bytesFreelist) checkPutGet(v []byte, length int) []byte {
  2891  	// checkPutGet broken out into its own function, so check is inlineable in general case
  2892  	const useSeparateCalls = false
  2893  
  2894  	if useSeparateCalls {
  2895  		x.put(v)
  2896  		return x.get(length)
  2897  	}
  2898  
  2899  	if bytesFreeListNoCache {
  2900  		return make([]byte, 0, freelistCapacity(length))
  2901  	}
  2902  
  2903  	// assume cap(v) < length, so put must happen before get
  2904  	y := *x
  2905  	var put = cap(v) == 0 // if empty, consider it already put
  2906  	if !put {
  2907  		y = append(y, v)
  2908  		*x = y
  2909  	}
  2910  	for i := 0; i < len(y); i++ {
  2911  		z := y[i]
  2912  		if put {
  2913  			if cap(z) >= length {
  2914  				copy(y[i:], y[i+1:])
  2915  				y = y[:len(y)-1]
  2916  				*x = y
  2917  				return z
  2918  			}
  2919  		} else {
  2920  			if cap(z) > cap(v) {
  2921  				copy(y[i+1:], y[i:])
  2922  				y[i] = v
  2923  				put = true
  2924  			}
  2925  		}
  2926  	}
  2927  	return make([]byte, 0, freelistCapacity(length))
  2928  }
  2929  
  2930  // -------------------------
  2931  
  2932  // sfiRvFreelist is used by Encoder for encoding structs,
  2933  // where we have to gather the fields first and then
  2934  // analyze them for omitEmpty, before knowing the length of the array/map to encode.
  2935  //
  2936  // Typically, the length here will depend on the number of cycles e.g.
  2937  // if type T1 has reference to T1, or T1 has reference to type T2 which has reference to T1.
  2938  //
  2939  // In the general case, the length of this list at most times is 1,
  2940  // so linear search is fine.
  2941  type sfiRvFreelist [][]sfiRv
  2942  
  2943  func (x *sfiRvFreelist) get(length int) (out []sfiRv) {
  2944  	y := *x
  2945  
  2946  	// MARKER: do not use range, as range is not currently inlineable as of go 1.16-beta
  2947  	// for i, v := range y {
  2948  	for i := 0; i < len(y); i++ {
  2949  		v := y[i]
  2950  		if cap(v) >= length {
  2951  			// *x = append(y[:i], y[i+1:]...)
  2952  			copy(y[i:], y[i+1:])
  2953  			*x = y[:len(y)-1]
  2954  			return v
  2955  		}
  2956  	}
  2957  	return make([]sfiRv, 0, freelistCapacity(length))
  2958  }
  2959  
  2960  func (x *sfiRvFreelist) put(v []sfiRv) {
  2961  	if len(v) != 0 {
  2962  		v = v[:0]
  2963  	}
  2964  	// append the new value, then try to put it in a better position
  2965  	y := append(*x, v)
  2966  	*x = y
  2967  	// MARKER: do not use range, as range is not currently inlineable as of go 1.16-beta
  2968  	// for i, z := range y[:len(y)-1] {
  2969  	for i := 0; i < len(y)-1; i++ {
  2970  		z := y[i]
  2971  		if cap(z) > cap(v) {
  2972  			copy(y[i+1:], y[i:])
  2973  			y[i] = v
  2974  			return
  2975  		}
  2976  	}
  2977  }
  2978  
  2979  // ---- multiple interner implementations ----
  2980  
  2981  // Hard to tell which is most performant:
  2982  //   - use a map[string]string - worst perf, no collisions, and unlimited entries
  2983  //   - use a linear search with move to front heuristics - no collisions, and maxed at 64 entries
  2984  //   - use a computationally-intensive hash - best performance, some collisions, maxed at 64 entries
  2985  
  2986  const (
  2987  	internMaxStrLen = 16     // if more than 16 bytes, faster to copy than compare bytes
  2988  	internCap       = 64 * 2 // 64 uses 1K bytes RAM, so 128 (anecdotal sweet spot) uses 2K bytes
  2989  )
  2990  
  2991  type internerMap map[string]string
  2992  
  2993  func (x *internerMap) init() {
  2994  	*x = make(map[string]string, internCap)
  2995  }
  2996  
  2997  func (x internerMap) string(v []byte) (s string) {
  2998  	s, ok := x[string(v)] // no allocation here, per go implementation
  2999  	if !ok {
  3000  		s = string(v) // new allocation here
  3001  		x[s] = s
  3002  	}
  3003  	return
  3004  }