mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-13 10:33:35 +00:00
build: move e2e dependencies into e2e/go.mod
Several packages are only used while running the e2e suite. These packages are less important to update, as the they can not influence the final executable that is part of the Ceph-CSI container-image. By moving these dependencies out of the main Ceph-CSI go.mod, it is easier to identify if a reported CVE affects Ceph-CSI, or only the testing (like most of the Kubernetes CVEs). Signed-off-by: Niels de Vos <ndevos@ibm.com>
This commit is contained in:
committed by
mergify[bot]
parent
15da101b1b
commit
bec6090996
414
e2e/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
generated
vendored
Normal file
414
e2e/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go
generated
vendored
Normal file
@ -0,0 +1,414 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package descfmt provides functionality to format descriptors.
|
||||
package descfmt
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type list interface {
|
||||
Len() int
|
||||
pragma.DoNotImplement
|
||||
}
|
||||
|
||||
func FormatList(s fmt.State, r rune, vs list) {
|
||||
io.WriteString(s, formatListOpt(vs, true, r == 'v' && (s.Flag('+') || s.Flag('#'))))
|
||||
}
|
||||
func formatListOpt(vs list, isRoot, allowMulti bool) string {
|
||||
start, end := "[", "]"
|
||||
if isRoot {
|
||||
var name string
|
||||
switch vs.(type) {
|
||||
case protoreflect.Names:
|
||||
name = "Names"
|
||||
case protoreflect.FieldNumbers:
|
||||
name = "FieldNumbers"
|
||||
case protoreflect.FieldRanges:
|
||||
name = "FieldRanges"
|
||||
case protoreflect.EnumRanges:
|
||||
name = "EnumRanges"
|
||||
case protoreflect.FileImports:
|
||||
name = "FileImports"
|
||||
case protoreflect.Descriptor:
|
||||
name = reflect.ValueOf(vs).MethodByName("Get").Type().Out(0).Name() + "s"
|
||||
default:
|
||||
name = reflect.ValueOf(vs).Elem().Type().Name()
|
||||
}
|
||||
start, end = name+"{", "}"
|
||||
}
|
||||
|
||||
var ss []string
|
||||
switch vs := vs.(type) {
|
||||
case protoreflect.Names:
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
ss = append(ss, fmt.Sprint(vs.Get(i)))
|
||||
}
|
||||
return start + joinStrings(ss, false) + end
|
||||
case protoreflect.FieldNumbers:
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
ss = append(ss, fmt.Sprint(vs.Get(i)))
|
||||
}
|
||||
return start + joinStrings(ss, false) + end
|
||||
case protoreflect.FieldRanges:
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
r := vs.Get(i)
|
||||
if r[0]+1 == r[1] {
|
||||
ss = append(ss, fmt.Sprintf("%d", r[0]))
|
||||
} else {
|
||||
ss = append(ss, fmt.Sprintf("%d:%d", r[0], r[1])) // enum ranges are end exclusive
|
||||
}
|
||||
}
|
||||
return start + joinStrings(ss, false) + end
|
||||
case protoreflect.EnumRanges:
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
r := vs.Get(i)
|
||||
if r[0] == r[1] {
|
||||
ss = append(ss, fmt.Sprintf("%d", r[0]))
|
||||
} else {
|
||||
ss = append(ss, fmt.Sprintf("%d:%d", r[0], int64(r[1])+1)) // enum ranges are end inclusive
|
||||
}
|
||||
}
|
||||
return start + joinStrings(ss, false) + end
|
||||
case protoreflect.FileImports:
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
var rs records
|
||||
rv := reflect.ValueOf(vs.Get(i))
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Path"), "Path"},
|
||||
{rv.MethodByName("Package"), "Package"},
|
||||
{rv.MethodByName("IsPublic"), "IsPublic"},
|
||||
{rv.MethodByName("IsWeak"), "IsWeak"},
|
||||
}...)
|
||||
ss = append(ss, "{"+rs.Join()+"}")
|
||||
}
|
||||
return start + joinStrings(ss, allowMulti) + end
|
||||
default:
|
||||
_, isEnumValue := vs.(protoreflect.EnumValueDescriptors)
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
m := reflect.ValueOf(vs).MethodByName("Get")
|
||||
v := m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface()
|
||||
ss = append(ss, formatDescOpt(v.(protoreflect.Descriptor), false, allowMulti && !isEnumValue, nil))
|
||||
}
|
||||
return start + joinStrings(ss, allowMulti && isEnumValue) + end
|
||||
}
|
||||
}
|
||||
|
||||
type methodAndName struct {
|
||||
method reflect.Value
|
||||
name string
|
||||
}
|
||||
|
||||
func FormatDesc(s fmt.State, r rune, t protoreflect.Descriptor) {
|
||||
io.WriteString(s, formatDescOpt(t, true, r == 'v' && (s.Flag('+') || s.Flag('#')), nil))
|
||||
}
|
||||
|
||||
func InternalFormatDescOptForTesting(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string {
|
||||
return formatDescOpt(t, isRoot, allowMulti, record)
|
||||
}
|
||||
|
||||
func formatDescOpt(t protoreflect.Descriptor, isRoot, allowMulti bool, record func(string)) string {
|
||||
rv := reflect.ValueOf(t)
|
||||
rt := rv.MethodByName("ProtoType").Type().In(0)
|
||||
|
||||
start, end := "{", "}"
|
||||
if isRoot {
|
||||
start = rt.Name() + "{"
|
||||
}
|
||||
|
||||
_, isFile := t.(protoreflect.FileDescriptor)
|
||||
rs := records{
|
||||
allowMulti: allowMulti,
|
||||
record: record,
|
||||
}
|
||||
if t.IsPlaceholder() {
|
||||
if isFile {
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Path"), "Path"},
|
||||
{rv.MethodByName("Package"), "Package"},
|
||||
{rv.MethodByName("IsPlaceholder"), "IsPlaceholder"},
|
||||
}...)
|
||||
} else {
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("FullName"), "FullName"},
|
||||
{rv.MethodByName("IsPlaceholder"), "IsPlaceholder"},
|
||||
}...)
|
||||
}
|
||||
} else {
|
||||
switch {
|
||||
case isFile:
|
||||
rs.Append(rv, methodAndName{rv.MethodByName("Syntax"), "Syntax"})
|
||||
case isRoot:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Syntax"), "Syntax"},
|
||||
{rv.MethodByName("FullName"), "FullName"},
|
||||
}...)
|
||||
default:
|
||||
rs.Append(rv, methodAndName{rv.MethodByName("Name"), "Name"})
|
||||
}
|
||||
switch t := t.(type) {
|
||||
case protoreflect.FieldDescriptor:
|
||||
accessors := []methodAndName{
|
||||
{rv.MethodByName("Number"), "Number"},
|
||||
{rv.MethodByName("Cardinality"), "Cardinality"},
|
||||
{rv.MethodByName("Kind"), "Kind"},
|
||||
{rv.MethodByName("HasJSONName"), "HasJSONName"},
|
||||
{rv.MethodByName("JSONName"), "JSONName"},
|
||||
{rv.MethodByName("HasPresence"), "HasPresence"},
|
||||
{rv.MethodByName("IsExtension"), "IsExtension"},
|
||||
{rv.MethodByName("IsPacked"), "IsPacked"},
|
||||
{rv.MethodByName("IsWeak"), "IsWeak"},
|
||||
{rv.MethodByName("IsList"), "IsList"},
|
||||
{rv.MethodByName("IsMap"), "IsMap"},
|
||||
{rv.MethodByName("MapKey"), "MapKey"},
|
||||
{rv.MethodByName("MapValue"), "MapValue"},
|
||||
{rv.MethodByName("HasDefault"), "HasDefault"},
|
||||
{rv.MethodByName("Default"), "Default"},
|
||||
{rv.MethodByName("ContainingOneof"), "ContainingOneof"},
|
||||
{rv.MethodByName("ContainingMessage"), "ContainingMessage"},
|
||||
{rv.MethodByName("Message"), "Message"},
|
||||
{rv.MethodByName("Enum"), "Enum"},
|
||||
}
|
||||
for _, s := range accessors {
|
||||
switch s.name {
|
||||
case "MapKey":
|
||||
if k := t.MapKey(); k != nil {
|
||||
rs.recs = append(rs.recs, [2]string{"MapKey", k.Kind().String()})
|
||||
}
|
||||
case "MapValue":
|
||||
if v := t.MapValue(); v != nil {
|
||||
switch v.Kind() {
|
||||
case protoreflect.EnumKind:
|
||||
rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Enum().FullName())})
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
rs.AppendRecs("MapValue", [2]string{"MapValue", string(v.Message().FullName())})
|
||||
default:
|
||||
rs.AppendRecs("MapValue", [2]string{"MapValue", v.Kind().String()})
|
||||
}
|
||||
}
|
||||
case "ContainingOneof":
|
||||
if od := t.ContainingOneof(); od != nil {
|
||||
rs.AppendRecs("ContainingOneof", [2]string{"Oneof", string(od.Name())})
|
||||
}
|
||||
case "ContainingMessage":
|
||||
if t.IsExtension() {
|
||||
rs.AppendRecs("ContainingMessage", [2]string{"Extendee", string(t.ContainingMessage().FullName())})
|
||||
}
|
||||
case "Message":
|
||||
if !t.IsMap() {
|
||||
rs.Append(rv, s)
|
||||
}
|
||||
default:
|
||||
rs.Append(rv, s)
|
||||
}
|
||||
}
|
||||
case protoreflect.OneofDescriptor:
|
||||
var ss []string
|
||||
fs := t.Fields()
|
||||
for i := 0; i < fs.Len(); i++ {
|
||||
ss = append(ss, string(fs.Get(i).Name()))
|
||||
}
|
||||
if len(ss) > 0 {
|
||||
rs.AppendRecs("Fields", [2]string{"Fields", "[" + joinStrings(ss, false) + "]"})
|
||||
}
|
||||
|
||||
case protoreflect.FileDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Path"), "Path"},
|
||||
{rv.MethodByName("Package"), "Package"},
|
||||
{rv.MethodByName("Imports"), "Imports"},
|
||||
{rv.MethodByName("Messages"), "Messages"},
|
||||
{rv.MethodByName("Enums"), "Enums"},
|
||||
{rv.MethodByName("Extensions"), "Extensions"},
|
||||
{rv.MethodByName("Services"), "Services"},
|
||||
}...)
|
||||
|
||||
case protoreflect.MessageDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("IsMapEntry"), "IsMapEntry"},
|
||||
{rv.MethodByName("Fields"), "Fields"},
|
||||
{rv.MethodByName("Oneofs"), "Oneofs"},
|
||||
{rv.MethodByName("ReservedNames"), "ReservedNames"},
|
||||
{rv.MethodByName("ReservedRanges"), "ReservedRanges"},
|
||||
{rv.MethodByName("RequiredNumbers"), "RequiredNumbers"},
|
||||
{rv.MethodByName("ExtensionRanges"), "ExtensionRanges"},
|
||||
{rv.MethodByName("Messages"), "Messages"},
|
||||
{rv.MethodByName("Enums"), "Enums"},
|
||||
{rv.MethodByName("Extensions"), "Extensions"},
|
||||
}...)
|
||||
|
||||
case protoreflect.EnumDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Values"), "Values"},
|
||||
{rv.MethodByName("ReservedNames"), "ReservedNames"},
|
||||
{rv.MethodByName("ReservedRanges"), "ReservedRanges"},
|
||||
{rv.MethodByName("IsClosed"), "IsClosed"},
|
||||
}...)
|
||||
|
||||
case protoreflect.EnumValueDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Number"), "Number"},
|
||||
}...)
|
||||
|
||||
case protoreflect.ServiceDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Methods"), "Methods"},
|
||||
}...)
|
||||
|
||||
case protoreflect.MethodDescriptor:
|
||||
rs.Append(rv, []methodAndName{
|
||||
{rv.MethodByName("Input"), "Input"},
|
||||
{rv.MethodByName("Output"), "Output"},
|
||||
{rv.MethodByName("IsStreamingClient"), "IsStreamingClient"},
|
||||
{rv.MethodByName("IsStreamingServer"), "IsStreamingServer"},
|
||||
}...)
|
||||
}
|
||||
if m := rv.MethodByName("GoType"); m.IsValid() {
|
||||
rs.Append(rv, methodAndName{m, "GoType"})
|
||||
}
|
||||
}
|
||||
return start + rs.Join() + end
|
||||
}
|
||||
|
||||
type records struct {
|
||||
recs [][2]string
|
||||
allowMulti bool
|
||||
|
||||
// record is a function that will be called for every Append() or
|
||||
// AppendRecs() call, to be used for testing with the
|
||||
// InternalFormatDescOptForTesting function.
|
||||
record func(string)
|
||||
}
|
||||
|
||||
func (rs *records) AppendRecs(fieldName string, newRecs [2]string) {
|
||||
if rs.record != nil {
|
||||
rs.record(fieldName)
|
||||
}
|
||||
rs.recs = append(rs.recs, newRecs)
|
||||
}
|
||||
|
||||
func (rs *records) Append(v reflect.Value, accessors ...methodAndName) {
|
||||
for _, a := range accessors {
|
||||
if rs.record != nil {
|
||||
rs.record(a.name)
|
||||
}
|
||||
var rv reflect.Value
|
||||
if a.method.IsValid() {
|
||||
rv = a.method.Call(nil)[0]
|
||||
}
|
||||
if v.Kind() == reflect.Struct && !rv.IsValid() {
|
||||
rv = v.FieldByName(a.name)
|
||||
}
|
||||
if !rv.IsValid() {
|
||||
panic(fmt.Sprintf("unknown accessor: %v.%s", v.Type(), a.name))
|
||||
}
|
||||
if _, ok := rv.Interface().(protoreflect.Value); ok {
|
||||
rv = rv.MethodByName("Interface").Call(nil)[0]
|
||||
if !rv.IsNil() {
|
||||
rv = rv.Elem()
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore zero values.
|
||||
var isZero bool
|
||||
switch rv.Kind() {
|
||||
case reflect.Interface, reflect.Slice:
|
||||
isZero = rv.IsNil()
|
||||
case reflect.Bool:
|
||||
isZero = rv.Bool() == false
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
isZero = rv.Int() == 0
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||
isZero = rv.Uint() == 0
|
||||
case reflect.String:
|
||||
isZero = rv.String() == ""
|
||||
}
|
||||
if n, ok := rv.Interface().(list); ok {
|
||||
isZero = n.Len() == 0
|
||||
}
|
||||
if isZero {
|
||||
continue
|
||||
}
|
||||
|
||||
// Format the value.
|
||||
var s string
|
||||
v := rv.Interface()
|
||||
switch v := v.(type) {
|
||||
case list:
|
||||
s = formatListOpt(v, false, rs.allowMulti)
|
||||
case protoreflect.FieldDescriptor, protoreflect.OneofDescriptor, protoreflect.EnumValueDescriptor, protoreflect.MethodDescriptor:
|
||||
s = string(v.(protoreflect.Descriptor).Name())
|
||||
case protoreflect.Descriptor:
|
||||
s = string(v.FullName())
|
||||
case string:
|
||||
s = strconv.Quote(v)
|
||||
case []byte:
|
||||
s = fmt.Sprintf("%q", v)
|
||||
default:
|
||||
s = fmt.Sprint(v)
|
||||
}
|
||||
rs.recs = append(rs.recs, [2]string{a.name, s})
|
||||
}
|
||||
}
|
||||
|
||||
func (rs *records) Join() string {
|
||||
var ss []string
|
||||
|
||||
// In single line mode, simply join all records with commas.
|
||||
if !rs.allowMulti {
|
||||
for _, r := range rs.recs {
|
||||
ss = append(ss, r[0]+formatColon(0)+r[1])
|
||||
}
|
||||
return joinStrings(ss, false)
|
||||
}
|
||||
|
||||
// In allowMulti line mode, align single line records for more readable output.
|
||||
var maxLen int
|
||||
flush := func(i int) {
|
||||
for _, r := range rs.recs[len(ss):i] {
|
||||
ss = append(ss, r[0]+formatColon(maxLen-len(r[0]))+r[1])
|
||||
}
|
||||
maxLen = 0
|
||||
}
|
||||
for i, r := range rs.recs {
|
||||
if isMulti := strings.Contains(r[1], "\n"); isMulti {
|
||||
flush(i)
|
||||
ss = append(ss, r[0]+formatColon(0)+strings.Join(strings.Split(r[1], "\n"), "\n\t"))
|
||||
} else if maxLen < len(r[0]) {
|
||||
maxLen = len(r[0])
|
||||
}
|
||||
}
|
||||
flush(len(rs.recs))
|
||||
return joinStrings(ss, true)
|
||||
}
|
||||
|
||||
func formatColon(padding int) string {
|
||||
// Deliberately introduce instability into the debug output to
|
||||
// discourage users from performing string comparisons.
|
||||
// This provides us flexibility to change the output in the future.
|
||||
if detrand.Bool() {
|
||||
return ":" + strings.Repeat(" ", 1+padding) // use non-breaking spaces (U+00a0)
|
||||
} else {
|
||||
return ":" + strings.Repeat(" ", 1+padding) // use regular spaces (U+0020)
|
||||
}
|
||||
}
|
||||
|
||||
func joinStrings(ss []string, isMulti bool) string {
|
||||
if len(ss) == 0 {
|
||||
return ""
|
||||
}
|
||||
if isMulti {
|
||||
return "\n\t" + strings.Join(ss, "\n\t") + "\n"
|
||||
}
|
||||
return strings.Join(ss, ", ")
|
||||
}
|
29
e2e/vendor/google.golang.org/protobuf/internal/descopts/options.go
generated
vendored
Normal file
29
e2e/vendor/google.golang.org/protobuf/internal/descopts/options.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package descopts contains the nil pointers to concrete descriptor options.
|
||||
//
|
||||
// This package exists as a form of reverse dependency injection so that certain
|
||||
// packages (e.g., internal/filedesc and internal/filetype can avoid a direct
|
||||
// dependency on the descriptor proto package).
|
||||
package descopts
|
||||
|
||||
import "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
// These variables are set by the init function in descriptor.pb.go via logic
|
||||
// in internal/filetype. In other words, so long as the descriptor proto package
|
||||
// is linked in, these variables will be populated.
|
||||
//
|
||||
// Each variable is populated with a nil pointer to the options struct.
|
||||
var (
|
||||
File protoreflect.ProtoMessage
|
||||
Enum protoreflect.ProtoMessage
|
||||
EnumValue protoreflect.ProtoMessage
|
||||
Message protoreflect.ProtoMessage
|
||||
Field protoreflect.ProtoMessage
|
||||
Oneof protoreflect.ProtoMessage
|
||||
ExtensionRange protoreflect.ProtoMessage
|
||||
Service protoreflect.ProtoMessage
|
||||
Method protoreflect.ProtoMessage
|
||||
)
|
69
e2e/vendor/google.golang.org/protobuf/internal/detrand/rand.go
generated
vendored
Normal file
69
e2e/vendor/google.golang.org/protobuf/internal/detrand/rand.go
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package detrand provides deterministically random functionality.
|
||||
//
|
||||
// The pseudo-randomness of these functions is seeded by the program binary
|
||||
// itself and guarantees that the output does not change within a program,
|
||||
// while ensuring that the output is unstable across different builds.
|
||||
package detrand
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"hash/fnv"
|
||||
"os"
|
||||
)
|
||||
|
||||
// Disable disables detrand such that all functions returns the zero value.
|
||||
// This function is not concurrent-safe and must be called during program init.
|
||||
func Disable() {
|
||||
randSeed = 0
|
||||
}
|
||||
|
||||
// Bool returns a deterministically random boolean.
|
||||
func Bool() bool {
|
||||
return randSeed%2 == 1
|
||||
}
|
||||
|
||||
// Intn returns a deterministically random integer between 0 and n-1, inclusive.
|
||||
func Intn(n int) int {
|
||||
if n <= 0 {
|
||||
panic("must be positive")
|
||||
}
|
||||
return int(randSeed % uint64(n))
|
||||
}
|
||||
|
||||
// randSeed is a best-effort at an approximate hash of the Go binary.
|
||||
var randSeed = binaryHash()
|
||||
|
||||
func binaryHash() uint64 {
|
||||
// Open the Go binary.
|
||||
s, err := os.Executable()
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
f, err := os.Open(s)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
// Hash the size and several samples of the Go binary.
|
||||
const numSamples = 8
|
||||
var buf [64]byte
|
||||
h := fnv.New64()
|
||||
fi, err := f.Stat()
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
binary.LittleEndian.PutUint64(buf[:8], uint64(fi.Size()))
|
||||
h.Write(buf[:8])
|
||||
for i := int64(0); i < numSamples; i++ {
|
||||
if _, err := f.ReadAt(buf[:], i*fi.Size()/numSamples); err != nil {
|
||||
return 0
|
||||
}
|
||||
h.Write(buf[:])
|
||||
}
|
||||
return h.Sum64()
|
||||
}
|
12
e2e/vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go
generated
vendored
Normal file
12
e2e/vendor/google.golang.org/protobuf/internal/editiondefaults/defaults.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package editiondefaults contains the binary representation of the editions
|
||||
// defaults.
|
||||
package editiondefaults
|
||||
|
||||
import _ "embed"
|
||||
|
||||
//go:embed editions_defaults.binpb
|
||||
var Defaults []byte
|
BIN
e2e/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb
generated
vendored
Normal file
BIN
e2e/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb
generated
vendored
Normal file
Binary file not shown.
18
e2e/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go
generated
vendored
Normal file
18
e2e/vendor/google.golang.org/protobuf/internal/editionssupport/editions.go
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package editionssupport defines constants for editions that are supported.
|
||||
package editionssupport
|
||||
|
||||
import "google.golang.org/protobuf/types/descriptorpb"
|
||||
|
||||
const (
|
||||
Minimum = descriptorpb.Edition_EDITION_PROTO2
|
||||
Maximum = descriptorpb.Edition_EDITION_2023
|
||||
|
||||
// MaximumKnown is the maximum edition that is known to Go Protobuf, but not
|
||||
// declared as supported. In other words: end users cannot use it, but
|
||||
// testprotos inside Go Protobuf can.
|
||||
MaximumKnown = descriptorpb.Edition_EDITION_2024
|
||||
)
|
213
e2e/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go
generated
vendored
Normal file
213
e2e/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go
generated
vendored
Normal file
@ -0,0 +1,213 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package defval marshals and unmarshals textual forms of default values.
|
||||
//
|
||||
// This package handles both the form historically used in Go struct field tags
|
||||
// and also the form used by google.protobuf.FieldDescriptorProto.default_value
|
||||
// since they differ in superficial ways.
|
||||
package defval
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
|
||||
ptext "google.golang.org/protobuf/internal/encoding/text"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// Format is the serialization format used to represent the default value.
|
||||
type Format int
|
||||
|
||||
const (
|
||||
_ Format = iota
|
||||
|
||||
// Descriptor uses the serialization format that protoc uses with the
|
||||
// google.protobuf.FieldDescriptorProto.default_value field.
|
||||
Descriptor
|
||||
|
||||
// GoTag uses the historical serialization format in Go struct field tags.
|
||||
GoTag
|
||||
)
|
||||
|
||||
// Unmarshal deserializes the default string s according to the given kind k.
|
||||
// When k is an enum, a list of enum value descriptors must be provided.
|
||||
func Unmarshal(s string, k protoreflect.Kind, evs protoreflect.EnumValueDescriptors, f Format) (protoreflect.Value, protoreflect.EnumValueDescriptor, error) {
|
||||
switch k {
|
||||
case protoreflect.BoolKind:
|
||||
if f == GoTag {
|
||||
switch s {
|
||||
case "1":
|
||||
return protoreflect.ValueOfBool(true), nil, nil
|
||||
case "0":
|
||||
return protoreflect.ValueOfBool(false), nil, nil
|
||||
}
|
||||
} else {
|
||||
switch s {
|
||||
case "true":
|
||||
return protoreflect.ValueOfBool(true), nil, nil
|
||||
case "false":
|
||||
return protoreflect.ValueOfBool(false), nil, nil
|
||||
}
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if f == GoTag {
|
||||
// Go tags use the numeric form of the enum value.
|
||||
if n, err := strconv.ParseInt(s, 10, 32); err == nil {
|
||||
if ev := evs.ByNumber(protoreflect.EnumNumber(n)); ev != nil {
|
||||
return protoreflect.ValueOfEnum(ev.Number()), ev, nil
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Descriptor default_value use the enum identifier.
|
||||
ev := evs.ByName(protoreflect.Name(s))
|
||||
if ev != nil {
|
||||
return protoreflect.ValueOfEnum(ev.Number()), ev, nil
|
||||
}
|
||||
}
|
||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
||||
if v, err := strconv.ParseInt(s, 10, 32); err == nil {
|
||||
return protoreflect.ValueOfInt32(int32(v)), nil, nil
|
||||
}
|
||||
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
||||
if v, err := strconv.ParseInt(s, 10, 64); err == nil {
|
||||
return protoreflect.ValueOfInt64(int64(v)), nil, nil
|
||||
}
|
||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
|
||||
if v, err := strconv.ParseUint(s, 10, 32); err == nil {
|
||||
return protoreflect.ValueOfUint32(uint32(v)), nil, nil
|
||||
}
|
||||
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
||||
if v, err := strconv.ParseUint(s, 10, 64); err == nil {
|
||||
return protoreflect.ValueOfUint64(uint64(v)), nil, nil
|
||||
}
|
||||
case protoreflect.FloatKind, protoreflect.DoubleKind:
|
||||
var v float64
|
||||
var err error
|
||||
switch s {
|
||||
case "-inf":
|
||||
v = math.Inf(-1)
|
||||
case "inf":
|
||||
v = math.Inf(+1)
|
||||
case "nan":
|
||||
v = math.NaN()
|
||||
default:
|
||||
v, err = strconv.ParseFloat(s, 64)
|
||||
}
|
||||
if err == nil {
|
||||
if k == protoreflect.FloatKind {
|
||||
return protoreflect.ValueOfFloat32(float32(v)), nil, nil
|
||||
} else {
|
||||
return protoreflect.ValueOfFloat64(float64(v)), nil, nil
|
||||
}
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
// String values are already unescaped and can be used as is.
|
||||
return protoreflect.ValueOfString(s), nil, nil
|
||||
case protoreflect.BytesKind:
|
||||
if b, ok := unmarshalBytes(s); ok {
|
||||
return protoreflect.ValueOfBytes(b), nil, nil
|
||||
}
|
||||
}
|
||||
return protoreflect.Value{}, nil, errors.New("could not parse value for %v: %q", k, s)
|
||||
}
|
||||
|
||||
// Marshal serializes v as the default string according to the given kind k.
|
||||
// When specifying the Descriptor format for an enum kind, the associated
|
||||
// enum value descriptor must be provided.
|
||||
func Marshal(v protoreflect.Value, ev protoreflect.EnumValueDescriptor, k protoreflect.Kind, f Format) (string, error) {
|
||||
switch k {
|
||||
case protoreflect.BoolKind:
|
||||
if f == GoTag {
|
||||
if v.Bool() {
|
||||
return "1", nil
|
||||
} else {
|
||||
return "0", nil
|
||||
}
|
||||
} else {
|
||||
if v.Bool() {
|
||||
return "true", nil
|
||||
} else {
|
||||
return "false", nil
|
||||
}
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if f == GoTag {
|
||||
return strconv.FormatInt(int64(v.Enum()), 10), nil
|
||||
} else {
|
||||
return string(ev.Name()), nil
|
||||
}
|
||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind, protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
||||
return strconv.FormatInt(v.Int(), 10), nil
|
||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind, protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
||||
return strconv.FormatUint(v.Uint(), 10), nil
|
||||
case protoreflect.FloatKind, protoreflect.DoubleKind:
|
||||
f := v.Float()
|
||||
switch {
|
||||
case math.IsInf(f, -1):
|
||||
return "-inf", nil
|
||||
case math.IsInf(f, +1):
|
||||
return "inf", nil
|
||||
case math.IsNaN(f):
|
||||
return "nan", nil
|
||||
default:
|
||||
if k == protoreflect.FloatKind {
|
||||
return strconv.FormatFloat(f, 'g', -1, 32), nil
|
||||
} else {
|
||||
return strconv.FormatFloat(f, 'g', -1, 64), nil
|
||||
}
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
// String values are serialized as is without any escaping.
|
||||
return v.String(), nil
|
||||
case protoreflect.BytesKind:
|
||||
if s, ok := marshalBytes(v.Bytes()); ok {
|
||||
return s, nil
|
||||
}
|
||||
}
|
||||
return "", errors.New("could not format value for %v: %v", k, v)
|
||||
}
|
||||
|
||||
// unmarshalBytes deserializes bytes by applying C unescaping.
|
||||
func unmarshalBytes(s string) ([]byte, bool) {
|
||||
// Bytes values use the same escaping as the text format,
|
||||
// however they lack the surrounding double quotes.
|
||||
v, err := ptext.UnmarshalString(`"` + s + `"`)
|
||||
if err != nil {
|
||||
return nil, false
|
||||
}
|
||||
return []byte(v), true
|
||||
}
|
||||
|
||||
// marshalBytes serializes bytes by using C escaping.
|
||||
// To match the exact output of protoc, this is identical to the
|
||||
// CEscape function in strutil.cc of the protoc source code.
|
||||
func marshalBytes(b []byte) (string, bool) {
|
||||
var s []byte
|
||||
for _, c := range b {
|
||||
switch c {
|
||||
case '\n':
|
||||
s = append(s, `\n`...)
|
||||
case '\r':
|
||||
s = append(s, `\r`...)
|
||||
case '\t':
|
||||
s = append(s, `\t`...)
|
||||
case '"':
|
||||
s = append(s, `\"`...)
|
||||
case '\'':
|
||||
s = append(s, `\'`...)
|
||||
case '\\':
|
||||
s = append(s, `\\`...)
|
||||
default:
|
||||
if printableASCII := c >= 0x20 && c <= 0x7e; printableASCII {
|
||||
s = append(s, c)
|
||||
} else {
|
||||
s = append(s, fmt.Sprintf(`\%03o`, c)...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return string(s), true
|
||||
}
|
340
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
generated
vendored
Normal file
340
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode.go
generated
vendored
Normal file
@ -0,0 +1,340 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"regexp"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// call specifies which Decoder method was invoked.
|
||||
type call uint8
|
||||
|
||||
const (
|
||||
readCall call = iota
|
||||
peekCall
|
||||
)
|
||||
|
||||
const unexpectedFmt = "unexpected token %s"
|
||||
|
||||
// ErrUnexpectedEOF means that EOF was encountered in the middle of the input.
|
||||
var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF)
|
||||
|
||||
// Decoder is a token-based JSON decoder.
|
||||
type Decoder struct {
|
||||
// lastCall is last method called, either readCall or peekCall.
|
||||
// Initial value is readCall.
|
||||
lastCall call
|
||||
|
||||
// lastToken contains the last read token.
|
||||
lastToken Token
|
||||
|
||||
// lastErr contains the last read error.
|
||||
lastErr error
|
||||
|
||||
// openStack is a stack containing ObjectOpen and ArrayOpen values. The
|
||||
// top of stack represents the object or the array the current value is
|
||||
// directly located in.
|
||||
openStack []Kind
|
||||
|
||||
// orig is used in reporting line and column.
|
||||
orig []byte
|
||||
// in contains the unconsumed input.
|
||||
in []byte
|
||||
}
|
||||
|
||||
// NewDecoder returns a Decoder to read the given []byte.
|
||||
func NewDecoder(b []byte) *Decoder {
|
||||
return &Decoder{orig: b, in: b}
|
||||
}
|
||||
|
||||
// Peek looks ahead and returns the next token kind without advancing a read.
|
||||
func (d *Decoder) Peek() (Token, error) {
|
||||
defer func() { d.lastCall = peekCall }()
|
||||
if d.lastCall == readCall {
|
||||
d.lastToken, d.lastErr = d.Read()
|
||||
}
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
// Read returns the next JSON token.
|
||||
// It will return an error if there is no valid token.
|
||||
func (d *Decoder) Read() (Token, error) {
|
||||
const scalar = Null | Bool | Number | String
|
||||
|
||||
defer func() { d.lastCall = readCall }()
|
||||
if d.lastCall == peekCall {
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
tok, err := d.parseNext()
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
|
||||
switch tok.kind {
|
||||
case EOF:
|
||||
if len(d.openStack) != 0 ||
|
||||
d.lastToken.kind&scalar|ObjectClose|ArrayClose == 0 {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
case Null:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
|
||||
case Bool, Number:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
|
||||
case String:
|
||||
if d.isValueNext() {
|
||||
break
|
||||
}
|
||||
// This string token should only be for a field name.
|
||||
if d.lastToken.kind&(ObjectOpen|comma) == 0 {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
if len(d.in) == 0 {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
if c := d.in[0]; c != ':' {
|
||||
return Token{}, d.newSyntaxError(d.currPos(), `unexpected character %s, missing ":" after field name`, string(c))
|
||||
}
|
||||
tok.kind = Name
|
||||
d.consume(1)
|
||||
|
||||
case ObjectOpen, ArrayOpen:
|
||||
if !d.isValueNext() {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = append(d.openStack, tok.kind)
|
||||
|
||||
case ObjectClose:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind&(Name|comma) != 0 ||
|
||||
d.openStack[len(d.openStack)-1] != ObjectOpen {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = d.openStack[:len(d.openStack)-1]
|
||||
|
||||
case ArrayClose:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind == comma ||
|
||||
d.openStack[len(d.openStack)-1] != ArrayOpen {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
d.openStack = d.openStack[:len(d.openStack)-1]
|
||||
|
||||
case comma:
|
||||
if len(d.openStack) == 0 ||
|
||||
d.lastToken.kind&(scalar|ObjectClose|ArrayClose) == 0 {
|
||||
return Token{}, d.newSyntaxError(tok.pos, unexpectedFmt, tok.RawString())
|
||||
}
|
||||
}
|
||||
|
||||
// Update d.lastToken only after validating token to be in the right sequence.
|
||||
d.lastToken = tok
|
||||
|
||||
if d.lastToken.kind == comma {
|
||||
return d.Read()
|
||||
}
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
// Any sequence that looks like a non-delimiter (for error reporting).
|
||||
var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9]{1,32}|.)`)
|
||||
|
||||
// parseNext parses for the next JSON token. It returns a Token object for
|
||||
// different types, except for Name. It does not handle whether the next token
|
||||
// is in a valid sequence or not.
|
||||
func (d *Decoder) parseNext() (Token, error) {
|
||||
// Trim leading spaces.
|
||||
d.consume(0)
|
||||
|
||||
in := d.in
|
||||
if len(in) == 0 {
|
||||
return d.consumeToken(EOF, 0), nil
|
||||
}
|
||||
|
||||
switch in[0] {
|
||||
case 'n':
|
||||
if n := matchWithDelim("null", in); n != 0 {
|
||||
return d.consumeToken(Null, n), nil
|
||||
}
|
||||
|
||||
case 't':
|
||||
if n := matchWithDelim("true", in); n != 0 {
|
||||
return d.consumeBoolToken(true, n), nil
|
||||
}
|
||||
|
||||
case 'f':
|
||||
if n := matchWithDelim("false", in); n != 0 {
|
||||
return d.consumeBoolToken(false, n), nil
|
||||
}
|
||||
|
||||
case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
|
||||
if n, ok := parseNumber(in); ok {
|
||||
return d.consumeToken(Number, n), nil
|
||||
}
|
||||
|
||||
case '"':
|
||||
s, n, err := d.parseString(in)
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
return d.consumeStringToken(s, n), nil
|
||||
|
||||
case '{':
|
||||
return d.consumeToken(ObjectOpen, 1), nil
|
||||
|
||||
case '}':
|
||||
return d.consumeToken(ObjectClose, 1), nil
|
||||
|
||||
case '[':
|
||||
return d.consumeToken(ArrayOpen, 1), nil
|
||||
|
||||
case ']':
|
||||
return d.consumeToken(ArrayClose, 1), nil
|
||||
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1), nil
|
||||
}
|
||||
return Token{}, d.newSyntaxError(d.currPos(), "invalid value %s", errRegexp.Find(in))
|
||||
}
|
||||
|
||||
// newSyntaxError returns an error with line and column information useful for
|
||||
// syntax errors.
|
||||
func (d *Decoder) newSyntaxError(pos int, f string, x ...any) error {
|
||||
e := errors.New(f, x...)
|
||||
line, column := d.Position(pos)
|
||||
return errors.New("syntax error (line %d:%d): %v", line, column, e)
|
||||
}
|
||||
|
||||
// Position returns line and column number of given index of the original input.
|
||||
// It will panic if index is out of range.
|
||||
func (d *Decoder) Position(idx int) (line int, column int) {
|
||||
b := d.orig[:idx]
|
||||
line = bytes.Count(b, []byte("\n")) + 1
|
||||
if i := bytes.LastIndexByte(b, '\n'); i >= 0 {
|
||||
b = b[i+1:]
|
||||
}
|
||||
column = utf8.RuneCount(b) + 1 // ignore multi-rune characters
|
||||
return line, column
|
||||
}
|
||||
|
||||
// currPos returns the current index position of d.in from d.orig.
|
||||
func (d *Decoder) currPos() int {
|
||||
return len(d.orig) - len(d.in)
|
||||
}
|
||||
|
||||
// matchWithDelim matches s with the input b and verifies that the match
|
||||
// terminates with a delimiter of some form (e.g., r"[^-+_.a-zA-Z0-9]").
|
||||
// As a special case, EOF is considered a delimiter. It returns the length of s
|
||||
// if there is a match, else 0.
|
||||
func matchWithDelim(s string, b []byte) int {
|
||||
if !bytes.HasPrefix(b, []byte(s)) {
|
||||
return 0
|
||||
}
|
||||
|
||||
n := len(s)
|
||||
if n < len(b) && isNotDelim(b[n]) {
|
||||
return 0
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// isNotDelim returns true if given byte is a not delimiter character.
|
||||
func isNotDelim(c byte) bool {
|
||||
return (c == '-' || c == '+' || c == '.' || c == '_' ||
|
||||
('a' <= c && c <= 'z') ||
|
||||
('A' <= c && c <= 'Z') ||
|
||||
('0' <= c && c <= '9'))
|
||||
}
|
||||
|
||||
// consume consumes n bytes of input and any subsequent whitespace.
|
||||
func (d *Decoder) consume(n int) {
|
||||
d.in = d.in[n:]
|
||||
for len(d.in) > 0 {
|
||||
switch d.in[0] {
|
||||
case ' ', '\n', '\r', '\t':
|
||||
d.in = d.in[1:]
|
||||
default:
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// isValueNext returns true if next type should be a JSON value: Null,
|
||||
// Number, String or Bool.
|
||||
func (d *Decoder) isValueNext() bool {
|
||||
if len(d.openStack) == 0 {
|
||||
return d.lastToken.kind == 0
|
||||
}
|
||||
|
||||
start := d.openStack[len(d.openStack)-1]
|
||||
switch start {
|
||||
case ObjectOpen:
|
||||
return d.lastToken.kind&Name != 0
|
||||
case ArrayOpen:
|
||||
return d.lastToken.kind&(ArrayOpen|comma) != 0
|
||||
}
|
||||
panic(fmt.Sprintf(
|
||||
"unreachable logic in Decoder.isValueNext, lastToken.kind: %v, openStack: %v",
|
||||
d.lastToken.kind, start))
|
||||
}
|
||||
|
||||
// consumeToken constructs a Token for given Kind with raw value derived from
|
||||
// current d.in and given size, and consumes the given size-length of it.
|
||||
func (d *Decoder) consumeToken(kind Kind, size int) Token {
|
||||
tok := Token{
|
||||
kind: kind,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// consumeBoolToken constructs a Token for a Bool kind with raw value derived from
|
||||
// current d.in and given size.
|
||||
func (d *Decoder) consumeBoolToken(b bool, size int) Token {
|
||||
tok := Token{
|
||||
kind: Bool,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
boo: b,
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// consumeStringToken constructs a Token for a String kind with raw value derived
|
||||
// from current d.in and given size.
|
||||
func (d *Decoder) consumeStringToken(s string, size int) Token {
|
||||
tok := Token{
|
||||
kind: String,
|
||||
raw: d.in[:size],
|
||||
pos: len(d.orig) - len(d.in),
|
||||
str: s,
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// Clone returns a copy of the Decoder for use in reading ahead the next JSON
|
||||
// object, array or other values without affecting current Decoder.
|
||||
func (d *Decoder) Clone() *Decoder {
|
||||
ret := *d
|
||||
ret.openStack = append([]Kind(nil), ret.openStack...)
|
||||
return &ret
|
||||
}
|
254
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
generated
vendored
Normal file
254
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_number.go
generated
vendored
Normal file
@ -0,0 +1,254 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// parseNumber reads the given []byte for a valid JSON number. If it is valid,
|
||||
// it returns the number of bytes. Parsing logic follows the definition in
|
||||
// https://tools.ietf.org/html/rfc7159#section-6, and is based off
|
||||
// encoding/json.isValidNumber function.
|
||||
func parseNumber(input []byte) (int, bool) {
|
||||
var n int
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// Optional -
|
||||
if s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
// Digits
|
||||
switch {
|
||||
case s[0] == '0':
|
||||
s = s[1:]
|
||||
n++
|
||||
|
||||
case '1' <= s[0] && s[0] <= '9':
|
||||
s = s[1:]
|
||||
n++
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// . followed by 1 or more digits.
|
||||
if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
|
||||
s = s[2:]
|
||||
n += 2
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
// e or E followed by an optional - or + and
|
||||
// 1 or more digits.
|
||||
if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
|
||||
s = s[1:]
|
||||
n++
|
||||
if s[0] == '+' || s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
// Check that next byte is a delimiter or it is at the end.
|
||||
if n < len(input) && isNotDelim(input[n]) {
|
||||
return 0, false
|
||||
}
|
||||
|
||||
return n, true
|
||||
}
|
||||
|
||||
// numberParts is the result of parsing out a valid JSON number. It contains
|
||||
// the parts of a number. The parts are used for integer conversion.
|
||||
type numberParts struct {
|
||||
neg bool
|
||||
intp []byte
|
||||
frac []byte
|
||||
exp []byte
|
||||
}
|
||||
|
||||
// parseNumber constructs numberParts from given []byte. The logic here is
|
||||
// similar to consumeNumber above with the difference of having to construct
|
||||
// numberParts. The slice fields in numberParts are subslices of the input.
|
||||
func parseNumberParts(input []byte) (numberParts, bool) {
|
||||
var neg bool
|
||||
var intp []byte
|
||||
var frac []byte
|
||||
var exp []byte
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
|
||||
// Optional -
|
||||
if s[0] == '-' {
|
||||
neg = true
|
||||
s = s[1:]
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
}
|
||||
|
||||
// Digits
|
||||
switch {
|
||||
case s[0] == '0':
|
||||
// Skip first 0 and no need to store.
|
||||
s = s[1:]
|
||||
|
||||
case '1' <= s[0] && s[0] <= '9':
|
||||
intp = s
|
||||
n := 1
|
||||
s = s[1:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
intp = intp[:n]
|
||||
|
||||
default:
|
||||
return numberParts{}, false
|
||||
}
|
||||
|
||||
// . followed by 1 or more digits.
|
||||
if len(s) >= 2 && s[0] == '.' && '0' <= s[1] && s[1] <= '9' {
|
||||
frac = s[1:]
|
||||
n := 1
|
||||
s = s[2:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
frac = frac[:n]
|
||||
}
|
||||
|
||||
// e or E followed by an optional - or + and
|
||||
// 1 or more digits.
|
||||
if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
|
||||
s = s[1:]
|
||||
exp = s
|
||||
n := 0
|
||||
if s[0] == '+' || s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return numberParts{}, false
|
||||
}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
exp = exp[:n]
|
||||
}
|
||||
|
||||
return numberParts{
|
||||
neg: neg,
|
||||
intp: intp,
|
||||
frac: bytes.TrimRight(frac, "0"), // Remove unnecessary 0s to the right.
|
||||
exp: exp,
|
||||
}, true
|
||||
}
|
||||
|
||||
// normalizeToIntString returns an integer string in normal form without the
|
||||
// E-notation for given numberParts. It will return false if it is not an
|
||||
// integer or if the exponent exceeds than max/min int value.
|
||||
func normalizeToIntString(n numberParts) (string, bool) {
|
||||
intpSize := len(n.intp)
|
||||
fracSize := len(n.frac)
|
||||
|
||||
if intpSize == 0 && fracSize == 0 {
|
||||
return "0", true
|
||||
}
|
||||
|
||||
var exp int
|
||||
if len(n.exp) > 0 {
|
||||
i, err := strconv.ParseInt(string(n.exp), 10, 32)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
exp = int(i)
|
||||
}
|
||||
|
||||
var num []byte
|
||||
if exp >= 0 {
|
||||
// For positive E, shift fraction digits into integer part and also pad
|
||||
// with zeroes as needed.
|
||||
|
||||
// If there are more digits in fraction than the E value, then the
|
||||
// number is not an integer.
|
||||
if fracSize > exp {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Make sure resulting digits are within max value limit to avoid
|
||||
// unnecessarily constructing a large byte slice that may simply fail
|
||||
// later on.
|
||||
const maxDigits = 20 // Max uint64 value has 20 decimal digits.
|
||||
if intpSize+exp > maxDigits {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// Set cap to make a copy of integer part when appended.
|
||||
num = n.intp[:len(n.intp):len(n.intp)]
|
||||
num = append(num, n.frac...)
|
||||
for i := 0; i < exp-fracSize; i++ {
|
||||
num = append(num, '0')
|
||||
}
|
||||
} else {
|
||||
// For negative E, shift digits in integer part out.
|
||||
|
||||
// If there are fractions, then the number is not an integer.
|
||||
if fracSize > 0 {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// index is where the decimal point will be after adjusting for negative
|
||||
// exponent.
|
||||
index := intpSize + exp
|
||||
if index < 0 {
|
||||
return "", false
|
||||
}
|
||||
|
||||
num = n.intp
|
||||
// If any of the digits being shifted to the right of the decimal point
|
||||
// is non-zero, then the number is not an integer.
|
||||
for i := index; i < intpSize; i++ {
|
||||
if num[i] != '0' {
|
||||
return "", false
|
||||
}
|
||||
}
|
||||
num = num[:index]
|
||||
}
|
||||
|
||||
if n.neg {
|
||||
return "-" + string(num), true
|
||||
}
|
||||
return string(num), true
|
||||
}
|
91
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
generated
vendored
Normal file
91
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_string.go
generated
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package json
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"unicode"
|
||||
"unicode/utf16"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
)
|
||||
|
||||
func (d *Decoder) parseString(in []byte) (string, int, error) {
|
||||
in0 := in
|
||||
if len(in) == 0 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
if in[0] != '"' {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q at start of string", in[0])
|
||||
}
|
||||
in = in[1:]
|
||||
i := indexNeedEscapeInBytes(in)
|
||||
in, out := in[i:], in[:i:i] // set cap to prevent mutations
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRune(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid UTF-8 in string")
|
||||
case r < ' ':
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q in string", r)
|
||||
case r == '"':
|
||||
in = in[1:]
|
||||
n := len(in0) - len(in)
|
||||
return string(out), n, nil
|
||||
case r == '\\':
|
||||
if len(in) < 2 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
switch r := in[1]; r {
|
||||
case '"', '\\', '/':
|
||||
in, out = in[2:], append(out, r)
|
||||
case 'b':
|
||||
in, out = in[2:], append(out, '\b')
|
||||
case 'f':
|
||||
in, out = in[2:], append(out, '\f')
|
||||
case 'n':
|
||||
in, out = in[2:], append(out, '\n')
|
||||
case 'r':
|
||||
in, out = in[2:], append(out, '\r')
|
||||
case 't':
|
||||
in, out = in[2:], append(out, '\t')
|
||||
case 'u':
|
||||
if len(in) < 6 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
|
||||
if err != nil {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
|
||||
}
|
||||
in = in[6:]
|
||||
|
||||
r := rune(v)
|
||||
if utf16.IsSurrogate(r) {
|
||||
if len(in) < 6 {
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
|
||||
r = utf16.DecodeRune(r, rune(v))
|
||||
if in[0] != '\\' || in[1] != 'u' ||
|
||||
r == unicode.ReplacementChar || err != nil {
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
|
||||
}
|
||||
in = in[6:]
|
||||
}
|
||||
out = append(out, string(r)...)
|
||||
default:
|
||||
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:2])
|
||||
}
|
||||
default:
|
||||
i := indexNeedEscapeInBytes(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
return "", 0, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
// indexNeedEscapeInBytes returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) }
|
192
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
generated
vendored
Normal file
192
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/decode_token.go
generated
vendored
Normal file
@ -0,0 +1,192 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package json
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Kind represents a token kind expressible in the JSON format.
|
||||
type Kind uint16
|
||||
|
||||
const (
|
||||
Invalid Kind = (1 << iota) / 2
|
||||
EOF
|
||||
Null
|
||||
Bool
|
||||
Number
|
||||
String
|
||||
Name
|
||||
ObjectOpen
|
||||
ObjectClose
|
||||
ArrayOpen
|
||||
ArrayClose
|
||||
|
||||
// comma is only for parsing in between tokens and
|
||||
// does not need to be exported.
|
||||
comma
|
||||
)
|
||||
|
||||
func (k Kind) String() string {
|
||||
switch k {
|
||||
case EOF:
|
||||
return "eof"
|
||||
case Null:
|
||||
return "null"
|
||||
case Bool:
|
||||
return "bool"
|
||||
case Number:
|
||||
return "number"
|
||||
case String:
|
||||
return "string"
|
||||
case ObjectOpen:
|
||||
return "{"
|
||||
case ObjectClose:
|
||||
return "}"
|
||||
case Name:
|
||||
return "name"
|
||||
case ArrayOpen:
|
||||
return "["
|
||||
case ArrayClose:
|
||||
return "]"
|
||||
case comma:
|
||||
return ","
|
||||
}
|
||||
return "<invalid>"
|
||||
}
|
||||
|
||||
// Token provides a parsed token kind and value.
|
||||
//
|
||||
// Values are provided by the difference accessor methods. The accessor methods
|
||||
// Name, Bool, and ParsedString will panic if called on the wrong kind. There
|
||||
// are different accessor methods for the Number kind for converting to the
|
||||
// appropriate Go numeric type and those methods have the ok return value.
|
||||
type Token struct {
|
||||
// Token kind.
|
||||
kind Kind
|
||||
// pos provides the position of the token in the original input.
|
||||
pos int
|
||||
// raw bytes of the serialized token.
|
||||
// This is a subslice into the original input.
|
||||
raw []byte
|
||||
// boo is parsed boolean value.
|
||||
boo bool
|
||||
// str is parsed string value.
|
||||
str string
|
||||
}
|
||||
|
||||
// Kind returns the token kind.
|
||||
func (t Token) Kind() Kind {
|
||||
return t.kind
|
||||
}
|
||||
|
||||
// RawString returns the read value in string.
|
||||
func (t Token) RawString() string {
|
||||
return string(t.raw)
|
||||
}
|
||||
|
||||
// Pos returns the token position from the input.
|
||||
func (t Token) Pos() int {
|
||||
return t.pos
|
||||
}
|
||||
|
||||
// Name returns the object name if token is Name, else it panics.
|
||||
func (t Token) Name() string {
|
||||
if t.kind == Name {
|
||||
return t.str
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Name: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// Bool returns the bool value if token kind is Bool, else it panics.
|
||||
func (t Token) Bool() bool {
|
||||
if t.kind == Bool {
|
||||
return t.boo
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Bool: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// ParsedString returns the string value for a JSON string token or the read
|
||||
// value in string if token is not a string.
|
||||
func (t Token) ParsedString() string {
|
||||
if t.kind == String {
|
||||
return t.str
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a String: %v", t.RawString()))
|
||||
}
|
||||
|
||||
// Float returns the floating-point number if token kind is Number.
|
||||
//
|
||||
// The floating-point precision is specified by the bitSize parameter: 32 for
|
||||
// float32 or 64 for float64. If bitSize=32, the result still has type float64,
|
||||
// but it will be convertible to float32 without changing its value. It will
|
||||
// return false if the number exceeds the floating point limits for given
|
||||
// bitSize.
|
||||
func (t Token) Float(bitSize int) (float64, bool) {
|
||||
if t.kind != Number {
|
||||
return 0, false
|
||||
}
|
||||
f, err := strconv.ParseFloat(t.RawString(), bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return f, true
|
||||
}
|
||||
|
||||
// Int returns the signed integer number if token is Number.
|
||||
//
|
||||
// The given bitSize specifies the integer type that the result must fit into.
|
||||
// It returns false if the number is not an integer value or if the result
|
||||
// exceeds the limits for given bitSize.
|
||||
func (t Token) Int(bitSize int) (int64, bool) {
|
||||
s, ok := t.getIntStr()
|
||||
if !ok {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseInt(s, 10, bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return n, true
|
||||
}
|
||||
|
||||
// Uint returns the signed integer number if token is Number.
|
||||
//
|
||||
// The given bitSize specifies the unsigned integer type that the result must
|
||||
// fit into. It returns false if the number is not an unsigned integer value
|
||||
// or if the result exceeds the limits for given bitSize.
|
||||
func (t Token) Uint(bitSize int) (uint64, bool) {
|
||||
s, ok := t.getIntStr()
|
||||
if !ok {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseUint(s, 10, bitSize)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return n, true
|
||||
}
|
||||
|
||||
func (t Token) getIntStr() (string, bool) {
|
||||
if t.kind != Number {
|
||||
return "", false
|
||||
}
|
||||
parts, ok := parseNumberParts(t.raw)
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
return normalizeToIntString(parts)
|
||||
}
|
||||
|
||||
// TokenEquals returns true if given Tokens are equal, else false.
|
||||
func TokenEquals(x, y Token) bool {
|
||||
return x.kind == y.kind &&
|
||||
x.pos == y.pos &&
|
||||
bytes.Equal(x.raw, y.raw) &&
|
||||
x.boo == y.boo &&
|
||||
x.str == y.str
|
||||
}
|
278
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
generated
vendored
Normal file
278
e2e/vendor/google.golang.org/protobuf/internal/encoding/json/encode.go
generated
vendored
Normal file
@ -0,0 +1,278 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package json
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/bits"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// kind represents an encoding type.
|
||||
type kind uint8
|
||||
|
||||
const (
|
||||
_ kind = (1 << iota) / 2
|
||||
name
|
||||
scalar
|
||||
objectOpen
|
||||
objectClose
|
||||
arrayOpen
|
||||
arrayClose
|
||||
)
|
||||
|
||||
// Encoder provides methods to write out JSON constructs and values. The user is
|
||||
// responsible for producing valid sequences of JSON constructs and values.
|
||||
type Encoder struct {
|
||||
indent string
|
||||
lastKind kind
|
||||
indents []byte
|
||||
out []byte
|
||||
}
|
||||
|
||||
// NewEncoder returns an Encoder.
|
||||
//
|
||||
// If indent is a non-empty string, it causes every entry for an Array or Object
|
||||
// to be preceded by the indent and trailed by a newline.
|
||||
func NewEncoder(buf []byte, indent string) (*Encoder, error) {
|
||||
e := &Encoder{
|
||||
out: buf,
|
||||
}
|
||||
if len(indent) > 0 {
|
||||
if strings.Trim(indent, " \t") != "" {
|
||||
return nil, errors.New("indent may only be composed of space or tab characters")
|
||||
}
|
||||
e.indent = indent
|
||||
}
|
||||
return e, nil
|
||||
}
|
||||
|
||||
// Bytes returns the content of the written bytes.
|
||||
func (e *Encoder) Bytes() []byte {
|
||||
return e.out
|
||||
}
|
||||
|
||||
// WriteNull writes out the null value.
|
||||
func (e *Encoder) WriteNull() {
|
||||
e.prepareNext(scalar)
|
||||
e.out = append(e.out, "null"...)
|
||||
}
|
||||
|
||||
// WriteBool writes out the given boolean value.
|
||||
func (e *Encoder) WriteBool(b bool) {
|
||||
e.prepareNext(scalar)
|
||||
if b {
|
||||
e.out = append(e.out, "true"...)
|
||||
} else {
|
||||
e.out = append(e.out, "false"...)
|
||||
}
|
||||
}
|
||||
|
||||
// WriteString writes out the given string in JSON string value. Returns error
|
||||
// if input string contains invalid UTF-8.
|
||||
func (e *Encoder) WriteString(s string) error {
|
||||
e.prepareNext(scalar)
|
||||
var err error
|
||||
if e.out, err = appendString(e.out, s); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Sentinel error used for indicating invalid UTF-8.
|
||||
var errInvalidUTF8 = errors.New("invalid UTF-8")
|
||||
|
||||
func appendString(out []byte, in string) ([]byte, error) {
|
||||
out = append(out, '"')
|
||||
i := indexNeedEscapeInString(in)
|
||||
in, out = in[i:], append(out, in[:i]...)
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRuneInString(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
return out, errInvalidUTF8
|
||||
case r < ' ' || r == '"' || r == '\\':
|
||||
out = append(out, '\\')
|
||||
switch r {
|
||||
case '"', '\\':
|
||||
out = append(out, byte(r))
|
||||
case '\b':
|
||||
out = append(out, 'b')
|
||||
case '\f':
|
||||
out = append(out, 'f')
|
||||
case '\n':
|
||||
out = append(out, 'n')
|
||||
case '\r':
|
||||
out = append(out, 'r')
|
||||
case '\t':
|
||||
out = append(out, 't')
|
||||
default:
|
||||
out = append(out, 'u')
|
||||
out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...)
|
||||
out = strconv.AppendUint(out, uint64(r), 16)
|
||||
}
|
||||
in = in[n:]
|
||||
default:
|
||||
i := indexNeedEscapeInString(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
out = append(out, '"')
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// indexNeedEscapeInString returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInString(s string) int {
|
||||
for i, r := range s {
|
||||
if r < ' ' || r == '\\' || r == '"' || r == utf8.RuneError {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return len(s)
|
||||
}
|
||||
|
||||
// WriteFloat writes out the given float and bitSize in JSON number value.
|
||||
func (e *Encoder) WriteFloat(n float64, bitSize int) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = appendFloat(e.out, n, bitSize)
|
||||
}
|
||||
|
||||
// appendFloat formats given float in bitSize, and appends to the given []byte.
|
||||
func appendFloat(out []byte, n float64, bitSize int) []byte {
|
||||
switch {
|
||||
case math.IsNaN(n):
|
||||
return append(out, `"NaN"`...)
|
||||
case math.IsInf(n, +1):
|
||||
return append(out, `"Infinity"`...)
|
||||
case math.IsInf(n, -1):
|
||||
return append(out, `"-Infinity"`...)
|
||||
}
|
||||
|
||||
// JSON number formatting logic based on encoding/json.
|
||||
// See floatEncoder.encode for reference.
|
||||
fmt := byte('f')
|
||||
if abs := math.Abs(n); abs != 0 {
|
||||
if bitSize == 64 && (abs < 1e-6 || abs >= 1e21) ||
|
||||
bitSize == 32 && (float32(abs) < 1e-6 || float32(abs) >= 1e21) {
|
||||
fmt = 'e'
|
||||
}
|
||||
}
|
||||
out = strconv.AppendFloat(out, n, fmt, -1, bitSize)
|
||||
if fmt == 'e' {
|
||||
n := len(out)
|
||||
if n >= 4 && out[n-4] == 'e' && out[n-3] == '-' && out[n-2] == '0' {
|
||||
out[n-2] = out[n-1]
|
||||
out = out[:n-1]
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// WriteInt writes out the given signed integer in JSON number value.
|
||||
func (e *Encoder) WriteInt(n int64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = strconv.AppendInt(e.out, n, 10)
|
||||
}
|
||||
|
||||
// WriteUint writes out the given unsigned integer in JSON number value.
|
||||
func (e *Encoder) WriteUint(n uint64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = strconv.AppendUint(e.out, n, 10)
|
||||
}
|
||||
|
||||
// StartObject writes out the '{' symbol.
|
||||
func (e *Encoder) StartObject() {
|
||||
e.prepareNext(objectOpen)
|
||||
e.out = append(e.out, '{')
|
||||
}
|
||||
|
||||
// EndObject writes out the '}' symbol.
|
||||
func (e *Encoder) EndObject() {
|
||||
e.prepareNext(objectClose)
|
||||
e.out = append(e.out, '}')
|
||||
}
|
||||
|
||||
// WriteName writes out the given string in JSON string value and the name
|
||||
// separator ':'. Returns error if input string contains invalid UTF-8, which
|
||||
// should not be likely as protobuf field names should be valid.
|
||||
func (e *Encoder) WriteName(s string) error {
|
||||
e.prepareNext(name)
|
||||
var err error
|
||||
// Append to output regardless of error.
|
||||
e.out, err = appendString(e.out, s)
|
||||
e.out = append(e.out, ':')
|
||||
return err
|
||||
}
|
||||
|
||||
// StartArray writes out the '[' symbol.
|
||||
func (e *Encoder) StartArray() {
|
||||
e.prepareNext(arrayOpen)
|
||||
e.out = append(e.out, '[')
|
||||
}
|
||||
|
||||
// EndArray writes out the ']' symbol.
|
||||
func (e *Encoder) EndArray() {
|
||||
e.prepareNext(arrayClose)
|
||||
e.out = append(e.out, ']')
|
||||
}
|
||||
|
||||
// prepareNext adds possible comma and indentation for the next value based
|
||||
// on last type and indent option. It also updates lastKind to next.
|
||||
func (e *Encoder) prepareNext(next kind) {
|
||||
defer func() {
|
||||
// Set lastKind to next.
|
||||
e.lastKind = next
|
||||
}()
|
||||
|
||||
if len(e.indent) == 0 {
|
||||
// Need to add comma on the following condition.
|
||||
if e.lastKind&(scalar|objectClose|arrayClose) != 0 &&
|
||||
next&(name|scalar|objectOpen|arrayOpen) != 0 {
|
||||
e.out = append(e.out, ',')
|
||||
// For single-line output, add a random extra space after each
|
||||
// comma to make output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
switch {
|
||||
case e.lastKind&(objectOpen|arrayOpen) != 0:
|
||||
// If next type is NOT closing, add indent and newline.
|
||||
if next&(objectClose|arrayClose) == 0 {
|
||||
e.indents = append(e.indents, e.indent...)
|
||||
e.out = append(e.out, '\n')
|
||||
e.out = append(e.out, e.indents...)
|
||||
}
|
||||
|
||||
case e.lastKind&(scalar|objectClose|arrayClose) != 0:
|
||||
switch {
|
||||
// If next type is either a value or name, add comma and newline.
|
||||
case next&(name|scalar|objectOpen|arrayOpen) != 0:
|
||||
e.out = append(e.out, ',', '\n')
|
||||
|
||||
// If next type is a closing object or array, adjust indentation.
|
||||
case next&(objectClose|arrayClose) != 0:
|
||||
e.indents = e.indents[:len(e.indents)-len(e.indent)]
|
||||
e.out = append(e.out, '\n')
|
||||
}
|
||||
e.out = append(e.out, e.indents...)
|
||||
|
||||
case e.lastKind&name != 0:
|
||||
e.out = append(e.out, ' ')
|
||||
// For multi-line output, add a random extra space after key: to make
|
||||
// output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
}
|
||||
}
|
242
e2e/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go
generated
vendored
Normal file
242
e2e/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go
generated
vendored
Normal file
@ -0,0 +1,242 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package messageset encodes and decodes the obsolete MessageSet wire format.
|
||||
package messageset
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// The MessageSet wire format is equivalent to a message defined as follows,
|
||||
// where each Item defines an extension field with a field number of 'type_id'
|
||||
// and content of 'message'. MessageSet extensions must be non-repeated message
|
||||
// fields.
|
||||
//
|
||||
// message MessageSet {
|
||||
// repeated group Item = 1 {
|
||||
// required int32 type_id = 2;
|
||||
// required string message = 3;
|
||||
// }
|
||||
// }
|
||||
const (
|
||||
FieldItem = protowire.Number(1)
|
||||
FieldTypeID = protowire.Number(2)
|
||||
FieldMessage = protowire.Number(3)
|
||||
)
|
||||
|
||||
// ExtensionName is the field name for extensions of MessageSet.
|
||||
//
|
||||
// A valid MessageSet extension must be of the form:
|
||||
//
|
||||
// message MyMessage {
|
||||
// extend proto2.bridge.MessageSet {
|
||||
// optional MyMessage message_set_extension = 1234;
|
||||
// }
|
||||
// ...
|
||||
// }
|
||||
const ExtensionName = "message_set_extension"
|
||||
|
||||
// IsMessageSet returns whether the message uses the MessageSet wire format.
|
||||
func IsMessageSet(md protoreflect.MessageDescriptor) bool {
|
||||
xmd, ok := md.(interface{ IsMessageSet() bool })
|
||||
return ok && xmd.IsMessageSet()
|
||||
}
|
||||
|
||||
// IsMessageSetExtension reports this field properly extends a MessageSet.
|
||||
func IsMessageSetExtension(fd protoreflect.FieldDescriptor) bool {
|
||||
switch {
|
||||
case fd.Name() != ExtensionName:
|
||||
return false
|
||||
case !IsMessageSet(fd.ContainingMessage()):
|
||||
return false
|
||||
case fd.FullName().Parent() != fd.Message().FullName():
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// SizeField returns the size of a MessageSet item field containing an extension
|
||||
// with the given field number, not counting the contents of the message subfield.
|
||||
func SizeField(num protowire.Number) int {
|
||||
return 2*protowire.SizeTag(FieldItem) + protowire.SizeTag(FieldTypeID) + protowire.SizeVarint(uint64(num))
|
||||
}
|
||||
|
||||
// Unmarshal parses a MessageSet.
|
||||
//
|
||||
// It calls fn with the type ID and value of each item in the MessageSet.
|
||||
// Unknown fields are discarded.
|
||||
//
|
||||
// If wantLen is true, the item values include the varint length prefix.
|
||||
// This is ugly, but simplifies the fast-path decoder in internal/impl.
|
||||
func Unmarshal(b []byte, wantLen bool, fn func(typeID protowire.Number, value []byte) error) error {
|
||||
for len(b) > 0 {
|
||||
num, wtyp, n := protowire.ConsumeTag(b)
|
||||
if n < 0 {
|
||||
return protowire.ParseError(n)
|
||||
}
|
||||
b = b[n:]
|
||||
if num != FieldItem || wtyp != protowire.StartGroupType {
|
||||
n := protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return protowire.ParseError(n)
|
||||
}
|
||||
b = b[n:]
|
||||
continue
|
||||
}
|
||||
typeID, value, n, err := ConsumeFieldValue(b, wantLen)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b = b[n:]
|
||||
if typeID == 0 {
|
||||
continue
|
||||
}
|
||||
if err := fn(typeID, value); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ConsumeFieldValue parses b as a MessageSet item field value until and including
|
||||
// the trailing end group marker. It assumes the start group tag has already been parsed.
|
||||
// It returns the contents of the type_id and message subfields and the total
|
||||
// item length.
|
||||
//
|
||||
// If wantLen is true, the returned message value includes the length prefix.
|
||||
func ConsumeFieldValue(b []byte, wantLen bool) (typeid protowire.Number, message []byte, n int, err error) {
|
||||
ilen := len(b)
|
||||
for {
|
||||
num, wtyp, n := protowire.ConsumeTag(b)
|
||||
if n < 0 {
|
||||
return 0, nil, 0, protowire.ParseError(n)
|
||||
}
|
||||
b = b[n:]
|
||||
switch {
|
||||
case num == FieldItem && wtyp == protowire.EndGroupType:
|
||||
if wantLen && len(message) == 0 {
|
||||
// The message field was missing, which should never happen.
|
||||
// Be prepared for this case anyway.
|
||||
message = protowire.AppendVarint(message, 0)
|
||||
}
|
||||
return typeid, message, ilen - len(b), nil
|
||||
case num == FieldTypeID && wtyp == protowire.VarintType:
|
||||
v, n := protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return 0, nil, 0, protowire.ParseError(n)
|
||||
}
|
||||
b = b[n:]
|
||||
if v < 1 || v > math.MaxInt32 {
|
||||
return 0, nil, 0, errors.New("invalid type_id in message set")
|
||||
}
|
||||
typeid = protowire.Number(v)
|
||||
case num == FieldMessage && wtyp == protowire.BytesType:
|
||||
m, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return 0, nil, 0, protowire.ParseError(n)
|
||||
}
|
||||
if message == nil {
|
||||
if wantLen {
|
||||
message = b[:n:n]
|
||||
} else {
|
||||
message = m[:len(m):len(m)]
|
||||
}
|
||||
} else {
|
||||
// This case should never happen in practice, but handle it for
|
||||
// correctness: The MessageSet item contains multiple message
|
||||
// fields, which need to be merged.
|
||||
//
|
||||
// In the case where we're returning the length, this becomes
|
||||
// quite inefficient since we need to strip the length off
|
||||
// the existing data and reconstruct it with the combined length.
|
||||
if wantLen {
|
||||
_, nn := protowire.ConsumeVarint(message)
|
||||
m0 := message[nn:]
|
||||
message = nil
|
||||
message = protowire.AppendVarint(message, uint64(len(m0)+len(m)))
|
||||
message = append(message, m0...)
|
||||
message = append(message, m...)
|
||||
} else {
|
||||
message = append(message, m...)
|
||||
}
|
||||
}
|
||||
b = b[n:]
|
||||
default:
|
||||
// We have no place to put it, so we just ignore unknown fields.
|
||||
n := protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return 0, nil, 0, protowire.ParseError(n)
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// AppendFieldStart appends the start of a MessageSet item field containing
|
||||
// an extension with the given number. The caller must add the message
|
||||
// subfield (including the tag).
|
||||
func AppendFieldStart(b []byte, num protowire.Number) []byte {
|
||||
b = protowire.AppendTag(b, FieldItem, protowire.StartGroupType)
|
||||
b = protowire.AppendTag(b, FieldTypeID, protowire.VarintType)
|
||||
b = protowire.AppendVarint(b, uint64(num))
|
||||
return b
|
||||
}
|
||||
|
||||
// AppendFieldEnd appends the trailing end group marker for a MessageSet item field.
|
||||
func AppendFieldEnd(b []byte) []byte {
|
||||
return protowire.AppendTag(b, FieldItem, protowire.EndGroupType)
|
||||
}
|
||||
|
||||
// SizeUnknown returns the size of an unknown fields section in MessageSet format.
|
||||
//
|
||||
// See AppendUnknown.
|
||||
func SizeUnknown(unknown []byte) (size int) {
|
||||
for len(unknown) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(unknown)
|
||||
if n < 0 || typ != protowire.BytesType {
|
||||
return 0
|
||||
}
|
||||
unknown = unknown[n:]
|
||||
_, n = protowire.ConsumeBytes(unknown)
|
||||
if n < 0 {
|
||||
return 0
|
||||
}
|
||||
unknown = unknown[n:]
|
||||
size += SizeField(num) + protowire.SizeTag(FieldMessage) + n
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
// AppendUnknown appends unknown fields to b in MessageSet format.
|
||||
//
|
||||
// For historic reasons, unresolved items in a MessageSet are stored in a
|
||||
// message's unknown fields section in non-MessageSet format. That is, an
|
||||
// unknown item with typeID T and value V appears in the unknown fields as
|
||||
// a field with number T and value V.
|
||||
//
|
||||
// This function converts the unknown fields back into MessageSet form.
|
||||
func AppendUnknown(b, unknown []byte) ([]byte, error) {
|
||||
for len(unknown) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(unknown)
|
||||
if n < 0 || typ != protowire.BytesType {
|
||||
return nil, errors.New("invalid data in message set unknown fields")
|
||||
}
|
||||
unknown = unknown[n:]
|
||||
_, n = protowire.ConsumeBytes(unknown)
|
||||
if n < 0 {
|
||||
return nil, errors.New("invalid data in message set unknown fields")
|
||||
}
|
||||
b = AppendFieldStart(b, num)
|
||||
b = protowire.AppendTag(b, FieldMessage, protowire.BytesType)
|
||||
b = append(b, unknown[:n]...)
|
||||
b = AppendFieldEnd(b)
|
||||
unknown = unknown[n:]
|
||||
}
|
||||
return b, nil
|
||||
}
|
201
e2e/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go
generated
vendored
Normal file
201
e2e/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package tag marshals and unmarshals the legacy struct tags as generated
|
||||
// by historical versions of protoc-gen-go.
|
||||
package tag
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/internal/encoding/defval"
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
var byteType = reflect.TypeOf(byte(0))
|
||||
|
||||
// Unmarshal decodes the tag into a prototype.Field.
|
||||
//
|
||||
// The goType is needed to determine the original protoreflect.Kind since the
|
||||
// tag does not record sufficient information to determine that.
|
||||
// The type is the underlying field type (e.g., a repeated field may be
|
||||
// represented by []T, but the Go type passed in is just T).
|
||||
// A list of enum value descriptors must be provided for enum fields.
|
||||
// This does not populate the Enum or Message.
|
||||
//
|
||||
// This function is a best effort attempt; parsing errors are ignored.
|
||||
func Unmarshal(tag string, goType reflect.Type, evs protoreflect.EnumValueDescriptors) protoreflect.FieldDescriptor {
|
||||
f := new(filedesc.Field)
|
||||
f.L0.ParentFile = filedesc.SurrogateProto2
|
||||
f.L1.EditionFeatures = f.L0.ParentFile.L1.EditionFeatures
|
||||
for len(tag) > 0 {
|
||||
i := strings.IndexByte(tag, ',')
|
||||
if i < 0 {
|
||||
i = len(tag)
|
||||
}
|
||||
switch s := tag[:i]; {
|
||||
case strings.HasPrefix(s, "name="):
|
||||
f.L0.FullName = protoreflect.FullName(s[len("name="):])
|
||||
case strings.Trim(s, "0123456789") == "":
|
||||
n, _ := strconv.ParseUint(s, 10, 32)
|
||||
f.L1.Number = protoreflect.FieldNumber(n)
|
||||
case s == "opt":
|
||||
f.L1.Cardinality = protoreflect.Optional
|
||||
case s == "req":
|
||||
f.L1.Cardinality = protoreflect.Required
|
||||
case s == "rep":
|
||||
f.L1.Cardinality = protoreflect.Repeated
|
||||
case s == "varint":
|
||||
switch goType.Kind() {
|
||||
case reflect.Bool:
|
||||
f.L1.Kind = protoreflect.BoolKind
|
||||
case reflect.Int32:
|
||||
f.L1.Kind = protoreflect.Int32Kind
|
||||
case reflect.Int64:
|
||||
f.L1.Kind = protoreflect.Int64Kind
|
||||
case reflect.Uint32:
|
||||
f.L1.Kind = protoreflect.Uint32Kind
|
||||
case reflect.Uint64:
|
||||
f.L1.Kind = protoreflect.Uint64Kind
|
||||
}
|
||||
case s == "zigzag32":
|
||||
if goType.Kind() == reflect.Int32 {
|
||||
f.L1.Kind = protoreflect.Sint32Kind
|
||||
}
|
||||
case s == "zigzag64":
|
||||
if goType.Kind() == reflect.Int64 {
|
||||
f.L1.Kind = protoreflect.Sint64Kind
|
||||
}
|
||||
case s == "fixed32":
|
||||
switch goType.Kind() {
|
||||
case reflect.Int32:
|
||||
f.L1.Kind = protoreflect.Sfixed32Kind
|
||||
case reflect.Uint32:
|
||||
f.L1.Kind = protoreflect.Fixed32Kind
|
||||
case reflect.Float32:
|
||||
f.L1.Kind = protoreflect.FloatKind
|
||||
}
|
||||
case s == "fixed64":
|
||||
switch goType.Kind() {
|
||||
case reflect.Int64:
|
||||
f.L1.Kind = protoreflect.Sfixed64Kind
|
||||
case reflect.Uint64:
|
||||
f.L1.Kind = protoreflect.Fixed64Kind
|
||||
case reflect.Float64:
|
||||
f.L1.Kind = protoreflect.DoubleKind
|
||||
}
|
||||
case s == "bytes":
|
||||
switch {
|
||||
case goType.Kind() == reflect.String:
|
||||
f.L1.Kind = protoreflect.StringKind
|
||||
case goType.Kind() == reflect.Slice && goType.Elem() == byteType:
|
||||
f.L1.Kind = protoreflect.BytesKind
|
||||
default:
|
||||
f.L1.Kind = protoreflect.MessageKind
|
||||
}
|
||||
case s == "group":
|
||||
f.L1.Kind = protoreflect.GroupKind
|
||||
case strings.HasPrefix(s, "enum="):
|
||||
f.L1.Kind = protoreflect.EnumKind
|
||||
case strings.HasPrefix(s, "json="):
|
||||
jsonName := s[len("json="):]
|
||||
if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) {
|
||||
f.L1.StringName.InitJSON(jsonName)
|
||||
}
|
||||
case s == "packed":
|
||||
f.L1.EditionFeatures.IsPacked = true
|
||||
case strings.HasPrefix(s, "def="):
|
||||
// The default tag is special in that everything afterwards is the
|
||||
// default regardless of the presence of commas.
|
||||
s, i = tag[len("def="):], len(tag)
|
||||
v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag)
|
||||
f.L1.Default = filedesc.DefaultValue(v, ev)
|
||||
case s == "proto3":
|
||||
f.L0.ParentFile = filedesc.SurrogateProto3
|
||||
}
|
||||
tag = strings.TrimPrefix(tag[i:], ",")
|
||||
}
|
||||
|
||||
// The generator uses the group message name instead of the field name.
|
||||
// We obtain the real field name by lowercasing the group name.
|
||||
if f.L1.Kind == protoreflect.GroupKind {
|
||||
f.L0.FullName = protoreflect.FullName(strings.ToLower(string(f.L0.FullName)))
|
||||
}
|
||||
return f
|
||||
}
|
||||
|
||||
// Marshal encodes the protoreflect.FieldDescriptor as a tag.
|
||||
//
|
||||
// The enumName must be provided if the kind is an enum.
|
||||
// Historically, the formulation of the enum "name" was the proto package
|
||||
// dot-concatenated with the generated Go identifier for the enum type.
|
||||
// Depending on the context on how Marshal is called, there are different ways
|
||||
// through which that information is determined. As such it is the caller's
|
||||
// responsibility to provide a function to obtain that information.
|
||||
func Marshal(fd protoreflect.FieldDescriptor, enumName string) string {
|
||||
var tag []string
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind, protoreflect.EnumKind, protoreflect.Int32Kind, protoreflect.Uint32Kind, protoreflect.Int64Kind, protoreflect.Uint64Kind:
|
||||
tag = append(tag, "varint")
|
||||
case protoreflect.Sint32Kind:
|
||||
tag = append(tag, "zigzag32")
|
||||
case protoreflect.Sint64Kind:
|
||||
tag = append(tag, "zigzag64")
|
||||
case protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind, protoreflect.FloatKind:
|
||||
tag = append(tag, "fixed32")
|
||||
case protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind, protoreflect.DoubleKind:
|
||||
tag = append(tag, "fixed64")
|
||||
case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind:
|
||||
tag = append(tag, "bytes")
|
||||
case protoreflect.GroupKind:
|
||||
tag = append(tag, "group")
|
||||
}
|
||||
tag = append(tag, strconv.Itoa(int(fd.Number())))
|
||||
switch fd.Cardinality() {
|
||||
case protoreflect.Optional:
|
||||
tag = append(tag, "opt")
|
||||
case protoreflect.Required:
|
||||
tag = append(tag, "req")
|
||||
case protoreflect.Repeated:
|
||||
tag = append(tag, "rep")
|
||||
}
|
||||
if fd.IsPacked() {
|
||||
tag = append(tag, "packed")
|
||||
}
|
||||
name := string(fd.Name())
|
||||
if fd.Kind() == protoreflect.GroupKind {
|
||||
// The name of the FieldDescriptor for a group field is
|
||||
// lowercased. To find the original capitalization, we
|
||||
// look in the field's MessageType.
|
||||
name = string(fd.Message().Name())
|
||||
}
|
||||
tag = append(tag, "name="+name)
|
||||
if jsonName := fd.JSONName(); jsonName != "" && jsonName != name && !fd.IsExtension() {
|
||||
// NOTE: The jsonName != name condition is suspect, but it preserve
|
||||
// the exact same semantics from the previous generator.
|
||||
tag = append(tag, "json="+jsonName)
|
||||
}
|
||||
// The previous implementation does not tag extension fields as proto3,
|
||||
// even when the field is defined in a proto3 file. Match that behavior
|
||||
// for consistency.
|
||||
if fd.Syntax() == protoreflect.Proto3 && !fd.IsExtension() {
|
||||
tag = append(tag, "proto3")
|
||||
}
|
||||
if fd.Kind() == protoreflect.EnumKind && enumName != "" {
|
||||
tag = append(tag, "enum="+enumName)
|
||||
}
|
||||
if fd.ContainingOneof() != nil {
|
||||
tag = append(tag, "oneof")
|
||||
}
|
||||
// This must appear last in the tag, since commas in strings aren't escaped.
|
||||
if fd.HasDefault() {
|
||||
def, _ := defval.Marshal(fd.Default(), fd.DefaultEnumValue(), fd.Kind(), defval.GoTag)
|
||||
tag = append(tag, "def="+def)
|
||||
}
|
||||
return strings.Join(tag, ",")
|
||||
}
|
686
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go
generated
vendored
Normal file
686
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go
generated
vendored
Normal file
@ -0,0 +1,686 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package text
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"strconv"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// Decoder is a token-based textproto decoder.
|
||||
type Decoder struct {
|
||||
// lastCall is last method called, either readCall or peekCall.
|
||||
// Initial value is readCall.
|
||||
lastCall call
|
||||
|
||||
// lastToken contains the last read token.
|
||||
lastToken Token
|
||||
|
||||
// lastErr contains the last read error.
|
||||
lastErr error
|
||||
|
||||
// openStack is a stack containing the byte characters for MessageOpen and
|
||||
// ListOpen kinds. The top of stack represents the message or the list that
|
||||
// the current token is nested in. An empty stack means the current token is
|
||||
// at the top level message. The characters '{' and '<' both represent the
|
||||
// MessageOpen kind.
|
||||
openStack []byte
|
||||
|
||||
// orig is used in reporting line and column.
|
||||
orig []byte
|
||||
// in contains the unconsumed input.
|
||||
in []byte
|
||||
}
|
||||
|
||||
// NewDecoder returns a Decoder to read the given []byte.
|
||||
func NewDecoder(b []byte) *Decoder {
|
||||
return &Decoder{orig: b, in: b}
|
||||
}
|
||||
|
||||
// ErrUnexpectedEOF means that EOF was encountered in the middle of the input.
|
||||
var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF)
|
||||
|
||||
// call specifies which Decoder method was invoked.
|
||||
type call uint8
|
||||
|
||||
const (
|
||||
readCall call = iota
|
||||
peekCall
|
||||
)
|
||||
|
||||
// Peek looks ahead and returns the next token and error without advancing a read.
|
||||
func (d *Decoder) Peek() (Token, error) {
|
||||
defer func() { d.lastCall = peekCall }()
|
||||
if d.lastCall == readCall {
|
||||
d.lastToken, d.lastErr = d.Read()
|
||||
}
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
// Read returns the next token.
|
||||
// It will return an error if there is no valid token.
|
||||
func (d *Decoder) Read() (Token, error) {
|
||||
defer func() { d.lastCall = readCall }()
|
||||
if d.lastCall == peekCall {
|
||||
return d.lastToken, d.lastErr
|
||||
}
|
||||
|
||||
tok, err := d.parseNext(d.lastToken.kind)
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
|
||||
switch tok.kind {
|
||||
case comma, semicolon:
|
||||
tok, err = d.parseNext(tok.kind)
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
}
|
||||
d.lastToken = tok
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
const (
|
||||
mismatchedFmt = "mismatched close character %q"
|
||||
unexpectedFmt = "unexpected character %q"
|
||||
)
|
||||
|
||||
// parseNext parses the next Token based on given last kind.
|
||||
func (d *Decoder) parseNext(lastKind Kind) (Token, error) {
|
||||
// Trim leading spaces.
|
||||
d.consume(0)
|
||||
isEOF := false
|
||||
if len(d.in) == 0 {
|
||||
isEOF = true
|
||||
}
|
||||
|
||||
switch lastKind {
|
||||
case EOF:
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
|
||||
case bof:
|
||||
// Start of top level message. Next token can be EOF or Name.
|
||||
if isEOF {
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
}
|
||||
return d.parseFieldName()
|
||||
|
||||
case Name:
|
||||
// Next token can be MessageOpen, ListOpen or Scalar.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case '{', '<':
|
||||
d.pushOpenStack(ch)
|
||||
return d.consumeToken(MessageOpen, 1, 0), nil
|
||||
case '[':
|
||||
d.pushOpenStack(ch)
|
||||
return d.consumeToken(ListOpen, 1, 0), nil
|
||||
default:
|
||||
return d.parseScalar()
|
||||
}
|
||||
|
||||
case Scalar:
|
||||
openKind, closeCh := d.currentOpenKind()
|
||||
switch openKind {
|
||||
case bof:
|
||||
// Top level message.
|
||||
// Next token can be EOF, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
}
|
||||
switch d.in[0] {
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case MessageOpen:
|
||||
// Next token can be MessageClose, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(MessageClose, 1, 0), nil
|
||||
case otherCloseChar[closeCh]:
|
||||
return Token{}, d.newSyntaxError(mismatchedFmt, ch)
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case ListOpen:
|
||||
// Next token can be ListClose or comma.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case ']':
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(ListClose, 1, 0), nil
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
default:
|
||||
return Token{}, d.newSyntaxError(unexpectedFmt, ch)
|
||||
}
|
||||
}
|
||||
|
||||
case MessageOpen:
|
||||
// Next token can be MessageClose or Name.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
_, closeCh := d.currentOpenKind()
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(MessageClose, 1, 0), nil
|
||||
case otherCloseChar[closeCh]:
|
||||
return Token{}, d.newSyntaxError(mismatchedFmt, ch)
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case MessageClose:
|
||||
openKind, closeCh := d.currentOpenKind()
|
||||
switch openKind {
|
||||
case bof:
|
||||
// Top level message.
|
||||
// Next token can be EOF, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case MessageOpen:
|
||||
// Next token can be MessageClose, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(MessageClose, 1, 0), nil
|
||||
case otherCloseChar[closeCh]:
|
||||
return Token{}, d.newSyntaxError(mismatchedFmt, ch)
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case ListOpen:
|
||||
// Next token can be ListClose or comma
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(ListClose, 1, 0), nil
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
default:
|
||||
return Token{}, d.newSyntaxError(unexpectedFmt, ch)
|
||||
}
|
||||
}
|
||||
|
||||
case ListOpen:
|
||||
// Next token can be ListClose, MessageStart or Scalar.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case ']':
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(ListClose, 1, 0), nil
|
||||
case '{', '<':
|
||||
d.pushOpenStack(ch)
|
||||
return d.consumeToken(MessageOpen, 1, 0), nil
|
||||
default:
|
||||
return d.parseScalar()
|
||||
}
|
||||
|
||||
case ListClose:
|
||||
openKind, closeCh := d.currentOpenKind()
|
||||
switch openKind {
|
||||
case bof:
|
||||
// Top level message.
|
||||
// Next token can be EOF, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case MessageOpen:
|
||||
// Next token can be MessageClose, comma, semicolon or Name.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(MessageClose, 1, 0), nil
|
||||
case otherCloseChar[closeCh]:
|
||||
return Token{}, d.newSyntaxError(mismatchedFmt, ch)
|
||||
case ',':
|
||||
return d.consumeToken(comma, 1, 0), nil
|
||||
case ';':
|
||||
return d.consumeToken(semicolon, 1, 0), nil
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
default:
|
||||
// It is not possible to have this case. Let it panic below.
|
||||
}
|
||||
|
||||
case comma, semicolon:
|
||||
openKind, closeCh := d.currentOpenKind()
|
||||
switch openKind {
|
||||
case bof:
|
||||
// Top level message. Next token can be EOF or Name.
|
||||
if isEOF {
|
||||
return d.consumeToken(EOF, 0, 0), nil
|
||||
}
|
||||
return d.parseFieldName()
|
||||
|
||||
case MessageOpen:
|
||||
// Next token can be MessageClose or Name.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case closeCh:
|
||||
d.popOpenStack()
|
||||
return d.consumeToken(MessageClose, 1, 0), nil
|
||||
case otherCloseChar[closeCh]:
|
||||
return Token{}, d.newSyntaxError(mismatchedFmt, ch)
|
||||
default:
|
||||
return d.parseFieldName()
|
||||
}
|
||||
|
||||
case ListOpen:
|
||||
if lastKind == semicolon {
|
||||
// It is not be possible to have this case as logic here
|
||||
// should not have produced a semicolon Token when inside a
|
||||
// list. Let it panic below.
|
||||
break
|
||||
}
|
||||
// Next token can be MessageOpen or Scalar.
|
||||
if isEOF {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
switch ch := d.in[0]; ch {
|
||||
case '{', '<':
|
||||
d.pushOpenStack(ch)
|
||||
return d.consumeToken(MessageOpen, 1, 0), nil
|
||||
default:
|
||||
return d.parseScalar()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
line, column := d.Position(len(d.orig) - len(d.in))
|
||||
panic(fmt.Sprintf("Decoder.parseNext: bug at handling line %d:%d with lastKind=%v", line, column, lastKind))
|
||||
}
|
||||
|
||||
var otherCloseChar = map[byte]byte{
|
||||
'}': '>',
|
||||
'>': '}',
|
||||
}
|
||||
|
||||
// currentOpenKind indicates whether current position is inside a message, list
|
||||
// or top-level message by returning MessageOpen, ListOpen or bof respectively.
|
||||
// If the returned kind is either a MessageOpen or ListOpen, it also returns the
|
||||
// corresponding closing character.
|
||||
func (d *Decoder) currentOpenKind() (Kind, byte) {
|
||||
if len(d.openStack) == 0 {
|
||||
return bof, 0
|
||||
}
|
||||
openCh := d.openStack[len(d.openStack)-1]
|
||||
switch openCh {
|
||||
case '{':
|
||||
return MessageOpen, '}'
|
||||
case '<':
|
||||
return MessageOpen, '>'
|
||||
case '[':
|
||||
return ListOpen, ']'
|
||||
}
|
||||
panic(fmt.Sprintf("Decoder: openStack contains invalid byte %c", openCh))
|
||||
}
|
||||
|
||||
func (d *Decoder) pushOpenStack(ch byte) {
|
||||
d.openStack = append(d.openStack, ch)
|
||||
}
|
||||
|
||||
func (d *Decoder) popOpenStack() {
|
||||
d.openStack = d.openStack[:len(d.openStack)-1]
|
||||
}
|
||||
|
||||
// parseFieldName parses field name and separator.
|
||||
func (d *Decoder) parseFieldName() (tok Token, err error) {
|
||||
defer func() {
|
||||
if err == nil && d.tryConsumeChar(':') {
|
||||
tok.attrs |= hasSeparator
|
||||
}
|
||||
}()
|
||||
|
||||
// Extension or Any type URL.
|
||||
if d.in[0] == '[' {
|
||||
return d.parseTypeName()
|
||||
}
|
||||
|
||||
// Identifier.
|
||||
if size := parseIdent(d.in, false); size > 0 {
|
||||
return d.consumeToken(Name, size, uint8(IdentName)), nil
|
||||
}
|
||||
|
||||
// Field number. Identify if input is a valid number that is not negative
|
||||
// and is decimal integer within 32-bit range.
|
||||
if num := parseNumber(d.in); num.size > 0 {
|
||||
str := num.string(d.in)
|
||||
if !num.neg && num.kind == numDec {
|
||||
if _, err := strconv.ParseInt(str, 10, 32); err == nil {
|
||||
return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil
|
||||
}
|
||||
}
|
||||
return Token{}, d.newSyntaxError("invalid field number: %s", str)
|
||||
}
|
||||
|
||||
return Token{}, d.newSyntaxError("invalid field name: %s", errId(d.in))
|
||||
}
|
||||
|
||||
// parseTypeName parses Any type URL or extension field name. The name is
|
||||
// enclosed in [ and ] characters. The C++ parser does not handle many legal URL
|
||||
// strings. This implementation is more liberal and allows for the pattern
|
||||
// ^[-_a-zA-Z0-9]+([./][-_a-zA-Z0-9]+)*`). Whitespaces and comments are allowed
|
||||
// in between [ ], '.', '/' and the sub names.
|
||||
func (d *Decoder) parseTypeName() (Token, error) {
|
||||
startPos := len(d.orig) - len(d.in)
|
||||
// Use alias s to advance first in order to use d.in for error handling.
|
||||
// Caller already checks for [ as first character.
|
||||
s := consume(d.in[1:], 0)
|
||||
if len(s) == 0 {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
var name []byte
|
||||
for len(s) > 0 && isTypeNameChar(s[0]) {
|
||||
name = append(name, s[0])
|
||||
s = s[1:]
|
||||
}
|
||||
s = consume(s, 0)
|
||||
|
||||
var closed bool
|
||||
for len(s) > 0 && !closed {
|
||||
switch {
|
||||
case s[0] == ']':
|
||||
s = s[1:]
|
||||
closed = true
|
||||
|
||||
case s[0] == '/', s[0] == '.':
|
||||
if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') {
|
||||
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
|
||||
d.orig[startPos:len(d.orig)-len(s)+1])
|
||||
}
|
||||
name = append(name, s[0])
|
||||
s = s[1:]
|
||||
s = consume(s, 0)
|
||||
for len(s) > 0 && isTypeNameChar(s[0]) {
|
||||
name = append(name, s[0])
|
||||
s = s[1:]
|
||||
}
|
||||
s = consume(s, 0)
|
||||
|
||||
default:
|
||||
return Token{}, d.newSyntaxError(
|
||||
"invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1])
|
||||
}
|
||||
}
|
||||
|
||||
if !closed {
|
||||
return Token{}, ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
// First character cannot be '.'. Last character cannot be '.' or '/'.
|
||||
size := len(name)
|
||||
if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' {
|
||||
return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
|
||||
d.orig[startPos:len(d.orig)-len(s)])
|
||||
}
|
||||
|
||||
d.in = s
|
||||
endPos := len(d.orig) - len(d.in)
|
||||
d.consume(0)
|
||||
|
||||
return Token{
|
||||
kind: Name,
|
||||
attrs: uint8(TypeName),
|
||||
pos: startPos,
|
||||
raw: d.orig[startPos:endPos],
|
||||
str: string(name),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func isTypeNameChar(b byte) bool {
|
||||
return (b == '-' || b == '_' ||
|
||||
('0' <= b && b <= '9') ||
|
||||
('a' <= b && b <= 'z') ||
|
||||
('A' <= b && b <= 'Z'))
|
||||
}
|
||||
|
||||
func isWhiteSpace(b byte) bool {
|
||||
switch b {
|
||||
case ' ', '\n', '\r', '\t':
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// parseIdent parses an unquoted proto identifier and returns size.
|
||||
// If allowNeg is true, it allows '-' to be the first character in the
|
||||
// identifier. This is used when parsing literal values like -infinity, etc.
|
||||
// Regular expression matches an identifier: `^[_a-zA-Z][_a-zA-Z0-9]*`
|
||||
func parseIdent(input []byte, allowNeg bool) int {
|
||||
var size int
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return 0
|
||||
}
|
||||
|
||||
if allowNeg && s[0] == '-' {
|
||||
s = s[1:]
|
||||
size++
|
||||
if len(s) == 0 {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case s[0] == '_',
|
||||
'a' <= s[0] && s[0] <= 'z',
|
||||
'A' <= s[0] && s[0] <= 'Z':
|
||||
s = s[1:]
|
||||
size++
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
|
||||
for len(s) > 0 && (s[0] == '_' ||
|
||||
'a' <= s[0] && s[0] <= 'z' ||
|
||||
'A' <= s[0] && s[0] <= 'Z' ||
|
||||
'0' <= s[0] && s[0] <= '9') {
|
||||
s = s[1:]
|
||||
size++
|
||||
}
|
||||
|
||||
if len(s) > 0 && !isDelim(s[0]) {
|
||||
return 0
|
||||
}
|
||||
|
||||
return size
|
||||
}
|
||||
|
||||
// parseScalar parses for a string, literal or number value.
|
||||
func (d *Decoder) parseScalar() (Token, error) {
|
||||
if d.in[0] == '"' || d.in[0] == '\'' {
|
||||
return d.parseStringValue()
|
||||
}
|
||||
|
||||
if tok, ok := d.parseLiteralValue(); ok {
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
if tok, ok := d.parseNumberValue(); ok {
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
return Token{}, d.newSyntaxError("invalid scalar value: %s", errId(d.in))
|
||||
}
|
||||
|
||||
// parseLiteralValue parses a literal value. A literal value is used for
|
||||
// bools, special floats and enums. This function simply identifies that the
|
||||
// field value is a literal.
|
||||
func (d *Decoder) parseLiteralValue() (Token, bool) {
|
||||
size := parseIdent(d.in, true)
|
||||
if size == 0 {
|
||||
return Token{}, false
|
||||
}
|
||||
return d.consumeToken(Scalar, size, literalValue), true
|
||||
}
|
||||
|
||||
// consumeToken constructs a Token for given Kind from d.in and consumes given
|
||||
// size-length from it.
|
||||
func (d *Decoder) consumeToken(kind Kind, size int, attrs uint8) Token {
|
||||
// Important to compute raw and pos before consuming.
|
||||
tok := Token{
|
||||
kind: kind,
|
||||
attrs: attrs,
|
||||
pos: len(d.orig) - len(d.in),
|
||||
raw: d.in[:size],
|
||||
}
|
||||
d.consume(size)
|
||||
return tok
|
||||
}
|
||||
|
||||
// newSyntaxError returns a syntax error with line and column information for
|
||||
// current position.
|
||||
func (d *Decoder) newSyntaxError(f string, x ...any) error {
|
||||
e := errors.New(f, x...)
|
||||
line, column := d.Position(len(d.orig) - len(d.in))
|
||||
return errors.New("syntax error (line %d:%d): %v", line, column, e)
|
||||
}
|
||||
|
||||
// Position returns line and column number of given index of the original input.
|
||||
// It will panic if index is out of range.
|
||||
func (d *Decoder) Position(idx int) (line int, column int) {
|
||||
b := d.orig[:idx]
|
||||
line = bytes.Count(b, []byte("\n")) + 1
|
||||
if i := bytes.LastIndexByte(b, '\n'); i >= 0 {
|
||||
b = b[i+1:]
|
||||
}
|
||||
column = utf8.RuneCount(b) + 1 // ignore multi-rune characters
|
||||
return line, column
|
||||
}
|
||||
|
||||
func (d *Decoder) tryConsumeChar(c byte) bool {
|
||||
if len(d.in) > 0 && d.in[0] == c {
|
||||
d.consume(1)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// consume consumes n bytes of input and any subsequent whitespace or comments.
|
||||
func (d *Decoder) consume(n int) {
|
||||
d.in = consume(d.in, n)
|
||||
return
|
||||
}
|
||||
|
||||
// consume consumes n bytes of input and any subsequent whitespace or comments.
|
||||
func consume(b []byte, n int) []byte {
|
||||
b = b[n:]
|
||||
for len(b) > 0 {
|
||||
switch b[0] {
|
||||
case ' ', '\n', '\r', '\t':
|
||||
b = b[1:]
|
||||
case '#':
|
||||
if i := bytes.IndexByte(b, '\n'); i >= 0 {
|
||||
b = b[i+len("\n"):]
|
||||
} else {
|
||||
b = nil
|
||||
}
|
||||
default:
|
||||
return b
|
||||
}
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// errId extracts a byte sequence that looks like an invalid ID
|
||||
// (for the purposes of error reporting).
|
||||
func errId(seq []byte) []byte {
|
||||
const maxLen = 32
|
||||
for i := 0; i < len(seq); {
|
||||
if i > maxLen {
|
||||
return append(seq[:i:i], "…"...)
|
||||
}
|
||||
r, size := utf8.DecodeRune(seq[i:])
|
||||
if r > utf8.RuneSelf || (r != '/' && isDelim(byte(r))) {
|
||||
if i == 0 {
|
||||
// Either the first byte is invalid UTF-8 or a
|
||||
// delimiter, or the first rune is non-ASCII.
|
||||
// Return it as-is.
|
||||
i = size
|
||||
}
|
||||
return seq[:i:i]
|
||||
}
|
||||
i += size
|
||||
}
|
||||
// No delimiter found.
|
||||
return seq
|
||||
}
|
||||
|
||||
// isDelim returns true if given byte is a delimiter character.
|
||||
func isDelim(c byte) bool {
|
||||
return !(c == '-' || c == '+' || c == '.' || c == '_' ||
|
||||
('a' <= c && c <= 'z') ||
|
||||
('A' <= c && c <= 'Z') ||
|
||||
('0' <= c && c <= '9'))
|
||||
}
|
211
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go
generated
vendored
Normal file
211
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go
generated
vendored
Normal file
@ -0,0 +1,211 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package text
|
||||
|
||||
// parseNumberValue parses a number from the input and returns a Token object.
|
||||
func (d *Decoder) parseNumberValue() (Token, bool) {
|
||||
in := d.in
|
||||
num := parseNumber(in)
|
||||
if num.size == 0 {
|
||||
return Token{}, false
|
||||
}
|
||||
numAttrs := num.kind
|
||||
if num.neg {
|
||||
numAttrs |= isNegative
|
||||
}
|
||||
tok := Token{
|
||||
kind: Scalar,
|
||||
attrs: numberValue,
|
||||
pos: len(d.orig) - len(d.in),
|
||||
raw: d.in[:num.size],
|
||||
str: num.string(d.in),
|
||||
numAttrs: numAttrs,
|
||||
}
|
||||
d.consume(num.size)
|
||||
return tok, true
|
||||
}
|
||||
|
||||
const (
|
||||
numDec uint8 = (1 << iota) / 2
|
||||
numHex
|
||||
numOct
|
||||
numFloat
|
||||
)
|
||||
|
||||
// number is the result of parsing out a valid number from parseNumber. It
|
||||
// contains data for doing float or integer conversion via the strconv package
|
||||
// in conjunction with the input bytes.
|
||||
type number struct {
|
||||
kind uint8
|
||||
neg bool
|
||||
size int
|
||||
// if neg, this is the length of whitespace and comments between
|
||||
// the minus sign and the rest fo the number literal
|
||||
sep int
|
||||
}
|
||||
|
||||
func (num number) string(data []byte) string {
|
||||
strSize := num.size
|
||||
last := num.size - 1
|
||||
if num.kind == numFloat && (data[last] == 'f' || data[last] == 'F') {
|
||||
strSize = last
|
||||
}
|
||||
if num.neg && num.sep > 0 {
|
||||
// strip whitespace/comments between negative sign and the rest
|
||||
strLen := strSize - num.sep
|
||||
str := make([]byte, strLen)
|
||||
str[0] = data[0]
|
||||
copy(str[1:], data[num.sep+1:strSize])
|
||||
return string(str)
|
||||
}
|
||||
return string(data[:strSize])
|
||||
|
||||
}
|
||||
|
||||
// parseNumber constructs a number object from given input. It allows for the
|
||||
// following patterns:
|
||||
//
|
||||
// integer: ^-?([1-9][0-9]*|0[xX][0-9a-fA-F]+|0[0-7]*)
|
||||
// float: ^-?((0|[1-9][0-9]*)?([.][0-9]*)?([eE][+-]?[0-9]+)?[fF]?)
|
||||
//
|
||||
// It also returns the number of parsed bytes for the given number, 0 if it is
|
||||
// not a number.
|
||||
func parseNumber(input []byte) number {
|
||||
kind := numDec
|
||||
var size int
|
||||
var neg bool
|
||||
|
||||
s := input
|
||||
if len(s) == 0 {
|
||||
return number{}
|
||||
}
|
||||
|
||||
// Optional -
|
||||
var sep int
|
||||
if s[0] == '-' {
|
||||
neg = true
|
||||
s = s[1:]
|
||||
size++
|
||||
// Consume any whitespace or comments between the
|
||||
// negative sign and the rest of the number
|
||||
lenBefore := len(s)
|
||||
s = consume(s, 0)
|
||||
sep = lenBefore - len(s)
|
||||
size += sep
|
||||
if len(s) == 0 {
|
||||
return number{}
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case s[0] == '0':
|
||||
if len(s) > 1 {
|
||||
switch {
|
||||
case s[1] == 'x' || s[1] == 'X':
|
||||
// Parse as hex number.
|
||||
kind = numHex
|
||||
n := 2
|
||||
s = s[2:]
|
||||
for len(s) > 0 && (('0' <= s[0] && s[0] <= '9') ||
|
||||
('a' <= s[0] && s[0] <= 'f') ||
|
||||
('A' <= s[0] && s[0] <= 'F')) {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
if n == 2 {
|
||||
return number{}
|
||||
}
|
||||
size += n
|
||||
|
||||
case '0' <= s[1] && s[1] <= '7':
|
||||
// Parse as octal number.
|
||||
kind = numOct
|
||||
n := 2
|
||||
s = s[2:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '7' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
size += n
|
||||
}
|
||||
|
||||
if kind&(numHex|numOct) > 0 {
|
||||
if len(s) > 0 && !isDelim(s[0]) {
|
||||
return number{}
|
||||
}
|
||||
return number{kind: kind, neg: neg, size: size, sep: sep}
|
||||
}
|
||||
}
|
||||
s = s[1:]
|
||||
size++
|
||||
|
||||
case '1' <= s[0] && s[0] <= '9':
|
||||
n := 1
|
||||
s = s[1:]
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
size += n
|
||||
|
||||
case s[0] == '.':
|
||||
// Set kind to numFloat to signify the intent to parse as float. And
|
||||
// that it needs to have other digits after '.'.
|
||||
kind = numFloat
|
||||
|
||||
default:
|
||||
return number{}
|
||||
}
|
||||
|
||||
// . followed by 0 or more digits.
|
||||
if len(s) > 0 && s[0] == '.' {
|
||||
n := 1
|
||||
s = s[1:]
|
||||
// If decimal point was before any digits, it should be followed by
|
||||
// other digits.
|
||||
if len(s) == 0 && kind == numFloat {
|
||||
return number{}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
size += n
|
||||
kind = numFloat
|
||||
}
|
||||
|
||||
// e or E followed by an optional - or + and 1 or more digits.
|
||||
if len(s) >= 2 && (s[0] == 'e' || s[0] == 'E') {
|
||||
kind = numFloat
|
||||
s = s[1:]
|
||||
n := 1
|
||||
if s[0] == '+' || s[0] == '-' {
|
||||
s = s[1:]
|
||||
n++
|
||||
if len(s) == 0 {
|
||||
return number{}
|
||||
}
|
||||
}
|
||||
for len(s) > 0 && '0' <= s[0] && s[0] <= '9' {
|
||||
s = s[1:]
|
||||
n++
|
||||
}
|
||||
size += n
|
||||
}
|
||||
|
||||
// Optional suffix f or F for floats.
|
||||
if len(s) > 0 && (s[0] == 'f' || s[0] == 'F') {
|
||||
kind = numFloat
|
||||
s = s[1:]
|
||||
size++
|
||||
}
|
||||
|
||||
// Check that next byte is a delimiter or it is at the end.
|
||||
if len(s) > 0 && !isDelim(s[0]) {
|
||||
return number{}
|
||||
}
|
||||
|
||||
return number{kind: kind, neg: neg, size: size, sep: sep}
|
||||
}
|
161
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go
generated
vendored
Normal file
161
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go
generated
vendored
Normal file
@ -0,0 +1,161 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package text
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode"
|
||||
"unicode/utf16"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
)
|
||||
|
||||
// parseStringValue parses string field token.
|
||||
// This differs from parseString since the text format allows
|
||||
// multiple back-to-back string literals where they are semantically treated
|
||||
// as a single large string with all values concatenated.
|
||||
//
|
||||
// E.g., `"foo" "bar" "baz"` => "foobarbaz"
|
||||
func (d *Decoder) parseStringValue() (Token, error) {
|
||||
// Note that the ending quote is sufficient to unambiguously mark the end
|
||||
// of a string. Thus, the text grammar does not require intervening
|
||||
// whitespace or control characters in-between strings.
|
||||
// Thus, the following is valid:
|
||||
// `"foo"'bar'"baz"` => "foobarbaz"
|
||||
in0 := d.in
|
||||
var ss []string
|
||||
for len(d.in) > 0 && (d.in[0] == '"' || d.in[0] == '\'') {
|
||||
s, err := d.parseString()
|
||||
if err != nil {
|
||||
return Token{}, err
|
||||
}
|
||||
ss = append(ss, s)
|
||||
}
|
||||
// d.in already points to the end of the value at this point.
|
||||
return Token{
|
||||
kind: Scalar,
|
||||
attrs: stringValue,
|
||||
pos: len(d.orig) - len(in0),
|
||||
raw: in0[:len(in0)-len(d.in)],
|
||||
str: strings.Join(ss, ""),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// parseString parses a string value enclosed in " or '.
|
||||
func (d *Decoder) parseString() (string, error) {
|
||||
in := d.in
|
||||
if len(in) == 0 {
|
||||
return "", ErrUnexpectedEOF
|
||||
}
|
||||
quote := in[0]
|
||||
in = in[1:]
|
||||
i := indexNeedEscapeInBytes(in)
|
||||
in, out := in[i:], in[:i:i] // set cap to prevent mutations
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRune(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
return "", d.newSyntaxError("invalid UTF-8 detected")
|
||||
case r == 0 || r == '\n':
|
||||
return "", d.newSyntaxError("invalid character %q in string", r)
|
||||
case r == rune(quote):
|
||||
in = in[1:]
|
||||
d.consume(len(d.in) - len(in))
|
||||
return string(out), nil
|
||||
case r == '\\':
|
||||
if len(in) < 2 {
|
||||
return "", ErrUnexpectedEOF
|
||||
}
|
||||
switch r := in[1]; r {
|
||||
case '"', '\'', '\\', '?':
|
||||
in, out = in[2:], append(out, r)
|
||||
case 'a':
|
||||
in, out = in[2:], append(out, '\a')
|
||||
case 'b':
|
||||
in, out = in[2:], append(out, '\b')
|
||||
case 'n':
|
||||
in, out = in[2:], append(out, '\n')
|
||||
case 'r':
|
||||
in, out = in[2:], append(out, '\r')
|
||||
case 't':
|
||||
in, out = in[2:], append(out, '\t')
|
||||
case 'v':
|
||||
in, out = in[2:], append(out, '\v')
|
||||
case 'f':
|
||||
in, out = in[2:], append(out, '\f')
|
||||
case '0', '1', '2', '3', '4', '5', '6', '7':
|
||||
// One, two, or three octal characters.
|
||||
n := len(in[1:]) - len(bytes.TrimLeft(in[1:], "01234567"))
|
||||
if n > 3 {
|
||||
n = 3
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[1:1+n]), 8, 8)
|
||||
if err != nil {
|
||||
return "", d.newSyntaxError("invalid octal escape code %q in string", in[:1+n])
|
||||
}
|
||||
in, out = in[1+n:], append(out, byte(v))
|
||||
case 'x':
|
||||
// One or two hexadecimal characters.
|
||||
n := len(in[2:]) - len(bytes.TrimLeft(in[2:], "0123456789abcdefABCDEF"))
|
||||
if n > 2 {
|
||||
n = 2
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:2+n]), 16, 8)
|
||||
if err != nil {
|
||||
return "", d.newSyntaxError("invalid hex escape code %q in string", in[:2+n])
|
||||
}
|
||||
in, out = in[2+n:], append(out, byte(v))
|
||||
case 'u', 'U':
|
||||
// Four or eight hexadecimal characters
|
||||
n := 6
|
||||
if r == 'U' {
|
||||
n = 10
|
||||
}
|
||||
if len(in) < n {
|
||||
return "", ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:n]), 16, 32)
|
||||
if utf8.MaxRune < v || err != nil {
|
||||
return "", d.newSyntaxError("invalid Unicode escape code %q in string", in[:n])
|
||||
}
|
||||
in = in[n:]
|
||||
|
||||
r := rune(v)
|
||||
if utf16.IsSurrogate(r) {
|
||||
if len(in) < 6 {
|
||||
return "", ErrUnexpectedEOF
|
||||
}
|
||||
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
|
||||
r = utf16.DecodeRune(r, rune(v))
|
||||
if in[0] != '\\' || in[1] != 'u' || r == unicode.ReplacementChar || err != nil {
|
||||
return "", d.newSyntaxError("invalid Unicode escape code %q in string", in[:6])
|
||||
}
|
||||
in = in[6:]
|
||||
}
|
||||
out = append(out, string(r)...)
|
||||
default:
|
||||
return "", d.newSyntaxError("invalid escape code %q in string", in[:2])
|
||||
}
|
||||
default:
|
||||
i := indexNeedEscapeInBytes(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
return "", ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
// indexNeedEscapeInString returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) }
|
||||
|
||||
// UnmarshalString returns an unescaped string given a textproto string value.
|
||||
// String value needs to contain single or double quotes. This is only used by
|
||||
// internal/encoding/defval package for unmarshaling bytes.
|
||||
func UnmarshalString(s string) (string, error) {
|
||||
d := NewDecoder([]byte(s))
|
||||
return d.parseString()
|
||||
}
|
373
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go
generated
vendored
Normal file
373
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go
generated
vendored
Normal file
@ -0,0 +1,373 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package text
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
)
|
||||
|
||||
// Kind represents a token kind expressible in the textproto format.
|
||||
type Kind uint8
|
||||
|
||||
// Kind values.
|
||||
const (
|
||||
Invalid Kind = iota
|
||||
EOF
|
||||
Name // Name indicates the field name.
|
||||
Scalar // Scalar are scalar values, e.g. "string", 47, ENUM_LITERAL, true.
|
||||
MessageOpen
|
||||
MessageClose
|
||||
ListOpen
|
||||
ListClose
|
||||
|
||||
// comma and semi-colon are only for parsing in between values and should not be exposed.
|
||||
comma
|
||||
semicolon
|
||||
|
||||
// bof indicates beginning of file, which is the default token
|
||||
// kind at the beginning of parsing.
|
||||
bof = Invalid
|
||||
)
|
||||
|
||||
func (t Kind) String() string {
|
||||
switch t {
|
||||
case Invalid:
|
||||
return "<invalid>"
|
||||
case EOF:
|
||||
return "eof"
|
||||
case Scalar:
|
||||
return "scalar"
|
||||
case Name:
|
||||
return "name"
|
||||
case MessageOpen:
|
||||
return "{"
|
||||
case MessageClose:
|
||||
return "}"
|
||||
case ListOpen:
|
||||
return "["
|
||||
case ListClose:
|
||||
return "]"
|
||||
case comma:
|
||||
return ","
|
||||
case semicolon:
|
||||
return ";"
|
||||
default:
|
||||
return fmt.Sprintf("<invalid:%v>", uint8(t))
|
||||
}
|
||||
}
|
||||
|
||||
// NameKind represents different types of field names.
|
||||
type NameKind uint8
|
||||
|
||||
// NameKind values.
|
||||
const (
|
||||
IdentName NameKind = iota + 1
|
||||
TypeName
|
||||
FieldNumber
|
||||
)
|
||||
|
||||
func (t NameKind) String() string {
|
||||
switch t {
|
||||
case IdentName:
|
||||
return "IdentName"
|
||||
case TypeName:
|
||||
return "TypeName"
|
||||
case FieldNumber:
|
||||
return "FieldNumber"
|
||||
default:
|
||||
return fmt.Sprintf("<invalid:%v>", uint8(t))
|
||||
}
|
||||
}
|
||||
|
||||
// Bit mask in Token.attrs to indicate if a Name token is followed by the
|
||||
// separator char ':'. The field name separator char is optional for message
|
||||
// field or repeated message field, but required for all other types. Decoder
|
||||
// simply indicates whether a Name token is followed by separator or not. It is
|
||||
// up to the prototext package to validate.
|
||||
const hasSeparator = 1 << 7
|
||||
|
||||
// Scalar value types.
|
||||
const (
|
||||
numberValue = iota + 1
|
||||
stringValue
|
||||
literalValue
|
||||
)
|
||||
|
||||
// Bit mask in Token.numAttrs to indicate that the number is a negative.
|
||||
const isNegative = 1 << 7
|
||||
|
||||
// Token provides a parsed token kind and value. Values are provided by the
|
||||
// different accessor methods.
|
||||
type Token struct {
|
||||
// Kind of the Token object.
|
||||
kind Kind
|
||||
// attrs contains metadata for the following Kinds:
|
||||
// Name: hasSeparator bit and one of NameKind.
|
||||
// Scalar: one of numberValue, stringValue, literalValue.
|
||||
attrs uint8
|
||||
// numAttrs contains metadata for numberValue:
|
||||
// - highest bit is whether negative or positive.
|
||||
// - lower bits indicate one of numDec, numHex, numOct, numFloat.
|
||||
numAttrs uint8
|
||||
// pos provides the position of the token in the original input.
|
||||
pos int
|
||||
// raw bytes of the serialized token.
|
||||
// This is a subslice into the original input.
|
||||
raw []byte
|
||||
// str contains parsed string for the following:
|
||||
// - stringValue of Scalar kind
|
||||
// - numberValue of Scalar kind
|
||||
// - TypeName of Name kind
|
||||
str string
|
||||
}
|
||||
|
||||
// Kind returns the token kind.
|
||||
func (t Token) Kind() Kind {
|
||||
return t.kind
|
||||
}
|
||||
|
||||
// RawString returns the read value in string.
|
||||
func (t Token) RawString() string {
|
||||
return string(t.raw)
|
||||
}
|
||||
|
||||
// Pos returns the token position from the input.
|
||||
func (t Token) Pos() int {
|
||||
return t.pos
|
||||
}
|
||||
|
||||
// NameKind returns IdentName, TypeName or FieldNumber.
|
||||
// It panics if type is not Name.
|
||||
func (t Token) NameKind() NameKind {
|
||||
if t.kind == Name {
|
||||
return NameKind(t.attrs &^ hasSeparator)
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Name type: %s", t.kind))
|
||||
}
|
||||
|
||||
// HasSeparator returns true if the field name is followed by the separator char
|
||||
// ':', else false. It panics if type is not Name.
|
||||
func (t Token) HasSeparator() bool {
|
||||
if t.kind == Name {
|
||||
return t.attrs&hasSeparator != 0
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a Name type: %s", t.kind))
|
||||
}
|
||||
|
||||
// IdentName returns the value for IdentName type.
|
||||
func (t Token) IdentName() string {
|
||||
if t.kind == Name && t.attrs&uint8(IdentName) != 0 {
|
||||
return string(t.raw)
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not an IdentName: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator)))
|
||||
}
|
||||
|
||||
// TypeName returns the value for TypeName type.
|
||||
func (t Token) TypeName() string {
|
||||
if t.kind == Name && t.attrs&uint8(TypeName) != 0 {
|
||||
return t.str
|
||||
}
|
||||
panic(fmt.Sprintf("Token is not a TypeName: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator)))
|
||||
}
|
||||
|
||||
// FieldNumber returns the value for FieldNumber type. It returns a
|
||||
// non-negative int32 value. Caller will still need to validate for the correct
|
||||
// field number range.
|
||||
func (t Token) FieldNumber() int32 {
|
||||
if t.kind != Name || t.attrs&uint8(FieldNumber) == 0 {
|
||||
panic(fmt.Sprintf("Token is not a FieldNumber: %s:%s", t.kind, NameKind(t.attrs&^hasSeparator)))
|
||||
}
|
||||
// Following should not return an error as it had already been called right
|
||||
// before this Token was constructed.
|
||||
num, _ := strconv.ParseInt(string(t.raw), 10, 32)
|
||||
return int32(num)
|
||||
}
|
||||
|
||||
// String returns the string value for a Scalar type.
|
||||
func (t Token) String() (string, bool) {
|
||||
if t.kind != Scalar || t.attrs != stringValue {
|
||||
return "", false
|
||||
}
|
||||
return t.str, true
|
||||
}
|
||||
|
||||
// Enum returns the literal value for a Scalar type for use as enum literals.
|
||||
func (t Token) Enum() (string, bool) {
|
||||
if t.kind != Scalar || t.attrs != literalValue || (len(t.raw) > 0 && t.raw[0] == '-') {
|
||||
return "", false
|
||||
}
|
||||
return string(t.raw), true
|
||||
}
|
||||
|
||||
// Bool returns the bool value for a Scalar type.
|
||||
func (t Token) Bool() (bool, bool) {
|
||||
if t.kind != Scalar {
|
||||
return false, false
|
||||
}
|
||||
switch t.attrs {
|
||||
case literalValue:
|
||||
if b, ok := boolLits[string(t.raw)]; ok {
|
||||
return b, true
|
||||
}
|
||||
case numberValue:
|
||||
// Unsigned integer representation of 0 or 1 is permitted: 00, 0x0, 01,
|
||||
// 0x1, etc.
|
||||
n, err := strconv.ParseUint(t.str, 0, 64)
|
||||
if err == nil {
|
||||
switch n {
|
||||
case 0:
|
||||
return false, true
|
||||
case 1:
|
||||
return true, true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false, false
|
||||
}
|
||||
|
||||
// These exact boolean literals are the ones supported in C++.
|
||||
var boolLits = map[string]bool{
|
||||
"t": true,
|
||||
"true": true,
|
||||
"True": true,
|
||||
"f": false,
|
||||
"false": false,
|
||||
"False": false,
|
||||
}
|
||||
|
||||
// Uint64 returns the uint64 value for a Scalar type.
|
||||
func (t Token) Uint64() (uint64, bool) {
|
||||
if t.kind != Scalar || t.attrs != numberValue ||
|
||||
t.numAttrs&isNegative > 0 || t.numAttrs&numFloat > 0 {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseUint(t.str, 0, 64)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return n, true
|
||||
}
|
||||
|
||||
// Uint32 returns the uint32 value for a Scalar type.
|
||||
func (t Token) Uint32() (uint32, bool) {
|
||||
if t.kind != Scalar || t.attrs != numberValue ||
|
||||
t.numAttrs&isNegative > 0 || t.numAttrs&numFloat > 0 {
|
||||
return 0, false
|
||||
}
|
||||
n, err := strconv.ParseUint(t.str, 0, 32)
|
||||
if err != nil {
|
||||
return 0, false
|
||||
}
|
||||
return uint32(n), true
|
||||
}
|
||||
|
||||
// Int64 returns the int64 value for a Scalar type.
|
||||
func (t Token) Int64() (int64, bool) {
|
||||
if t.kind != Scalar || t.attrs != numberValue || t.numAttrs&numFloat > 0 {
|
||||
return 0, false
|
||||
}
|
||||
if n, err := strconv.ParseInt(t.str, 0, 64); err == nil {
|
||||
return n, true
|
||||
}
|
||||
// C++ accepts large positive hex numbers as negative values.
|
||||
// This feature is here for proto1 backwards compatibility purposes.
|
||||
if flags.ProtoLegacy && (t.numAttrs == numHex) {
|
||||
if n, err := strconv.ParseUint(t.str, 0, 64); err == nil {
|
||||
return int64(n), true
|
||||
}
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// Int32 returns the int32 value for a Scalar type.
|
||||
func (t Token) Int32() (int32, bool) {
|
||||
if t.kind != Scalar || t.attrs != numberValue || t.numAttrs&numFloat > 0 {
|
||||
return 0, false
|
||||
}
|
||||
if n, err := strconv.ParseInt(t.str, 0, 32); err == nil {
|
||||
return int32(n), true
|
||||
}
|
||||
// C++ accepts large positive hex numbers as negative values.
|
||||
// This feature is here for proto1 backwards compatibility purposes.
|
||||
if flags.ProtoLegacy && (t.numAttrs == numHex) {
|
||||
if n, err := strconv.ParseUint(t.str, 0, 32); err == nil {
|
||||
return int32(n), true
|
||||
}
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// Float64 returns the float64 value for a Scalar type.
|
||||
func (t Token) Float64() (float64, bool) {
|
||||
if t.kind != Scalar {
|
||||
return 0, false
|
||||
}
|
||||
switch t.attrs {
|
||||
case literalValue:
|
||||
if f, ok := floatLits[strings.ToLower(string(t.raw))]; ok {
|
||||
return f, true
|
||||
}
|
||||
case numberValue:
|
||||
n, err := strconv.ParseFloat(t.str, 64)
|
||||
if err == nil {
|
||||
return n, true
|
||||
}
|
||||
nerr := err.(*strconv.NumError)
|
||||
if nerr.Err == strconv.ErrRange {
|
||||
return n, true
|
||||
}
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// Float32 returns the float32 value for a Scalar type.
|
||||
func (t Token) Float32() (float32, bool) {
|
||||
if t.kind != Scalar {
|
||||
return 0, false
|
||||
}
|
||||
switch t.attrs {
|
||||
case literalValue:
|
||||
if f, ok := floatLits[strings.ToLower(string(t.raw))]; ok {
|
||||
return float32(f), true
|
||||
}
|
||||
case numberValue:
|
||||
n, err := strconv.ParseFloat(t.str, 64)
|
||||
if err == nil {
|
||||
// Overflows are treated as (-)infinity.
|
||||
return float32(n), true
|
||||
}
|
||||
nerr := err.(*strconv.NumError)
|
||||
if nerr.Err == strconv.ErrRange {
|
||||
return float32(n), true
|
||||
}
|
||||
}
|
||||
return 0, false
|
||||
}
|
||||
|
||||
// These are the supported float literals which C++ permits case-insensitive
|
||||
// variants of these.
|
||||
var floatLits = map[string]float64{
|
||||
"nan": math.NaN(),
|
||||
"inf": math.Inf(1),
|
||||
"infinity": math.Inf(1),
|
||||
"-inf": math.Inf(-1),
|
||||
"-infinity": math.Inf(-1),
|
||||
}
|
||||
|
||||
// TokenEquals returns true if given Tokens are equal, else false.
|
||||
func TokenEquals(x, y Token) bool {
|
||||
return x.kind == y.kind &&
|
||||
x.attrs == y.attrs &&
|
||||
x.numAttrs == y.numAttrs &&
|
||||
x.pos == y.pos &&
|
||||
bytes.Equal(x.raw, y.raw) &&
|
||||
x.str == y.str
|
||||
}
|
29
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go
generated
vendored
Normal file
29
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package text implements the text format for protocol buffers.
|
||||
// This package has no semantic understanding for protocol buffers and is only
|
||||
// a parser and composer for the format.
|
||||
//
|
||||
// There is no formal specification for the protobuf text format, as such the
|
||||
// C++ implementation (see google::protobuf::TextFormat) is the reference
|
||||
// implementation of the text format.
|
||||
//
|
||||
// This package is neither a superset nor a subset of the C++ implementation.
|
||||
// This implementation permits a more liberal grammar in some cases to be
|
||||
// backwards compatible with the historical Go implementation.
|
||||
// Future parsings unique to Go should not be added.
|
||||
// Some grammars allowed by the C++ implementation are deliberately
|
||||
// not implemented here because they are considered a bug by the protobuf team
|
||||
// and should not be replicated.
|
||||
//
|
||||
// The Go implementation should implement a sufficient amount of the C++
|
||||
// grammar such that the default text serialization by C++ can be parsed by Go.
|
||||
// However, just because the C++ parser accepts some input does not mean that
|
||||
// the Go implementation should as well.
|
||||
//
|
||||
// The text format is almost a superset of JSON except:
|
||||
// - message keys are not quoted strings, but identifiers
|
||||
// - the top-level value must be a message without the delimiters
|
||||
package text
|
272
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go
generated
vendored
Normal file
272
e2e/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go
generated
vendored
Normal file
@ -0,0 +1,272 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package text
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/bits"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
)
|
||||
|
||||
// encType represents an encoding type.
|
||||
type encType uint8
|
||||
|
||||
const (
|
||||
_ encType = (1 << iota) / 2
|
||||
name
|
||||
scalar
|
||||
messageOpen
|
||||
messageClose
|
||||
)
|
||||
|
||||
// Encoder provides methods to write out textproto constructs and values. The user is
|
||||
// responsible for producing valid sequences of constructs and values.
|
||||
type Encoder struct {
|
||||
encoderState
|
||||
|
||||
indent string
|
||||
delims [2]byte
|
||||
outputASCII bool
|
||||
}
|
||||
|
||||
type encoderState struct {
|
||||
lastType encType
|
||||
indents []byte
|
||||
out []byte
|
||||
}
|
||||
|
||||
// NewEncoder returns an Encoder.
|
||||
//
|
||||
// If indent is a non-empty string, it causes every entry in a List or Message
|
||||
// to be preceded by the indent and trailed by a newline.
|
||||
//
|
||||
// If delims is not the zero value, it controls the delimiter characters used
|
||||
// for messages (e.g., "{}" vs "<>").
|
||||
//
|
||||
// If outputASCII is true, strings will be serialized in such a way that
|
||||
// multi-byte UTF-8 sequences are escaped. This property ensures that the
|
||||
// overall output is ASCII (as opposed to UTF-8).
|
||||
func NewEncoder(buf []byte, indent string, delims [2]byte, outputASCII bool) (*Encoder, error) {
|
||||
e := &Encoder{
|
||||
encoderState: encoderState{out: buf},
|
||||
}
|
||||
if len(indent) > 0 {
|
||||
if strings.Trim(indent, " \t") != "" {
|
||||
return nil, errors.New("indent may only be composed of space and tab characters")
|
||||
}
|
||||
e.indent = indent
|
||||
}
|
||||
switch delims {
|
||||
case [2]byte{0, 0}:
|
||||
e.delims = [2]byte{'{', '}'}
|
||||
case [2]byte{'{', '}'}, [2]byte{'<', '>'}:
|
||||
e.delims = delims
|
||||
default:
|
||||
return nil, errors.New("delimiters may only be \"{}\" or \"<>\"")
|
||||
}
|
||||
e.outputASCII = outputASCII
|
||||
|
||||
return e, nil
|
||||
}
|
||||
|
||||
// Bytes returns the content of the written bytes.
|
||||
func (e *Encoder) Bytes() []byte {
|
||||
return e.out
|
||||
}
|
||||
|
||||
// StartMessage writes out the '{' or '<' symbol.
|
||||
func (e *Encoder) StartMessage() {
|
||||
e.prepareNext(messageOpen)
|
||||
e.out = append(e.out, e.delims[0])
|
||||
}
|
||||
|
||||
// EndMessage writes out the '}' or '>' symbol.
|
||||
func (e *Encoder) EndMessage() {
|
||||
e.prepareNext(messageClose)
|
||||
e.out = append(e.out, e.delims[1])
|
||||
}
|
||||
|
||||
// WriteName writes out the field name and the separator ':'.
|
||||
func (e *Encoder) WriteName(s string) {
|
||||
e.prepareNext(name)
|
||||
e.out = append(e.out, s...)
|
||||
e.out = append(e.out, ':')
|
||||
}
|
||||
|
||||
// WriteBool writes out the given boolean value.
|
||||
func (e *Encoder) WriteBool(b bool) {
|
||||
if b {
|
||||
e.WriteLiteral("true")
|
||||
} else {
|
||||
e.WriteLiteral("false")
|
||||
}
|
||||
}
|
||||
|
||||
// WriteString writes out the given string value.
|
||||
func (e *Encoder) WriteString(s string) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = appendString(e.out, s, e.outputASCII)
|
||||
}
|
||||
|
||||
func appendString(out []byte, in string, outputASCII bool) []byte {
|
||||
out = append(out, '"')
|
||||
i := indexNeedEscapeInString(in)
|
||||
in, out = in[i:], append(out, in[:i]...)
|
||||
for len(in) > 0 {
|
||||
switch r, n := utf8.DecodeRuneInString(in); {
|
||||
case r == utf8.RuneError && n == 1:
|
||||
// We do not report invalid UTF-8 because strings in the text format
|
||||
// are used to represent both the proto string and bytes type.
|
||||
r = rune(in[0])
|
||||
fallthrough
|
||||
case r < ' ' || r == '"' || r == '\\' || r == 0x7f:
|
||||
out = append(out, '\\')
|
||||
switch r {
|
||||
case '"', '\\':
|
||||
out = append(out, byte(r))
|
||||
case '\n':
|
||||
out = append(out, 'n')
|
||||
case '\r':
|
||||
out = append(out, 'r')
|
||||
case '\t':
|
||||
out = append(out, 't')
|
||||
default:
|
||||
out = append(out, 'x')
|
||||
out = append(out, "00"[1+(bits.Len32(uint32(r))-1)/4:]...)
|
||||
out = strconv.AppendUint(out, uint64(r), 16)
|
||||
}
|
||||
in = in[n:]
|
||||
case r >= utf8.RuneSelf && (outputASCII || r <= 0x009f):
|
||||
out = append(out, '\\')
|
||||
if r <= math.MaxUint16 {
|
||||
out = append(out, 'u')
|
||||
out = append(out, "0000"[1+(bits.Len32(uint32(r))-1)/4:]...)
|
||||
out = strconv.AppendUint(out, uint64(r), 16)
|
||||
} else {
|
||||
out = append(out, 'U')
|
||||
out = append(out, "00000000"[1+(bits.Len32(uint32(r))-1)/4:]...)
|
||||
out = strconv.AppendUint(out, uint64(r), 16)
|
||||
}
|
||||
in = in[n:]
|
||||
default:
|
||||
i := indexNeedEscapeInString(in[n:])
|
||||
in, out = in[n+i:], append(out, in[:n+i]...)
|
||||
}
|
||||
}
|
||||
out = append(out, '"')
|
||||
return out
|
||||
}
|
||||
|
||||
// indexNeedEscapeInString returns the index of the character that needs
|
||||
// escaping. If no characters need escaping, this returns the input length.
|
||||
func indexNeedEscapeInString(s string) int {
|
||||
for i := 0; i < len(s); i++ {
|
||||
if c := s[i]; c < ' ' || c == '"' || c == '\'' || c == '\\' || c >= 0x7f {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return len(s)
|
||||
}
|
||||
|
||||
// WriteFloat writes out the given float value for given bitSize.
|
||||
func (e *Encoder) WriteFloat(n float64, bitSize int) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = appendFloat(e.out, n, bitSize)
|
||||
}
|
||||
|
||||
func appendFloat(out []byte, n float64, bitSize int) []byte {
|
||||
switch {
|
||||
case math.IsNaN(n):
|
||||
return append(out, "nan"...)
|
||||
case math.IsInf(n, +1):
|
||||
return append(out, "inf"...)
|
||||
case math.IsInf(n, -1):
|
||||
return append(out, "-inf"...)
|
||||
default:
|
||||
return strconv.AppendFloat(out, n, 'g', -1, bitSize)
|
||||
}
|
||||
}
|
||||
|
||||
// WriteInt writes out the given signed integer value.
|
||||
func (e *Encoder) WriteInt(n int64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = strconv.AppendInt(e.out, n, 10)
|
||||
}
|
||||
|
||||
// WriteUint writes out the given unsigned integer value.
|
||||
func (e *Encoder) WriteUint(n uint64) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = strconv.AppendUint(e.out, n, 10)
|
||||
}
|
||||
|
||||
// WriteLiteral writes out the given string as a literal value without quotes.
|
||||
// This is used for writing enum literal strings.
|
||||
func (e *Encoder) WriteLiteral(s string) {
|
||||
e.prepareNext(scalar)
|
||||
e.out = append(e.out, s...)
|
||||
}
|
||||
|
||||
// prepareNext adds possible space and indentation for the next value based
|
||||
// on last encType and indent option. It also updates e.lastType to next.
|
||||
func (e *Encoder) prepareNext(next encType) {
|
||||
defer func() {
|
||||
e.lastType = next
|
||||
}()
|
||||
|
||||
// Single line.
|
||||
if len(e.indent) == 0 {
|
||||
// Add space after each field before the next one.
|
||||
if e.lastType&(scalar|messageClose) != 0 && next == name {
|
||||
e.out = append(e.out, ' ')
|
||||
// Add a random extra space to make output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Multi-line.
|
||||
switch {
|
||||
case e.lastType == name:
|
||||
e.out = append(e.out, ' ')
|
||||
// Add a random extra space after name: to make output unstable.
|
||||
if detrand.Bool() {
|
||||
e.out = append(e.out, ' ')
|
||||
}
|
||||
|
||||
case e.lastType == messageOpen && next != messageClose:
|
||||
e.indents = append(e.indents, e.indent...)
|
||||
e.out = append(e.out, '\n')
|
||||
e.out = append(e.out, e.indents...)
|
||||
|
||||
case e.lastType&(scalar|messageClose) != 0:
|
||||
if next == messageClose {
|
||||
e.indents = e.indents[:len(e.indents)-len(e.indent)]
|
||||
}
|
||||
e.out = append(e.out, '\n')
|
||||
e.out = append(e.out, e.indents...)
|
||||
}
|
||||
}
|
||||
|
||||
// Snapshot returns the current snapshot for use in Reset.
|
||||
func (e *Encoder) Snapshot() encoderState {
|
||||
return e.encoderState
|
||||
}
|
||||
|
||||
// Reset resets the Encoder to the given encoderState from a Snapshot.
|
||||
func (e *Encoder) Reset(es encoderState) {
|
||||
e.encoderState = es
|
||||
}
|
||||
|
||||
// AppendString appends the escaped form of the input string to b.
|
||||
func AppendString(b []byte, s string) []byte {
|
||||
return appendString(b, s, false)
|
||||
}
|
104
e2e/vendor/google.golang.org/protobuf/internal/errors/errors.go
generated
vendored
Normal file
104
e2e/vendor/google.golang.org/protobuf/internal/errors/errors.go
generated
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package errors implements functions to manipulate errors.
|
||||
package errors
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
)
|
||||
|
||||
// Error is a sentinel matching all errors produced by this package.
|
||||
var Error = errors.New("protobuf error")
|
||||
|
||||
// New formats a string according to the format specifier and arguments and
|
||||
// returns an error that has a "proto" prefix.
|
||||
func New(f string, x ...any) error {
|
||||
return &prefixError{s: format(f, x...)}
|
||||
}
|
||||
|
||||
type prefixError struct{ s string }
|
||||
|
||||
var prefix = func() string {
|
||||
// Deliberately introduce instability into the error message string to
|
||||
// discourage users from performing error string comparisons.
|
||||
if detrand.Bool() {
|
||||
return "proto: " // use non-breaking spaces (U+00a0)
|
||||
} else {
|
||||
return "proto: " // use regular spaces (U+0020)
|
||||
}
|
||||
}()
|
||||
|
||||
func (e *prefixError) Error() string {
|
||||
return prefix + e.s
|
||||
}
|
||||
|
||||
func (e *prefixError) Unwrap() error {
|
||||
return Error
|
||||
}
|
||||
|
||||
// Wrap returns an error that has a "proto" prefix, the formatted string described
|
||||
// by the format specifier and arguments, and a suffix of err. The error wraps err.
|
||||
func Wrap(err error, f string, x ...any) error {
|
||||
return &wrapError{
|
||||
s: format(f, x...),
|
||||
err: err,
|
||||
}
|
||||
}
|
||||
|
||||
type wrapError struct {
|
||||
s string
|
||||
err error
|
||||
}
|
||||
|
||||
func (e *wrapError) Error() string {
|
||||
return format("%v%v: %v", prefix, e.s, e.err)
|
||||
}
|
||||
|
||||
func (e *wrapError) Unwrap() error {
|
||||
return e.err
|
||||
}
|
||||
|
||||
func (e *wrapError) Is(target error) bool {
|
||||
return target == Error
|
||||
}
|
||||
|
||||
func format(f string, x ...any) string {
|
||||
// avoid "proto: " prefix when chaining
|
||||
for i := 0; i < len(x); i++ {
|
||||
switch e := x[i].(type) {
|
||||
case *prefixError:
|
||||
x[i] = e.s
|
||||
case *wrapError:
|
||||
x[i] = format("%v: %v", e.s, e.err)
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf(f, x...)
|
||||
}
|
||||
|
||||
func InvalidUTF8(name string) error {
|
||||
return New("field %v contains invalid UTF-8", name)
|
||||
}
|
||||
|
||||
func RequiredNotSet(name string) error {
|
||||
return New("required field %v not set", name)
|
||||
}
|
||||
|
||||
type SizeMismatchError struct {
|
||||
Calculated, Measured int
|
||||
}
|
||||
|
||||
func (e *SizeMismatchError) Error() string {
|
||||
return fmt.Sprintf("size mismatch (see https://github.com/golang/protobuf/issues/1609): calculated=%d, measured=%d", e.Calculated, e.Measured)
|
||||
}
|
||||
|
||||
func MismatchedSizeCalculation(calculated, measured int) error {
|
||||
return &SizeMismatchError{
|
||||
Calculated: calculated,
|
||||
Measured: measured,
|
||||
}
|
||||
}
|
157
e2e/vendor/google.golang.org/protobuf/internal/filedesc/build.go
generated
vendored
Normal file
157
e2e/vendor/google.golang.org/protobuf/internal/filedesc/build.go
generated
vendored
Normal file
@ -0,0 +1,157 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package filedesc provides functionality for constructing descriptors.
|
||||
//
|
||||
// The types in this package implement interfaces in the protoreflect package
|
||||
// related to protobuf descripriptors.
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
)
|
||||
|
||||
// Builder construct a protoreflect.FileDescriptor from the raw descriptor.
|
||||
type Builder struct {
|
||||
// GoPackagePath is the Go package path that is invoking this builder.
|
||||
GoPackagePath string
|
||||
|
||||
// RawDescriptor is the wire-encoded bytes of FileDescriptorProto
|
||||
// and must be populated.
|
||||
RawDescriptor []byte
|
||||
|
||||
// NumEnums is the total number of enums declared in the file.
|
||||
NumEnums int32
|
||||
// NumMessages is the total number of messages declared in the file.
|
||||
// It includes the implicit message declarations for map entries.
|
||||
NumMessages int32
|
||||
// NumExtensions is the total number of extensions declared in the file.
|
||||
NumExtensions int32
|
||||
// NumServices is the total number of services declared in the file.
|
||||
NumServices int32
|
||||
|
||||
// TypeResolver resolves extension field types for descriptor options.
|
||||
// If nil, it uses protoregistry.GlobalTypes.
|
||||
TypeResolver interface {
|
||||
protoregistry.ExtensionTypeResolver
|
||||
}
|
||||
|
||||
// FileRegistry is use to lookup file, enum, and message dependencies.
|
||||
// Once constructed, the file descriptor is registered here.
|
||||
// If nil, it uses protoregistry.GlobalFiles.
|
||||
FileRegistry interface {
|
||||
FindFileByPath(string) (protoreflect.FileDescriptor, error)
|
||||
FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error)
|
||||
RegisterFile(protoreflect.FileDescriptor) error
|
||||
}
|
||||
}
|
||||
|
||||
// resolverByIndex is an interface Builder.FileRegistry may implement.
|
||||
// If so, it permits looking up an enum or message dependency based on the
|
||||
// sub-list and element index into filetype.Builder.DependencyIndexes.
|
||||
type resolverByIndex interface {
|
||||
FindEnumByIndex(int32, int32, []Enum, []Message) protoreflect.EnumDescriptor
|
||||
FindMessageByIndex(int32, int32, []Enum, []Message) protoreflect.MessageDescriptor
|
||||
}
|
||||
|
||||
// Indexes of each sub-list in filetype.Builder.DependencyIndexes.
|
||||
const (
|
||||
listFieldDeps int32 = iota
|
||||
listExtTargets
|
||||
listExtDeps
|
||||
listMethInDeps
|
||||
listMethOutDeps
|
||||
)
|
||||
|
||||
// Out is the output of the Builder.
|
||||
type Out struct {
|
||||
File protoreflect.FileDescriptor
|
||||
|
||||
// Enums is all enum descriptors in "flattened ordering".
|
||||
Enums []Enum
|
||||
// Messages is all message descriptors in "flattened ordering".
|
||||
// It includes the implicit message declarations for map entries.
|
||||
Messages []Message
|
||||
// Extensions is all extension descriptors in "flattened ordering".
|
||||
Extensions []Extension
|
||||
// Service is all service descriptors in "flattened ordering".
|
||||
Services []Service
|
||||
}
|
||||
|
||||
// Build constructs a FileDescriptor given the parameters set in Builder.
|
||||
// It assumes that the inputs are well-formed and panics if any inconsistencies
|
||||
// are encountered.
|
||||
//
|
||||
// If NumEnums+NumMessages+NumExtensions+NumServices is zero,
|
||||
// then Build automatically derives them from the raw descriptor.
|
||||
func (db Builder) Build() (out Out) {
|
||||
// Populate the counts if uninitialized.
|
||||
if db.NumEnums+db.NumMessages+db.NumExtensions+db.NumServices == 0 {
|
||||
db.unmarshalCounts(db.RawDescriptor, true)
|
||||
}
|
||||
|
||||
// Initialize resolvers and registries if unpopulated.
|
||||
if db.TypeResolver == nil {
|
||||
db.TypeResolver = protoregistry.GlobalTypes
|
||||
}
|
||||
if db.FileRegistry == nil {
|
||||
db.FileRegistry = protoregistry.GlobalFiles
|
||||
}
|
||||
|
||||
fd := newRawFile(db)
|
||||
out.File = fd
|
||||
out.Enums = fd.allEnums
|
||||
out.Messages = fd.allMessages
|
||||
out.Extensions = fd.allExtensions
|
||||
out.Services = fd.allServices
|
||||
|
||||
if err := db.FileRegistry.RegisterFile(fd); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// unmarshalCounts counts the number of enum, message, extension, and service
|
||||
// declarations in the raw message, which is either a FileDescriptorProto
|
||||
// or a MessageDescriptorProto depending on whether isFile is set.
|
||||
func (db *Builder) unmarshalCounts(b []byte, isFile bool) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
if isFile {
|
||||
switch num {
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
db.NumEnums++
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
db.unmarshalCounts(v, false)
|
||||
db.NumMessages++
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
db.NumExtensions++
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
db.NumServices++
|
||||
}
|
||||
} else {
|
||||
switch num {
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
db.NumEnums++
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
db.unmarshalCounts(v, false)
|
||||
db.NumMessages++
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
db.NumExtensions++
|
||||
}
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
748
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc.go
generated
vendored
Normal file
748
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc.go
generated
vendored
Normal file
@ -0,0 +1,748 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/internal/descfmt"
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/encoding/defval"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// Edition is an Enum for proto2.Edition
|
||||
type Edition int32
|
||||
|
||||
// These values align with the value of Enum in descriptor.proto which allows
|
||||
// direct conversion between the proto enum and this enum.
|
||||
const (
|
||||
EditionUnknown Edition = 0
|
||||
EditionProto2 Edition = 998
|
||||
EditionProto3 Edition = 999
|
||||
Edition2023 Edition = 1000
|
||||
Edition2024 Edition = 1001
|
||||
EditionUnsupported Edition = 100000
|
||||
)
|
||||
|
||||
// The types in this file may have a suffix:
|
||||
// • L0: Contains fields common to all descriptors (except File) and
|
||||
// must be initialized up front.
|
||||
// • L1: Contains fields specific to a descriptor and
|
||||
// must be initialized up front. If the associated proto uses Editions, the
|
||||
// Editions features must always be resolved. If not explicitly set, the
|
||||
// appropriate default must be resolved and set.
|
||||
// • L2: Contains fields that are lazily initialized when constructing
|
||||
// from the raw file descriptor. When constructing as a literal, the L2
|
||||
// fields must be initialized up front.
|
||||
//
|
||||
// The types are exported so that packages like reflect/protodesc can
|
||||
// directly construct descriptors.
|
||||
|
||||
type (
|
||||
File struct {
|
||||
fileRaw
|
||||
L1 FileL1
|
||||
|
||||
once uint32 // atomically set if L2 is valid
|
||||
mu sync.Mutex // protects L2
|
||||
L2 *FileL2
|
||||
}
|
||||
FileL1 struct {
|
||||
Syntax protoreflect.Syntax
|
||||
Edition Edition // Only used if Syntax == Editions
|
||||
Path string
|
||||
Package protoreflect.FullName
|
||||
|
||||
Enums Enums
|
||||
Messages Messages
|
||||
Extensions Extensions
|
||||
Services Services
|
||||
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
FileL2 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Imports FileImports
|
||||
Locations SourceLocations
|
||||
}
|
||||
|
||||
// EditionFeatures is a frequently-instantiated struct, so please take care
|
||||
// to minimize padding when adding new fields to this struct (add them in
|
||||
// the right place/order).
|
||||
EditionFeatures struct {
|
||||
// StripEnumPrefix determines if the plugin generates enum value
|
||||
// constants as-is, with their prefix stripped, or both variants.
|
||||
StripEnumPrefix int
|
||||
|
||||
// IsFieldPresence is true if field_presence is EXPLICIT
|
||||
// https://protobuf.dev/editions/features/#field_presence
|
||||
IsFieldPresence bool
|
||||
|
||||
// IsFieldPresence is true if field_presence is LEGACY_REQUIRED
|
||||
// https://protobuf.dev/editions/features/#field_presence
|
||||
IsLegacyRequired bool
|
||||
|
||||
// IsOpenEnum is true if enum_type is OPEN
|
||||
// https://protobuf.dev/editions/features/#enum_type
|
||||
IsOpenEnum bool
|
||||
|
||||
// IsPacked is true if repeated_field_encoding is PACKED
|
||||
// https://protobuf.dev/editions/features/#repeated_field_encoding
|
||||
IsPacked bool
|
||||
|
||||
// IsUTF8Validated is true if utf_validation is VERIFY
|
||||
// https://protobuf.dev/editions/features/#utf8_validation
|
||||
IsUTF8Validated bool
|
||||
|
||||
// IsDelimitedEncoded is true if message_encoding is DELIMITED
|
||||
// https://protobuf.dev/editions/features/#message_encoding
|
||||
IsDelimitedEncoded bool
|
||||
|
||||
// IsJSONCompliant is true if json_format is ALLOW
|
||||
// https://protobuf.dev/editions/features/#json_format
|
||||
IsJSONCompliant bool
|
||||
|
||||
// GenerateLegacyUnmarshalJSON determines if the plugin generates the
|
||||
// UnmarshalJSON([]byte) error method for enums.
|
||||
GenerateLegacyUnmarshalJSON bool
|
||||
// APILevel controls which API (Open, Hybrid or Opaque) should be used
|
||||
// for generated code (.pb.go files).
|
||||
APILevel int
|
||||
}
|
||||
)
|
||||
|
||||
func (fd *File) ParentFile() protoreflect.FileDescriptor { return fd }
|
||||
func (fd *File) Parent() protoreflect.Descriptor { return nil }
|
||||
func (fd *File) Index() int { return 0 }
|
||||
func (fd *File) Syntax() protoreflect.Syntax { return fd.L1.Syntax }
|
||||
|
||||
// Not exported and just used to reconstruct the original FileDescriptor proto
|
||||
func (fd *File) Edition() int32 { return int32(fd.L1.Edition) }
|
||||
func (fd *File) Name() protoreflect.Name { return fd.L1.Package.Name() }
|
||||
func (fd *File) FullName() protoreflect.FullName { return fd.L1.Package }
|
||||
func (fd *File) IsPlaceholder() bool { return false }
|
||||
func (fd *File) Options() protoreflect.ProtoMessage {
|
||||
if f := fd.lazyInit().Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.File
|
||||
}
|
||||
func (fd *File) Path() string { return fd.L1.Path }
|
||||
func (fd *File) Package() protoreflect.FullName { return fd.L1.Package }
|
||||
func (fd *File) Imports() protoreflect.FileImports { return &fd.lazyInit().Imports }
|
||||
func (fd *File) Enums() protoreflect.EnumDescriptors { return &fd.L1.Enums }
|
||||
func (fd *File) Messages() protoreflect.MessageDescriptors { return &fd.L1.Messages }
|
||||
func (fd *File) Extensions() protoreflect.ExtensionDescriptors { return &fd.L1.Extensions }
|
||||
func (fd *File) Services() protoreflect.ServiceDescriptors { return &fd.L1.Services }
|
||||
func (fd *File) SourceLocations() protoreflect.SourceLocations { return &fd.lazyInit().Locations }
|
||||
func (fd *File) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) }
|
||||
func (fd *File) ProtoType(protoreflect.FileDescriptor) {}
|
||||
func (fd *File) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
func (fd *File) lazyInit() *FileL2 {
|
||||
if atomic.LoadUint32(&fd.once) == 0 {
|
||||
fd.lazyInitOnce()
|
||||
}
|
||||
return fd.L2
|
||||
}
|
||||
|
||||
func (fd *File) lazyInitOnce() {
|
||||
fd.mu.Lock()
|
||||
if fd.L2 == nil {
|
||||
fd.lazyRawInit() // recursively initializes all L2 structures
|
||||
}
|
||||
atomic.StoreUint32(&fd.once, 1)
|
||||
fd.mu.Unlock()
|
||||
}
|
||||
|
||||
// GoPackagePath is a pseudo-internal API for determining the Go package path
|
||||
// that this file descriptor is declared in.
|
||||
//
|
||||
// WARNING: This method is exempt from the compatibility promise and may be
|
||||
// removed in the future without warning.
|
||||
func (fd *File) GoPackagePath() string {
|
||||
return fd.builder.GoPackagePath
|
||||
}
|
||||
|
||||
type (
|
||||
Enum struct {
|
||||
Base
|
||||
L1 EnumL1
|
||||
L2 *EnumL2 // protected by fileDesc.once
|
||||
}
|
||||
EnumL1 struct {
|
||||
eagerValues bool // controls whether EnumL2.Values is already populated
|
||||
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
EnumL2 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Values EnumValues
|
||||
ReservedNames Names
|
||||
ReservedRanges EnumRanges
|
||||
}
|
||||
|
||||
EnumValue struct {
|
||||
Base
|
||||
L1 EnumValueL1
|
||||
}
|
||||
EnumValueL1 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Number protoreflect.EnumNumber
|
||||
}
|
||||
)
|
||||
|
||||
func (ed *Enum) Options() protoreflect.ProtoMessage {
|
||||
if f := ed.lazyInit().Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Enum
|
||||
}
|
||||
func (ed *Enum) Values() protoreflect.EnumValueDescriptors {
|
||||
if ed.L1.eagerValues {
|
||||
return &ed.L2.Values
|
||||
}
|
||||
return &ed.lazyInit().Values
|
||||
}
|
||||
func (ed *Enum) ReservedNames() protoreflect.Names { return &ed.lazyInit().ReservedNames }
|
||||
func (ed *Enum) ReservedRanges() protoreflect.EnumRanges { return &ed.lazyInit().ReservedRanges }
|
||||
func (ed *Enum) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) }
|
||||
func (ed *Enum) ProtoType(protoreflect.EnumDescriptor) {}
|
||||
func (ed *Enum) lazyInit() *EnumL2 {
|
||||
ed.L0.ParentFile.lazyInit() // implicitly initializes L2
|
||||
return ed.L2
|
||||
}
|
||||
func (ed *Enum) IsClosed() bool {
|
||||
return !ed.L1.EditionFeatures.IsOpenEnum
|
||||
}
|
||||
|
||||
func (ed *EnumValue) Options() protoreflect.ProtoMessage {
|
||||
if f := ed.L1.Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.EnumValue
|
||||
}
|
||||
func (ed *EnumValue) Number() protoreflect.EnumNumber { return ed.L1.Number }
|
||||
func (ed *EnumValue) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, ed) }
|
||||
func (ed *EnumValue) ProtoType(protoreflect.EnumValueDescriptor) {}
|
||||
|
||||
type (
|
||||
Message struct {
|
||||
Base
|
||||
L1 MessageL1
|
||||
L2 *MessageL2 // protected by fileDesc.once
|
||||
}
|
||||
MessageL1 struct {
|
||||
Enums Enums
|
||||
Messages Messages
|
||||
Extensions Extensions
|
||||
IsMapEntry bool // promoted from google.protobuf.MessageOptions
|
||||
IsMessageSet bool // promoted from google.protobuf.MessageOptions
|
||||
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
MessageL2 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Fields Fields
|
||||
Oneofs Oneofs
|
||||
ReservedNames Names
|
||||
ReservedRanges FieldRanges
|
||||
RequiredNumbers FieldNumbers // must be consistent with Fields.Cardinality
|
||||
ExtensionRanges FieldRanges
|
||||
ExtensionRangeOptions []func() protoreflect.ProtoMessage // must be same length as ExtensionRanges
|
||||
}
|
||||
|
||||
Field struct {
|
||||
Base
|
||||
L1 FieldL1
|
||||
}
|
||||
FieldL1 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Number protoreflect.FieldNumber
|
||||
Cardinality protoreflect.Cardinality // must be consistent with Message.RequiredNumbers
|
||||
Kind protoreflect.Kind
|
||||
StringName stringName
|
||||
IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto
|
||||
IsLazy bool // promoted from google.protobuf.FieldOptions
|
||||
Default defaultValue
|
||||
ContainingOneof protoreflect.OneofDescriptor // must be consistent with Message.Oneofs.Fields
|
||||
Enum protoreflect.EnumDescriptor
|
||||
Message protoreflect.MessageDescriptor
|
||||
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
|
||||
Oneof struct {
|
||||
Base
|
||||
L1 OneofL1
|
||||
}
|
||||
OneofL1 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Fields OneofFields // must be consistent with Message.Fields.ContainingOneof
|
||||
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
)
|
||||
|
||||
func (md *Message) Options() protoreflect.ProtoMessage {
|
||||
if f := md.lazyInit().Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Message
|
||||
}
|
||||
func (md *Message) IsMapEntry() bool { return md.L1.IsMapEntry }
|
||||
func (md *Message) Fields() protoreflect.FieldDescriptors { return &md.lazyInit().Fields }
|
||||
func (md *Message) Oneofs() protoreflect.OneofDescriptors { return &md.lazyInit().Oneofs }
|
||||
func (md *Message) ReservedNames() protoreflect.Names { return &md.lazyInit().ReservedNames }
|
||||
func (md *Message) ReservedRanges() protoreflect.FieldRanges { return &md.lazyInit().ReservedRanges }
|
||||
func (md *Message) RequiredNumbers() protoreflect.FieldNumbers { return &md.lazyInit().RequiredNumbers }
|
||||
func (md *Message) ExtensionRanges() protoreflect.FieldRanges { return &md.lazyInit().ExtensionRanges }
|
||||
func (md *Message) ExtensionRangeOptions(i int) protoreflect.ProtoMessage {
|
||||
if f := md.lazyInit().ExtensionRangeOptions[i]; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.ExtensionRange
|
||||
}
|
||||
func (md *Message) Enums() protoreflect.EnumDescriptors { return &md.L1.Enums }
|
||||
func (md *Message) Messages() protoreflect.MessageDescriptors { return &md.L1.Messages }
|
||||
func (md *Message) Extensions() protoreflect.ExtensionDescriptors { return &md.L1.Extensions }
|
||||
func (md *Message) ProtoType(protoreflect.MessageDescriptor) {}
|
||||
func (md *Message) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) }
|
||||
func (md *Message) lazyInit() *MessageL2 {
|
||||
md.L0.ParentFile.lazyInit() // implicitly initializes L2
|
||||
return md.L2
|
||||
}
|
||||
|
||||
// IsMessageSet is a pseudo-internal API for checking whether a message
|
||||
// should serialize in the proto1 message format.
|
||||
//
|
||||
// WARNING: This method is exempt from the compatibility promise and may be
|
||||
// removed in the future without warning.
|
||||
func (md *Message) IsMessageSet() bool {
|
||||
return md.L1.IsMessageSet
|
||||
}
|
||||
|
||||
func (fd *Field) Options() protoreflect.ProtoMessage {
|
||||
if f := fd.L1.Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Field
|
||||
}
|
||||
func (fd *Field) Number() protoreflect.FieldNumber { return fd.L1.Number }
|
||||
func (fd *Field) Cardinality() protoreflect.Cardinality { return fd.L1.Cardinality }
|
||||
func (fd *Field) Kind() protoreflect.Kind {
|
||||
return fd.L1.Kind
|
||||
}
|
||||
func (fd *Field) HasJSONName() bool { return fd.L1.StringName.hasJSON }
|
||||
func (fd *Field) JSONName() string { return fd.L1.StringName.getJSON(fd) }
|
||||
func (fd *Field) TextName() string { return fd.L1.StringName.getText(fd) }
|
||||
func (fd *Field) HasPresence() bool {
|
||||
if fd.L1.Cardinality == protoreflect.Repeated {
|
||||
return false
|
||||
}
|
||||
return fd.IsExtension() || fd.L1.EditionFeatures.IsFieldPresence || fd.L1.Message != nil || fd.L1.ContainingOneof != nil
|
||||
}
|
||||
func (fd *Field) HasOptionalKeyword() bool {
|
||||
return (fd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && fd.L1.Cardinality == protoreflect.Optional && fd.L1.ContainingOneof == nil) || fd.L1.IsProto3Optional
|
||||
}
|
||||
func (fd *Field) IsPacked() bool {
|
||||
if fd.L1.Cardinality != protoreflect.Repeated {
|
||||
return false
|
||||
}
|
||||
switch fd.L1.Kind {
|
||||
case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
return false
|
||||
}
|
||||
return fd.L1.EditionFeatures.IsPacked
|
||||
}
|
||||
func (fd *Field) IsExtension() bool { return false }
|
||||
func (fd *Field) IsWeak() bool { return false }
|
||||
func (fd *Field) IsLazy() bool { return fd.L1.IsLazy }
|
||||
func (fd *Field) IsList() bool { return fd.Cardinality() == protoreflect.Repeated && !fd.IsMap() }
|
||||
func (fd *Field) IsMap() bool { return fd.Message() != nil && fd.Message().IsMapEntry() }
|
||||
func (fd *Field) MapKey() protoreflect.FieldDescriptor {
|
||||
if !fd.IsMap() {
|
||||
return nil
|
||||
}
|
||||
return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number)
|
||||
}
|
||||
func (fd *Field) MapValue() protoreflect.FieldDescriptor {
|
||||
if !fd.IsMap() {
|
||||
return nil
|
||||
}
|
||||
return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number)
|
||||
}
|
||||
func (fd *Field) HasDefault() bool { return fd.L1.Default.has }
|
||||
func (fd *Field) Default() protoreflect.Value { return fd.L1.Default.get(fd) }
|
||||
func (fd *Field) DefaultEnumValue() protoreflect.EnumValueDescriptor { return fd.L1.Default.enum }
|
||||
func (fd *Field) ContainingOneof() protoreflect.OneofDescriptor { return fd.L1.ContainingOneof }
|
||||
func (fd *Field) ContainingMessage() protoreflect.MessageDescriptor {
|
||||
return fd.L0.Parent.(protoreflect.MessageDescriptor)
|
||||
}
|
||||
func (fd *Field) Enum() protoreflect.EnumDescriptor {
|
||||
return fd.L1.Enum
|
||||
}
|
||||
func (fd *Field) Message() protoreflect.MessageDescriptor {
|
||||
return fd.L1.Message
|
||||
}
|
||||
func (fd *Field) IsMapEntry() bool {
|
||||
parent, ok := fd.L0.Parent.(protoreflect.MessageDescriptor)
|
||||
return ok && parent.IsMapEntry()
|
||||
}
|
||||
func (fd *Field) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, fd) }
|
||||
func (fd *Field) ProtoType(protoreflect.FieldDescriptor) {}
|
||||
|
||||
// EnforceUTF8 is a pseudo-internal API to determine whether to enforce UTF-8
|
||||
// validation for the string field. This exists for Google-internal use only
|
||||
// since proto3 did not enforce UTF-8 validity prior to the open-source release.
|
||||
// If this method does not exist, the default is to enforce valid UTF-8.
|
||||
//
|
||||
// WARNING: This method is exempt from the compatibility promise and may be
|
||||
// removed in the future without warning.
|
||||
func (fd *Field) EnforceUTF8() bool {
|
||||
return fd.L1.EditionFeatures.IsUTF8Validated
|
||||
}
|
||||
|
||||
func (od *Oneof) IsSynthetic() bool {
|
||||
return od.L0.ParentFile.L1.Syntax == protoreflect.Proto3 && len(od.L1.Fields.List) == 1 && od.L1.Fields.List[0].HasOptionalKeyword()
|
||||
}
|
||||
func (od *Oneof) Options() protoreflect.ProtoMessage {
|
||||
if f := od.L1.Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Oneof
|
||||
}
|
||||
func (od *Oneof) Fields() protoreflect.FieldDescriptors { return &od.L1.Fields }
|
||||
func (od *Oneof) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, od) }
|
||||
func (od *Oneof) ProtoType(protoreflect.OneofDescriptor) {}
|
||||
|
||||
type (
|
||||
Extension struct {
|
||||
Base
|
||||
L1 ExtensionL1
|
||||
L2 *ExtensionL2 // protected by fileDesc.once
|
||||
}
|
||||
ExtensionL1 struct {
|
||||
Number protoreflect.FieldNumber
|
||||
Extendee protoreflect.MessageDescriptor
|
||||
Cardinality protoreflect.Cardinality
|
||||
Kind protoreflect.Kind
|
||||
IsLazy bool
|
||||
EditionFeatures EditionFeatures
|
||||
}
|
||||
ExtensionL2 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
StringName stringName
|
||||
IsProto3Optional bool // promoted from google.protobuf.FieldDescriptorProto
|
||||
Default defaultValue
|
||||
Enum protoreflect.EnumDescriptor
|
||||
Message protoreflect.MessageDescriptor
|
||||
}
|
||||
)
|
||||
|
||||
func (xd *Extension) Options() protoreflect.ProtoMessage {
|
||||
if f := xd.lazyInit().Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Field
|
||||
}
|
||||
func (xd *Extension) Number() protoreflect.FieldNumber { return xd.L1.Number }
|
||||
func (xd *Extension) Cardinality() protoreflect.Cardinality { return xd.L1.Cardinality }
|
||||
func (xd *Extension) Kind() protoreflect.Kind { return xd.L1.Kind }
|
||||
func (xd *Extension) HasJSONName() bool { return xd.lazyInit().StringName.hasJSON }
|
||||
func (xd *Extension) JSONName() string { return xd.lazyInit().StringName.getJSON(xd) }
|
||||
func (xd *Extension) TextName() string { return xd.lazyInit().StringName.getText(xd) }
|
||||
func (xd *Extension) HasPresence() bool { return xd.L1.Cardinality != protoreflect.Repeated }
|
||||
func (xd *Extension) HasOptionalKeyword() bool {
|
||||
return (xd.L0.ParentFile.L1.Syntax == protoreflect.Proto2 && xd.L1.Cardinality == protoreflect.Optional) || xd.lazyInit().IsProto3Optional
|
||||
}
|
||||
func (xd *Extension) IsPacked() bool {
|
||||
if xd.L1.Cardinality != protoreflect.Repeated {
|
||||
return false
|
||||
}
|
||||
switch xd.L1.Kind {
|
||||
case protoreflect.StringKind, protoreflect.BytesKind, protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
return false
|
||||
}
|
||||
return xd.L1.EditionFeatures.IsPacked
|
||||
}
|
||||
func (xd *Extension) IsExtension() bool { return true }
|
||||
func (xd *Extension) IsWeak() bool { return false }
|
||||
func (xd *Extension) IsLazy() bool { return xd.L1.IsLazy }
|
||||
func (xd *Extension) IsList() bool { return xd.Cardinality() == protoreflect.Repeated }
|
||||
func (xd *Extension) IsMap() bool { return false }
|
||||
func (xd *Extension) MapKey() protoreflect.FieldDescriptor { return nil }
|
||||
func (xd *Extension) MapValue() protoreflect.FieldDescriptor { return nil }
|
||||
func (xd *Extension) HasDefault() bool { return xd.lazyInit().Default.has }
|
||||
func (xd *Extension) Default() protoreflect.Value { return xd.lazyInit().Default.get(xd) }
|
||||
func (xd *Extension) DefaultEnumValue() protoreflect.EnumValueDescriptor {
|
||||
return xd.lazyInit().Default.enum
|
||||
}
|
||||
func (xd *Extension) ContainingOneof() protoreflect.OneofDescriptor { return nil }
|
||||
func (xd *Extension) ContainingMessage() protoreflect.MessageDescriptor { return xd.L1.Extendee }
|
||||
func (xd *Extension) Enum() protoreflect.EnumDescriptor { return xd.lazyInit().Enum }
|
||||
func (xd *Extension) Message() protoreflect.MessageDescriptor { return xd.lazyInit().Message }
|
||||
func (xd *Extension) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, xd) }
|
||||
func (xd *Extension) ProtoType(protoreflect.FieldDescriptor) {}
|
||||
func (xd *Extension) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (xd *Extension) lazyInit() *ExtensionL2 {
|
||||
xd.L0.ParentFile.lazyInit() // implicitly initializes L2
|
||||
return xd.L2
|
||||
}
|
||||
|
||||
type (
|
||||
Service struct {
|
||||
Base
|
||||
L1 ServiceL1
|
||||
L2 *ServiceL2 // protected by fileDesc.once
|
||||
}
|
||||
ServiceL1 struct{}
|
||||
ServiceL2 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Methods Methods
|
||||
}
|
||||
|
||||
Method struct {
|
||||
Base
|
||||
L1 MethodL1
|
||||
}
|
||||
MethodL1 struct {
|
||||
Options func() protoreflect.ProtoMessage
|
||||
Input protoreflect.MessageDescriptor
|
||||
Output protoreflect.MessageDescriptor
|
||||
IsStreamingClient bool
|
||||
IsStreamingServer bool
|
||||
}
|
||||
)
|
||||
|
||||
func (sd *Service) Options() protoreflect.ProtoMessage {
|
||||
if f := sd.lazyInit().Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Service
|
||||
}
|
||||
func (sd *Service) Methods() protoreflect.MethodDescriptors { return &sd.lazyInit().Methods }
|
||||
func (sd *Service) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, sd) }
|
||||
func (sd *Service) ProtoType(protoreflect.ServiceDescriptor) {}
|
||||
func (sd *Service) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (sd *Service) lazyInit() *ServiceL2 {
|
||||
sd.L0.ParentFile.lazyInit() // implicitly initializes L2
|
||||
return sd.L2
|
||||
}
|
||||
|
||||
func (md *Method) Options() protoreflect.ProtoMessage {
|
||||
if f := md.L1.Options; f != nil {
|
||||
return f()
|
||||
}
|
||||
return descopts.Method
|
||||
}
|
||||
func (md *Method) Input() protoreflect.MessageDescriptor { return md.L1.Input }
|
||||
func (md *Method) Output() protoreflect.MessageDescriptor { return md.L1.Output }
|
||||
func (md *Method) IsStreamingClient() bool { return md.L1.IsStreamingClient }
|
||||
func (md *Method) IsStreamingServer() bool { return md.L1.IsStreamingServer }
|
||||
func (md *Method) Format(s fmt.State, r rune) { descfmt.FormatDesc(s, r, md) }
|
||||
func (md *Method) ProtoType(protoreflect.MethodDescriptor) {}
|
||||
func (md *Method) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
// Surrogate files are can be used to create standalone descriptors
|
||||
// where the syntax is only information derived from the parent file.
|
||||
var (
|
||||
SurrogateProto2 = &File{L1: FileL1{Syntax: protoreflect.Proto2}, L2: &FileL2{}}
|
||||
SurrogateProto3 = &File{L1: FileL1{Syntax: protoreflect.Proto3}, L2: &FileL2{}}
|
||||
SurrogateEdition2023 = &File{L1: FileL1{Syntax: protoreflect.Editions, Edition: Edition2023}, L2: &FileL2{}}
|
||||
)
|
||||
|
||||
type (
|
||||
Base struct {
|
||||
L0 BaseL0
|
||||
}
|
||||
BaseL0 struct {
|
||||
FullName protoreflect.FullName // must be populated
|
||||
ParentFile *File // must be populated
|
||||
Parent protoreflect.Descriptor
|
||||
Index int
|
||||
}
|
||||
)
|
||||
|
||||
func (d *Base) Name() protoreflect.Name { return d.L0.FullName.Name() }
|
||||
func (d *Base) FullName() protoreflect.FullName { return d.L0.FullName }
|
||||
func (d *Base) ParentFile() protoreflect.FileDescriptor {
|
||||
if d.L0.ParentFile == SurrogateProto2 || d.L0.ParentFile == SurrogateProto3 {
|
||||
return nil // surrogate files are not real parents
|
||||
}
|
||||
return d.L0.ParentFile
|
||||
}
|
||||
func (d *Base) Parent() protoreflect.Descriptor { return d.L0.Parent }
|
||||
func (d *Base) Index() int { return d.L0.Index }
|
||||
func (d *Base) Syntax() protoreflect.Syntax { return d.L0.ParentFile.Syntax() }
|
||||
func (d *Base) IsPlaceholder() bool { return false }
|
||||
func (d *Base) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
type stringName struct {
|
||||
hasJSON bool
|
||||
once sync.Once
|
||||
nameJSON string
|
||||
nameText string
|
||||
}
|
||||
|
||||
// InitJSON initializes the name. It is exported for use by other internal packages.
|
||||
func (s *stringName) InitJSON(name string) {
|
||||
s.hasJSON = true
|
||||
s.nameJSON = name
|
||||
}
|
||||
|
||||
// Returns true if this field is structured like the synthetic field of a proto2
|
||||
// group. This allows us to expand our treatment of delimited fields without
|
||||
// breaking proto2 files that have been upgraded to editions.
|
||||
func isGroupLike(fd protoreflect.FieldDescriptor) bool {
|
||||
// Groups are always group types.
|
||||
if fd.Kind() != protoreflect.GroupKind {
|
||||
return false
|
||||
}
|
||||
|
||||
// Group fields are always the lowercase type name.
|
||||
if strings.ToLower(string(fd.Message().Name())) != string(fd.Name()) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Groups could only be defined in the same file they're used.
|
||||
if fd.Message().ParentFile() != fd.ParentFile() {
|
||||
return false
|
||||
}
|
||||
|
||||
// Group messages are always defined in the same scope as the field. File
|
||||
// level extensions will compare NULL == NULL here, which is why the file
|
||||
// comparison above is necessary to ensure both come from the same file.
|
||||
if fd.IsExtension() {
|
||||
return fd.Parent() == fd.Message().Parent()
|
||||
}
|
||||
return fd.ContainingMessage() == fd.Message().Parent()
|
||||
}
|
||||
|
||||
func (s *stringName) lazyInit(fd protoreflect.FieldDescriptor) *stringName {
|
||||
s.once.Do(func() {
|
||||
if fd.IsExtension() {
|
||||
// For extensions, JSON and text are formatted the same way.
|
||||
var name string
|
||||
if messageset.IsMessageSetExtension(fd) {
|
||||
name = string("[" + fd.FullName().Parent() + "]")
|
||||
} else {
|
||||
name = string("[" + fd.FullName() + "]")
|
||||
}
|
||||
s.nameJSON = name
|
||||
s.nameText = name
|
||||
} else {
|
||||
// Format the JSON name.
|
||||
if !s.hasJSON {
|
||||
s.nameJSON = strs.JSONCamelCase(string(fd.Name()))
|
||||
}
|
||||
|
||||
// Format the text name.
|
||||
s.nameText = string(fd.Name())
|
||||
if isGroupLike(fd) {
|
||||
s.nameText = string(fd.Message().Name())
|
||||
}
|
||||
}
|
||||
})
|
||||
return s
|
||||
}
|
||||
|
||||
func (s *stringName) getJSON(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameJSON }
|
||||
func (s *stringName) getText(fd protoreflect.FieldDescriptor) string { return s.lazyInit(fd).nameText }
|
||||
|
||||
func DefaultValue(v protoreflect.Value, ev protoreflect.EnumValueDescriptor) defaultValue {
|
||||
dv := defaultValue{has: v.IsValid(), val: v, enum: ev}
|
||||
if b, ok := v.Interface().([]byte); ok {
|
||||
// Store a copy of the default bytes, so that we can detect
|
||||
// accidental mutations of the original value.
|
||||
dv.bytes = append([]byte(nil), b...)
|
||||
}
|
||||
return dv
|
||||
}
|
||||
|
||||
func unmarshalDefault(b []byte, k protoreflect.Kind, pf *File, ed protoreflect.EnumDescriptor) defaultValue {
|
||||
var evs protoreflect.EnumValueDescriptors
|
||||
if k == protoreflect.EnumKind {
|
||||
// If the enum is declared within the same file, be careful not to
|
||||
// blindly call the Values method, lest we bind ourselves in a deadlock.
|
||||
if e, ok := ed.(*Enum); ok && e.L0.ParentFile == pf {
|
||||
evs = &e.L2.Values
|
||||
} else {
|
||||
evs = ed.Values()
|
||||
}
|
||||
|
||||
// If we are unable to resolve the enum dependency, use a placeholder
|
||||
// enum value since we will not be able to parse the default value.
|
||||
if ed.IsPlaceholder() && protoreflect.Name(b).IsValid() {
|
||||
v := protoreflect.ValueOfEnum(0)
|
||||
ev := PlaceholderEnumValue(ed.FullName().Parent().Append(protoreflect.Name(b)))
|
||||
return DefaultValue(v, ev)
|
||||
}
|
||||
}
|
||||
|
||||
v, ev, err := defval.Unmarshal(string(b), k, evs, defval.Descriptor)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return DefaultValue(v, ev)
|
||||
}
|
||||
|
||||
type defaultValue struct {
|
||||
has bool
|
||||
val protoreflect.Value
|
||||
enum protoreflect.EnumValueDescriptor
|
||||
bytes []byte
|
||||
}
|
||||
|
||||
func (dv *defaultValue) get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
// Return the zero value as the default if unpopulated.
|
||||
if !dv.has {
|
||||
if fd.Cardinality() == protoreflect.Repeated {
|
||||
return protoreflect.Value{}
|
||||
}
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
return protoreflect.ValueOfBool(false)
|
||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
||||
return protoreflect.ValueOfInt32(0)
|
||||
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
||||
return protoreflect.ValueOfInt64(0)
|
||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
|
||||
return protoreflect.ValueOfUint32(0)
|
||||
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
||||
return protoreflect.ValueOfUint64(0)
|
||||
case protoreflect.FloatKind:
|
||||
return protoreflect.ValueOfFloat32(0)
|
||||
case protoreflect.DoubleKind:
|
||||
return protoreflect.ValueOfFloat64(0)
|
||||
case protoreflect.StringKind:
|
||||
return protoreflect.ValueOfString("")
|
||||
case protoreflect.BytesKind:
|
||||
return protoreflect.ValueOfBytes(nil)
|
||||
case protoreflect.EnumKind:
|
||||
if evs := fd.Enum().Values(); evs.Len() > 0 {
|
||||
return protoreflect.ValueOfEnum(evs.Get(0).Number())
|
||||
}
|
||||
return protoreflect.ValueOfEnum(0)
|
||||
}
|
||||
}
|
||||
|
||||
if len(dv.bytes) > 0 && !bytes.Equal(dv.bytes, dv.val.Bytes()) {
|
||||
// TODO: Avoid panic if we're running with the race detector
|
||||
// and instead spawn a goroutine that periodically resets
|
||||
// this value back to the original to induce a race.
|
||||
panic(fmt.Sprintf("detected mutation on the default bytes for %v", fd.FullName()))
|
||||
}
|
||||
return dv.val
|
||||
}
|
560
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
generated
vendored
Normal file
560
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go
generated
vendored
Normal file
@ -0,0 +1,560 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// fileRaw is a data struct used when initializing a file descriptor from
|
||||
// a raw FileDescriptorProto.
|
||||
type fileRaw struct {
|
||||
builder Builder
|
||||
allEnums []Enum
|
||||
allMessages []Message
|
||||
allExtensions []Extension
|
||||
allServices []Service
|
||||
}
|
||||
|
||||
func newRawFile(db Builder) *File {
|
||||
fd := &File{fileRaw: fileRaw{builder: db}}
|
||||
fd.initDecls(db.NumEnums, db.NumMessages, db.NumExtensions, db.NumServices)
|
||||
fd.unmarshalSeed(db.RawDescriptor)
|
||||
|
||||
// Extended message targets are eagerly resolved since registration
|
||||
// needs this information at program init time.
|
||||
for i := range fd.allExtensions {
|
||||
xd := &fd.allExtensions[i]
|
||||
xd.L1.Extendee = fd.resolveMessageDependency(xd.L1.Extendee, listExtTargets, int32(i))
|
||||
}
|
||||
|
||||
fd.checkDecls()
|
||||
return fd
|
||||
}
|
||||
|
||||
// initDecls pre-allocates slices for the exact number of enums, messages
|
||||
// (including map entries), extensions, and services declared in the proto file.
|
||||
// This is done to avoid regrowing the slice, which would change the address
|
||||
// for any previously seen declaration.
|
||||
//
|
||||
// The alloc methods "allocates" slices by pulling from the capacity.
|
||||
func (fd *File) initDecls(numEnums, numMessages, numExtensions, numServices int32) {
|
||||
fd.allEnums = make([]Enum, 0, numEnums)
|
||||
fd.allMessages = make([]Message, 0, numMessages)
|
||||
fd.allExtensions = make([]Extension, 0, numExtensions)
|
||||
fd.allServices = make([]Service, 0, numServices)
|
||||
}
|
||||
|
||||
func (fd *File) allocEnums(n int) []Enum {
|
||||
total := len(fd.allEnums)
|
||||
es := fd.allEnums[total : total+n]
|
||||
fd.allEnums = fd.allEnums[:total+n]
|
||||
return es
|
||||
}
|
||||
func (fd *File) allocMessages(n int) []Message {
|
||||
total := len(fd.allMessages)
|
||||
ms := fd.allMessages[total : total+n]
|
||||
fd.allMessages = fd.allMessages[:total+n]
|
||||
return ms
|
||||
}
|
||||
func (fd *File) allocExtensions(n int) []Extension {
|
||||
total := len(fd.allExtensions)
|
||||
xs := fd.allExtensions[total : total+n]
|
||||
fd.allExtensions = fd.allExtensions[:total+n]
|
||||
return xs
|
||||
}
|
||||
func (fd *File) allocServices(n int) []Service {
|
||||
total := len(fd.allServices)
|
||||
xs := fd.allServices[total : total+n]
|
||||
fd.allServices = fd.allServices[:total+n]
|
||||
return xs
|
||||
}
|
||||
|
||||
// checkDecls performs a sanity check that the expected number of expected
|
||||
// declarations matches the number that were found in the descriptor proto.
|
||||
func (fd *File) checkDecls() {
|
||||
switch {
|
||||
case len(fd.allEnums) != cap(fd.allEnums):
|
||||
case len(fd.allMessages) != cap(fd.allMessages):
|
||||
case len(fd.allExtensions) != cap(fd.allExtensions):
|
||||
case len(fd.allServices) != cap(fd.allServices):
|
||||
default:
|
||||
return
|
||||
}
|
||||
panic("mismatching cardinality")
|
||||
}
|
||||
|
||||
func (fd *File) unmarshalSeed(b []byte) {
|
||||
sb := getBuilder()
|
||||
defer putBuilder(sb)
|
||||
|
||||
var prevField protoreflect.FieldNumber
|
||||
var numEnums, numMessages, numExtensions, numServices int
|
||||
var posEnums, posMessages, posExtensions, posServices int
|
||||
var options []byte
|
||||
b0 := b
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FileDescriptorProto_Syntax_field_number:
|
||||
switch string(v) {
|
||||
case "proto2":
|
||||
fd.L1.Syntax = protoreflect.Proto2
|
||||
fd.L1.Edition = EditionProto2
|
||||
case "proto3":
|
||||
fd.L1.Syntax = protoreflect.Proto3
|
||||
fd.L1.Edition = EditionProto3
|
||||
case "editions":
|
||||
fd.L1.Syntax = protoreflect.Editions
|
||||
default:
|
||||
panic("invalid syntax")
|
||||
}
|
||||
case genid.FileDescriptorProto_Name_field_number:
|
||||
fd.L1.Path = sb.MakeString(v)
|
||||
case genid.FileDescriptorProto_Package_field_number:
|
||||
fd.L1.Package = protoreflect.FullName(sb.MakeString(v))
|
||||
case genid.FileDescriptorProto_Options_field_number:
|
||||
options = v
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
if prevField != genid.FileDescriptorProto_EnumType_field_number {
|
||||
if numEnums > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posEnums = len(b0) - len(b) - n - m
|
||||
}
|
||||
numEnums++
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
if prevField != genid.FileDescriptorProto_MessageType_field_number {
|
||||
if numMessages > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posMessages = len(b0) - len(b) - n - m
|
||||
}
|
||||
numMessages++
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
if prevField != genid.FileDescriptorProto_Extension_field_number {
|
||||
if numExtensions > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posExtensions = len(b0) - len(b) - n - m
|
||||
}
|
||||
numExtensions++
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
if prevField != genid.FileDescriptorProto_Service_field_number {
|
||||
if numServices > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posServices = len(b0) - len(b) - n - m
|
||||
}
|
||||
numServices++
|
||||
}
|
||||
prevField = num
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FileDescriptorProto_Edition_field_number:
|
||||
fd.L1.Edition = Edition(v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
prevField = -1 // ignore known field numbers of unknown wire type
|
||||
}
|
||||
}
|
||||
|
||||
// If syntax is missing, it is assumed to be proto2.
|
||||
if fd.L1.Syntax == 0 {
|
||||
fd.L1.Syntax = protoreflect.Proto2
|
||||
fd.L1.Edition = EditionProto2
|
||||
}
|
||||
|
||||
fd.L1.EditionFeatures = getFeaturesFor(fd.L1.Edition)
|
||||
|
||||
// Parse editions features from options if any
|
||||
if options != nil {
|
||||
fd.unmarshalSeedOptions(options)
|
||||
}
|
||||
|
||||
// Must allocate all declarations before parsing each descriptor type
|
||||
// to ensure we handled all descriptors in "flattened ordering".
|
||||
if numEnums > 0 {
|
||||
fd.L1.Enums.List = fd.allocEnums(numEnums)
|
||||
}
|
||||
if numMessages > 0 {
|
||||
fd.L1.Messages.List = fd.allocMessages(numMessages)
|
||||
}
|
||||
if numExtensions > 0 {
|
||||
fd.L1.Extensions.List = fd.allocExtensions(numExtensions)
|
||||
}
|
||||
if numServices > 0 {
|
||||
fd.L1.Services.List = fd.allocServices(numServices)
|
||||
}
|
||||
|
||||
if numEnums > 0 {
|
||||
b := b0[posEnums:]
|
||||
for i := range fd.L1.Enums.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
fd.L1.Enums.List[i].unmarshalSeed(v, sb, fd, fd, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
if numMessages > 0 {
|
||||
b := b0[posMessages:]
|
||||
for i := range fd.L1.Messages.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
fd.L1.Messages.List[i].unmarshalSeed(v, sb, fd, fd, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
if numExtensions > 0 {
|
||||
b := b0[posExtensions:]
|
||||
for i := range fd.L1.Extensions.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
fd.L1.Extensions.List[i].unmarshalSeed(v, sb, fd, fd, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
if numServices > 0 {
|
||||
b := b0[posServices:]
|
||||
for i := range fd.L1.Services.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
fd.L1.Services.List[i].unmarshalSeed(v, sb, fd, fd, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (fd *File) unmarshalSeedOptions(b []byte) {
|
||||
for b := b; len(b) > 0; {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FileOptions_Features_field_number:
|
||||
if fd.Syntax() != protoreflect.Editions {
|
||||
panic(fmt.Sprintf("invalid descriptor: using edition features in a proto with syntax %s", fd.Syntax()))
|
||||
}
|
||||
fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
ed.L0.ParentFile = pf
|
||||
ed.L0.Parent = pd
|
||||
ed.L0.Index = i
|
||||
ed.L1.EditionFeatures = featuresFromParentDesc(ed.Parent())
|
||||
|
||||
var numValues int
|
||||
for b := b; len(b) > 0; {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumDescriptorProto_Name_field_number:
|
||||
ed.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
numValues++
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
|
||||
// Only construct enum value descriptors for top-level enums since
|
||||
// they are needed for registration.
|
||||
if pd != pf {
|
||||
return
|
||||
}
|
||||
ed.L1.eagerValues = true
|
||||
ed.L2 = new(EnumL2)
|
||||
ed.L2.Values.List = make([]EnumValue, numValues)
|
||||
for i := 0; len(b) > 0; {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
ed.L2.Values.List[i].unmarshalFull(v, sb, pf, ed, i)
|
||||
i++
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
md.L0.ParentFile = pf
|
||||
md.L0.Parent = pd
|
||||
md.L0.Index = i
|
||||
md.L1.EditionFeatures = featuresFromParentDesc(md.Parent())
|
||||
|
||||
var prevField protoreflect.FieldNumber
|
||||
var numEnums, numMessages, numExtensions int
|
||||
var posEnums, posMessages, posExtensions int
|
||||
b0 := b
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.DescriptorProto_Name_field_number:
|
||||
md.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
if prevField != genid.DescriptorProto_EnumType_field_number {
|
||||
if numEnums > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posEnums = len(b0) - len(b) - n - m
|
||||
}
|
||||
numEnums++
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
if prevField != genid.DescriptorProto_NestedType_field_number {
|
||||
if numMessages > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posMessages = len(b0) - len(b) - n - m
|
||||
}
|
||||
numMessages++
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
if prevField != genid.DescriptorProto_Extension_field_number {
|
||||
if numExtensions > 0 {
|
||||
panic("non-contiguous repeated field")
|
||||
}
|
||||
posExtensions = len(b0) - len(b) - n - m
|
||||
}
|
||||
numExtensions++
|
||||
case genid.DescriptorProto_Options_field_number:
|
||||
md.unmarshalSeedOptions(v)
|
||||
}
|
||||
prevField = num
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
prevField = -1 // ignore known field numbers of unknown wire type
|
||||
}
|
||||
}
|
||||
|
||||
// Must allocate all declarations before parsing each descriptor type
|
||||
// to ensure we handled all descriptors in "flattened ordering".
|
||||
if numEnums > 0 {
|
||||
md.L1.Enums.List = pf.allocEnums(numEnums)
|
||||
}
|
||||
if numMessages > 0 {
|
||||
md.L1.Messages.List = pf.allocMessages(numMessages)
|
||||
}
|
||||
if numExtensions > 0 {
|
||||
md.L1.Extensions.List = pf.allocExtensions(numExtensions)
|
||||
}
|
||||
|
||||
if numEnums > 0 {
|
||||
b := b0[posEnums:]
|
||||
for i := range md.L1.Enums.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
md.L1.Enums.List[i].unmarshalSeed(v, sb, pf, md, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
if numMessages > 0 {
|
||||
b := b0[posMessages:]
|
||||
for i := range md.L1.Messages.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
md.L1.Messages.List[i].unmarshalSeed(v, sb, pf, md, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
if numExtensions > 0 {
|
||||
b := b0[posExtensions:]
|
||||
for i := range md.L1.Extensions.List {
|
||||
_, n := protowire.ConsumeVarint(b)
|
||||
v, m := protowire.ConsumeBytes(b[n:])
|
||||
md.L1.Extensions.List[i].unmarshalSeed(v, sb, pf, md, i)
|
||||
b = b[n+m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (md *Message) unmarshalSeedOptions(b []byte) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.MessageOptions_MapEntry_field_number:
|
||||
md.L1.IsMapEntry = protowire.DecodeBool(v)
|
||||
case genid.MessageOptions_MessageSetWireFormat_field_number:
|
||||
md.L1.IsMessageSet = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.MessageOptions_Features_field_number:
|
||||
md.L1.EditionFeatures = unmarshalFeatureSet(v, md.L1.EditionFeatures)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
xd.L0.ParentFile = pf
|
||||
xd.L0.Parent = pd
|
||||
xd.L0.Index = i
|
||||
xd.L1.EditionFeatures = featuresFromParentDesc(pd)
|
||||
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_Number_field_number:
|
||||
xd.L1.Number = protoreflect.FieldNumber(v)
|
||||
case genid.FieldDescriptorProto_Label_field_number:
|
||||
xd.L1.Cardinality = protoreflect.Cardinality(v)
|
||||
case genid.FieldDescriptorProto_Type_field_number:
|
||||
xd.L1.Kind = protoreflect.Kind(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_Name_field_number:
|
||||
xd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.FieldDescriptorProto_Extendee_field_number:
|
||||
xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v))
|
||||
case genid.FieldDescriptorProto_Options_field_number:
|
||||
xd.unmarshalOptions(v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
|
||||
if xd.L1.Kind == protoreflect.MessageKind && xd.L1.EditionFeatures.IsDelimitedEncoded {
|
||||
xd.L1.Kind = protoreflect.GroupKind
|
||||
}
|
||||
}
|
||||
|
||||
func (xd *Extension) unmarshalOptions(b []byte) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldOptions_Packed_field_number:
|
||||
xd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v)
|
||||
case genid.FieldOptions_Lazy_field_number:
|
||||
xd.L1.IsLazy = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldOptions_Features_field_number:
|
||||
xd.L1.EditionFeatures = unmarshalFeatureSet(v, xd.L1.EditionFeatures)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
sd.L0.ParentFile = pf
|
||||
sd.L0.Parent = pd
|
||||
sd.L0.Index = i
|
||||
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.ServiceDescriptorProto_Name_field_number:
|
||||
sd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var nameBuilderPool = sync.Pool{
|
||||
New: func() any { return new(strs.Builder) },
|
||||
}
|
||||
|
||||
func getBuilder() *strs.Builder {
|
||||
return nameBuilderPool.Get().(*strs.Builder)
|
||||
}
|
||||
func putBuilder(b *strs.Builder) {
|
||||
nameBuilderPool.Put(b)
|
||||
}
|
||||
|
||||
// makeFullName converts b to a protoreflect.FullName,
|
||||
// where b must start with a leading dot.
|
||||
func makeFullName(sb *strs.Builder, b []byte) protoreflect.FullName {
|
||||
if len(b) == 0 || b[0] != '.' {
|
||||
panic("name reference must be fully qualified")
|
||||
}
|
||||
return protoreflect.FullName(sb.MakeString(b[1:]))
|
||||
}
|
||||
|
||||
func appendFullName(sb *strs.Builder, prefix protoreflect.FullName, suffix []byte) protoreflect.FullName {
|
||||
return sb.AppendFullName(prefix, protoreflect.Name(strs.UnsafeString(suffix)))
|
||||
}
|
694
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
generated
vendored
Normal file
694
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go
generated
vendored
Normal file
@ -0,0 +1,694 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func (fd *File) lazyRawInit() {
|
||||
fd.unmarshalFull(fd.builder.RawDescriptor)
|
||||
fd.resolveMessages()
|
||||
fd.resolveExtensions()
|
||||
fd.resolveServices()
|
||||
}
|
||||
|
||||
func (file *File) resolveMessages() {
|
||||
var depIdx int32
|
||||
for i := range file.allMessages {
|
||||
md := &file.allMessages[i]
|
||||
|
||||
// Resolve message field dependencies.
|
||||
for j := range md.L2.Fields.List {
|
||||
fd := &md.L2.Fields.List[j]
|
||||
|
||||
// Resolve message field dependency.
|
||||
switch fd.L1.Kind {
|
||||
case protoreflect.EnumKind:
|
||||
fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx)
|
||||
depIdx++
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx)
|
||||
depIdx++
|
||||
if fd.L1.Kind == protoreflect.GroupKind && (fd.IsMap() || fd.IsMapEntry()) {
|
||||
// A map field might inherit delimited encoding from a file-wide default feature.
|
||||
// But maps never actually use delimited encoding. (At least for now...)
|
||||
fd.L1.Kind = protoreflect.MessageKind
|
||||
}
|
||||
}
|
||||
|
||||
// Default is resolved here since it depends on Enum being resolved.
|
||||
if v := fd.L1.Default.val; v.IsValid() {
|
||||
fd.L1.Default = unmarshalDefault(v.Bytes(), fd.L1.Kind, file, fd.L1.Enum)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (file *File) resolveExtensions() {
|
||||
var depIdx int32
|
||||
for i := range file.allExtensions {
|
||||
xd := &file.allExtensions[i]
|
||||
|
||||
// Resolve extension field dependency.
|
||||
switch xd.L1.Kind {
|
||||
case protoreflect.EnumKind:
|
||||
xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx)
|
||||
depIdx++
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx)
|
||||
depIdx++
|
||||
}
|
||||
|
||||
// Default is resolved here since it depends on Enum being resolved.
|
||||
if v := xd.L2.Default.val; v.IsValid() {
|
||||
xd.L2.Default = unmarshalDefault(v.Bytes(), xd.L1.Kind, file, xd.L2.Enum)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (file *File) resolveServices() {
|
||||
var depIdx int32
|
||||
for i := range file.allServices {
|
||||
sd := &file.allServices[i]
|
||||
|
||||
// Resolve method dependencies.
|
||||
for j := range sd.L2.Methods.List {
|
||||
md := &sd.L2.Methods.List[j]
|
||||
md.L1.Input = file.resolveMessageDependency(md.L1.Input, listMethInDeps, depIdx)
|
||||
md.L1.Output = file.resolveMessageDependency(md.L1.Output, listMethOutDeps, depIdx)
|
||||
depIdx++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor {
|
||||
r := file.builder.FileRegistry
|
||||
if r, ok := r.(resolverByIndex); ok {
|
||||
if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil {
|
||||
return ed2
|
||||
}
|
||||
}
|
||||
for i := range file.allEnums {
|
||||
if ed2 := &file.allEnums[i]; ed2.L0.FullName == ed.FullName() {
|
||||
return ed2
|
||||
}
|
||||
}
|
||||
if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil {
|
||||
return d.(protoreflect.EnumDescriptor)
|
||||
}
|
||||
return ed
|
||||
}
|
||||
|
||||
func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor {
|
||||
r := file.builder.FileRegistry
|
||||
if r, ok := r.(resolverByIndex); ok {
|
||||
if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil {
|
||||
return md2
|
||||
}
|
||||
}
|
||||
for i := range file.allMessages {
|
||||
if md2 := &file.allMessages[i]; md2.L0.FullName == md.FullName() {
|
||||
return md2
|
||||
}
|
||||
}
|
||||
if d, _ := r.FindDescriptorByName(md.FullName()); d != nil {
|
||||
return d.(protoreflect.MessageDescriptor)
|
||||
}
|
||||
return md
|
||||
}
|
||||
|
||||
func (fd *File) unmarshalFull(b []byte) {
|
||||
sb := getBuilder()
|
||||
defer putBuilder(sb)
|
||||
|
||||
var enumIdx, messageIdx, extensionIdx, serviceIdx int
|
||||
var rawOptions []byte
|
||||
fd.L2 = new(FileL2)
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FileDescriptorProto_PublicDependency_field_number:
|
||||
fd.L2.Imports[v].IsPublic = true
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FileDescriptorProto_Dependency_field_number:
|
||||
path := sb.MakeString(v)
|
||||
imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
|
||||
if imp == nil {
|
||||
imp = PlaceholderFile(path)
|
||||
}
|
||||
fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp})
|
||||
case genid.FileDescriptorProto_EnumType_field_number:
|
||||
fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
|
||||
enumIdx++
|
||||
case genid.FileDescriptorProto_MessageType_field_number:
|
||||
fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
|
||||
messageIdx++
|
||||
case genid.FileDescriptorProto_Extension_field_number:
|
||||
fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
||||
extensionIdx++
|
||||
case genid.FileDescriptorProto_Service_field_number:
|
||||
fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb)
|
||||
serviceIdx++
|
||||
case genid.FileDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions)
|
||||
}
|
||||
|
||||
func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
var rawValues [][]byte
|
||||
var rawOptions []byte
|
||||
if !ed.L1.eagerValues {
|
||||
ed.L2 = new(EnumL2)
|
||||
}
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumDescriptorProto_Value_field_number:
|
||||
rawValues = append(rawValues, v)
|
||||
case genid.EnumDescriptorProto_ReservedName_field_number:
|
||||
ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
|
||||
case genid.EnumDescriptorProto_ReservedRange_field_number:
|
||||
ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v))
|
||||
case genid.EnumDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
if !ed.L1.eagerValues && len(rawValues) > 0 {
|
||||
ed.L2.Values.List = make([]EnumValue, len(rawValues))
|
||||
for i, b := range rawValues {
|
||||
ed.L2.Values.List[i].unmarshalFull(b, sb, ed.L0.ParentFile, ed, i)
|
||||
}
|
||||
}
|
||||
ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions)
|
||||
}
|
||||
|
||||
func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number:
|
||||
r[0] = protoreflect.EnumNumber(v)
|
||||
case genid.EnumDescriptorProto_EnumReservedRange_End_field_number:
|
||||
r[1] = protoreflect.EnumNumber(v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
vd.L0.ParentFile = pf
|
||||
vd.L0.Parent = pd
|
||||
vd.L0.Index = i
|
||||
|
||||
var rawOptions []byte
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumValueDescriptorProto_Number_field_number:
|
||||
vd.L1.Number = protoreflect.EnumNumber(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.EnumValueDescriptorProto_Name_field_number:
|
||||
// NOTE: Enum values are in the same scope as the enum parent.
|
||||
vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v)
|
||||
case genid.EnumValueDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
vd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.EnumValue, rawOptions)
|
||||
}
|
||||
|
||||
func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
var rawFields, rawOneofs [][]byte
|
||||
var enumIdx, messageIdx, extensionIdx int
|
||||
var rawOptions []byte
|
||||
md.L2 = new(MessageL2)
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.DescriptorProto_Field_field_number:
|
||||
rawFields = append(rawFields, v)
|
||||
case genid.DescriptorProto_OneofDecl_field_number:
|
||||
rawOneofs = append(rawOneofs, v)
|
||||
case genid.DescriptorProto_ReservedName_field_number:
|
||||
md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
|
||||
case genid.DescriptorProto_ReservedRange_field_number:
|
||||
md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v))
|
||||
case genid.DescriptorProto_ExtensionRange_field_number:
|
||||
r, rawOptions := unmarshalMessageExtensionRange(v)
|
||||
opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions)
|
||||
md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r)
|
||||
md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts)
|
||||
case genid.DescriptorProto_EnumType_field_number:
|
||||
md.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
|
||||
enumIdx++
|
||||
case genid.DescriptorProto_NestedType_field_number:
|
||||
md.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
|
||||
messageIdx++
|
||||
case genid.DescriptorProto_Extension_field_number:
|
||||
md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
|
||||
extensionIdx++
|
||||
case genid.DescriptorProto_Options_field_number:
|
||||
md.unmarshalOptions(v)
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
if len(rawFields) > 0 || len(rawOneofs) > 0 {
|
||||
md.L2.Fields.List = make([]Field, len(rawFields))
|
||||
md.L2.Oneofs.List = make([]Oneof, len(rawOneofs))
|
||||
for i, b := range rawFields {
|
||||
fd := &md.L2.Fields.List[i]
|
||||
fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
|
||||
if fd.L1.Cardinality == protoreflect.Required {
|
||||
md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number)
|
||||
}
|
||||
}
|
||||
for i, b := range rawOneofs {
|
||||
od := &md.L2.Oneofs.List[i]
|
||||
od.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
|
||||
}
|
||||
}
|
||||
md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
|
||||
}
|
||||
|
||||
func (md *Message) unmarshalOptions(b []byte) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.MessageOptions_MapEntry_field_number:
|
||||
md.L1.IsMapEntry = protowire.DecodeBool(v)
|
||||
case genid.MessageOptions_MessageSetWireFormat_field_number:
|
||||
md.L1.IsMessageSet = protowire.DecodeBool(v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.DescriptorProto_ReservedRange_Start_field_number:
|
||||
r[0] = protoreflect.FieldNumber(v)
|
||||
case genid.DescriptorProto_ReservedRange_End_field_number:
|
||||
r[1] = protoreflect.FieldNumber(v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.DescriptorProto_ExtensionRange_Start_field_number:
|
||||
r[0] = protoreflect.FieldNumber(v)
|
||||
case genid.DescriptorProto_ExtensionRange_End_field_number:
|
||||
r[1] = protoreflect.FieldNumber(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.DescriptorProto_ExtensionRange_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
return r, rawOptions
|
||||
}
|
||||
|
||||
func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
fd.L0.ParentFile = pf
|
||||
fd.L0.Parent = pd
|
||||
fd.L0.Index = i
|
||||
fd.L1.EditionFeatures = featuresFromParentDesc(fd.Parent())
|
||||
|
||||
var rawTypeName []byte
|
||||
var rawOptions []byte
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_Number_field_number:
|
||||
fd.L1.Number = protoreflect.FieldNumber(v)
|
||||
case genid.FieldDescriptorProto_Label_field_number:
|
||||
fd.L1.Cardinality = protoreflect.Cardinality(v)
|
||||
case genid.FieldDescriptorProto_Type_field_number:
|
||||
fd.L1.Kind = protoreflect.Kind(v)
|
||||
case genid.FieldDescriptorProto_OneofIndex_field_number:
|
||||
// In Message.unmarshalFull, we allocate slices for both
|
||||
// the field and oneof descriptors before unmarshaling either
|
||||
// of them. This ensures pointers to slice elements are stable.
|
||||
od := &pd.(*Message).L2.Oneofs.List[v]
|
||||
od.L1.Fields.List = append(od.L1.Fields.List, fd)
|
||||
if fd.L1.ContainingOneof != nil {
|
||||
panic("oneof type already set")
|
||||
}
|
||||
fd.L1.ContainingOneof = od
|
||||
case genid.FieldDescriptorProto_Proto3Optional_field_number:
|
||||
fd.L1.IsProto3Optional = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_Name_field_number:
|
||||
fd.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.FieldDescriptorProto_JsonName_field_number:
|
||||
fd.L1.StringName.InitJSON(sb.MakeString(v))
|
||||
case genid.FieldDescriptorProto_DefaultValue_field_number:
|
||||
fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages
|
||||
case genid.FieldDescriptorProto_TypeName_field_number:
|
||||
rawTypeName = v
|
||||
case genid.FieldDescriptorProto_Options_field_number:
|
||||
fd.unmarshalOptions(v)
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
if fd.L1.Kind == protoreflect.MessageKind && fd.L1.EditionFeatures.IsDelimitedEncoded {
|
||||
fd.L1.Kind = protoreflect.GroupKind
|
||||
}
|
||||
if fd.L1.EditionFeatures.IsLegacyRequired {
|
||||
fd.L1.Cardinality = protoreflect.Required
|
||||
}
|
||||
if rawTypeName != nil {
|
||||
name := makeFullName(sb, rawTypeName)
|
||||
switch fd.L1.Kind {
|
||||
case protoreflect.EnumKind:
|
||||
fd.L1.Enum = PlaceholderEnum(name)
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
fd.L1.Message = PlaceholderMessage(name)
|
||||
}
|
||||
}
|
||||
fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
|
||||
}
|
||||
|
||||
func (fd *Field) unmarshalOptions(b []byte) {
|
||||
const FieldOptions_EnforceUTF8 = 13
|
||||
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldOptions_Packed_field_number:
|
||||
fd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v)
|
||||
case genid.FieldOptions_Lazy_field_number:
|
||||
fd.L1.IsLazy = protowire.DecodeBool(v)
|
||||
case FieldOptions_EnforceUTF8:
|
||||
fd.L1.EditionFeatures.IsUTF8Validated = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldOptions_Features_field_number:
|
||||
fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
od.L0.ParentFile = pf
|
||||
od.L0.Parent = pd
|
||||
od.L0.Index = i
|
||||
|
||||
var rawOptions []byte
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.OneofDescriptorProto_Name_field_number:
|
||||
od.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.OneofDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions)
|
||||
}
|
||||
|
||||
func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
var rawTypeName []byte
|
||||
var rawOptions []byte
|
||||
xd.L2 = new(ExtensionL2)
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_Proto3Optional_field_number:
|
||||
xd.L2.IsProto3Optional = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FieldDescriptorProto_JsonName_field_number:
|
||||
xd.L2.StringName.InitJSON(sb.MakeString(v))
|
||||
case genid.FieldDescriptorProto_DefaultValue_field_number:
|
||||
xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions
|
||||
case genid.FieldDescriptorProto_TypeName_field_number:
|
||||
rawTypeName = v
|
||||
case genid.FieldDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
if rawTypeName != nil {
|
||||
name := makeFullName(sb, rawTypeName)
|
||||
switch xd.L1.Kind {
|
||||
case protoreflect.EnumKind:
|
||||
xd.L2.Enum = PlaceholderEnum(name)
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
xd.L2.Message = PlaceholderMessage(name)
|
||||
}
|
||||
}
|
||||
xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
|
||||
}
|
||||
|
||||
func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) {
|
||||
var rawMethods [][]byte
|
||||
var rawOptions []byte
|
||||
sd.L2 = new(ServiceL2)
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.ServiceDescriptorProto_Method_field_number:
|
||||
rawMethods = append(rawMethods, v)
|
||||
case genid.ServiceDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
if len(rawMethods) > 0 {
|
||||
sd.L2.Methods.List = make([]Method, len(rawMethods))
|
||||
for i, b := range rawMethods {
|
||||
sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i)
|
||||
}
|
||||
}
|
||||
sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions)
|
||||
}
|
||||
|
||||
func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
|
||||
md.L0.ParentFile = pf
|
||||
md.L0.Parent = pd
|
||||
md.L0.Index = i
|
||||
|
||||
var rawOptions []byte
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.MethodDescriptorProto_ClientStreaming_field_number:
|
||||
md.L1.IsStreamingClient = protowire.DecodeBool(v)
|
||||
case genid.MethodDescriptorProto_ServerStreaming_field_number:
|
||||
md.L1.IsStreamingServer = protowire.DecodeBool(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.MethodDescriptorProto_Name_field_number:
|
||||
md.L0.FullName = appendFullName(sb, pd.FullName(), v)
|
||||
case genid.MethodDescriptorProto_InputType_field_number:
|
||||
md.L1.Input = PlaceholderMessage(makeFullName(sb, v))
|
||||
case genid.MethodDescriptorProto_OutputType_field_number:
|
||||
md.L1.Output = PlaceholderMessage(makeFullName(sb, v))
|
||||
case genid.MethodDescriptorProto_Options_field_number:
|
||||
rawOptions = appendOptions(rawOptions, v)
|
||||
}
|
||||
default:
|
||||
m := protowire.ConsumeFieldValue(num, typ, b)
|
||||
b = b[m:]
|
||||
}
|
||||
}
|
||||
md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions)
|
||||
}
|
||||
|
||||
// appendOptions appends src to dst, where the returned slice is never nil.
|
||||
// This is necessary to distinguish between empty and unpopulated options.
|
||||
func appendOptions(dst, src []byte) []byte {
|
||||
if dst == nil {
|
||||
dst = []byte{}
|
||||
}
|
||||
return append(dst, src...)
|
||||
}
|
||||
|
||||
// optionsUnmarshaler constructs a lazy unmarshal function for an options message.
|
||||
//
|
||||
// The type of message to unmarshal to is passed as a pointer since the
|
||||
// vars in descopts may not yet be populated at the time this function is called.
|
||||
func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage {
|
||||
if b == nil {
|
||||
return nil
|
||||
}
|
||||
var opts protoreflect.ProtoMessage
|
||||
var once sync.Once
|
||||
return func() protoreflect.ProtoMessage {
|
||||
once.Do(func() {
|
||||
if *p == nil {
|
||||
panic("Descriptor.Options called without importing the descriptor package")
|
||||
}
|
||||
opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage)
|
||||
if err := (proto.UnmarshalOptions{
|
||||
AllowPartial: true,
|
||||
Resolver: db.TypeResolver,
|
||||
}).Unmarshal(b, opts); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
})
|
||||
return opts
|
||||
}
|
||||
}
|
457
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
generated
vendored
Normal file
457
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go
generated
vendored
Normal file
@ -0,0 +1,457 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/descfmt"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type FileImports []protoreflect.FileImport
|
||||
|
||||
func (p *FileImports) Len() int { return len(*p) }
|
||||
func (p *FileImports) Get(i int) protoreflect.FileImport { return (*p)[i] }
|
||||
func (p *FileImports) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *FileImports) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
type Names struct {
|
||||
List []protoreflect.Name
|
||||
once sync.Once
|
||||
has map[protoreflect.Name]int // protected by once
|
||||
}
|
||||
|
||||
func (p *Names) Len() int { return len(p.List) }
|
||||
func (p *Names) Get(i int) protoreflect.Name { return p.List[i] }
|
||||
func (p *Names) Has(s protoreflect.Name) bool { return p.lazyInit().has[s] > 0 }
|
||||
func (p *Names) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *Names) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Names) lazyInit() *Names {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.has = make(map[protoreflect.Name]int, len(p.List))
|
||||
for _, s := range p.List {
|
||||
p.has[s] = p.has[s] + 1
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
// CheckValid reports any errors with the set of names with an error message
|
||||
// that completes the sentence: "ranges is invalid because it has ..."
|
||||
func (p *Names) CheckValid() error {
|
||||
for s, n := range p.lazyInit().has {
|
||||
switch {
|
||||
case n > 1:
|
||||
return errors.New("duplicate name: %q", s)
|
||||
case false && !s.IsValid():
|
||||
// NOTE: The C++ implementation does not validate the identifier.
|
||||
// See https://github.com/protocolbuffers/protobuf/issues/6335.
|
||||
return errors.New("invalid name: %q", s)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type EnumRanges struct {
|
||||
List [][2]protoreflect.EnumNumber // start inclusive; end inclusive
|
||||
once sync.Once
|
||||
sorted [][2]protoreflect.EnumNumber // protected by once
|
||||
}
|
||||
|
||||
func (p *EnumRanges) Len() int { return len(p.List) }
|
||||
func (p *EnumRanges) Get(i int) [2]protoreflect.EnumNumber { return p.List[i] }
|
||||
func (p *EnumRanges) Has(n protoreflect.EnumNumber) bool {
|
||||
for ls := p.lazyInit().sorted; len(ls) > 0; {
|
||||
i := len(ls) / 2
|
||||
switch r := enumRange(ls[i]); {
|
||||
case n < r.Start():
|
||||
ls = ls[:i] // search lower
|
||||
case n > r.End():
|
||||
ls = ls[i+1:] // search upper
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
func (p *EnumRanges) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *EnumRanges) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *EnumRanges) lazyInit() *EnumRanges {
|
||||
p.once.Do(func() {
|
||||
p.sorted = append(p.sorted, p.List...)
|
||||
sort.Slice(p.sorted, func(i, j int) bool {
|
||||
return p.sorted[i][0] < p.sorted[j][0]
|
||||
})
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
// CheckValid reports any errors with the set of names with an error message
|
||||
// that completes the sentence: "ranges is invalid because it has ..."
|
||||
func (p *EnumRanges) CheckValid() error {
|
||||
var rp enumRange
|
||||
for i, r := range p.lazyInit().sorted {
|
||||
r := enumRange(r)
|
||||
switch {
|
||||
case !(r.Start() <= r.End()):
|
||||
return errors.New("invalid range: %v", r)
|
||||
case !(rp.End() < r.Start()) && i > 0:
|
||||
return errors.New("overlapping ranges: %v with %v", rp, r)
|
||||
}
|
||||
rp = r
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type enumRange [2]protoreflect.EnumNumber
|
||||
|
||||
func (r enumRange) Start() protoreflect.EnumNumber { return r[0] } // inclusive
|
||||
func (r enumRange) End() protoreflect.EnumNumber { return r[1] } // inclusive
|
||||
func (r enumRange) String() string {
|
||||
if r.Start() == r.End() {
|
||||
return fmt.Sprintf("%d", r.Start())
|
||||
}
|
||||
return fmt.Sprintf("%d to %d", r.Start(), r.End())
|
||||
}
|
||||
|
||||
type FieldRanges struct {
|
||||
List [][2]protoreflect.FieldNumber // start inclusive; end exclusive
|
||||
once sync.Once
|
||||
sorted [][2]protoreflect.FieldNumber // protected by once
|
||||
}
|
||||
|
||||
func (p *FieldRanges) Len() int { return len(p.List) }
|
||||
func (p *FieldRanges) Get(i int) [2]protoreflect.FieldNumber { return p.List[i] }
|
||||
func (p *FieldRanges) Has(n protoreflect.FieldNumber) bool {
|
||||
for ls := p.lazyInit().sorted; len(ls) > 0; {
|
||||
i := len(ls) / 2
|
||||
switch r := fieldRange(ls[i]); {
|
||||
case n < r.Start():
|
||||
ls = ls[:i] // search lower
|
||||
case n > r.End():
|
||||
ls = ls[i+1:] // search upper
|
||||
default:
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
func (p *FieldRanges) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *FieldRanges) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *FieldRanges) lazyInit() *FieldRanges {
|
||||
p.once.Do(func() {
|
||||
p.sorted = append(p.sorted, p.List...)
|
||||
sort.Slice(p.sorted, func(i, j int) bool {
|
||||
return p.sorted[i][0] < p.sorted[j][0]
|
||||
})
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
// CheckValid reports any errors with the set of ranges with an error message
|
||||
// that completes the sentence: "ranges is invalid because it has ..."
|
||||
func (p *FieldRanges) CheckValid(isMessageSet bool) error {
|
||||
var rp fieldRange
|
||||
for i, r := range p.lazyInit().sorted {
|
||||
r := fieldRange(r)
|
||||
switch {
|
||||
case !isValidFieldNumber(r.Start(), isMessageSet):
|
||||
return errors.New("invalid field number: %d", r.Start())
|
||||
case !isValidFieldNumber(r.End(), isMessageSet):
|
||||
return errors.New("invalid field number: %d", r.End())
|
||||
case !(r.Start() <= r.End()):
|
||||
return errors.New("invalid range: %v", r)
|
||||
case !(rp.End() < r.Start()) && i > 0:
|
||||
return errors.New("overlapping ranges: %v with %v", rp, r)
|
||||
}
|
||||
rp = r
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// isValidFieldNumber reports whether the field number is valid.
|
||||
// Unlike the FieldNumber.IsValid method, it allows ranges that cover the
|
||||
// reserved number range.
|
||||
func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool {
|
||||
return protowire.MinValidNumber <= n && (n <= protowire.MaxValidNumber || isMessageSet)
|
||||
}
|
||||
|
||||
// CheckOverlap reports an error if p and q overlap.
|
||||
func (p *FieldRanges) CheckOverlap(q *FieldRanges) error {
|
||||
rps := p.lazyInit().sorted
|
||||
rqs := q.lazyInit().sorted
|
||||
for pi, qi := 0, 0; pi < len(rps) && qi < len(rqs); {
|
||||
rp := fieldRange(rps[pi])
|
||||
rq := fieldRange(rqs[qi])
|
||||
if !(rp.End() < rq.Start() || rq.End() < rp.Start()) {
|
||||
return errors.New("overlapping ranges: %v with %v", rp, rq)
|
||||
}
|
||||
if rp.Start() < rq.Start() {
|
||||
pi++
|
||||
} else {
|
||||
qi++
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type fieldRange [2]protoreflect.FieldNumber
|
||||
|
||||
func (r fieldRange) Start() protoreflect.FieldNumber { return r[0] } // inclusive
|
||||
func (r fieldRange) End() protoreflect.FieldNumber { return r[1] - 1 } // inclusive
|
||||
func (r fieldRange) String() string {
|
||||
if r.Start() == r.End() {
|
||||
return fmt.Sprintf("%d", r.Start())
|
||||
}
|
||||
return fmt.Sprintf("%d to %d", r.Start(), r.End())
|
||||
}
|
||||
|
||||
type FieldNumbers struct {
|
||||
List []protoreflect.FieldNumber
|
||||
once sync.Once
|
||||
has map[protoreflect.FieldNumber]struct{} // protected by once
|
||||
}
|
||||
|
||||
func (p *FieldNumbers) Len() int { return len(p.List) }
|
||||
func (p *FieldNumbers) Get(i int) protoreflect.FieldNumber { return p.List[i] }
|
||||
func (p *FieldNumbers) Has(n protoreflect.FieldNumber) bool {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.has = make(map[protoreflect.FieldNumber]struct{}, len(p.List))
|
||||
for _, n := range p.List {
|
||||
p.has[n] = struct{}{}
|
||||
}
|
||||
}
|
||||
})
|
||||
_, ok := p.has[n]
|
||||
return ok
|
||||
}
|
||||
func (p *FieldNumbers) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *FieldNumbers) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
type OneofFields struct {
|
||||
List []protoreflect.FieldDescriptor
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]protoreflect.FieldDescriptor // protected by once
|
||||
byJSON map[string]protoreflect.FieldDescriptor // protected by once
|
||||
byText map[string]protoreflect.FieldDescriptor // protected by once
|
||||
byNum map[protoreflect.FieldNumber]protoreflect.FieldDescriptor // protected by once
|
||||
}
|
||||
|
||||
func (p *OneofFields) Len() int { return len(p.List) }
|
||||
func (p *OneofFields) Get(i int) protoreflect.FieldDescriptor { return p.List[i] }
|
||||
func (p *OneofFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
|
||||
return p.lazyInit().byName[s]
|
||||
}
|
||||
func (p *OneofFields) ByJSONName(s string) protoreflect.FieldDescriptor {
|
||||
return p.lazyInit().byJSON[s]
|
||||
}
|
||||
func (p *OneofFields) ByTextName(s string) protoreflect.FieldDescriptor {
|
||||
return p.lazyInit().byText[s]
|
||||
}
|
||||
func (p *OneofFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
|
||||
return p.lazyInit().byNum[n]
|
||||
}
|
||||
func (p *OneofFields) Format(s fmt.State, r rune) { descfmt.FormatList(s, r, p) }
|
||||
func (p *OneofFields) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
func (p *OneofFields) lazyInit() *OneofFields {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]protoreflect.FieldDescriptor, len(p.List))
|
||||
p.byJSON = make(map[string]protoreflect.FieldDescriptor, len(p.List))
|
||||
p.byText = make(map[string]protoreflect.FieldDescriptor, len(p.List))
|
||||
p.byNum = make(map[protoreflect.FieldNumber]protoreflect.FieldDescriptor, len(p.List))
|
||||
for _, f := range p.List {
|
||||
// Field names and numbers are guaranteed to be unique.
|
||||
p.byName[f.Name()] = f
|
||||
p.byJSON[f.JSONName()] = f
|
||||
p.byText[f.TextName()] = f
|
||||
p.byNum[f.Number()] = f
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type SourceLocations struct {
|
||||
// List is a list of SourceLocations.
|
||||
// The SourceLocation.Next field does not need to be populated
|
||||
// as it will be lazily populated upon first need.
|
||||
List []protoreflect.SourceLocation
|
||||
|
||||
// File is the parent file descriptor that these locations are relative to.
|
||||
// If non-nil, ByDescriptor verifies that the provided descriptor
|
||||
// is a child of this file descriptor.
|
||||
File protoreflect.FileDescriptor
|
||||
|
||||
once sync.Once
|
||||
byPath map[pathKey]int
|
||||
}
|
||||
|
||||
func (p *SourceLocations) Len() int { return len(p.List) }
|
||||
func (p *SourceLocations) Get(i int) protoreflect.SourceLocation { return p.lazyInit().List[i] }
|
||||
func (p *SourceLocations) byKey(k pathKey) protoreflect.SourceLocation {
|
||||
if i, ok := p.lazyInit().byPath[k]; ok {
|
||||
return p.List[i]
|
||||
}
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
func (p *SourceLocations) ByPath(path protoreflect.SourcePath) protoreflect.SourceLocation {
|
||||
return p.byKey(newPathKey(path))
|
||||
}
|
||||
func (p *SourceLocations) ByDescriptor(desc protoreflect.Descriptor) protoreflect.SourceLocation {
|
||||
if p.File != nil && desc != nil && p.File != desc.ParentFile() {
|
||||
return protoreflect.SourceLocation{} // mismatching parent files
|
||||
}
|
||||
var pathArr [16]int32
|
||||
path := pathArr[:0]
|
||||
for {
|
||||
switch desc.(type) {
|
||||
case protoreflect.FileDescriptor:
|
||||
// Reverse the path since it was constructed in reverse.
|
||||
for i, j := 0, len(path)-1; i < j; i, j = i+1, j-1 {
|
||||
path[i], path[j] = path[j], path[i]
|
||||
}
|
||||
return p.byKey(newPathKey(path))
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.FileDescriptor:
|
||||
path = append(path, int32(genid.FileDescriptorProto_MessageType_field_number))
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(genid.DescriptorProto_NestedType_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
case protoreflect.FieldDescriptor:
|
||||
isExtension := desc.(protoreflect.FieldDescriptor).IsExtension()
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
if isExtension {
|
||||
switch desc.(type) {
|
||||
case protoreflect.FileDescriptor:
|
||||
path = append(path, int32(genid.FileDescriptorProto_Extension_field_number))
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(genid.DescriptorProto_Extension_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
} else {
|
||||
switch desc.(type) {
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(genid.DescriptorProto_Field_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
}
|
||||
case protoreflect.OneofDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(genid.DescriptorProto_OneofDecl_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
case protoreflect.EnumDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.FileDescriptor:
|
||||
path = append(path, int32(genid.FileDescriptorProto_EnumType_field_number))
|
||||
case protoreflect.MessageDescriptor:
|
||||
path = append(path, int32(genid.DescriptorProto_EnumType_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
case protoreflect.EnumValueDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.EnumDescriptor:
|
||||
path = append(path, int32(genid.EnumDescriptorProto_Value_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
case protoreflect.ServiceDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.FileDescriptor:
|
||||
path = append(path, int32(genid.FileDescriptorProto_Service_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
case protoreflect.MethodDescriptor:
|
||||
path = append(path, int32(desc.Index()))
|
||||
desc = desc.Parent()
|
||||
switch desc.(type) {
|
||||
case protoreflect.ServiceDescriptor:
|
||||
path = append(path, int32(genid.ServiceDescriptorProto_Method_field_number))
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
default:
|
||||
return protoreflect.SourceLocation{}
|
||||
}
|
||||
}
|
||||
}
|
||||
func (p *SourceLocations) lazyInit() *SourceLocations {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
// Collect all the indexes for a given path.
|
||||
pathIdxs := make(map[pathKey][]int, len(p.List))
|
||||
for i, l := range p.List {
|
||||
k := newPathKey(l.Path)
|
||||
pathIdxs[k] = append(pathIdxs[k], i)
|
||||
}
|
||||
|
||||
// Update the next index for all locations.
|
||||
p.byPath = make(map[pathKey]int, len(p.List))
|
||||
for k, idxs := range pathIdxs {
|
||||
for i := 0; i < len(idxs)-1; i++ {
|
||||
p.List[idxs[i]].Next = idxs[i+1]
|
||||
}
|
||||
p.List[idxs[len(idxs)-1]].Next = 0
|
||||
p.byPath[k] = idxs[0] // record the first location for this path
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
func (p *SourceLocations) ProtoInternal(pragma.DoNotImplement) {}
|
||||
|
||||
// pathKey is a comparable representation of protoreflect.SourcePath.
|
||||
type pathKey struct {
|
||||
arr [16]uint8 // first n-1 path segments; last element is the length
|
||||
str string // used if the path does not fit in arr
|
||||
}
|
||||
|
||||
func newPathKey(p protoreflect.SourcePath) (k pathKey) {
|
||||
if len(p) < len(k.arr) {
|
||||
for i, ps := range p {
|
||||
if ps < 0 || math.MaxUint8 <= ps {
|
||||
return pathKey{str: p.String()}
|
||||
}
|
||||
k.arr[i] = uint8(ps)
|
||||
}
|
||||
k.arr[len(k.arr)-1] = uint8(len(p))
|
||||
return k
|
||||
}
|
||||
return pathKey{str: p.String()}
|
||||
}
|
367
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
generated
vendored
Normal file
367
e2e/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
generated
vendored
Normal file
@ -0,0 +1,367 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-types. DO NOT EDIT.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/descfmt"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type Enums struct {
|
||||
List []Enum
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Enum // protected by once
|
||||
}
|
||||
|
||||
func (p *Enums) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Enums) Get(i int) protoreflect.EnumDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Enums) ByName(s protoreflect.Name) protoreflect.EnumDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Enums) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Enums) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Enums) lazyInit() *Enums {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Enum, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type EnumValues struct {
|
||||
List []EnumValue
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*EnumValue // protected by once
|
||||
byNum map[protoreflect.EnumNumber]*EnumValue // protected by once
|
||||
}
|
||||
|
||||
func (p *EnumValues) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *EnumValues) Get(i int) protoreflect.EnumValueDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *EnumValues) ByName(s protoreflect.Name) protoreflect.EnumValueDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *EnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor {
|
||||
if d := p.lazyInit().byNum[n]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *EnumValues) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *EnumValues) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *EnumValues) lazyInit() *EnumValues {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*EnumValue, len(p.List))
|
||||
p.byNum = make(map[protoreflect.EnumNumber]*EnumValue, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
if _, ok := p.byNum[d.Number()]; !ok {
|
||||
p.byNum[d.Number()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Messages struct {
|
||||
List []Message
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Message // protected by once
|
||||
}
|
||||
|
||||
func (p *Messages) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Messages) Get(i int) protoreflect.MessageDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Messages) ByName(s protoreflect.Name) protoreflect.MessageDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Messages) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Messages) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Messages) lazyInit() *Messages {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Message, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Fields struct {
|
||||
List []Field
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Field // protected by once
|
||||
byJSON map[string]*Field // protected by once
|
||||
byText map[string]*Field // protected by once
|
||||
byNum map[protoreflect.FieldNumber]*Field // protected by once
|
||||
}
|
||||
|
||||
func (p *Fields) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Fields) Get(i int) protoreflect.FieldDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Fields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Fields) ByJSONName(s string) protoreflect.FieldDescriptor {
|
||||
if d := p.lazyInit().byJSON[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Fields) ByTextName(s string) protoreflect.FieldDescriptor {
|
||||
if d := p.lazyInit().byText[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Fields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
|
||||
if d := p.lazyInit().byNum[n]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Fields) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Fields) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Fields) lazyInit() *Fields {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Field, len(p.List))
|
||||
p.byJSON = make(map[string]*Field, len(p.List))
|
||||
p.byText = make(map[string]*Field, len(p.List))
|
||||
p.byNum = make(map[protoreflect.FieldNumber]*Field, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
if _, ok := p.byJSON[d.JSONName()]; !ok {
|
||||
p.byJSON[d.JSONName()] = d
|
||||
}
|
||||
if _, ok := p.byText[d.TextName()]; !ok {
|
||||
p.byText[d.TextName()] = d
|
||||
}
|
||||
if isGroupLike(d) {
|
||||
lowerJSONName := strings.ToLower(d.JSONName())
|
||||
if _, ok := p.byJSON[lowerJSONName]; !ok {
|
||||
p.byJSON[lowerJSONName] = d
|
||||
}
|
||||
lowerTextName := strings.ToLower(d.TextName())
|
||||
if _, ok := p.byText[lowerTextName]; !ok {
|
||||
p.byText[lowerTextName] = d
|
||||
}
|
||||
}
|
||||
if _, ok := p.byNum[d.Number()]; !ok {
|
||||
p.byNum[d.Number()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Oneofs struct {
|
||||
List []Oneof
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Oneof // protected by once
|
||||
}
|
||||
|
||||
func (p *Oneofs) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Oneofs) Get(i int) protoreflect.OneofDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Oneofs) ByName(s protoreflect.Name) protoreflect.OneofDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Oneofs) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Oneofs) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Oneofs) lazyInit() *Oneofs {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Oneof, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Extensions struct {
|
||||
List []Extension
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Extension // protected by once
|
||||
}
|
||||
|
||||
func (p *Extensions) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Extensions) Get(i int) protoreflect.ExtensionDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Extensions) ByName(s protoreflect.Name) protoreflect.ExtensionDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Extensions) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Extensions) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Extensions) lazyInit() *Extensions {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Extension, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Services struct {
|
||||
List []Service
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Service // protected by once
|
||||
}
|
||||
|
||||
func (p *Services) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Services) Get(i int) protoreflect.ServiceDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Services) ByName(s protoreflect.Name) protoreflect.ServiceDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Services) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Services) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Services) lazyInit() *Services {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Service, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
||||
|
||||
type Methods struct {
|
||||
List []Method
|
||||
once sync.Once
|
||||
byName map[protoreflect.Name]*Method // protected by once
|
||||
}
|
||||
|
||||
func (p *Methods) Len() int {
|
||||
return len(p.List)
|
||||
}
|
||||
func (p *Methods) Get(i int) protoreflect.MethodDescriptor {
|
||||
return &p.List[i]
|
||||
}
|
||||
func (p *Methods) ByName(s protoreflect.Name) protoreflect.MethodDescriptor {
|
||||
if d := p.lazyInit().byName[s]; d != nil {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (p *Methods) Format(s fmt.State, r rune) {
|
||||
descfmt.FormatList(s, r, p)
|
||||
}
|
||||
func (p *Methods) ProtoInternal(pragma.DoNotImplement) {}
|
||||
func (p *Methods) lazyInit() *Methods {
|
||||
p.once.Do(func() {
|
||||
if len(p.List) > 0 {
|
||||
p.byName = make(map[protoreflect.Name]*Method, len(p.List))
|
||||
for i := range p.List {
|
||||
d := &p.List[i]
|
||||
if _, ok := p.byName[d.Name()]; !ok {
|
||||
p.byName[d.Name()] = d
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
return p
|
||||
}
|
164
e2e/vendor/google.golang.org/protobuf/internal/filedesc/editions.go
generated
vendored
Normal file
164
e2e/vendor/google.golang.org/protobuf/internal/filedesc/editions.go
generated
vendored
Normal file
@ -0,0 +1,164 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/editiondefaults"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
var defaultsCache = make(map[Edition]EditionFeatures)
|
||||
var defaultsKeys = []Edition{}
|
||||
|
||||
func init() {
|
||||
unmarshalEditionDefaults(editiondefaults.Defaults)
|
||||
SurrogateProto2.L1.EditionFeatures = getFeaturesFor(EditionProto2)
|
||||
SurrogateProto3.L1.EditionFeatures = getFeaturesFor(EditionProto3)
|
||||
SurrogateEdition2023.L1.EditionFeatures = getFeaturesFor(Edition2023)
|
||||
}
|
||||
|
||||
func unmarshalGoFeature(b []byte, parent EditionFeatures) EditionFeatures {
|
||||
for len(b) > 0 {
|
||||
num, _, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch num {
|
||||
case genid.GoFeatures_LegacyUnmarshalJsonEnum_field_number:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
parent.GenerateLegacyUnmarshalJSON = protowire.DecodeBool(v)
|
||||
case genid.GoFeatures_ApiLevel_field_number:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
parent.APILevel = int(v)
|
||||
case genid.GoFeatures_StripEnumPrefix_field_number:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
parent.StripEnumPrefix = int(v)
|
||||
default:
|
||||
panic(fmt.Sprintf("unkown field number %d while unmarshalling GoFeatures", num))
|
||||
}
|
||||
}
|
||||
return parent
|
||||
}
|
||||
|
||||
func unmarshalFeatureSet(b []byte, parent EditionFeatures) EditionFeatures {
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FeatureSet_FieldPresence_field_number:
|
||||
parent.IsFieldPresence = v == genid.FeatureSet_EXPLICIT_enum_value || v == genid.FeatureSet_LEGACY_REQUIRED_enum_value
|
||||
parent.IsLegacyRequired = v == genid.FeatureSet_LEGACY_REQUIRED_enum_value
|
||||
case genid.FeatureSet_EnumType_field_number:
|
||||
parent.IsOpenEnum = v == genid.FeatureSet_OPEN_enum_value
|
||||
case genid.FeatureSet_RepeatedFieldEncoding_field_number:
|
||||
parent.IsPacked = v == genid.FeatureSet_PACKED_enum_value
|
||||
case genid.FeatureSet_Utf8Validation_field_number:
|
||||
parent.IsUTF8Validated = v == genid.FeatureSet_VERIFY_enum_value
|
||||
case genid.FeatureSet_MessageEncoding_field_number:
|
||||
parent.IsDelimitedEncoded = v == genid.FeatureSet_DELIMITED_enum_value
|
||||
case genid.FeatureSet_JsonFormat_field_number:
|
||||
parent.IsJSONCompliant = v == genid.FeatureSet_ALLOW_enum_value
|
||||
default:
|
||||
panic(fmt.Sprintf("unkown field number %d while unmarshalling FeatureSet", num))
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FeatureSet_Go_ext_number:
|
||||
parent = unmarshalGoFeature(v, parent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return parent
|
||||
}
|
||||
|
||||
func featuresFromParentDesc(parentDesc protoreflect.Descriptor) EditionFeatures {
|
||||
var parentFS EditionFeatures
|
||||
switch p := parentDesc.(type) {
|
||||
case *File:
|
||||
parentFS = p.L1.EditionFeatures
|
||||
case *Message:
|
||||
parentFS = p.L1.EditionFeatures
|
||||
default:
|
||||
panic(fmt.Sprintf("unknown parent type %T", parentDesc))
|
||||
}
|
||||
return parentFS
|
||||
}
|
||||
|
||||
func unmarshalEditionDefault(b []byte) {
|
||||
var ed Edition
|
||||
var fs EditionFeatures
|
||||
for len(b) > 0 {
|
||||
num, typ, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch typ {
|
||||
case protowire.VarintType:
|
||||
v, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number:
|
||||
ed = Edition(v)
|
||||
}
|
||||
case protowire.BytesType:
|
||||
v, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
switch num {
|
||||
case genid.FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number:
|
||||
fs = unmarshalFeatureSet(v, fs)
|
||||
case genid.FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number:
|
||||
fs = unmarshalFeatureSet(v, fs)
|
||||
}
|
||||
}
|
||||
}
|
||||
defaultsCache[ed] = fs
|
||||
defaultsKeys = append(defaultsKeys, ed)
|
||||
}
|
||||
|
||||
func unmarshalEditionDefaults(b []byte) {
|
||||
for len(b) > 0 {
|
||||
num, _, n := protowire.ConsumeTag(b)
|
||||
b = b[n:]
|
||||
switch num {
|
||||
case genid.FeatureSetDefaults_Defaults_field_number:
|
||||
def, m := protowire.ConsumeBytes(b)
|
||||
b = b[m:]
|
||||
unmarshalEditionDefault(def)
|
||||
case genid.FeatureSetDefaults_MinimumEdition_field_number,
|
||||
genid.FeatureSetDefaults_MaximumEdition_field_number:
|
||||
// We don't care about the minimum and maximum editions. If the
|
||||
// edition we are looking for later on is not in the cache we know
|
||||
// it is outside of the range between minimum and maximum edition.
|
||||
_, m := protowire.ConsumeVarint(b)
|
||||
b = b[m:]
|
||||
default:
|
||||
panic(fmt.Sprintf("unkown field number %d while unmarshalling EditionDefault", num))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getFeaturesFor(ed Edition) EditionFeatures {
|
||||
match := EditionUnknown
|
||||
for _, key := range defaultsKeys {
|
||||
if key > ed {
|
||||
break
|
||||
}
|
||||
match = key
|
||||
}
|
||||
if match == EditionUnknown {
|
||||
panic(fmt.Sprintf("unsupported edition: %v", ed))
|
||||
}
|
||||
return defaultsCache[match]
|
||||
}
|
110
e2e/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
generated
vendored
Normal file
110
e2e/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go
generated
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package filedesc
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
var (
|
||||
emptyNames = new(Names)
|
||||
emptyEnumRanges = new(EnumRanges)
|
||||
emptyFieldRanges = new(FieldRanges)
|
||||
emptyFieldNumbers = new(FieldNumbers)
|
||||
emptySourceLocations = new(SourceLocations)
|
||||
|
||||
emptyFiles = new(FileImports)
|
||||
emptyMessages = new(Messages)
|
||||
emptyFields = new(Fields)
|
||||
emptyOneofs = new(Oneofs)
|
||||
emptyEnums = new(Enums)
|
||||
emptyEnumValues = new(EnumValues)
|
||||
emptyExtensions = new(Extensions)
|
||||
emptyServices = new(Services)
|
||||
)
|
||||
|
||||
// PlaceholderFile is a placeholder, representing only the file path.
|
||||
type PlaceholderFile string
|
||||
|
||||
func (f PlaceholderFile) ParentFile() protoreflect.FileDescriptor { return f }
|
||||
func (f PlaceholderFile) Parent() protoreflect.Descriptor { return nil }
|
||||
func (f PlaceholderFile) Index() int { return 0 }
|
||||
func (f PlaceholderFile) Syntax() protoreflect.Syntax { return 0 }
|
||||
func (f PlaceholderFile) Name() protoreflect.Name { return "" }
|
||||
func (f PlaceholderFile) FullName() protoreflect.FullName { return "" }
|
||||
func (f PlaceholderFile) IsPlaceholder() bool { return true }
|
||||
func (f PlaceholderFile) Options() protoreflect.ProtoMessage { return descopts.File }
|
||||
func (f PlaceholderFile) Path() string { return string(f) }
|
||||
func (f PlaceholderFile) Package() protoreflect.FullName { return "" }
|
||||
func (f PlaceholderFile) Imports() protoreflect.FileImports { return emptyFiles }
|
||||
func (f PlaceholderFile) Messages() protoreflect.MessageDescriptors { return emptyMessages }
|
||||
func (f PlaceholderFile) Enums() protoreflect.EnumDescriptors { return emptyEnums }
|
||||
func (f PlaceholderFile) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions }
|
||||
func (f PlaceholderFile) Services() protoreflect.ServiceDescriptors { return emptyServices }
|
||||
func (f PlaceholderFile) SourceLocations() protoreflect.SourceLocations { return emptySourceLocations }
|
||||
func (f PlaceholderFile) ProtoType(protoreflect.FileDescriptor) { return }
|
||||
func (f PlaceholderFile) ProtoInternal(pragma.DoNotImplement) { return }
|
||||
|
||||
// PlaceholderEnum is a placeholder, representing only the full name.
|
||||
type PlaceholderEnum protoreflect.FullName
|
||||
|
||||
func (e PlaceholderEnum) ParentFile() protoreflect.FileDescriptor { return nil }
|
||||
func (e PlaceholderEnum) Parent() protoreflect.Descriptor { return nil }
|
||||
func (e PlaceholderEnum) Index() int { return 0 }
|
||||
func (e PlaceholderEnum) Syntax() protoreflect.Syntax { return 0 }
|
||||
func (e PlaceholderEnum) Name() protoreflect.Name { return protoreflect.FullName(e).Name() }
|
||||
func (e PlaceholderEnum) FullName() protoreflect.FullName { return protoreflect.FullName(e) }
|
||||
func (e PlaceholderEnum) IsPlaceholder() bool { return true }
|
||||
func (e PlaceholderEnum) Options() protoreflect.ProtoMessage { return descopts.Enum }
|
||||
func (e PlaceholderEnum) Values() protoreflect.EnumValueDescriptors { return emptyEnumValues }
|
||||
func (e PlaceholderEnum) ReservedNames() protoreflect.Names { return emptyNames }
|
||||
func (e PlaceholderEnum) ReservedRanges() protoreflect.EnumRanges { return emptyEnumRanges }
|
||||
func (e PlaceholderEnum) IsClosed() bool { return false }
|
||||
func (e PlaceholderEnum) ProtoType(protoreflect.EnumDescriptor) { return }
|
||||
func (e PlaceholderEnum) ProtoInternal(pragma.DoNotImplement) { return }
|
||||
|
||||
// PlaceholderEnumValue is a placeholder, representing only the full name.
|
||||
type PlaceholderEnumValue protoreflect.FullName
|
||||
|
||||
func (e PlaceholderEnumValue) ParentFile() protoreflect.FileDescriptor { return nil }
|
||||
func (e PlaceholderEnumValue) Parent() protoreflect.Descriptor { return nil }
|
||||
func (e PlaceholderEnumValue) Index() int { return 0 }
|
||||
func (e PlaceholderEnumValue) Syntax() protoreflect.Syntax { return 0 }
|
||||
func (e PlaceholderEnumValue) Name() protoreflect.Name { return protoreflect.FullName(e).Name() }
|
||||
func (e PlaceholderEnumValue) FullName() protoreflect.FullName { return protoreflect.FullName(e) }
|
||||
func (e PlaceholderEnumValue) IsPlaceholder() bool { return true }
|
||||
func (e PlaceholderEnumValue) Options() protoreflect.ProtoMessage { return descopts.EnumValue }
|
||||
func (e PlaceholderEnumValue) Number() protoreflect.EnumNumber { return 0 }
|
||||
func (e PlaceholderEnumValue) ProtoType(protoreflect.EnumValueDescriptor) { return }
|
||||
func (e PlaceholderEnumValue) ProtoInternal(pragma.DoNotImplement) { return }
|
||||
|
||||
// PlaceholderMessage is a placeholder, representing only the full name.
|
||||
type PlaceholderMessage protoreflect.FullName
|
||||
|
||||
func (m PlaceholderMessage) ParentFile() protoreflect.FileDescriptor { return nil }
|
||||
func (m PlaceholderMessage) Parent() protoreflect.Descriptor { return nil }
|
||||
func (m PlaceholderMessage) Index() int { return 0 }
|
||||
func (m PlaceholderMessage) Syntax() protoreflect.Syntax { return 0 }
|
||||
func (m PlaceholderMessage) Name() protoreflect.Name { return protoreflect.FullName(m).Name() }
|
||||
func (m PlaceholderMessage) FullName() protoreflect.FullName { return protoreflect.FullName(m) }
|
||||
func (m PlaceholderMessage) IsPlaceholder() bool { return true }
|
||||
func (m PlaceholderMessage) Options() protoreflect.ProtoMessage { return descopts.Message }
|
||||
func (m PlaceholderMessage) IsMapEntry() bool { return false }
|
||||
func (m PlaceholderMessage) Fields() protoreflect.FieldDescriptors { return emptyFields }
|
||||
func (m PlaceholderMessage) Oneofs() protoreflect.OneofDescriptors { return emptyOneofs }
|
||||
func (m PlaceholderMessage) ReservedNames() protoreflect.Names { return emptyNames }
|
||||
func (m PlaceholderMessage) ReservedRanges() protoreflect.FieldRanges { return emptyFieldRanges }
|
||||
func (m PlaceholderMessage) RequiredNumbers() protoreflect.FieldNumbers { return emptyFieldNumbers }
|
||||
func (m PlaceholderMessage) ExtensionRanges() protoreflect.FieldRanges { return emptyFieldRanges }
|
||||
func (m PlaceholderMessage) ExtensionRangeOptions(int) protoreflect.ProtoMessage {
|
||||
panic("index out of range")
|
||||
}
|
||||
func (m PlaceholderMessage) Messages() protoreflect.MessageDescriptors { return emptyMessages }
|
||||
func (m PlaceholderMessage) Enums() protoreflect.EnumDescriptors { return emptyEnums }
|
||||
func (m PlaceholderMessage) Extensions() protoreflect.ExtensionDescriptors { return emptyExtensions }
|
||||
func (m PlaceholderMessage) ProtoType(protoreflect.MessageDescriptor) { return }
|
||||
func (m PlaceholderMessage) ProtoInternal(pragma.DoNotImplement) { return }
|
296
e2e/vendor/google.golang.org/protobuf/internal/filetype/build.go
generated
vendored
Normal file
296
e2e/vendor/google.golang.org/protobuf/internal/filetype/build.go
generated
vendored
Normal file
@ -0,0 +1,296 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package filetype provides functionality for wrapping descriptors
|
||||
// with Go type information.
|
||||
package filetype
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
pimpl "google.golang.org/protobuf/internal/impl"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
)
|
||||
|
||||
// Builder constructs type descriptors from a raw file descriptor
|
||||
// and associated Go types for each enum and message declaration.
|
||||
//
|
||||
// # Flattened Ordering
|
||||
//
|
||||
// The protobuf type system represents declarations as a tree. Certain nodes in
|
||||
// the tree require us to either associate it with a concrete Go type or to
|
||||
// resolve a dependency, which is information that must be provided separately
|
||||
// since it cannot be derived from the file descriptor alone.
|
||||
//
|
||||
// However, representing a tree as Go literals is difficult to simply do in a
|
||||
// space and time efficient way. Thus, we store them as a flattened list of
|
||||
// objects where the serialization order from the tree-based form is important.
|
||||
//
|
||||
// The "flattened ordering" is defined as a tree traversal of all enum, message,
|
||||
// extension, and service declarations using the following algorithm:
|
||||
//
|
||||
// def VisitFileDecls(fd):
|
||||
// for e in fd.Enums: yield e
|
||||
// for m in fd.Messages: yield m
|
||||
// for x in fd.Extensions: yield x
|
||||
// for s in fd.Services: yield s
|
||||
// for m in fd.Messages: yield from VisitMessageDecls(m)
|
||||
//
|
||||
// def VisitMessageDecls(md):
|
||||
// for e in md.Enums: yield e
|
||||
// for m in md.Messages: yield m
|
||||
// for x in md.Extensions: yield x
|
||||
// for m in md.Messages: yield from VisitMessageDecls(m)
|
||||
//
|
||||
// The traversal starts at the root file descriptor and yields each direct
|
||||
// declaration within each node before traversing into sub-declarations
|
||||
// that children themselves may have.
|
||||
type Builder struct {
|
||||
// File is the underlying file descriptor builder.
|
||||
File filedesc.Builder
|
||||
|
||||
// GoTypes is a unique set of the Go types for all declarations and
|
||||
// dependencies. Each type is represented as a zero value of the Go type.
|
||||
//
|
||||
// Declarations are Go types generated for enums and messages directly
|
||||
// declared (not publicly imported) in the proto source file.
|
||||
// Messages for map entries are accounted for, but represented by nil.
|
||||
// Enum declarations in "flattened ordering" come first, followed by
|
||||
// message declarations in "flattened ordering".
|
||||
//
|
||||
// Dependencies are Go types for enums or messages referenced by
|
||||
// message fields, for parent extended messages of
|
||||
// extension fields, for enums or messages referenced by extension fields,
|
||||
// and for input and output messages referenced by service methods.
|
||||
// Dependencies must come after declarations, but the ordering of
|
||||
// dependencies themselves is unspecified.
|
||||
GoTypes []any
|
||||
|
||||
// DependencyIndexes is an ordered list of indexes into GoTypes for the
|
||||
// dependencies of messages, extensions, or services.
|
||||
//
|
||||
// There are 5 sub-lists in "flattened ordering" concatenated back-to-back:
|
||||
// 0. Message field dependencies: list of the enum or message type
|
||||
// referred to by every message field.
|
||||
// 1. Extension field targets: list of the extended parent message of
|
||||
// every extension.
|
||||
// 2. Extension field dependencies: list of the enum or message type
|
||||
// referred to by every extension field.
|
||||
// 3. Service method inputs: list of the input message type
|
||||
// referred to by every service method.
|
||||
// 4. Service method outputs: list of the output message type
|
||||
// referred to by every service method.
|
||||
//
|
||||
// The offset into DependencyIndexes for the start of each sub-list
|
||||
// is appended to the end in reverse order.
|
||||
DependencyIndexes []int32
|
||||
|
||||
// EnumInfos is a list of enum infos in "flattened ordering".
|
||||
EnumInfos []pimpl.EnumInfo
|
||||
|
||||
// MessageInfos is a list of message infos in "flattened ordering".
|
||||
// If provided, the GoType and PBType for each element is populated.
|
||||
//
|
||||
// Requirement: len(MessageInfos) == len(Build.Messages)
|
||||
MessageInfos []pimpl.MessageInfo
|
||||
|
||||
// ExtensionInfos is a list of extension infos in "flattened ordering".
|
||||
// Each element is initialized and registered with the protoregistry package.
|
||||
//
|
||||
// Requirement: len(LegacyExtensions) == len(Build.Extensions)
|
||||
ExtensionInfos []pimpl.ExtensionInfo
|
||||
|
||||
// TypeRegistry is the registry to register each type descriptor.
|
||||
// If nil, it uses protoregistry.GlobalTypes.
|
||||
TypeRegistry interface {
|
||||
RegisterMessage(protoreflect.MessageType) error
|
||||
RegisterEnum(protoreflect.EnumType) error
|
||||
RegisterExtension(protoreflect.ExtensionType) error
|
||||
}
|
||||
}
|
||||
|
||||
// Out is the output of the builder.
|
||||
type Out struct {
|
||||
File protoreflect.FileDescriptor
|
||||
}
|
||||
|
||||
func (tb Builder) Build() (out Out) {
|
||||
// Replace the resolver with one that resolves dependencies by index,
|
||||
// which is faster and more reliable than relying on the global registry.
|
||||
if tb.File.FileRegistry == nil {
|
||||
tb.File.FileRegistry = protoregistry.GlobalFiles
|
||||
}
|
||||
tb.File.FileRegistry = &resolverByIndex{
|
||||
goTypes: tb.GoTypes,
|
||||
depIdxs: tb.DependencyIndexes,
|
||||
fileRegistry: tb.File.FileRegistry,
|
||||
}
|
||||
|
||||
// Initialize registry if unpopulated.
|
||||
if tb.TypeRegistry == nil {
|
||||
tb.TypeRegistry = protoregistry.GlobalTypes
|
||||
}
|
||||
|
||||
fbOut := tb.File.Build()
|
||||
out.File = fbOut.File
|
||||
|
||||
// Process enums.
|
||||
enumGoTypes := tb.GoTypes[:len(fbOut.Enums)]
|
||||
if len(tb.EnumInfos) != len(fbOut.Enums) {
|
||||
panic("mismatching enum lengths")
|
||||
}
|
||||
if len(fbOut.Enums) > 0 {
|
||||
for i := range fbOut.Enums {
|
||||
tb.EnumInfos[i] = pimpl.EnumInfo{
|
||||
GoReflectType: reflect.TypeOf(enumGoTypes[i]),
|
||||
Desc: &fbOut.Enums[i],
|
||||
}
|
||||
// Register enum types.
|
||||
if err := tb.TypeRegistry.RegisterEnum(&tb.EnumInfos[i]); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process messages.
|
||||
messageGoTypes := tb.GoTypes[len(fbOut.Enums):][:len(fbOut.Messages)]
|
||||
if len(tb.MessageInfos) != len(fbOut.Messages) {
|
||||
panic("mismatching message lengths")
|
||||
}
|
||||
if len(fbOut.Messages) > 0 {
|
||||
for i := range fbOut.Messages {
|
||||
if messageGoTypes[i] == nil {
|
||||
continue // skip map entry
|
||||
}
|
||||
|
||||
tb.MessageInfos[i].GoReflectType = reflect.TypeOf(messageGoTypes[i])
|
||||
tb.MessageInfos[i].Desc = &fbOut.Messages[i]
|
||||
|
||||
// Register message types.
|
||||
if err := tb.TypeRegistry.RegisterMessage(&tb.MessageInfos[i]); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// As a special-case for descriptor.proto,
|
||||
// locally register concrete message type for the options.
|
||||
if out.File.Path() == "google/protobuf/descriptor.proto" && out.File.Package() == "google.protobuf" {
|
||||
for i := range fbOut.Messages {
|
||||
switch fbOut.Messages[i].Name() {
|
||||
case "FileOptions":
|
||||
descopts.File = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "EnumOptions":
|
||||
descopts.Enum = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "EnumValueOptions":
|
||||
descopts.EnumValue = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "MessageOptions":
|
||||
descopts.Message = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "FieldOptions":
|
||||
descopts.Field = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "OneofOptions":
|
||||
descopts.Oneof = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "ExtensionRangeOptions":
|
||||
descopts.ExtensionRange = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "ServiceOptions":
|
||||
descopts.Service = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
case "MethodOptions":
|
||||
descopts.Method = messageGoTypes[i].(protoreflect.ProtoMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Process extensions.
|
||||
if len(tb.ExtensionInfos) != len(fbOut.Extensions) {
|
||||
panic("mismatching extension lengths")
|
||||
}
|
||||
var depIdx int32
|
||||
for i := range fbOut.Extensions {
|
||||
// For enum and message kinds, determine the referent Go type so
|
||||
// that we can construct their constructors.
|
||||
const listExtDeps = 2
|
||||
var goType reflect.Type
|
||||
switch fbOut.Extensions[i].L1.Kind {
|
||||
case protoreflect.EnumKind:
|
||||
j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx)
|
||||
goType = reflect.TypeOf(tb.GoTypes[j])
|
||||
depIdx++
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
j := depIdxs.Get(tb.DependencyIndexes, listExtDeps, depIdx)
|
||||
goType = reflect.TypeOf(tb.GoTypes[j])
|
||||
depIdx++
|
||||
default:
|
||||
goType = goTypeForPBKind[fbOut.Extensions[i].L1.Kind]
|
||||
}
|
||||
if fbOut.Extensions[i].IsList() {
|
||||
goType = reflect.SliceOf(goType)
|
||||
}
|
||||
|
||||
pimpl.InitExtensionInfo(&tb.ExtensionInfos[i], &fbOut.Extensions[i], goType)
|
||||
|
||||
// Register extension types.
|
||||
if err := tb.TypeRegistry.RegisterExtension(&tb.ExtensionInfos[i]); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
var goTypeForPBKind = map[protoreflect.Kind]reflect.Type{
|
||||
protoreflect.BoolKind: reflect.TypeOf(bool(false)),
|
||||
protoreflect.Int32Kind: reflect.TypeOf(int32(0)),
|
||||
protoreflect.Sint32Kind: reflect.TypeOf(int32(0)),
|
||||
protoreflect.Sfixed32Kind: reflect.TypeOf(int32(0)),
|
||||
protoreflect.Int64Kind: reflect.TypeOf(int64(0)),
|
||||
protoreflect.Sint64Kind: reflect.TypeOf(int64(0)),
|
||||
protoreflect.Sfixed64Kind: reflect.TypeOf(int64(0)),
|
||||
protoreflect.Uint32Kind: reflect.TypeOf(uint32(0)),
|
||||
protoreflect.Fixed32Kind: reflect.TypeOf(uint32(0)),
|
||||
protoreflect.Uint64Kind: reflect.TypeOf(uint64(0)),
|
||||
protoreflect.Fixed64Kind: reflect.TypeOf(uint64(0)),
|
||||
protoreflect.FloatKind: reflect.TypeOf(float32(0)),
|
||||
protoreflect.DoubleKind: reflect.TypeOf(float64(0)),
|
||||
protoreflect.StringKind: reflect.TypeOf(string("")),
|
||||
protoreflect.BytesKind: reflect.TypeOf([]byte(nil)),
|
||||
}
|
||||
|
||||
type depIdxs []int32
|
||||
|
||||
// Get retrieves the jth element of the ith sub-list.
|
||||
func (x depIdxs) Get(i, j int32) int32 {
|
||||
return x[x[int32(len(x))-i-1]+j]
|
||||
}
|
||||
|
||||
type (
|
||||
resolverByIndex struct {
|
||||
goTypes []any
|
||||
depIdxs depIdxs
|
||||
fileRegistry
|
||||
}
|
||||
fileRegistry interface {
|
||||
FindFileByPath(string) (protoreflect.FileDescriptor, error)
|
||||
FindDescriptorByName(protoreflect.FullName) (protoreflect.Descriptor, error)
|
||||
RegisterFile(protoreflect.FileDescriptor) error
|
||||
}
|
||||
)
|
||||
|
||||
func (r *resolverByIndex) FindEnumByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.EnumDescriptor {
|
||||
if depIdx := int(r.depIdxs.Get(i, j)); int(depIdx) < len(es)+len(ms) {
|
||||
return &es[depIdx]
|
||||
} else {
|
||||
return pimpl.Export{}.EnumDescriptorOf(r.goTypes[depIdx])
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolverByIndex) FindMessageByIndex(i, j int32, es []filedesc.Enum, ms []filedesc.Message) protoreflect.MessageDescriptor {
|
||||
if depIdx := int(r.depIdxs.Get(i, j)); depIdx < len(es)+len(ms) {
|
||||
return &ms[depIdx-len(es)]
|
||||
} else {
|
||||
return pimpl.Export{}.MessageDescriptorOf(r.goTypes[depIdx])
|
||||
}
|
||||
}
|
24
e2e/vendor/google.golang.org/protobuf/internal/flags/flags.go
generated
vendored
Normal file
24
e2e/vendor/google.golang.org/protobuf/internal/flags/flags.go
generated
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package flags provides a set of flags controlled by build tags.
|
||||
package flags
|
||||
|
||||
// ProtoLegacy specifies whether to enable support for legacy functionality
|
||||
// such as MessageSets, and various other obscure behavior
|
||||
// that is necessary to maintain backwards compatibility with proto1 or
|
||||
// the pre-release variants of proto2 and proto3.
|
||||
//
|
||||
// This is disabled by default unless built with the "protolegacy" tag.
|
||||
//
|
||||
// WARNING: The compatibility agreement covers nothing provided by this flag.
|
||||
// As such, functionality may suddenly be removed or changed at our discretion.
|
||||
const ProtoLegacy = protoLegacy
|
||||
|
||||
// LazyUnmarshalExtensions specifies whether to lazily unmarshal extensions.
|
||||
//
|
||||
// Lazy extension unmarshaling validates the contents of message-valued
|
||||
// extension fields at unmarshal time, but defers creating the message
|
||||
// structure until the extension is first accessed.
|
||||
const LazyUnmarshalExtensions = ProtoLegacy
|
10
e2e/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go
generated
vendored
Normal file
10
e2e/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build !protolegacy
|
||||
// +build !protolegacy
|
||||
|
||||
package flags
|
||||
|
||||
const protoLegacy = false
|
10
e2e/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go
generated
vendored
Normal file
10
e2e/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build protolegacy
|
||||
// +build protolegacy
|
||||
|
||||
package flags
|
||||
|
||||
const protoLegacy = true
|
34
e2e/vendor/google.golang.org/protobuf/internal/genid/any_gen.go
generated
vendored
Normal file
34
e2e/vendor/google.golang.org/protobuf/internal/genid/any_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_any_proto = "google/protobuf/any.proto"
|
||||
|
||||
// Names for google.protobuf.Any.
|
||||
const (
|
||||
Any_message_name protoreflect.Name = "Any"
|
||||
Any_message_fullname protoreflect.FullName = "google.protobuf.Any"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Any.
|
||||
const (
|
||||
Any_TypeUrl_field_name protoreflect.Name = "type_url"
|
||||
Any_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Any_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Any.type_url"
|
||||
Any_Value_field_fullname protoreflect.FullName = "google.protobuf.Any.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Any.
|
||||
const (
|
||||
Any_TypeUrl_field_number protoreflect.FieldNumber = 1
|
||||
Any_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
106
e2e/vendor/google.golang.org/protobuf/internal/genid/api_gen.go
generated
vendored
Normal file
106
e2e/vendor/google.golang.org/protobuf/internal/genid/api_gen.go
generated
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_api_proto = "google/protobuf/api.proto"
|
||||
|
||||
// Names for google.protobuf.Api.
|
||||
const (
|
||||
Api_message_name protoreflect.Name = "Api"
|
||||
Api_message_fullname protoreflect.FullName = "google.protobuf.Api"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Api.
|
||||
const (
|
||||
Api_Name_field_name protoreflect.Name = "name"
|
||||
Api_Methods_field_name protoreflect.Name = "methods"
|
||||
Api_Options_field_name protoreflect.Name = "options"
|
||||
Api_Version_field_name protoreflect.Name = "version"
|
||||
Api_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Api_Mixins_field_name protoreflect.Name = "mixins"
|
||||
Api_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Api_Name_field_fullname protoreflect.FullName = "google.protobuf.Api.name"
|
||||
Api_Methods_field_fullname protoreflect.FullName = "google.protobuf.Api.methods"
|
||||
Api_Options_field_fullname protoreflect.FullName = "google.protobuf.Api.options"
|
||||
Api_Version_field_fullname protoreflect.FullName = "google.protobuf.Api.version"
|
||||
Api_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Api.source_context"
|
||||
Api_Mixins_field_fullname protoreflect.FullName = "google.protobuf.Api.mixins"
|
||||
Api_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Api.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Api.
|
||||
const (
|
||||
Api_Name_field_number protoreflect.FieldNumber = 1
|
||||
Api_Methods_field_number protoreflect.FieldNumber = 2
|
||||
Api_Options_field_number protoreflect.FieldNumber = 3
|
||||
Api_Version_field_number protoreflect.FieldNumber = 4
|
||||
Api_SourceContext_field_number protoreflect.FieldNumber = 5
|
||||
Api_Mixins_field_number protoreflect.FieldNumber = 6
|
||||
Api_Syntax_field_number protoreflect.FieldNumber = 7
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Method.
|
||||
const (
|
||||
Method_message_name protoreflect.Name = "Method"
|
||||
Method_message_fullname protoreflect.FullName = "google.protobuf.Method"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Method.
|
||||
const (
|
||||
Method_Name_field_name protoreflect.Name = "name"
|
||||
Method_RequestTypeUrl_field_name protoreflect.Name = "request_type_url"
|
||||
Method_RequestStreaming_field_name protoreflect.Name = "request_streaming"
|
||||
Method_ResponseTypeUrl_field_name protoreflect.Name = "response_type_url"
|
||||
Method_ResponseStreaming_field_name protoreflect.Name = "response_streaming"
|
||||
Method_Options_field_name protoreflect.Name = "options"
|
||||
Method_Syntax_field_name protoreflect.Name = "syntax"
|
||||
|
||||
Method_Name_field_fullname protoreflect.FullName = "google.protobuf.Method.name"
|
||||
Method_RequestTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.request_type_url"
|
||||
Method_RequestStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.request_streaming"
|
||||
Method_ResponseTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.response_type_url"
|
||||
Method_ResponseStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.response_streaming"
|
||||
Method_Options_field_fullname protoreflect.FullName = "google.protobuf.Method.options"
|
||||
Method_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Method.syntax"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Method.
|
||||
const (
|
||||
Method_Name_field_number protoreflect.FieldNumber = 1
|
||||
Method_RequestTypeUrl_field_number protoreflect.FieldNumber = 2
|
||||
Method_RequestStreaming_field_number protoreflect.FieldNumber = 3
|
||||
Method_ResponseTypeUrl_field_number protoreflect.FieldNumber = 4
|
||||
Method_ResponseStreaming_field_number protoreflect.FieldNumber = 5
|
||||
Method_Options_field_number protoreflect.FieldNumber = 6
|
||||
Method_Syntax_field_number protoreflect.FieldNumber = 7
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_message_name protoreflect.Name = "Mixin"
|
||||
Mixin_message_fullname protoreflect.FullName = "google.protobuf.Mixin"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_Name_field_name protoreflect.Name = "name"
|
||||
Mixin_Root_field_name protoreflect.Name = "root"
|
||||
|
||||
Mixin_Name_field_fullname protoreflect.FullName = "google.protobuf.Mixin.name"
|
||||
Mixin_Root_field_fullname protoreflect.FullName = "google.protobuf.Mixin.root"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Mixin.
|
||||
const (
|
||||
Mixin_Name_field_number protoreflect.FieldNumber = 1
|
||||
Mixin_Root_field_number protoreflect.FieldNumber = 2
|
||||
)
|
1270
e2e/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
generated
vendored
Normal file
1270
e2e/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
11
e2e/vendor/google.golang.org/protobuf/internal/genid/doc.go
generated
vendored
Normal file
11
e2e/vendor/google.golang.org/protobuf/internal/genid/doc.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package genid contains constants for declarations in descriptor.proto
|
||||
// and the well-known types.
|
||||
package genid
|
||||
|
||||
import "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
const GoogleProtobuf_package protoreflect.FullName = "google.protobuf"
|
34
e2e/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
generated
vendored
Normal file
34
e2e/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_duration_proto = "google/protobuf/duration.proto"
|
||||
|
||||
// Names for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_message_name protoreflect.Name = "Duration"
|
||||
Duration_message_fullname protoreflect.FullName = "google.protobuf.Duration"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_Seconds_field_name protoreflect.Name = "seconds"
|
||||
Duration_Nanos_field_name protoreflect.Name = "nanos"
|
||||
|
||||
Duration_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Duration.seconds"
|
||||
Duration_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Duration.nanos"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Duration.
|
||||
const (
|
||||
Duration_Seconds_field_number protoreflect.FieldNumber = 1
|
||||
Duration_Nanos_field_number protoreflect.FieldNumber = 2
|
||||
)
|
19
e2e/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
generated
vendored
Normal file
19
e2e/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_empty_proto = "google/protobuf/empty.proto"
|
||||
|
||||
// Names for google.protobuf.Empty.
|
||||
const (
|
||||
Empty_message_name protoreflect.Name = "Empty"
|
||||
Empty_message_fullname protoreflect.FullName = "google.protobuf.Empty"
|
||||
)
|
31
e2e/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
generated
vendored
Normal file
31
e2e/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_field_mask_proto = "google/protobuf/field_mask.proto"
|
||||
|
||||
// Names for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_message_name protoreflect.Name = "FieldMask"
|
||||
FieldMask_message_fullname protoreflect.FullName = "google.protobuf.FieldMask"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_Paths_field_name protoreflect.Name = "paths"
|
||||
|
||||
FieldMask_Paths_field_fullname protoreflect.FullName = "google.protobuf.FieldMask.paths"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FieldMask.
|
||||
const (
|
||||
FieldMask_Paths_field_number protoreflect.FieldNumber = 1
|
||||
)
|
70
e2e/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go
generated
vendored
Normal file
70
e2e/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go
generated
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_go_features_proto = "google/protobuf/go_features.proto"
|
||||
|
||||
// Names for pb.GoFeatures.
|
||||
const (
|
||||
GoFeatures_message_name protoreflect.Name = "GoFeatures"
|
||||
GoFeatures_message_fullname protoreflect.FullName = "pb.GoFeatures"
|
||||
)
|
||||
|
||||
// Field names for pb.GoFeatures.
|
||||
const (
|
||||
GoFeatures_LegacyUnmarshalJsonEnum_field_name protoreflect.Name = "legacy_unmarshal_json_enum"
|
||||
GoFeatures_ApiLevel_field_name protoreflect.Name = "api_level"
|
||||
GoFeatures_StripEnumPrefix_field_name protoreflect.Name = "strip_enum_prefix"
|
||||
|
||||
GoFeatures_LegacyUnmarshalJsonEnum_field_fullname protoreflect.FullName = "pb.GoFeatures.legacy_unmarshal_json_enum"
|
||||
GoFeatures_ApiLevel_field_fullname protoreflect.FullName = "pb.GoFeatures.api_level"
|
||||
GoFeatures_StripEnumPrefix_field_fullname protoreflect.FullName = "pb.GoFeatures.strip_enum_prefix"
|
||||
)
|
||||
|
||||
// Field numbers for pb.GoFeatures.
|
||||
const (
|
||||
GoFeatures_LegacyUnmarshalJsonEnum_field_number protoreflect.FieldNumber = 1
|
||||
GoFeatures_ApiLevel_field_number protoreflect.FieldNumber = 2
|
||||
GoFeatures_StripEnumPrefix_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Full and short names for pb.GoFeatures.APILevel.
|
||||
const (
|
||||
GoFeatures_APILevel_enum_fullname = "pb.GoFeatures.APILevel"
|
||||
GoFeatures_APILevel_enum_name = "APILevel"
|
||||
)
|
||||
|
||||
// Enum values for pb.GoFeatures.APILevel.
|
||||
const (
|
||||
GoFeatures_API_LEVEL_UNSPECIFIED_enum_value = 0
|
||||
GoFeatures_API_OPEN_enum_value = 1
|
||||
GoFeatures_API_HYBRID_enum_value = 2
|
||||
GoFeatures_API_OPAQUE_enum_value = 3
|
||||
)
|
||||
|
||||
// Full and short names for pb.GoFeatures.StripEnumPrefix.
|
||||
const (
|
||||
GoFeatures_StripEnumPrefix_enum_fullname = "pb.GoFeatures.StripEnumPrefix"
|
||||
GoFeatures_StripEnumPrefix_enum_name = "StripEnumPrefix"
|
||||
)
|
||||
|
||||
// Enum values for pb.GoFeatures.StripEnumPrefix.
|
||||
const (
|
||||
GoFeatures_STRIP_ENUM_PREFIX_UNSPECIFIED_enum_value = 0
|
||||
GoFeatures_STRIP_ENUM_PREFIX_KEEP_enum_value = 1
|
||||
GoFeatures_STRIP_ENUM_PREFIX_GENERATE_BOTH_enum_value = 2
|
||||
GoFeatures_STRIP_ENUM_PREFIX_STRIP_enum_value = 3
|
||||
)
|
||||
|
||||
// Extension numbers
|
||||
const (
|
||||
FeatureSet_Go_ext_number protoreflect.FieldNumber = 1002
|
||||
)
|
20
e2e/vendor/google.golang.org/protobuf/internal/genid/goname.go
generated
vendored
Normal file
20
e2e/vendor/google.golang.org/protobuf/internal/genid/goname.go
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package genid
|
||||
|
||||
// Go names of implementation-specific struct fields in generated messages.
|
||||
const (
|
||||
State_goname = "state"
|
||||
|
||||
SizeCache_goname = "sizeCache"
|
||||
SizeCacheA_goname = "XXX_sizecache"
|
||||
|
||||
UnknownFields_goname = "unknownFields"
|
||||
UnknownFieldsA_goname = "XXX_unrecognized"
|
||||
|
||||
ExtensionFields_goname = "extensionFields"
|
||||
ExtensionFieldsA_goname = "XXX_InternalExtensions"
|
||||
ExtensionFieldsB_goname = "XXX_extensions"
|
||||
)
|
16
e2e/vendor/google.golang.org/protobuf/internal/genid/map_entry.go
generated
vendored
Normal file
16
e2e/vendor/google.golang.org/protobuf/internal/genid/map_entry.go
generated
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package genid
|
||||
|
||||
import "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
// Generic field names and numbers for synthetic map entry messages.
|
||||
const (
|
||||
MapEntry_Key_field_name protoreflect.Name = "key"
|
||||
MapEntry_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
MapEntry_Key_field_number protoreflect.FieldNumber = 1
|
||||
MapEntry_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
12
e2e/vendor/google.golang.org/protobuf/internal/genid/name.go
generated
vendored
Normal file
12
e2e/vendor/google.golang.org/protobuf/internal/genid/name.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package genid
|
||||
|
||||
const (
|
||||
NoUnkeyedLiteral_goname = "noUnkeyedLiteral"
|
||||
NoUnkeyedLiteralA_goname = "XXX_NoUnkeyedLiteral"
|
||||
|
||||
BuilderSuffix_goname = "_builder"
|
||||
)
|
31
e2e/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
generated
vendored
Normal file
31
e2e/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_source_context_proto = "google/protobuf/source_context.proto"
|
||||
|
||||
// Names for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_message_name protoreflect.Name = "SourceContext"
|
||||
SourceContext_message_fullname protoreflect.FullName = "google.protobuf.SourceContext"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_FileName_field_name protoreflect.Name = "file_name"
|
||||
|
||||
SourceContext_FileName_field_fullname protoreflect.FullName = "google.protobuf.SourceContext.file_name"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.SourceContext.
|
||||
const (
|
||||
SourceContext_FileName_field_number protoreflect.FieldNumber = 1
|
||||
)
|
121
e2e/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
generated
vendored
Normal file
121
e2e/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go
generated
vendored
Normal file
@ -0,0 +1,121 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_struct_proto = "google/protobuf/struct.proto"
|
||||
|
||||
// Full and short names for google.protobuf.NullValue.
|
||||
const (
|
||||
NullValue_enum_fullname = "google.protobuf.NullValue"
|
||||
NullValue_enum_name = "NullValue"
|
||||
)
|
||||
|
||||
// Enum values for google.protobuf.NullValue.
|
||||
const (
|
||||
NullValue_NULL_VALUE_enum_value = 0
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_message_name protoreflect.Name = "Struct"
|
||||
Struct_message_fullname protoreflect.FullName = "google.protobuf.Struct"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_Fields_field_name protoreflect.Name = "fields"
|
||||
|
||||
Struct_Fields_field_fullname protoreflect.FullName = "google.protobuf.Struct.fields"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Struct.
|
||||
const (
|
||||
Struct_Fields_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_message_name protoreflect.Name = "FieldsEntry"
|
||||
Struct_FieldsEntry_message_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_Key_field_name protoreflect.Name = "key"
|
||||
Struct_FieldsEntry_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Struct_FieldsEntry_Key_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.key"
|
||||
Struct_FieldsEntry_Value_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Struct.FieldsEntry.
|
||||
const (
|
||||
Struct_FieldsEntry_Key_field_number protoreflect.FieldNumber = 1
|
||||
Struct_FieldsEntry_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Value.
|
||||
const (
|
||||
Value_message_name protoreflect.Name = "Value"
|
||||
Value_message_fullname protoreflect.FullName = "google.protobuf.Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Value.
|
||||
const (
|
||||
Value_NullValue_field_name protoreflect.Name = "null_value"
|
||||
Value_NumberValue_field_name protoreflect.Name = "number_value"
|
||||
Value_StringValue_field_name protoreflect.Name = "string_value"
|
||||
Value_BoolValue_field_name protoreflect.Name = "bool_value"
|
||||
Value_StructValue_field_name protoreflect.Name = "struct_value"
|
||||
Value_ListValue_field_name protoreflect.Name = "list_value"
|
||||
|
||||
Value_NullValue_field_fullname protoreflect.FullName = "google.protobuf.Value.null_value"
|
||||
Value_NumberValue_field_fullname protoreflect.FullName = "google.protobuf.Value.number_value"
|
||||
Value_StringValue_field_fullname protoreflect.FullName = "google.protobuf.Value.string_value"
|
||||
Value_BoolValue_field_fullname protoreflect.FullName = "google.protobuf.Value.bool_value"
|
||||
Value_StructValue_field_fullname protoreflect.FullName = "google.protobuf.Value.struct_value"
|
||||
Value_ListValue_field_fullname protoreflect.FullName = "google.protobuf.Value.list_value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Value.
|
||||
const (
|
||||
Value_NullValue_field_number protoreflect.FieldNumber = 1
|
||||
Value_NumberValue_field_number protoreflect.FieldNumber = 2
|
||||
Value_StringValue_field_number protoreflect.FieldNumber = 3
|
||||
Value_BoolValue_field_number protoreflect.FieldNumber = 4
|
||||
Value_StructValue_field_number protoreflect.FieldNumber = 5
|
||||
Value_ListValue_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Oneof names for google.protobuf.Value.
|
||||
const (
|
||||
Value_Kind_oneof_name protoreflect.Name = "kind"
|
||||
|
||||
Value_Kind_oneof_fullname protoreflect.FullName = "google.protobuf.Value.kind"
|
||||
)
|
||||
|
||||
// Names for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_message_name protoreflect.Name = "ListValue"
|
||||
ListValue_message_fullname protoreflect.FullName = "google.protobuf.ListValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_Values_field_name protoreflect.Name = "values"
|
||||
|
||||
ListValue_Values_field_fullname protoreflect.FullName = "google.protobuf.ListValue.values"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.ListValue.
|
||||
const (
|
||||
ListValue_Values_field_number protoreflect.FieldNumber = 1
|
||||
)
|
34
e2e/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
generated
vendored
Normal file
34
e2e/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_timestamp_proto = "google/protobuf/timestamp.proto"
|
||||
|
||||
// Names for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_message_name protoreflect.Name = "Timestamp"
|
||||
Timestamp_message_fullname protoreflect.FullName = "google.protobuf.Timestamp"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_Seconds_field_name protoreflect.Name = "seconds"
|
||||
Timestamp_Nanos_field_name protoreflect.Name = "nanos"
|
||||
|
||||
Timestamp_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.seconds"
|
||||
Timestamp_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.nanos"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Timestamp.
|
||||
const (
|
||||
Timestamp_Seconds_field_number protoreflect.FieldNumber = 1
|
||||
Timestamp_Nanos_field_number protoreflect.FieldNumber = 2
|
||||
)
|
228
e2e/vendor/google.golang.org/protobuf/internal/genid/type_gen.go
generated
vendored
Normal file
228
e2e/vendor/google.golang.org/protobuf/internal/genid/type_gen.go
generated
vendored
Normal file
@ -0,0 +1,228 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_type_proto = "google/protobuf/type.proto"
|
||||
|
||||
// Full and short names for google.protobuf.Syntax.
|
||||
const (
|
||||
Syntax_enum_fullname = "google.protobuf.Syntax"
|
||||
Syntax_enum_name = "Syntax"
|
||||
)
|
||||
|
||||
// Enum values for google.protobuf.Syntax.
|
||||
const (
|
||||
Syntax_SYNTAX_PROTO2_enum_value = 0
|
||||
Syntax_SYNTAX_PROTO3_enum_value = 1
|
||||
Syntax_SYNTAX_EDITIONS_enum_value = 2
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Type.
|
||||
const (
|
||||
Type_message_name protoreflect.Name = "Type"
|
||||
Type_message_fullname protoreflect.FullName = "google.protobuf.Type"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Type.
|
||||
const (
|
||||
Type_Name_field_name protoreflect.Name = "name"
|
||||
Type_Fields_field_name protoreflect.Name = "fields"
|
||||
Type_Oneofs_field_name protoreflect.Name = "oneofs"
|
||||
Type_Options_field_name protoreflect.Name = "options"
|
||||
Type_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Type_Syntax_field_name protoreflect.Name = "syntax"
|
||||
Type_Edition_field_name protoreflect.Name = "edition"
|
||||
|
||||
Type_Name_field_fullname protoreflect.FullName = "google.protobuf.Type.name"
|
||||
Type_Fields_field_fullname protoreflect.FullName = "google.protobuf.Type.fields"
|
||||
Type_Oneofs_field_fullname protoreflect.FullName = "google.protobuf.Type.oneofs"
|
||||
Type_Options_field_fullname protoreflect.FullName = "google.protobuf.Type.options"
|
||||
Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context"
|
||||
Type_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Type.syntax"
|
||||
Type_Edition_field_fullname protoreflect.FullName = "google.protobuf.Type.edition"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Type.
|
||||
const (
|
||||
Type_Name_field_number protoreflect.FieldNumber = 1
|
||||
Type_Fields_field_number protoreflect.FieldNumber = 2
|
||||
Type_Oneofs_field_number protoreflect.FieldNumber = 3
|
||||
Type_Options_field_number protoreflect.FieldNumber = 4
|
||||
Type_SourceContext_field_number protoreflect.FieldNumber = 5
|
||||
Type_Syntax_field_number protoreflect.FieldNumber = 6
|
||||
Type_Edition_field_number protoreflect.FieldNumber = 7
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Field.
|
||||
const (
|
||||
Field_message_name protoreflect.Name = "Field"
|
||||
Field_message_fullname protoreflect.FullName = "google.protobuf.Field"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Field.
|
||||
const (
|
||||
Field_Kind_field_name protoreflect.Name = "kind"
|
||||
Field_Cardinality_field_name protoreflect.Name = "cardinality"
|
||||
Field_Number_field_name protoreflect.Name = "number"
|
||||
Field_Name_field_name protoreflect.Name = "name"
|
||||
Field_TypeUrl_field_name protoreflect.Name = "type_url"
|
||||
Field_OneofIndex_field_name protoreflect.Name = "oneof_index"
|
||||
Field_Packed_field_name protoreflect.Name = "packed"
|
||||
Field_Options_field_name protoreflect.Name = "options"
|
||||
Field_JsonName_field_name protoreflect.Name = "json_name"
|
||||
Field_DefaultValue_field_name protoreflect.Name = "default_value"
|
||||
|
||||
Field_Kind_field_fullname protoreflect.FullName = "google.protobuf.Field.kind"
|
||||
Field_Cardinality_field_fullname protoreflect.FullName = "google.protobuf.Field.cardinality"
|
||||
Field_Number_field_fullname protoreflect.FullName = "google.protobuf.Field.number"
|
||||
Field_Name_field_fullname protoreflect.FullName = "google.protobuf.Field.name"
|
||||
Field_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Field.type_url"
|
||||
Field_OneofIndex_field_fullname protoreflect.FullName = "google.protobuf.Field.oneof_index"
|
||||
Field_Packed_field_fullname protoreflect.FullName = "google.protobuf.Field.packed"
|
||||
Field_Options_field_fullname protoreflect.FullName = "google.protobuf.Field.options"
|
||||
Field_JsonName_field_fullname protoreflect.FullName = "google.protobuf.Field.json_name"
|
||||
Field_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.Field.default_value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Field.
|
||||
const (
|
||||
Field_Kind_field_number protoreflect.FieldNumber = 1
|
||||
Field_Cardinality_field_number protoreflect.FieldNumber = 2
|
||||
Field_Number_field_number protoreflect.FieldNumber = 3
|
||||
Field_Name_field_number protoreflect.FieldNumber = 4
|
||||
Field_TypeUrl_field_number protoreflect.FieldNumber = 6
|
||||
Field_OneofIndex_field_number protoreflect.FieldNumber = 7
|
||||
Field_Packed_field_number protoreflect.FieldNumber = 8
|
||||
Field_Options_field_number protoreflect.FieldNumber = 9
|
||||
Field_JsonName_field_number protoreflect.FieldNumber = 10
|
||||
Field_DefaultValue_field_number protoreflect.FieldNumber = 11
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.Field.Kind.
|
||||
const (
|
||||
Field_Kind_enum_fullname = "google.protobuf.Field.Kind"
|
||||
Field_Kind_enum_name = "Kind"
|
||||
)
|
||||
|
||||
// Enum values for google.protobuf.Field.Kind.
|
||||
const (
|
||||
Field_TYPE_UNKNOWN_enum_value = 0
|
||||
Field_TYPE_DOUBLE_enum_value = 1
|
||||
Field_TYPE_FLOAT_enum_value = 2
|
||||
Field_TYPE_INT64_enum_value = 3
|
||||
Field_TYPE_UINT64_enum_value = 4
|
||||
Field_TYPE_INT32_enum_value = 5
|
||||
Field_TYPE_FIXED64_enum_value = 6
|
||||
Field_TYPE_FIXED32_enum_value = 7
|
||||
Field_TYPE_BOOL_enum_value = 8
|
||||
Field_TYPE_STRING_enum_value = 9
|
||||
Field_TYPE_GROUP_enum_value = 10
|
||||
Field_TYPE_MESSAGE_enum_value = 11
|
||||
Field_TYPE_BYTES_enum_value = 12
|
||||
Field_TYPE_UINT32_enum_value = 13
|
||||
Field_TYPE_ENUM_enum_value = 14
|
||||
Field_TYPE_SFIXED32_enum_value = 15
|
||||
Field_TYPE_SFIXED64_enum_value = 16
|
||||
Field_TYPE_SINT32_enum_value = 17
|
||||
Field_TYPE_SINT64_enum_value = 18
|
||||
)
|
||||
|
||||
// Full and short names for google.protobuf.Field.Cardinality.
|
||||
const (
|
||||
Field_Cardinality_enum_fullname = "google.protobuf.Field.Cardinality"
|
||||
Field_Cardinality_enum_name = "Cardinality"
|
||||
)
|
||||
|
||||
// Enum values for google.protobuf.Field.Cardinality.
|
||||
const (
|
||||
Field_CARDINALITY_UNKNOWN_enum_value = 0
|
||||
Field_CARDINALITY_OPTIONAL_enum_value = 1
|
||||
Field_CARDINALITY_REQUIRED_enum_value = 2
|
||||
Field_CARDINALITY_REPEATED_enum_value = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_message_name protoreflect.Name = "Enum"
|
||||
Enum_message_fullname protoreflect.FullName = "google.protobuf.Enum"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_Name_field_name protoreflect.Name = "name"
|
||||
Enum_Enumvalue_field_name protoreflect.Name = "enumvalue"
|
||||
Enum_Options_field_name protoreflect.Name = "options"
|
||||
Enum_SourceContext_field_name protoreflect.Name = "source_context"
|
||||
Enum_Syntax_field_name protoreflect.Name = "syntax"
|
||||
Enum_Edition_field_name protoreflect.Name = "edition"
|
||||
|
||||
Enum_Name_field_fullname protoreflect.FullName = "google.protobuf.Enum.name"
|
||||
Enum_Enumvalue_field_fullname protoreflect.FullName = "google.protobuf.Enum.enumvalue"
|
||||
Enum_Options_field_fullname protoreflect.FullName = "google.protobuf.Enum.options"
|
||||
Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context"
|
||||
Enum_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Enum.syntax"
|
||||
Enum_Edition_field_fullname protoreflect.FullName = "google.protobuf.Enum.edition"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Enum.
|
||||
const (
|
||||
Enum_Name_field_number protoreflect.FieldNumber = 1
|
||||
Enum_Enumvalue_field_number protoreflect.FieldNumber = 2
|
||||
Enum_Options_field_number protoreflect.FieldNumber = 3
|
||||
Enum_SourceContext_field_number protoreflect.FieldNumber = 4
|
||||
Enum_Syntax_field_number protoreflect.FieldNumber = 5
|
||||
Enum_Edition_field_number protoreflect.FieldNumber = 6
|
||||
)
|
||||
|
||||
// Names for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_message_name protoreflect.Name = "EnumValue"
|
||||
EnumValue_message_fullname protoreflect.FullName = "google.protobuf.EnumValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_Name_field_name protoreflect.Name = "name"
|
||||
EnumValue_Number_field_name protoreflect.Name = "number"
|
||||
EnumValue_Options_field_name protoreflect.Name = "options"
|
||||
|
||||
EnumValue_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.name"
|
||||
EnumValue_Number_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.number"
|
||||
EnumValue_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.options"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.EnumValue.
|
||||
const (
|
||||
EnumValue_Name_field_number protoreflect.FieldNumber = 1
|
||||
EnumValue_Number_field_number protoreflect.FieldNumber = 2
|
||||
EnumValue_Options_field_number protoreflect.FieldNumber = 3
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Option.
|
||||
const (
|
||||
Option_message_name protoreflect.Name = "Option"
|
||||
Option_message_fullname protoreflect.FullName = "google.protobuf.Option"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Option.
|
||||
const (
|
||||
Option_Name_field_name protoreflect.Name = "name"
|
||||
Option_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Option_Name_field_fullname protoreflect.FullName = "google.protobuf.Option.name"
|
||||
Option_Value_field_fullname protoreflect.FullName = "google.protobuf.Option.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Option.
|
||||
const (
|
||||
Option_Name_field_number protoreflect.FieldNumber = 1
|
||||
Option_Value_field_number protoreflect.FieldNumber = 2
|
||||
)
|
13
e2e/vendor/google.golang.org/protobuf/internal/genid/wrappers.go
generated
vendored
Normal file
13
e2e/vendor/google.golang.org/protobuf/internal/genid/wrappers.go
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package genid
|
||||
|
||||
import "google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
// Generic field name and number for messages in wrappers.proto.
|
||||
const (
|
||||
WrapperValue_Value_field_name protoreflect.Name = "value"
|
||||
WrapperValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
175
e2e/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
generated
vendored
Normal file
175
e2e/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go
generated
vendored
Normal file
@ -0,0 +1,175 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-protos. DO NOT EDIT.
|
||||
|
||||
package genid
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
const File_google_protobuf_wrappers_proto = "google/protobuf/wrappers.proto"
|
||||
|
||||
// Names for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_message_name protoreflect.Name = "DoubleValue"
|
||||
DoubleValue_message_fullname protoreflect.FullName = "google.protobuf.DoubleValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
DoubleValue_Value_field_fullname protoreflect.FullName = "google.protobuf.DoubleValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.DoubleValue.
|
||||
const (
|
||||
DoubleValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_message_name protoreflect.Name = "FloatValue"
|
||||
FloatValue_message_fullname protoreflect.FullName = "google.protobuf.FloatValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
FloatValue_Value_field_fullname protoreflect.FullName = "google.protobuf.FloatValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.FloatValue.
|
||||
const (
|
||||
FloatValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_message_name protoreflect.Name = "Int64Value"
|
||||
Int64Value_message_fullname protoreflect.FullName = "google.protobuf.Int64Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Int64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int64Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int64Value.
|
||||
const (
|
||||
Int64Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_message_name protoreflect.Name = "UInt64Value"
|
||||
UInt64Value_message_fullname protoreflect.FullName = "google.protobuf.UInt64Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
UInt64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt64Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt64Value.
|
||||
const (
|
||||
UInt64Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_message_name protoreflect.Name = "Int32Value"
|
||||
Int32Value_message_fullname protoreflect.FullName = "google.protobuf.Int32Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
Int32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int32Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.Int32Value.
|
||||
const (
|
||||
Int32Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_message_name protoreflect.Name = "UInt32Value"
|
||||
UInt32Value_message_fullname protoreflect.FullName = "google.protobuf.UInt32Value"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
UInt32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt32Value.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.UInt32Value.
|
||||
const (
|
||||
UInt32Value_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_message_name protoreflect.Name = "BoolValue"
|
||||
BoolValue_message_fullname protoreflect.FullName = "google.protobuf.BoolValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
BoolValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BoolValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BoolValue.
|
||||
const (
|
||||
BoolValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_message_name protoreflect.Name = "StringValue"
|
||||
StringValue_message_fullname protoreflect.FullName = "google.protobuf.StringValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
StringValue_Value_field_fullname protoreflect.FullName = "google.protobuf.StringValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.StringValue.
|
||||
const (
|
||||
StringValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
||||
|
||||
// Names for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_message_name protoreflect.Name = "BytesValue"
|
||||
BytesValue_message_fullname protoreflect.FullName = "google.protobuf.BytesValue"
|
||||
)
|
||||
|
||||
// Field names for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_Value_field_name protoreflect.Name = "value"
|
||||
|
||||
BytesValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BytesValue.value"
|
||||
)
|
||||
|
||||
// Field numbers for google.protobuf.BytesValue.
|
||||
const (
|
||||
BytesValue_Value_field_number protoreflect.FieldNumber = 1
|
||||
)
|
177
e2e/vendor/google.golang.org/protobuf/internal/impl/api_export.go
generated
vendored
Normal file
177
e2e/vendor/google.golang.org/protobuf/internal/impl/api_export.go
generated
vendored
Normal file
@ -0,0 +1,177 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
||||
"google.golang.org/protobuf/encoding/prototext"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// Export is a zero-length named type that exists only to export a set of
|
||||
// functions that we do not want to appear in godoc.
|
||||
type Export struct{}
|
||||
|
||||
// NewError formats a string according to the format specifier and arguments and
|
||||
// returns an error that has a "proto" prefix.
|
||||
func (Export) NewError(f string, x ...any) error {
|
||||
return errors.New(f, x...)
|
||||
}
|
||||
|
||||
// enum is any enum type generated by protoc-gen-go
|
||||
// and must be a named int32 type.
|
||||
type enum = any
|
||||
|
||||
// EnumOf returns the protoreflect.Enum interface over e.
|
||||
// It returns nil if e is nil.
|
||||
func (Export) EnumOf(e enum) protoreflect.Enum {
|
||||
switch e := e.(type) {
|
||||
case nil:
|
||||
return nil
|
||||
case protoreflect.Enum:
|
||||
return e
|
||||
default:
|
||||
return legacyWrapEnum(reflect.ValueOf(e))
|
||||
}
|
||||
}
|
||||
|
||||
// EnumDescriptorOf returns the protoreflect.EnumDescriptor for e.
|
||||
// It returns nil if e is nil.
|
||||
func (Export) EnumDescriptorOf(e enum) protoreflect.EnumDescriptor {
|
||||
switch e := e.(type) {
|
||||
case nil:
|
||||
return nil
|
||||
case protoreflect.Enum:
|
||||
return e.Descriptor()
|
||||
default:
|
||||
return LegacyLoadEnumDesc(reflect.TypeOf(e))
|
||||
}
|
||||
}
|
||||
|
||||
// EnumTypeOf returns the protoreflect.EnumType for e.
|
||||
// It returns nil if e is nil.
|
||||
func (Export) EnumTypeOf(e enum) protoreflect.EnumType {
|
||||
switch e := e.(type) {
|
||||
case nil:
|
||||
return nil
|
||||
case protoreflect.Enum:
|
||||
return e.Type()
|
||||
default:
|
||||
return legacyLoadEnumType(reflect.TypeOf(e))
|
||||
}
|
||||
}
|
||||
|
||||
// EnumStringOf returns the enum value as a string, either as the name if
|
||||
// the number is resolvable, or the number formatted as a string.
|
||||
func (Export) EnumStringOf(ed protoreflect.EnumDescriptor, n protoreflect.EnumNumber) string {
|
||||
ev := ed.Values().ByNumber(n)
|
||||
if ev != nil {
|
||||
return string(ev.Name())
|
||||
}
|
||||
return strconv.Itoa(int(n))
|
||||
}
|
||||
|
||||
// message is any message type generated by protoc-gen-go
|
||||
// and must be a pointer to a named struct type.
|
||||
type message = any
|
||||
|
||||
// legacyMessageWrapper wraps a v2 message as a v1 message.
|
||||
type legacyMessageWrapper struct{ m protoreflect.ProtoMessage }
|
||||
|
||||
func (m legacyMessageWrapper) Reset() { proto.Reset(m.m) }
|
||||
func (m legacyMessageWrapper) String() string { return Export{}.MessageStringOf(m.m) }
|
||||
func (m legacyMessageWrapper) ProtoMessage() {}
|
||||
|
||||
// ProtoMessageV1Of converts either a v1 or v2 message to a v1 message.
|
||||
// It returns nil if m is nil.
|
||||
func (Export) ProtoMessageV1Of(m message) protoiface.MessageV1 {
|
||||
switch mv := m.(type) {
|
||||
case nil:
|
||||
return nil
|
||||
case protoiface.MessageV1:
|
||||
return mv
|
||||
case unwrapper:
|
||||
return Export{}.ProtoMessageV1Of(mv.protoUnwrap())
|
||||
case protoreflect.ProtoMessage:
|
||||
return legacyMessageWrapper{mv}
|
||||
default:
|
||||
panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m))
|
||||
}
|
||||
}
|
||||
|
||||
func (Export) protoMessageV2Of(m message) protoreflect.ProtoMessage {
|
||||
switch mv := m.(type) {
|
||||
case nil:
|
||||
return nil
|
||||
case protoreflect.ProtoMessage:
|
||||
return mv
|
||||
case legacyMessageWrapper:
|
||||
return mv.m
|
||||
case protoiface.MessageV1:
|
||||
return nil
|
||||
default:
|
||||
panic(fmt.Sprintf("message %T is neither a v1 or v2 Message", m))
|
||||
}
|
||||
}
|
||||
|
||||
// ProtoMessageV2Of converts either a v1 or v2 message to a v2 message.
|
||||
// It returns nil if m is nil.
|
||||
func (Export) ProtoMessageV2Of(m message) protoreflect.ProtoMessage {
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
if mv := (Export{}).protoMessageV2Of(m); mv != nil {
|
||||
return mv
|
||||
}
|
||||
return legacyWrapMessage(reflect.ValueOf(m)).Interface()
|
||||
}
|
||||
|
||||
// MessageOf returns the protoreflect.Message interface over m.
|
||||
// It returns nil if m is nil.
|
||||
func (Export) MessageOf(m message) protoreflect.Message {
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
if mv := (Export{}).protoMessageV2Of(m); mv != nil {
|
||||
return mv.ProtoReflect()
|
||||
}
|
||||
return legacyWrapMessage(reflect.ValueOf(m))
|
||||
}
|
||||
|
||||
// MessageDescriptorOf returns the protoreflect.MessageDescriptor for m.
|
||||
// It returns nil if m is nil.
|
||||
func (Export) MessageDescriptorOf(m message) protoreflect.MessageDescriptor {
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
if mv := (Export{}).protoMessageV2Of(m); mv != nil {
|
||||
return mv.ProtoReflect().Descriptor()
|
||||
}
|
||||
return LegacyLoadMessageDesc(reflect.TypeOf(m))
|
||||
}
|
||||
|
||||
// MessageTypeOf returns the protoreflect.MessageType for m.
|
||||
// It returns nil if m is nil.
|
||||
func (Export) MessageTypeOf(m message) protoreflect.MessageType {
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
if mv := (Export{}).protoMessageV2Of(m); mv != nil {
|
||||
return mv.ProtoReflect().Type()
|
||||
}
|
||||
return legacyLoadMessageType(reflect.TypeOf(m), "")
|
||||
}
|
||||
|
||||
// MessageStringOf returns the message value as a string,
|
||||
// which is the message serialized in the protobuf text format.
|
||||
func (Export) MessageStringOf(m protoreflect.ProtoMessage) string {
|
||||
return prototext.MarshalOptions{Multiline: false}.Format(m)
|
||||
}
|
128
e2e/vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go
generated
vendored
Normal file
128
e2e/vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go
generated
vendored
Normal file
@ -0,0 +1,128 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func (Export) UnmarshalField(msg any, fieldNum int32) {
|
||||
UnmarshalField(msg.(protoreflect.ProtoMessage).ProtoReflect(), protoreflect.FieldNumber(fieldNum))
|
||||
}
|
||||
|
||||
// Present checks the presence set for a certain field number (zero
|
||||
// based, ordered by appearance in original proto file). part is
|
||||
// a pointer to the correct element in the bitmask array, num is the
|
||||
// field number unaltered. Example (field number 70 -> part =
|
||||
// &m.XXX_presence[1], num = 70)
|
||||
func (Export) Present(part *uint32, num uint32) bool {
|
||||
// This hook will read an unprotected shadow presence set if
|
||||
// we're unning under the race detector
|
||||
raceDetectHookPresent(part, num)
|
||||
return atomic.LoadUint32(part)&(1<<(num%32)) > 0
|
||||
}
|
||||
|
||||
// SetPresent adds a field to the presence set. part is a pointer to
|
||||
// the relevant element in the array and num is the field number
|
||||
// unaltered. size is the number of fields in the protocol
|
||||
// buffer.
|
||||
func (Export) SetPresent(part *uint32, num uint32, size uint32) {
|
||||
// This hook will mutate an unprotected shadow presence set if
|
||||
// we're running under the race detector
|
||||
raceDetectHookSetPresent(part, num, presenceSize(size))
|
||||
for {
|
||||
old := atomic.LoadUint32(part)
|
||||
if atomic.CompareAndSwapUint32(part, old, old|(1<<(num%32))) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SetPresentNonAtomic is like SetPresent, but operates non-atomically.
|
||||
// It is meant for use by builder methods, where the message is known not
|
||||
// to be accessible yet by other goroutines.
|
||||
func (Export) SetPresentNonAtomic(part *uint32, num uint32, size uint32) {
|
||||
// This hook will mutate an unprotected shadow presence set if
|
||||
// we're running under the race detector
|
||||
raceDetectHookSetPresent(part, num, presenceSize(size))
|
||||
*part |= 1 << (num % 32)
|
||||
}
|
||||
|
||||
// ClearPresence removes a field from the presence set. part is a
|
||||
// pointer to the relevant element in the presence array and num is
|
||||
// the field number unaltered.
|
||||
func (Export) ClearPresent(part *uint32, num uint32) {
|
||||
// This hook will mutate an unprotected shadow presence set if
|
||||
// we're running under the race detector
|
||||
raceDetectHookClearPresent(part, num)
|
||||
for {
|
||||
old := atomic.LoadUint32(part)
|
||||
if atomic.CompareAndSwapUint32(part, old, old&^(1<<(num%32))) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// interfaceToPointer takes a pointer to an empty interface whose value is a
|
||||
// pointer type, and converts it into a "pointer" that points to the same
|
||||
// target
|
||||
func interfaceToPointer(i *any) pointer {
|
||||
return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]}
|
||||
}
|
||||
|
||||
func (p pointer) atomicGetPointer() pointer {
|
||||
return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
|
||||
}
|
||||
|
||||
func (p pointer) atomicSetPointer(q pointer) {
|
||||
atomic.StorePointer((*unsafe.Pointer)(p.p), q.p)
|
||||
}
|
||||
|
||||
// AtomicCheckPointerIsNil takes an interface (which is a pointer to a
|
||||
// pointer) and returns true if the pointed-to pointer is nil (using an
|
||||
// atomic load). This function is inlineable and, on x86, just becomes a
|
||||
// simple load and compare.
|
||||
func (Export) AtomicCheckPointerIsNil(ptr any) bool {
|
||||
return interfaceToPointer(&ptr).atomicGetPointer().IsNil()
|
||||
}
|
||||
|
||||
// AtomicSetPointer takes two interfaces (first is a pointer to a pointer,
|
||||
// second is a pointer) and atomically sets the second pointer into location
|
||||
// referenced by first pointer. Unfortunately, atomicSetPointer() does not inline
|
||||
// (even on x86), so this does not become a simple store on x86.
|
||||
func (Export) AtomicSetPointer(dstPtr, valPtr any) {
|
||||
interfaceToPointer(&dstPtr).atomicSetPointer(interfaceToPointer(&valPtr))
|
||||
}
|
||||
|
||||
// AtomicLoadPointer loads the pointer at the location pointed at by src,
|
||||
// and stores that pointer value into the location pointed at by dst.
|
||||
func (Export) AtomicLoadPointer(ptr Pointer, dst Pointer) {
|
||||
*(*unsafe.Pointer)(unsafe.Pointer(dst)) = atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(ptr)))
|
||||
}
|
||||
|
||||
// AtomicInitializePointer makes ptr and dst point to the same value.
|
||||
//
|
||||
// If *ptr is a nil pointer, it sets *ptr = *dst.
|
||||
//
|
||||
// If *ptr is a non-nil pointer, it sets *dst = *ptr.
|
||||
func (Export) AtomicInitializePointer(ptr Pointer, dst Pointer) {
|
||||
if !atomic.CompareAndSwapPointer((*unsafe.Pointer)(ptr), unsafe.Pointer(nil), *(*unsafe.Pointer)(dst)) {
|
||||
*(*unsafe.Pointer)(unsafe.Pointer(dst)) = atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(ptr)))
|
||||
}
|
||||
}
|
||||
|
||||
// MessageFieldStringOf returns the field formatted as a string,
|
||||
// either as the field name if resolvable otherwise as a decimal string.
|
||||
func (Export) MessageFieldStringOf(md protoreflect.MessageDescriptor, n protoreflect.FieldNumber) string {
|
||||
fd := md.Fields().ByNumber(n)
|
||||
if fd != nil {
|
||||
return string(fd.Name())
|
||||
}
|
||||
return strconv.Itoa(int(n))
|
||||
}
|
34
e2e/vendor/google.golang.org/protobuf/internal/impl/bitmap.go
generated
vendored
Normal file
34
e2e/vendor/google.golang.org/protobuf/internal/impl/bitmap.go
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build !race
|
||||
|
||||
package impl
|
||||
|
||||
// There is no additional data as we're not running under race detector.
|
||||
type RaceDetectHookData struct{}
|
||||
|
||||
// Empty stubs for when not using the race detector. Calls to these from index.go should be optimized away.
|
||||
func (presence) raceDetectHookPresent(num uint32) {}
|
||||
func (presence) raceDetectHookSetPresent(num uint32, size presenceSize) {}
|
||||
func (presence) raceDetectHookClearPresent(num uint32) {}
|
||||
func (presence) raceDetectHookAllocAndCopy(src presence) {}
|
||||
|
||||
// raceDetectHookPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) Present to optionally read an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookPresent(field *uint32, num uint32) {}
|
||||
|
||||
// raceDetectHookSetPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) SetPresent to optionally write an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookSetPresent(field *uint32, num uint32, size presenceSize) {}
|
||||
|
||||
// raceDetectHookClearPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) ClearPresent to optionally write an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookClearPresent(field *uint32, num uint32) {}
|
126
e2e/vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go
generated
vendored
Normal file
126
e2e/vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go
generated
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build race
|
||||
|
||||
package impl
|
||||
|
||||
// When running under race detector, we add a presence map of bytes, that we can access
|
||||
// in the hook functions so that we trigger the race detection whenever we have concurrent
|
||||
// Read-Writes or Write-Writes. The race detector does not otherwise detect invalid concurrent
|
||||
// access to lazy fields as all updates of bitmaps and pointers are done using atomic operations.
|
||||
type RaceDetectHookData struct {
|
||||
shadowPresence *[]byte
|
||||
}
|
||||
|
||||
// Hooks for presence bitmap operations that allocate, read and write the shadowPresence
|
||||
// using non-atomic operations.
|
||||
func (data *RaceDetectHookData) raceDetectHookAlloc(size presenceSize) {
|
||||
sp := make([]byte, size)
|
||||
atomicStoreShadowPresence(&data.shadowPresence, &sp)
|
||||
}
|
||||
|
||||
func (p presence) raceDetectHookPresent(num uint32) {
|
||||
data := p.toRaceDetectData()
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp != nil {
|
||||
_ = (*sp)[num]
|
||||
}
|
||||
}
|
||||
|
||||
func (p presence) raceDetectHookSetPresent(num uint32, size presenceSize) {
|
||||
data := p.toRaceDetectData()
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp == nil {
|
||||
data.raceDetectHookAlloc(size)
|
||||
sp = atomicLoadShadowPresence(&data.shadowPresence)
|
||||
}
|
||||
(*sp)[num] = 1
|
||||
}
|
||||
|
||||
func (p presence) raceDetectHookClearPresent(num uint32) {
|
||||
data := p.toRaceDetectData()
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp != nil {
|
||||
(*sp)[num] = 0
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// raceDetectHookAllocAndCopy allocates a new shadowPresence slice at lazy and copies
|
||||
// shadowPresence bytes from src to lazy.
|
||||
func (p presence) raceDetectHookAllocAndCopy(q presence) {
|
||||
sData := q.toRaceDetectData()
|
||||
dData := p.toRaceDetectData()
|
||||
if sData == nil {
|
||||
return
|
||||
}
|
||||
srcSp := atomicLoadShadowPresence(&sData.shadowPresence)
|
||||
if srcSp == nil {
|
||||
atomicStoreShadowPresence(&dData.shadowPresence, nil)
|
||||
return
|
||||
}
|
||||
n := len(*srcSp)
|
||||
dSlice := make([]byte, n)
|
||||
atomicStoreShadowPresence(&dData.shadowPresence, &dSlice)
|
||||
for i := 0; i < n; i++ {
|
||||
dSlice[i] = (*srcSp)[i]
|
||||
}
|
||||
}
|
||||
|
||||
// raceDetectHookPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) Present to optionally read an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookPresent(field *uint32, num uint32) {
|
||||
data := findPointerToRaceDetectData(field, num)
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp != nil {
|
||||
_ = (*sp)[num]
|
||||
}
|
||||
}
|
||||
|
||||
// raceDetectHookSetPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) SetPresent to optionally write an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookSetPresent(field *uint32, num uint32, size presenceSize) {
|
||||
data := findPointerToRaceDetectData(field, num)
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp == nil {
|
||||
data.raceDetectHookAlloc(size)
|
||||
sp = atomicLoadShadowPresence(&data.shadowPresence)
|
||||
}
|
||||
(*sp)[num] = 1
|
||||
}
|
||||
|
||||
// raceDetectHookClearPresent is called by the generated file interface
|
||||
// (*proto.internalFuncs) ClearPresent to optionally write an unprotected
|
||||
// shadow bitmap when race detection is enabled. In regular code it is
|
||||
// a noop.
|
||||
func raceDetectHookClearPresent(field *uint32, num uint32) {
|
||||
data := findPointerToRaceDetectData(field, num)
|
||||
if data == nil {
|
||||
return
|
||||
}
|
||||
sp := atomicLoadShadowPresence(&data.shadowPresence)
|
||||
if sp != nil {
|
||||
(*sp)[num] = 0
|
||||
}
|
||||
}
|
174
e2e/vendor/google.golang.org/protobuf/internal/impl/checkinit.go
generated
vendored
Normal file
174
e2e/vendor/google.golang.org/protobuf/internal/impl/checkinit.go
generated
vendored
Normal file
@ -0,0 +1,174 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
func (mi *MessageInfo) checkInitialized(in protoiface.CheckInitializedInput) (protoiface.CheckInitializedOutput, error) {
|
||||
var p pointer
|
||||
if ms, ok := in.Message.(*messageState); ok {
|
||||
p = ms.pointer()
|
||||
} else {
|
||||
p = in.Message.(*messageReflectWrapper).pointer()
|
||||
}
|
||||
return protoiface.CheckInitializedOutput{}, mi.checkInitializedPointer(p)
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) checkInitializedPointer(p pointer) error {
|
||||
mi.init()
|
||||
if !mi.needsInitCheck {
|
||||
return nil
|
||||
}
|
||||
if p.IsNil() {
|
||||
for _, f := range mi.orderedCoderFields {
|
||||
if f.isRequired {
|
||||
return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName()))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var presence presence
|
||||
if mi.presenceOffset.IsValid() {
|
||||
presence = p.Apply(mi.presenceOffset).PresenceInfo()
|
||||
}
|
||||
|
||||
if mi.extensionOffset.IsValid() {
|
||||
e := p.Apply(mi.extensionOffset).Extensions()
|
||||
if err := mi.isInitExtensions(e); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
for _, f := range mi.orderedCoderFields {
|
||||
if !f.isRequired && f.funcs.isInit == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if f.presenceIndex != noPresence {
|
||||
if !presence.Present(f.presenceIndex) {
|
||||
if f.isRequired {
|
||||
return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName()))
|
||||
}
|
||||
continue
|
||||
}
|
||||
if f.funcs.isInit != nil {
|
||||
f.mi.init()
|
||||
if f.mi.needsInitCheck {
|
||||
if f.isLazy && p.Apply(f.offset).AtomicGetPointer().IsNil() {
|
||||
lazy := *p.Apply(mi.lazyOffset).LazyInfoPtr()
|
||||
if !lazy.AllowedPartial() {
|
||||
// Nothing to see here, it was checked on unmarshal
|
||||
continue
|
||||
}
|
||||
mi.lazyUnmarshal(p, f.num)
|
||||
}
|
||||
if err := f.funcs.isInit(p.Apply(f.offset), f); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
fptr := p.Apply(f.offset)
|
||||
if f.isPointer && fptr.Elem().IsNil() {
|
||||
if f.isRequired {
|
||||
return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName()))
|
||||
}
|
||||
continue
|
||||
}
|
||||
if f.funcs.isInit == nil {
|
||||
continue
|
||||
}
|
||||
if err := f.funcs.isInit(fptr, f); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) isInitExtensions(ext *map[int32]ExtensionField) error {
|
||||
if ext == nil {
|
||||
return nil
|
||||
}
|
||||
for _, x := range *ext {
|
||||
ei := getExtensionFieldInfo(x.Type())
|
||||
if ei.funcs.isInit == nil || x.isUnexpandedLazy() {
|
||||
continue
|
||||
}
|
||||
v := x.Value()
|
||||
if !v.IsValid() {
|
||||
continue
|
||||
}
|
||||
if err := ei.funcs.isInit(v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
needsInitCheckMu sync.Mutex
|
||||
needsInitCheckMap sync.Map
|
||||
)
|
||||
|
||||
// needsInitCheck reports whether a message needs to be checked for partial initialization.
|
||||
//
|
||||
// It returns true if the message transitively includes any required or extension fields.
|
||||
func needsInitCheck(md protoreflect.MessageDescriptor) bool {
|
||||
if v, ok := needsInitCheckMap.Load(md); ok {
|
||||
if has, ok := v.(bool); ok {
|
||||
return has
|
||||
}
|
||||
}
|
||||
needsInitCheckMu.Lock()
|
||||
defer needsInitCheckMu.Unlock()
|
||||
return needsInitCheckLocked(md)
|
||||
}
|
||||
|
||||
func needsInitCheckLocked(md protoreflect.MessageDescriptor) (has bool) {
|
||||
if v, ok := needsInitCheckMap.Load(md); ok {
|
||||
// If has is true, we've previously determined that this message
|
||||
// needs init checks.
|
||||
//
|
||||
// If has is false, we've previously determined that it can never
|
||||
// be uninitialized.
|
||||
//
|
||||
// If has is not a bool, we've just encountered a cycle in the
|
||||
// message graph. In this case, it is safe to return false: If
|
||||
// the message does have required fields, we'll detect them later
|
||||
// in the graph traversal.
|
||||
has, ok := v.(bool)
|
||||
return ok && has
|
||||
}
|
||||
needsInitCheckMap.Store(md, struct{}{}) // avoid cycles while descending into this message
|
||||
defer func() {
|
||||
needsInitCheckMap.Store(md, has)
|
||||
}()
|
||||
if md.RequiredNumbers().Len() > 0 {
|
||||
return true
|
||||
}
|
||||
if md.ExtensionRanges().Len() > 0 {
|
||||
return true
|
||||
}
|
||||
for i := 0; i < md.Fields().Len(); i++ {
|
||||
fd := md.Fields().Get(i)
|
||||
// Map keys are never messages, so just consider the map value.
|
||||
if fd.IsMap() {
|
||||
fd = fd.MapValue()
|
||||
}
|
||||
fmd := fd.Message()
|
||||
if fmd != nil && needsInitCheckLocked(fmd) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
228
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go
generated
vendored
Normal file
228
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go
generated
vendored
Normal file
@ -0,0 +1,228 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type extensionFieldInfo struct {
|
||||
wiretag uint64
|
||||
tagsize int
|
||||
unmarshalNeedsValue bool
|
||||
funcs valueCoderFuncs
|
||||
validation validationInfo
|
||||
}
|
||||
|
||||
func getExtensionFieldInfo(xt protoreflect.ExtensionType) *extensionFieldInfo {
|
||||
if xi, ok := xt.(*ExtensionInfo); ok {
|
||||
xi.lazyInit()
|
||||
return xi.info
|
||||
}
|
||||
// Ideally we'd cache the resulting *extensionFieldInfo so we don't have to
|
||||
// recompute this metadata repeatedly. But without support for something like
|
||||
// weak references, such a cache would pin temporary values (like dynamic
|
||||
// extension types, constructed for the duration of a user request) to the
|
||||
// heap forever, causing memory usage of the cache to grow unbounded.
|
||||
// See discussion in https://github.com/golang/protobuf/issues/1521.
|
||||
return makeExtensionFieldInfo(xt.TypeDescriptor())
|
||||
}
|
||||
|
||||
func makeExtensionFieldInfo(xd protoreflect.ExtensionDescriptor) *extensionFieldInfo {
|
||||
var wiretag uint64
|
||||
if !xd.IsPacked() {
|
||||
wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()])
|
||||
} else {
|
||||
wiretag = protowire.EncodeTag(xd.Number(), protowire.BytesType)
|
||||
}
|
||||
e := &extensionFieldInfo{
|
||||
wiretag: wiretag,
|
||||
tagsize: protowire.SizeVarint(wiretag),
|
||||
funcs: encoderFuncsForValue(xd),
|
||||
}
|
||||
// Does the unmarshal function need a value passed to it?
|
||||
// This is true for composite types, where we pass in a message, list, or map to fill in,
|
||||
// and for enums, where we pass in a prototype value to specify the concrete enum type.
|
||||
switch xd.Kind() {
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.EnumKind:
|
||||
e.unmarshalNeedsValue = true
|
||||
default:
|
||||
if xd.Cardinality() == protoreflect.Repeated {
|
||||
e.unmarshalNeedsValue = true
|
||||
}
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
type lazyExtensionValue struct {
|
||||
atomicOnce uint32 // atomically set if value is valid
|
||||
mu sync.Mutex
|
||||
xi *extensionFieldInfo
|
||||
value protoreflect.Value
|
||||
b []byte
|
||||
}
|
||||
|
||||
type ExtensionField struct {
|
||||
typ protoreflect.ExtensionType
|
||||
|
||||
// value is either the value of GetValue,
|
||||
// or a *lazyExtensionValue that then returns the value of GetValue.
|
||||
value protoreflect.Value
|
||||
lazy *lazyExtensionValue
|
||||
}
|
||||
|
||||
func (f *ExtensionField) appendLazyBytes(xt protoreflect.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) {
|
||||
if f.lazy == nil {
|
||||
f.lazy = &lazyExtensionValue{xi: xi}
|
||||
}
|
||||
f.typ = xt
|
||||
f.lazy.xi = xi
|
||||
f.lazy.b = protowire.AppendTag(f.lazy.b, num, wtyp)
|
||||
f.lazy.b = append(f.lazy.b, b...)
|
||||
}
|
||||
|
||||
func (f *ExtensionField) canLazy(xt protoreflect.ExtensionType) bool {
|
||||
if f.typ == nil {
|
||||
return true
|
||||
}
|
||||
if f.typ == xt && f.lazy != nil && atomic.LoadUint32(&f.lazy.atomicOnce) == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// isUnexpandedLazy returns true if the ExensionField is lazy and not
|
||||
// yet expanded, which means it's present and already checked for
|
||||
// initialized required fields.
|
||||
func (f *ExtensionField) isUnexpandedLazy() bool {
|
||||
return f.lazy != nil && atomic.LoadUint32(&f.lazy.atomicOnce) == 0
|
||||
}
|
||||
|
||||
// lazyBuffer retrieves the buffer for a lazy extension if it's not yet expanded.
|
||||
//
|
||||
// The returned buffer has to be kept over whatever operation we're planning,
|
||||
// as re-retrieving it will fail after the message is lazily decoded.
|
||||
func (f *ExtensionField) lazyBuffer() []byte {
|
||||
// This function might be in the critical path, so check the atomic without
|
||||
// taking a look first, then only take the lock if needed.
|
||||
if !f.isUnexpandedLazy() {
|
||||
return nil
|
||||
}
|
||||
f.lazy.mu.Lock()
|
||||
defer f.lazy.mu.Unlock()
|
||||
return f.lazy.b
|
||||
}
|
||||
|
||||
func (f *ExtensionField) lazyInit() {
|
||||
f.lazy.mu.Lock()
|
||||
defer f.lazy.mu.Unlock()
|
||||
if atomic.LoadUint32(&f.lazy.atomicOnce) == 1 {
|
||||
return
|
||||
}
|
||||
if f.lazy.xi != nil {
|
||||
b := f.lazy.b
|
||||
val := f.typ.New()
|
||||
for len(b) > 0 {
|
||||
var tag uint64
|
||||
if b[0] < 0x80 {
|
||||
tag = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
tag = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
tag, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
panic(errors.New("bad tag in lazy extension decoding"))
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
num := protowire.Number(tag >> 3)
|
||||
wtyp := protowire.Type(tag & 7)
|
||||
var out unmarshalOutput
|
||||
var err error
|
||||
val, out, err = f.lazy.xi.funcs.unmarshal(b, val, num, wtyp, lazyUnmarshalOptions)
|
||||
if err != nil {
|
||||
panic(errors.New("decode failure in lazy extension decoding: %v", err))
|
||||
}
|
||||
b = b[out.n:]
|
||||
}
|
||||
f.lazy.value = val
|
||||
} else {
|
||||
panic("No support for lazy fns for ExtensionField")
|
||||
}
|
||||
f.lazy.xi = nil
|
||||
f.lazy.b = nil
|
||||
atomic.StoreUint32(&f.lazy.atomicOnce, 1)
|
||||
}
|
||||
|
||||
// Set sets the type and value of the extension field.
|
||||
// This must not be called concurrently.
|
||||
func (f *ExtensionField) Set(t protoreflect.ExtensionType, v protoreflect.Value) {
|
||||
f.typ = t
|
||||
f.value = v
|
||||
f.lazy = nil
|
||||
}
|
||||
|
||||
// Value returns the value of the extension field.
|
||||
// This may be called concurrently.
|
||||
func (f *ExtensionField) Value() protoreflect.Value {
|
||||
if f.lazy != nil {
|
||||
if atomic.LoadUint32(&f.lazy.atomicOnce) == 0 {
|
||||
f.lazyInit()
|
||||
}
|
||||
return f.lazy.value
|
||||
}
|
||||
return f.value
|
||||
}
|
||||
|
||||
// Type returns the type of the extension field.
|
||||
// This may be called concurrently.
|
||||
func (f ExtensionField) Type() protoreflect.ExtensionType {
|
||||
return f.typ
|
||||
}
|
||||
|
||||
// IsSet returns whether the extension field is set.
|
||||
// This may be called concurrently.
|
||||
func (f ExtensionField) IsSet() bool {
|
||||
return f.typ != nil
|
||||
}
|
||||
|
||||
// IsLazy reports whether a field is lazily encoded.
|
||||
// It is exported for testing.
|
||||
func IsLazy(m protoreflect.Message, fd protoreflect.FieldDescriptor) bool {
|
||||
var mi *MessageInfo
|
||||
var p pointer
|
||||
switch m := m.(type) {
|
||||
case *messageState:
|
||||
mi = m.messageInfo()
|
||||
p = m.pointer()
|
||||
case *messageReflectWrapper:
|
||||
mi = m.messageInfo()
|
||||
p = m.pointer()
|
||||
default:
|
||||
return false
|
||||
}
|
||||
xd, ok := fd.(protoreflect.ExtensionTypeDescriptor)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
xt := xd.Type()
|
||||
ext := mi.extensionMap(p)
|
||||
if ext == nil {
|
||||
return false
|
||||
}
|
||||
f, ok := (*ext)[int32(fd.Number())]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return f.typ == xt && f.lazy != nil && atomic.LoadUint32(&f.lazy.atomicOnce) == 0
|
||||
}
|
788
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_field.go
generated
vendored
Normal file
788
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_field.go
generated
vendored
Normal file
@ -0,0 +1,788 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
type errInvalidUTF8 struct{}
|
||||
|
||||
func (errInvalidUTF8) Error() string { return "string field contains invalid UTF-8" }
|
||||
func (errInvalidUTF8) InvalidUTF8() bool { return true }
|
||||
func (errInvalidUTF8) Unwrap() error { return errors.Error }
|
||||
|
||||
// initOneofFieldCoders initializes the fast-path functions for the fields in a oneof.
|
||||
//
|
||||
// For size, marshal, and isInit operations, functions are set only on the first field
|
||||
// in the oneof. The functions are called when the oneof is non-nil, and will dispatch
|
||||
// to the appropriate field-specific function as necessary.
|
||||
//
|
||||
// The unmarshal function is set on each field individually as usual.
|
||||
func (mi *MessageInfo) initOneofFieldCoders(od protoreflect.OneofDescriptor, si structInfo) {
|
||||
fs := si.oneofsByName[od.Name()]
|
||||
ft := fs.Type
|
||||
oneofFields := make(map[reflect.Type]*coderFieldInfo)
|
||||
needIsInit := false
|
||||
fields := od.Fields()
|
||||
for i, lim := 0, fields.Len(); i < lim; i++ {
|
||||
fd := od.Fields().Get(i)
|
||||
num := fd.Number()
|
||||
// Make a copy of the original coderFieldInfo for use in unmarshaling.
|
||||
//
|
||||
// oneofFields[oneofType].funcs.marshal is the field-specific marshal function.
|
||||
//
|
||||
// mi.coderFields[num].marshal is set on only the first field in the oneof,
|
||||
// and dispatches to the field-specific marshaler in oneofFields.
|
||||
cf := *mi.coderFields[num]
|
||||
ot := si.oneofWrappersByNumber[num]
|
||||
cf.ft = ot.Field(0).Type
|
||||
cf.mi, cf.funcs = fieldCoder(fd, cf.ft)
|
||||
oneofFields[ot] = &cf
|
||||
if cf.funcs.isInit != nil {
|
||||
needIsInit = true
|
||||
}
|
||||
mi.coderFields[num].funcs.unmarshal = func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
var vw reflect.Value // pointer to wrapper type
|
||||
vi := p.AsValueOf(ft).Elem() // oneof field value of interface kind
|
||||
if !vi.IsNil() && !vi.Elem().IsNil() && vi.Elem().Elem().Type() == ot {
|
||||
vw = vi.Elem()
|
||||
} else {
|
||||
vw = reflect.New(ot)
|
||||
}
|
||||
out, err := cf.funcs.unmarshal(b, pointerOfValue(vw).Apply(zeroOffset), wtyp, &cf, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
if cf.funcs.isInit == nil {
|
||||
out.initialized = true
|
||||
}
|
||||
vi.Set(vw)
|
||||
return out, nil
|
||||
}
|
||||
}
|
||||
getInfo := func(p pointer) (pointer, *coderFieldInfo) {
|
||||
v := p.AsValueOf(ft).Elem()
|
||||
if v.IsNil() {
|
||||
return pointer{}, nil
|
||||
}
|
||||
v = v.Elem() // interface -> *struct
|
||||
if v.IsNil() {
|
||||
return pointer{}, nil
|
||||
}
|
||||
return pointerOfValue(v).Apply(zeroOffset), oneofFields[v.Elem().Type()]
|
||||
}
|
||||
first := mi.coderFields[od.Fields().Get(0).Number()]
|
||||
first.funcs.size = func(p pointer, _ *coderFieldInfo, opts marshalOptions) int {
|
||||
p, info := getInfo(p)
|
||||
if info == nil || info.funcs.size == nil {
|
||||
return 0
|
||||
}
|
||||
return info.funcs.size(p, info, opts)
|
||||
}
|
||||
first.funcs.marshal = func(b []byte, p pointer, _ *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
p, info := getInfo(p)
|
||||
if info == nil || info.funcs.marshal == nil {
|
||||
return b, nil
|
||||
}
|
||||
return info.funcs.marshal(b, p, info, opts)
|
||||
}
|
||||
first.funcs.merge = func(dst, src pointer, _ *coderFieldInfo, opts mergeOptions) {
|
||||
srcp, srcinfo := getInfo(src)
|
||||
if srcinfo == nil || srcinfo.funcs.merge == nil {
|
||||
return
|
||||
}
|
||||
dstp, dstinfo := getInfo(dst)
|
||||
if dstinfo != srcinfo {
|
||||
dst.AsValueOf(ft).Elem().Set(reflect.New(src.AsValueOf(ft).Elem().Elem().Elem().Type()))
|
||||
dstp = pointerOfValue(dst.AsValueOf(ft).Elem().Elem()).Apply(zeroOffset)
|
||||
}
|
||||
srcinfo.funcs.merge(dstp, srcp, srcinfo, opts)
|
||||
}
|
||||
if needIsInit {
|
||||
first.funcs.isInit = func(p pointer, _ *coderFieldInfo) error {
|
||||
p, info := getInfo(p)
|
||||
if info == nil || info.funcs.isInit == nil {
|
||||
return nil
|
||||
}
|
||||
return info.funcs.isInit(p, info)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func makeMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
funcs := pointerCoderFuncs{
|
||||
size: sizeMessageInfo,
|
||||
marshal: appendMessageInfo,
|
||||
unmarshal: consumeMessageInfo,
|
||||
merge: mergeMessage,
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = isInitMessageInfo
|
||||
}
|
||||
return funcs
|
||||
} else {
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return sizeMessage(m, f.tagsize, opts)
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return appendMessage(b, m, f.wiretag, opts)
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
mp := p.AsValueOf(ft).Elem()
|
||||
if mp.IsNil() {
|
||||
mp.Set(reflect.New(ft.Elem()))
|
||||
}
|
||||
return consumeMessage(b, asMessage(mp), wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer, f *coderFieldInfo) error {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return proto.CheckInitialized(m)
|
||||
},
|
||||
merge: mergeMessage,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sizeMessageInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return protowire.SizeBytes(f.mi.sizePointer(p.Elem(), opts)) + f.tagsize
|
||||
}
|
||||
|
||||
func appendMessageInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
calculatedSize := f.mi.sizePointer(p.Elem(), opts)
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
b = protowire.AppendVarint(b, uint64(calculatedSize))
|
||||
before := len(b)
|
||||
b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts)
|
||||
if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil {
|
||||
return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize)
|
||||
}
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeMessageInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if p.Elem().IsNil() {
|
||||
p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
o, err := f.mi.unmarshalPointer(v, p.Elem(), 0, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
out.n = n
|
||||
out.initialized = o.initialized
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isInitMessageInfo(p pointer, f *coderFieldInfo) error {
|
||||
return f.mi.checkInitializedPointer(p.Elem())
|
||||
}
|
||||
|
||||
func sizeMessage(m proto.Message, tagsize int, opts marshalOptions) int {
|
||||
return protowire.SizeBytes(opts.Options().Size(m)) + tagsize
|
||||
}
|
||||
|
||||
func appendMessage(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
mopts := opts.Options()
|
||||
calculatedSize := mopts.Size(m)
|
||||
b = protowire.AppendVarint(b, wiretag)
|
||||
b = protowire.AppendVarint(b, uint64(calculatedSize))
|
||||
before := len(b)
|
||||
b, err := mopts.MarshalAppend(b, m)
|
||||
if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil {
|
||||
return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize)
|
||||
}
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: v,
|
||||
Message: m.ProtoReflect(),
|
||||
})
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func sizeMessageValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
|
||||
m := v.Message().Interface()
|
||||
return sizeMessage(m, tagsize, opts)
|
||||
}
|
||||
|
||||
func appendMessageValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
m := v.Message().Interface()
|
||||
return appendMessage(b, m, wiretag, opts)
|
||||
}
|
||||
|
||||
func consumeMessageValue(b []byte, v protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
|
||||
m := v.Message().Interface()
|
||||
out, err := consumeMessage(b, m, wtyp, opts)
|
||||
return v, out, err
|
||||
}
|
||||
|
||||
func isInitMessageValue(v protoreflect.Value) error {
|
||||
m := v.Message().Interface()
|
||||
return proto.CheckInitialized(m)
|
||||
}
|
||||
|
||||
var coderMessageValue = valueCoderFuncs{
|
||||
size: sizeMessageValue,
|
||||
marshal: appendMessageValue,
|
||||
unmarshal: consumeMessageValue,
|
||||
isInit: isInitMessageValue,
|
||||
merge: mergeMessageValue,
|
||||
}
|
||||
|
||||
func sizeGroupValue(v protoreflect.Value, tagsize int, opts marshalOptions) int {
|
||||
m := v.Message().Interface()
|
||||
return sizeGroup(m, tagsize, opts)
|
||||
}
|
||||
|
||||
func appendGroupValue(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
m := v.Message().Interface()
|
||||
return appendGroup(b, m, wiretag, opts)
|
||||
}
|
||||
|
||||
func consumeGroupValue(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
|
||||
m := v.Message().Interface()
|
||||
out, err := consumeGroup(b, m, num, wtyp, opts)
|
||||
return v, out, err
|
||||
}
|
||||
|
||||
var coderGroupValue = valueCoderFuncs{
|
||||
size: sizeGroupValue,
|
||||
marshal: appendGroupValue,
|
||||
unmarshal: consumeGroupValue,
|
||||
isInit: isInitMessageValue,
|
||||
merge: mergeMessageValue,
|
||||
}
|
||||
|
||||
func makeGroupFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
num := fd.Number()
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
funcs := pointerCoderFuncs{
|
||||
size: sizeGroupType,
|
||||
marshal: appendGroupType,
|
||||
unmarshal: consumeGroupType,
|
||||
merge: mergeMessage,
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = isInitMessageInfo
|
||||
}
|
||||
return funcs
|
||||
} else {
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return sizeGroup(m, f.tagsize, opts)
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return appendGroup(b, m, f.wiretag, opts)
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
mp := p.AsValueOf(ft).Elem()
|
||||
if mp.IsNil() {
|
||||
mp.Set(reflect.New(ft.Elem()))
|
||||
}
|
||||
return consumeGroup(b, asMessage(mp), num, wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer, f *coderFieldInfo) error {
|
||||
m := asMessage(p.AsValueOf(ft).Elem())
|
||||
return proto.CheckInitialized(m)
|
||||
},
|
||||
merge: mergeMessage,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sizeGroupType(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return 2*f.tagsize + f.mi.sizePointer(p.Elem(), opts)
|
||||
}
|
||||
|
||||
func appendGroupType(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
b = protowire.AppendVarint(b, f.wiretag) // start group
|
||||
b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts)
|
||||
b = protowire.AppendVarint(b, f.wiretag+1) // end group
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeGroupType(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, errUnknown
|
||||
}
|
||||
if p.Elem().IsNil() {
|
||||
p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
return f.mi.unmarshalPointer(b, p.Elem(), f.num, opts)
|
||||
}
|
||||
|
||||
func sizeGroup(m proto.Message, tagsize int, opts marshalOptions) int {
|
||||
return 2*tagsize + opts.Options().Size(m)
|
||||
}
|
||||
|
||||
func appendGroup(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
b = protowire.AppendVarint(b, wiretag) // start group
|
||||
b, err := opts.Options().MarshalAppend(b, m)
|
||||
b = protowire.AppendVarint(b, wiretag+1) // end group
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, errUnknown
|
||||
}
|
||||
b, n := protowire.ConsumeGroup(num, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: b,
|
||||
Message: m.ProtoReflect(),
|
||||
})
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func makeMessageSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
funcs := pointerCoderFuncs{
|
||||
size: sizeMessageSliceInfo,
|
||||
marshal: appendMessageSliceInfo,
|
||||
unmarshal: consumeMessageSliceInfo,
|
||||
merge: mergeMessageSlice,
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = isInitMessageSliceInfo
|
||||
}
|
||||
return funcs
|
||||
}
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return sizeMessageSlice(p, ft, f.tagsize, opts)
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
return appendMessageSlice(b, p, f.wiretag, ft, opts)
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
return consumeMessageSlice(b, p, ft, wtyp, opts)
|
||||
},
|
||||
isInit: func(p pointer, f *coderFieldInfo) error {
|
||||
return isInitMessageSlice(p, ft)
|
||||
},
|
||||
merge: mergeMessageSlice,
|
||||
}
|
||||
}
|
||||
|
||||
func sizeMessageSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
s := p.PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendMessageSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
s := p.PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
siz := f.mi.sizePointer(v, opts)
|
||||
b = protowire.AppendVarint(b, uint64(siz))
|
||||
before := len(b)
|
||||
b, err = f.mi.marshalAppendPointer(b, v, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
if measuredSize := len(b) - before; siz != measuredSize {
|
||||
return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeMessageSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
|
||||
mp := pointerOfIface(m)
|
||||
o, err := f.mi.unmarshalPointer(v, mp, 0, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
p.AppendPointerSlice(mp)
|
||||
out.n = n
|
||||
out.initialized = o.initialized
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isInitMessageSliceInfo(p pointer, f *coderFieldInfo) error {
|
||||
s := p.PointerSlice()
|
||||
for _, v := range s {
|
||||
if err := f.mi.checkInitializedPointer(v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func sizeMessageSlice(p pointer, goType reflect.Type, tagsize int, opts marshalOptions) int {
|
||||
mopts := opts.Options()
|
||||
s := p.PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
m := asMessage(v.AsValueOf(goType.Elem()))
|
||||
n += protowire.SizeBytes(mopts.Size(m)) + tagsize
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendMessageSlice(b []byte, p pointer, wiretag uint64, goType reflect.Type, opts marshalOptions) ([]byte, error) {
|
||||
mopts := opts.Options()
|
||||
s := p.PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
m := asMessage(v.AsValueOf(goType.Elem()))
|
||||
b = protowire.AppendVarint(b, wiretag)
|
||||
siz := mopts.Size(m)
|
||||
b = protowire.AppendVarint(b, uint64(siz))
|
||||
before := len(b)
|
||||
b, err = mopts.MarshalAppend(b, m)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
if measuredSize := len(b) - before; siz != measuredSize {
|
||||
return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
mp := reflect.New(goType.Elem())
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: v,
|
||||
Message: asMessage(mp).ProtoReflect(),
|
||||
})
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
p.AppendPointerSlice(pointerOfValue(mp))
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isInitMessageSlice(p pointer, goType reflect.Type) error {
|
||||
s := p.PointerSlice()
|
||||
for _, v := range s {
|
||||
m := asMessage(v.AsValueOf(goType.Elem()))
|
||||
if err := proto.CheckInitialized(m); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Slices of messages
|
||||
|
||||
func sizeMessageSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int {
|
||||
mopts := opts.Options()
|
||||
list := listv.List()
|
||||
n := 0
|
||||
for i, llen := 0, list.Len(); i < llen; i++ {
|
||||
m := list.Get(i).Message().Interface()
|
||||
n += protowire.SizeBytes(mopts.Size(m)) + tagsize
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendMessageSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
list := listv.List()
|
||||
mopts := opts.Options()
|
||||
for i, llen := 0, list.Len(); i < llen; i++ {
|
||||
m := list.Get(i).Message().Interface()
|
||||
b = protowire.AppendVarint(b, wiretag)
|
||||
siz := mopts.Size(m)
|
||||
b = protowire.AppendVarint(b, uint64(siz))
|
||||
before := len(b)
|
||||
var err error
|
||||
b, err = mopts.MarshalAppend(b, m)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
if measuredSize := len(b) - before; siz != measuredSize {
|
||||
return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeMessageSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
|
||||
list := listv.List()
|
||||
if wtyp != protowire.BytesType {
|
||||
return protoreflect.Value{}, out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return protoreflect.Value{}, out, errDecode
|
||||
}
|
||||
m := list.NewElement()
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: v,
|
||||
Message: m.Message(),
|
||||
})
|
||||
if err != nil {
|
||||
return protoreflect.Value{}, out, err
|
||||
}
|
||||
list.Append(m)
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return listv, out, nil
|
||||
}
|
||||
|
||||
func isInitMessageSliceValue(listv protoreflect.Value) error {
|
||||
list := listv.List()
|
||||
for i, llen := 0, list.Len(); i < llen; i++ {
|
||||
m := list.Get(i).Message().Interface()
|
||||
if err := proto.CheckInitialized(m); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var coderMessageSliceValue = valueCoderFuncs{
|
||||
size: sizeMessageSliceValue,
|
||||
marshal: appendMessageSliceValue,
|
||||
unmarshal: consumeMessageSliceValue,
|
||||
isInit: isInitMessageSliceValue,
|
||||
merge: mergeMessageListValue,
|
||||
}
|
||||
|
||||
func sizeGroupSliceValue(listv protoreflect.Value, tagsize int, opts marshalOptions) int {
|
||||
mopts := opts.Options()
|
||||
list := listv.List()
|
||||
n := 0
|
||||
for i, llen := 0, list.Len(); i < llen; i++ {
|
||||
m := list.Get(i).Message().Interface()
|
||||
n += 2*tagsize + mopts.Size(m)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendGroupSliceValue(b []byte, listv protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error) {
|
||||
list := listv.List()
|
||||
mopts := opts.Options()
|
||||
for i, llen := 0, list.Len(); i < llen; i++ {
|
||||
m := list.Get(i).Message().Interface()
|
||||
b = protowire.AppendVarint(b, wiretag) // start group
|
||||
var err error
|
||||
b, err = mopts.MarshalAppend(b, m)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
b = protowire.AppendVarint(b, wiretag+1) // end group
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeGroupSliceValue(b []byte, listv protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
|
||||
list := listv.List()
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return protoreflect.Value{}, out, errUnknown
|
||||
}
|
||||
b, n := protowire.ConsumeGroup(num, b)
|
||||
if n < 0 {
|
||||
return protoreflect.Value{}, out, errDecode
|
||||
}
|
||||
m := list.NewElement()
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: b,
|
||||
Message: m.Message(),
|
||||
})
|
||||
if err != nil {
|
||||
return protoreflect.Value{}, out, err
|
||||
}
|
||||
list.Append(m)
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return listv, out, nil
|
||||
}
|
||||
|
||||
var coderGroupSliceValue = valueCoderFuncs{
|
||||
size: sizeGroupSliceValue,
|
||||
marshal: appendGroupSliceValue,
|
||||
unmarshal: consumeGroupSliceValue,
|
||||
isInit: isInitMessageSliceValue,
|
||||
merge: mergeMessageListValue,
|
||||
}
|
||||
|
||||
func makeGroupSliceFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
|
||||
num := fd.Number()
|
||||
if mi := getMessageInfo(ft); mi != nil {
|
||||
funcs := pointerCoderFuncs{
|
||||
size: sizeGroupSliceInfo,
|
||||
marshal: appendGroupSliceInfo,
|
||||
unmarshal: consumeGroupSliceInfo,
|
||||
merge: mergeMessageSlice,
|
||||
}
|
||||
if needsInitCheck(mi.Desc) {
|
||||
funcs.isInit = isInitMessageSliceInfo
|
||||
}
|
||||
return funcs
|
||||
}
|
||||
return pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return sizeGroupSlice(p, ft, f.tagsize, opts)
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
return appendGroupSlice(b, p, f.wiretag, ft, opts)
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
return consumeGroupSlice(b, p, num, wtyp, ft, opts)
|
||||
},
|
||||
isInit: func(p pointer, f *coderFieldInfo) error {
|
||||
return isInitMessageSlice(p, ft)
|
||||
},
|
||||
merge: mergeMessageSlice,
|
||||
}
|
||||
}
|
||||
|
||||
func sizeGroupSlice(p pointer, messageType reflect.Type, tagsize int, opts marshalOptions) int {
|
||||
mopts := opts.Options()
|
||||
s := p.PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
m := asMessage(v.AsValueOf(messageType.Elem()))
|
||||
n += 2*tagsize + mopts.Size(m)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendGroupSlice(b []byte, p pointer, wiretag uint64, messageType reflect.Type, opts marshalOptions) ([]byte, error) {
|
||||
s := p.PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
m := asMessage(v.AsValueOf(messageType.Elem()))
|
||||
b = protowire.AppendVarint(b, wiretag) // start group
|
||||
b, err = opts.Options().MarshalAppend(b, m)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
b = protowire.AppendVarint(b, wiretag+1) // end group
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire.Type, goType reflect.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, errUnknown
|
||||
}
|
||||
b, n := protowire.ConsumeGroup(num, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
mp := reflect.New(goType.Elem())
|
||||
o, err := opts.Options().UnmarshalState(protoiface.UnmarshalInput{
|
||||
Buf: b,
|
||||
Message: asMessage(mp).ProtoReflect(),
|
||||
})
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
p.AppendPointerSlice(pointerOfValue(mp))
|
||||
out.n = n
|
||||
out.initialized = o.Flags&protoiface.UnmarshalInitialized != 0
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func sizeGroupSliceInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
s := p.PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
n += 2*f.tagsize + f.mi.sizePointer(v, opts)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendGroupSliceInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
s := p.PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
b = protowire.AppendVarint(b, f.wiretag) // start group
|
||||
b, err = f.mi.marshalAppendPointer(b, v, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
b = protowire.AppendVarint(b, f.wiretag+1) // end group
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return unmarshalOutput{}, errUnknown
|
||||
}
|
||||
m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
|
||||
mp := pointerOfIface(m)
|
||||
out, err := f.mi.unmarshalPointer(b, mp, f.num, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
p.AppendPointerSlice(mp)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func asMessage(v reflect.Value) protoreflect.ProtoMessage {
|
||||
if m, ok := v.Interface().(protoreflect.ProtoMessage); ok {
|
||||
return m
|
||||
}
|
||||
return legacyWrapMessage(v).Interface()
|
||||
}
|
264
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go
generated
vendored
Normal file
264
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go
generated
vendored
Normal file
@ -0,0 +1,264 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func makeOpaqueMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) {
|
||||
mi := getMessageInfo(ft)
|
||||
if mi == nil {
|
||||
panic(fmt.Sprintf("invalid field: %v: unsupported message type %v", fd.FullName(), ft))
|
||||
}
|
||||
switch fd.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
return mi, pointerCoderFuncs{
|
||||
size: sizeOpaqueMessage,
|
||||
marshal: appendOpaqueMessage,
|
||||
unmarshal: consumeOpaqueMessage,
|
||||
isInit: isInitOpaqueMessage,
|
||||
merge: mergeOpaqueMessage,
|
||||
}
|
||||
case protoreflect.GroupKind:
|
||||
return mi, pointerCoderFuncs{
|
||||
size: sizeOpaqueGroup,
|
||||
marshal: appendOpaqueGroup,
|
||||
unmarshal: consumeOpaqueGroup,
|
||||
isInit: isInitOpaqueMessage,
|
||||
merge: mergeOpaqueMessage,
|
||||
}
|
||||
}
|
||||
panic("unexpected field kind")
|
||||
}
|
||||
|
||||
func sizeOpaqueMessage(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
|
||||
return protowire.SizeBytes(f.mi.sizePointer(p.AtomicGetPointer(), opts)) + f.tagsize
|
||||
}
|
||||
|
||||
func appendOpaqueMessage(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
mp := p.AtomicGetPointer()
|
||||
calculatedSize := f.mi.sizePointer(mp, opts)
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
b = protowire.AppendVarint(b, uint64(calculatedSize))
|
||||
before := len(b)
|
||||
b, err := f.mi.marshalAppendPointer(b, mp, opts)
|
||||
if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil {
|
||||
return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize)
|
||||
}
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeOpaqueMessage(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
mp := p.AtomicGetPointer()
|
||||
if mp.IsNil() {
|
||||
mp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
o, err := f.mi.unmarshalPointer(v, mp, 0, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
out.n = n
|
||||
out.initialized = o.initialized
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isInitOpaqueMessage(p pointer, f *coderFieldInfo) error {
|
||||
mp := p.AtomicGetPointer()
|
||||
if mp.IsNil() {
|
||||
return nil
|
||||
}
|
||||
return f.mi.checkInitializedPointer(mp)
|
||||
}
|
||||
|
||||
func mergeOpaqueMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
dstmp := dst.AtomicGetPointer()
|
||||
if dstmp.IsNil() {
|
||||
dstmp = dst.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
f.mi.mergePointer(dstmp, src.AtomicGetPointer(), opts)
|
||||
}
|
||||
|
||||
func sizeOpaqueGroup(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
|
||||
return 2*f.tagsize + f.mi.sizePointer(p.AtomicGetPointer(), opts)
|
||||
}
|
||||
|
||||
func appendOpaqueGroup(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
b = protowire.AppendVarint(b, f.wiretag) // start group
|
||||
b, err := f.mi.marshalAppendPointer(b, p.AtomicGetPointer(), opts)
|
||||
b = protowire.AppendVarint(b, f.wiretag+1) // end group
|
||||
return b, err
|
||||
}
|
||||
|
||||
func consumeOpaqueGroup(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, errUnknown
|
||||
}
|
||||
mp := p.AtomicGetPointer()
|
||||
if mp.IsNil() {
|
||||
mp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
o, e := f.mi.unmarshalPointer(b, mp, f.num, opts)
|
||||
return o, e
|
||||
}
|
||||
|
||||
func makeOpaqueRepeatedMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) {
|
||||
if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("invalid field: %v: unsupported type for opaque repeated message: %v", fd.FullName(), ft))
|
||||
}
|
||||
mt := ft.Elem().Elem() // *[]*T -> *T
|
||||
mi := getMessageInfo(mt)
|
||||
if mi == nil {
|
||||
panic(fmt.Sprintf("invalid field: %v: unsupported message type %v", fd.FullName(), mt))
|
||||
}
|
||||
switch fd.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
return mi, pointerCoderFuncs{
|
||||
size: sizeOpaqueMessageSlice,
|
||||
marshal: appendOpaqueMessageSlice,
|
||||
unmarshal: consumeOpaqueMessageSlice,
|
||||
isInit: isInitOpaqueMessageSlice,
|
||||
merge: mergeOpaqueMessageSlice,
|
||||
}
|
||||
case protoreflect.GroupKind:
|
||||
return mi, pointerCoderFuncs{
|
||||
size: sizeOpaqueGroupSlice,
|
||||
marshal: appendOpaqueGroupSlice,
|
||||
unmarshal: consumeOpaqueGroupSlice,
|
||||
isInit: isInitOpaqueMessageSlice,
|
||||
merge: mergeOpaqueMessageSlice,
|
||||
}
|
||||
}
|
||||
panic("unexpected field kind")
|
||||
}
|
||||
|
||||
func sizeOpaqueMessageSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
|
||||
s := p.AtomicGetPointer().PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendOpaqueMessageSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
s := p.AtomicGetPointer().PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
siz := f.mi.sizePointer(v, opts)
|
||||
b = protowire.AppendVarint(b, uint64(siz))
|
||||
before := len(b)
|
||||
b, err = f.mi.marshalAppendPointer(b, v, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
if measuredSize := len(b) - before; siz != measuredSize {
|
||||
return nil, errors.MismatchedSizeCalculation(siz, measuredSize)
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeOpaqueMessageSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
mp := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))
|
||||
o, err := f.mi.unmarshalPointer(v, mp, 0, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
sp := p.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
sp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem())))
|
||||
}
|
||||
sp.AppendPointerSlice(mp)
|
||||
out.n = n
|
||||
out.initialized = o.initialized
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func isInitOpaqueMessageSlice(p pointer, f *coderFieldInfo) error {
|
||||
sp := p.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
return nil
|
||||
}
|
||||
s := sp.PointerSlice()
|
||||
for _, v := range s {
|
||||
if err := f.mi.checkInitializedPointer(v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func mergeOpaqueMessageSlice(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
ds := dst.AtomicGetPointer()
|
||||
if ds.IsNil() {
|
||||
ds = dst.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem())))
|
||||
}
|
||||
for _, sp := range src.AtomicGetPointer().PointerSlice() {
|
||||
dm := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))
|
||||
f.mi.mergePointer(dm, sp, opts)
|
||||
ds.AppendPointerSlice(dm)
|
||||
}
|
||||
}
|
||||
|
||||
func sizeOpaqueGroupSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
|
||||
s := p.AtomicGetPointer().PointerSlice()
|
||||
n := 0
|
||||
for _, v := range s {
|
||||
n += 2*f.tagsize + f.mi.sizePointer(v, opts)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func appendOpaqueGroupSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
s := p.AtomicGetPointer().PointerSlice()
|
||||
var err error
|
||||
for _, v := range s {
|
||||
b = protowire.AppendVarint(b, f.wiretag) // start group
|
||||
b, err = f.mi.marshalAppendPointer(b, v, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
b = protowire.AppendVarint(b, f.wiretag+1) // end group
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func consumeOpaqueGroupSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, errUnknown
|
||||
}
|
||||
mp := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))
|
||||
out, err = f.mi.unmarshalPointer(b, mp, f.num, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
sp := p.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
sp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem())))
|
||||
}
|
||||
sp.AppendPointerSlice(mp)
|
||||
return out, err
|
||||
}
|
5724
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
generated
vendored
Normal file
5724
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
399
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_map.go
generated
vendored
Normal file
399
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_map.go
generated
vendored
Normal file
@ -0,0 +1,399 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type mapInfo struct {
|
||||
goType reflect.Type
|
||||
keyWiretag uint64
|
||||
valWiretag uint64
|
||||
keyFuncs valueCoderFuncs
|
||||
valFuncs valueCoderFuncs
|
||||
keyZero protoreflect.Value
|
||||
keyKind protoreflect.Kind
|
||||
conv *mapConverter
|
||||
}
|
||||
|
||||
func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) {
|
||||
// TODO: Consider generating specialized map coders.
|
||||
keyField := fd.MapKey()
|
||||
valField := fd.MapValue()
|
||||
keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()])
|
||||
valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()])
|
||||
keyFuncs := encoderFuncsForValue(keyField)
|
||||
valFuncs := encoderFuncsForValue(valField)
|
||||
conv := newMapConverter(ft, fd)
|
||||
|
||||
mapi := &mapInfo{
|
||||
goType: ft,
|
||||
keyWiretag: keyWiretag,
|
||||
valWiretag: valWiretag,
|
||||
keyFuncs: keyFuncs,
|
||||
valFuncs: valFuncs,
|
||||
keyZero: keyField.Default(),
|
||||
keyKind: keyField.Kind(),
|
||||
conv: conv,
|
||||
}
|
||||
if valField.Kind() == protoreflect.MessageKind {
|
||||
valueMessage = getMessageInfo(ft.Elem())
|
||||
}
|
||||
|
||||
funcs = pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return sizeMap(p.AsValueOf(ft).Elem(), mapi, f, opts)
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
return appendMap(b, p.AsValueOf(ft).Elem(), mapi, f, opts)
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
mp := p.AsValueOf(ft)
|
||||
if mp.Elem().IsNil() {
|
||||
mp.Elem().Set(reflect.MakeMap(mapi.goType))
|
||||
}
|
||||
if f.mi == nil {
|
||||
return consumeMap(b, mp.Elem(), wtyp, mapi, f, opts)
|
||||
} else {
|
||||
return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts)
|
||||
}
|
||||
},
|
||||
}
|
||||
switch valField.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
funcs.merge = mergeMapOfMessage
|
||||
case protoreflect.BytesKind:
|
||||
funcs.merge = mergeMapOfBytes
|
||||
default:
|
||||
funcs.merge = mergeMap
|
||||
}
|
||||
if valFuncs.isInit != nil {
|
||||
funcs.isInit = func(p pointer, f *coderFieldInfo) error {
|
||||
return isInitMap(p.AsValueOf(ft).Elem(), mapi, f)
|
||||
}
|
||||
}
|
||||
return valueMessage, funcs
|
||||
}
|
||||
|
||||
const (
|
||||
mapKeyTagSize = 1 // field 1, tag size 1.
|
||||
mapValTagSize = 1 // field 2, tag size 2.
|
||||
)
|
||||
|
||||
func sizeMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) int {
|
||||
if mapv.Len() == 0 {
|
||||
return 0
|
||||
}
|
||||
n := 0
|
||||
iter := mapv.MapRange()
|
||||
for iter.Next() {
|
||||
key := mapi.conv.keyConv.PBValueOf(iter.Key()).MapKey()
|
||||
keySize := mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts)
|
||||
var valSize int
|
||||
value := mapi.conv.valConv.PBValueOf(iter.Value())
|
||||
if f.mi == nil {
|
||||
valSize = mapi.valFuncs.size(value, mapValTagSize, opts)
|
||||
} else {
|
||||
p := pointerOfValue(iter.Value())
|
||||
valSize += mapValTagSize
|
||||
valSize += protowire.SizeBytes(f.mi.sizePointer(p, opts))
|
||||
}
|
||||
n += f.tagsize + protowire.SizeBytes(keySize+valSize)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
b, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
var (
|
||||
key = mapi.keyZero
|
||||
val = mapi.conv.valConv.New()
|
||||
)
|
||||
for len(b) > 0 {
|
||||
num, wtyp, n := protowire.ConsumeTag(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if num > protowire.MaxValidNumber {
|
||||
return out, errDecode
|
||||
}
|
||||
b = b[n:]
|
||||
err := errUnknown
|
||||
switch num {
|
||||
case genid.MapEntry_Key_field_number:
|
||||
var v protoreflect.Value
|
||||
var o unmarshalOutput
|
||||
v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
key = v
|
||||
n = o.n
|
||||
case genid.MapEntry_Value_field_number:
|
||||
var v protoreflect.Value
|
||||
var o unmarshalOutput
|
||||
v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
val = v
|
||||
n = o.n
|
||||
}
|
||||
if err == errUnknown {
|
||||
n = protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
} else if err != nil {
|
||||
return out, err
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
mapv.SetMapIndex(mapi.conv.keyConv.GoValueOf(key), mapi.conv.valConv.GoValueOf(val))
|
||||
out.n = n
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, errUnknown
|
||||
}
|
||||
b, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
var (
|
||||
key = mapi.keyZero
|
||||
val = reflect.New(f.mi.GoReflectType.Elem())
|
||||
)
|
||||
for len(b) > 0 {
|
||||
num, wtyp, n := protowire.ConsumeTag(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if num > protowire.MaxValidNumber {
|
||||
return out, errDecode
|
||||
}
|
||||
b = b[n:]
|
||||
err := errUnknown
|
||||
switch num {
|
||||
case 1:
|
||||
var v protoreflect.Value
|
||||
var o unmarshalOutput
|
||||
v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
key = v
|
||||
n = o.n
|
||||
case 2:
|
||||
if wtyp != protowire.BytesType {
|
||||
break
|
||||
}
|
||||
var v []byte
|
||||
v, n = protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
var o unmarshalOutput
|
||||
o, err = f.mi.unmarshalPointer(v, pointerOfValue(val), 0, opts)
|
||||
if o.initialized {
|
||||
// Consider this map item initialized so long as we see
|
||||
// an initialized value.
|
||||
out.initialized = true
|
||||
}
|
||||
}
|
||||
if err == errUnknown {
|
||||
n = protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
} else if err != nil {
|
||||
return out, err
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
mapv.SetMapIndex(mapi.conv.keyConv.GoValueOf(key), val)
|
||||
out.n = n
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func appendMapItem(b []byte, keyrv, valrv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
if f.mi == nil {
|
||||
key := mapi.conv.keyConv.PBValueOf(keyrv).MapKey()
|
||||
val := mapi.conv.valConv.PBValueOf(valrv)
|
||||
size := 0
|
||||
size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts)
|
||||
size += mapi.valFuncs.size(val, mapValTagSize, opts)
|
||||
b = protowire.AppendVarint(b, uint64(size))
|
||||
before := len(b)
|
||||
b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
b, err = mapi.valFuncs.marshal(b, val, mapi.valWiretag, opts)
|
||||
if measuredSize := len(b) - before; size != measuredSize && err == nil {
|
||||
return nil, errors.MismatchedSizeCalculation(size, measuredSize)
|
||||
}
|
||||
return b, err
|
||||
} else {
|
||||
key := mapi.conv.keyConv.PBValueOf(keyrv).MapKey()
|
||||
val := pointerOfValue(valrv)
|
||||
valSize := f.mi.sizePointer(val, opts)
|
||||
size := 0
|
||||
size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts)
|
||||
size += mapValTagSize + protowire.SizeBytes(valSize)
|
||||
b = protowire.AppendVarint(b, uint64(size))
|
||||
b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
b = protowire.AppendVarint(b, mapi.valWiretag)
|
||||
b = protowire.AppendVarint(b, uint64(valSize))
|
||||
before := len(b)
|
||||
b, err = f.mi.marshalAppendPointer(b, val, opts)
|
||||
if measuredSize := len(b) - before; valSize != measuredSize && err == nil {
|
||||
return nil, errors.MismatchedSizeCalculation(valSize, measuredSize)
|
||||
}
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
|
||||
func appendMap(b []byte, mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
if mapv.Len() == 0 {
|
||||
return b, nil
|
||||
}
|
||||
if opts.Deterministic() {
|
||||
return appendMapDeterministic(b, mapv, mapi, f, opts)
|
||||
}
|
||||
iter := mapv.MapRange()
|
||||
for iter.Next() {
|
||||
var err error
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
b, err = appendMapItem(b, iter.Key(), iter.Value(), mapi, f, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func appendMapDeterministic(b []byte, mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
keys := mapv.MapKeys()
|
||||
sort.Slice(keys, func(i, j int) bool {
|
||||
switch keys[i].Kind() {
|
||||
case reflect.Bool:
|
||||
return !keys[i].Bool() && keys[j].Bool()
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
return keys[i].Int() < keys[j].Int()
|
||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||
return keys[i].Uint() < keys[j].Uint()
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return keys[i].Float() < keys[j].Float()
|
||||
case reflect.String:
|
||||
return keys[i].String() < keys[j].String()
|
||||
default:
|
||||
panic("invalid kind: " + keys[i].Kind().String())
|
||||
}
|
||||
})
|
||||
for _, key := range keys {
|
||||
var err error
|
||||
b = protowire.AppendVarint(b, f.wiretag)
|
||||
b, err = appendMapItem(b, key, mapv.MapIndex(key), mapi, f, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func isInitMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo) error {
|
||||
if mi := f.mi; mi != nil {
|
||||
mi.init()
|
||||
if !mi.needsInitCheck {
|
||||
return nil
|
||||
}
|
||||
iter := mapv.MapRange()
|
||||
for iter.Next() {
|
||||
val := pointerOfValue(iter.Value())
|
||||
if err := mi.checkInitializedPointer(val); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
iter := mapv.MapRange()
|
||||
for iter.Next() {
|
||||
val := mapi.conv.valConv.PBValueOf(iter.Value())
|
||||
if err := mapi.valFuncs.isInit(val); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func mergeMap(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
dstm := dst.AsValueOf(f.ft).Elem()
|
||||
srcm := src.AsValueOf(f.ft).Elem()
|
||||
if srcm.Len() == 0 {
|
||||
return
|
||||
}
|
||||
if dstm.IsNil() {
|
||||
dstm.Set(reflect.MakeMap(f.ft))
|
||||
}
|
||||
iter := srcm.MapRange()
|
||||
for iter.Next() {
|
||||
dstm.SetMapIndex(iter.Key(), iter.Value())
|
||||
}
|
||||
}
|
||||
|
||||
func mergeMapOfBytes(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
dstm := dst.AsValueOf(f.ft).Elem()
|
||||
srcm := src.AsValueOf(f.ft).Elem()
|
||||
if srcm.Len() == 0 {
|
||||
return
|
||||
}
|
||||
if dstm.IsNil() {
|
||||
dstm.Set(reflect.MakeMap(f.ft))
|
||||
}
|
||||
iter := srcm.MapRange()
|
||||
for iter.Next() {
|
||||
dstm.SetMapIndex(iter.Key(), reflect.ValueOf(append(emptyBuf[:], iter.Value().Bytes()...)))
|
||||
}
|
||||
}
|
||||
|
||||
func mergeMapOfMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
dstm := dst.AsValueOf(f.ft).Elem()
|
||||
srcm := src.AsValueOf(f.ft).Elem()
|
||||
if srcm.Len() == 0 {
|
||||
return
|
||||
}
|
||||
if dstm.IsNil() {
|
||||
dstm.Set(reflect.MakeMap(f.ft))
|
||||
}
|
||||
iter := srcm.MapRange()
|
||||
for iter.Next() {
|
||||
val := reflect.New(f.ft.Elem().Elem())
|
||||
if f.mi != nil {
|
||||
f.mi.mergePointer(pointerOfValue(val), pointerOfValue(iter.Value()), opts)
|
||||
} else {
|
||||
opts.Merge(asMessage(val), asMessage(iter.Value()))
|
||||
}
|
||||
dstm.SetMapIndex(iter.Key(), val)
|
||||
}
|
||||
}
|
230
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_message.go
generated
vendored
Normal file
230
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_message.go
generated
vendored
Normal file
@ -0,0 +1,230 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/order"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// coderMessageInfo contains per-message information used by the fast-path functions.
|
||||
// This is a different type from MessageInfo to keep MessageInfo as general-purpose as
|
||||
// possible.
|
||||
type coderMessageInfo struct {
|
||||
methods protoiface.Methods
|
||||
|
||||
orderedCoderFields []*coderFieldInfo
|
||||
denseCoderFields []*coderFieldInfo
|
||||
coderFields map[protowire.Number]*coderFieldInfo
|
||||
sizecacheOffset offset
|
||||
unknownOffset offset
|
||||
unknownPtrKind bool
|
||||
extensionOffset offset
|
||||
needsInitCheck bool
|
||||
isMessageSet bool
|
||||
numRequiredFields uint8
|
||||
|
||||
lazyOffset offset
|
||||
presenceOffset offset
|
||||
presenceSize presenceSize
|
||||
}
|
||||
|
||||
type coderFieldInfo struct {
|
||||
funcs pointerCoderFuncs // fast-path per-field functions
|
||||
mi *MessageInfo // field's message
|
||||
ft reflect.Type
|
||||
validation validationInfo // information used by message validation
|
||||
num protoreflect.FieldNumber // field number
|
||||
offset offset // struct field offset
|
||||
wiretag uint64 // field tag (number + wire type)
|
||||
tagsize int // size of the varint-encoded tag
|
||||
isPointer bool // true if IsNil may be called on the struct field
|
||||
isRequired bool // true if field is required
|
||||
|
||||
isLazy bool
|
||||
presenceIndex uint32
|
||||
}
|
||||
|
||||
const noPresence = 0xffffffff
|
||||
|
||||
func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
|
||||
mi.sizecacheOffset = invalidOffset
|
||||
mi.unknownOffset = invalidOffset
|
||||
mi.extensionOffset = invalidOffset
|
||||
mi.lazyOffset = invalidOffset
|
||||
mi.presenceOffset = si.presenceOffset
|
||||
|
||||
if si.sizecacheOffset.IsValid() && si.sizecacheType == sizecacheType {
|
||||
mi.sizecacheOffset = si.sizecacheOffset
|
||||
}
|
||||
if si.unknownOffset.IsValid() && (si.unknownType == unknownFieldsAType || si.unknownType == unknownFieldsBType) {
|
||||
mi.unknownOffset = si.unknownOffset
|
||||
mi.unknownPtrKind = si.unknownType.Kind() == reflect.Ptr
|
||||
}
|
||||
if si.extensionOffset.IsValid() && si.extensionType == extensionFieldsType {
|
||||
mi.extensionOffset = si.extensionOffset
|
||||
}
|
||||
|
||||
mi.coderFields = make(map[protowire.Number]*coderFieldInfo)
|
||||
fields := mi.Desc.Fields()
|
||||
preallocFields := make([]coderFieldInfo, fields.Len())
|
||||
for i := 0; i < fields.Len(); i++ {
|
||||
fd := fields.Get(i)
|
||||
|
||||
fs := si.fieldsByNumber[fd.Number()]
|
||||
isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic()
|
||||
if isOneof {
|
||||
fs = si.oneofsByName[fd.ContainingOneof().Name()]
|
||||
}
|
||||
ft := fs.Type
|
||||
var wiretag uint64
|
||||
if !fd.IsPacked() {
|
||||
wiretag = protowire.EncodeTag(fd.Number(), wireTypes[fd.Kind()])
|
||||
} else {
|
||||
wiretag = protowire.EncodeTag(fd.Number(), protowire.BytesType)
|
||||
}
|
||||
var fieldOffset offset
|
||||
var funcs pointerCoderFuncs
|
||||
var childMessage *MessageInfo
|
||||
switch {
|
||||
case ft == nil:
|
||||
// This never occurs for generated message types.
|
||||
// It implies that a hand-crafted type has missing Go fields
|
||||
// for specific protobuf message fields.
|
||||
funcs = pointerCoderFuncs{
|
||||
size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int {
|
||||
return 0
|
||||
},
|
||||
marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
|
||||
return nil, nil
|
||||
},
|
||||
unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
isInit: func(p pointer, f *coderFieldInfo) error {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
merge: func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
}
|
||||
case isOneof:
|
||||
fieldOffset = offsetOf(fs)
|
||||
default:
|
||||
fieldOffset = offsetOf(fs)
|
||||
childMessage, funcs = fieldCoder(fd, ft)
|
||||
}
|
||||
cf := &preallocFields[i]
|
||||
*cf = coderFieldInfo{
|
||||
num: fd.Number(),
|
||||
offset: fieldOffset,
|
||||
wiretag: wiretag,
|
||||
ft: ft,
|
||||
tagsize: protowire.SizeVarint(wiretag),
|
||||
funcs: funcs,
|
||||
mi: childMessage,
|
||||
validation: newFieldValidationInfo(mi, si, fd, ft),
|
||||
isPointer: fd.Cardinality() == protoreflect.Repeated || fd.HasPresence(),
|
||||
isRequired: fd.Cardinality() == protoreflect.Required,
|
||||
|
||||
presenceIndex: noPresence,
|
||||
}
|
||||
mi.orderedCoderFields = append(mi.orderedCoderFields, cf)
|
||||
mi.coderFields[cf.num] = cf
|
||||
}
|
||||
for i, oneofs := 0, mi.Desc.Oneofs(); i < oneofs.Len(); i++ {
|
||||
if od := oneofs.Get(i); !od.IsSynthetic() {
|
||||
mi.initOneofFieldCoders(od, si)
|
||||
}
|
||||
}
|
||||
if messageset.IsMessageSet(mi.Desc) {
|
||||
if !mi.extensionOffset.IsValid() {
|
||||
panic(fmt.Sprintf("%v: MessageSet with no extensions field", mi.Desc.FullName()))
|
||||
}
|
||||
if !mi.unknownOffset.IsValid() {
|
||||
panic(fmt.Sprintf("%v: MessageSet with no unknown field", mi.Desc.FullName()))
|
||||
}
|
||||
mi.isMessageSet = true
|
||||
}
|
||||
sort.Slice(mi.orderedCoderFields, func(i, j int) bool {
|
||||
return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num
|
||||
})
|
||||
|
||||
var maxDense protoreflect.FieldNumber
|
||||
for _, cf := range mi.orderedCoderFields {
|
||||
if cf.num >= 16 && cf.num >= 2*maxDense {
|
||||
break
|
||||
}
|
||||
maxDense = cf.num
|
||||
}
|
||||
mi.denseCoderFields = make([]*coderFieldInfo, maxDense+1)
|
||||
for _, cf := range mi.orderedCoderFields {
|
||||
if int(cf.num) >= len(mi.denseCoderFields) {
|
||||
break
|
||||
}
|
||||
mi.denseCoderFields[cf.num] = cf
|
||||
}
|
||||
|
||||
// To preserve compatibility with historic wire output, marshal oneofs last.
|
||||
if mi.Desc.Oneofs().Len() > 0 {
|
||||
sort.Slice(mi.orderedCoderFields, func(i, j int) bool {
|
||||
fi := fields.ByNumber(mi.orderedCoderFields[i].num)
|
||||
fj := fields.ByNumber(mi.orderedCoderFields[j].num)
|
||||
return order.LegacyFieldOrder(fi, fj)
|
||||
})
|
||||
}
|
||||
|
||||
mi.needsInitCheck = needsInitCheck(mi.Desc)
|
||||
if mi.methods.Marshal == nil && mi.methods.Size == nil {
|
||||
mi.methods.Flags |= protoiface.SupportMarshalDeterministic
|
||||
mi.methods.Marshal = mi.marshal
|
||||
mi.methods.Size = mi.size
|
||||
}
|
||||
if mi.methods.Unmarshal == nil {
|
||||
mi.methods.Flags |= protoiface.SupportUnmarshalDiscardUnknown
|
||||
mi.methods.Unmarshal = mi.unmarshal
|
||||
}
|
||||
if mi.methods.CheckInitialized == nil {
|
||||
mi.methods.CheckInitialized = mi.checkInitialized
|
||||
}
|
||||
if mi.methods.Merge == nil {
|
||||
mi.methods.Merge = mi.merge
|
||||
}
|
||||
if mi.methods.Equal == nil {
|
||||
mi.methods.Equal = equal
|
||||
}
|
||||
}
|
||||
|
||||
// getUnknownBytes returns a *[]byte for the unknown fields.
|
||||
// It is the caller's responsibility to check whether the pointer is nil.
|
||||
// This function is specially designed to be inlineable.
|
||||
func (mi *MessageInfo) getUnknownBytes(p pointer) *[]byte {
|
||||
if mi.unknownPtrKind {
|
||||
return *p.Apply(mi.unknownOffset).BytesPtr()
|
||||
} else {
|
||||
return p.Apply(mi.unknownOffset).Bytes()
|
||||
}
|
||||
}
|
||||
|
||||
// mutableUnknownBytes returns a *[]byte for the unknown fields.
|
||||
// The returned pointer is guaranteed to not be nil.
|
||||
func (mi *MessageInfo) mutableUnknownBytes(p pointer) *[]byte {
|
||||
if mi.unknownPtrKind {
|
||||
bp := p.Apply(mi.unknownOffset).BytesPtr()
|
||||
if *bp == nil {
|
||||
*bp = new([]byte)
|
||||
}
|
||||
return *bp
|
||||
} else {
|
||||
return p.Apply(mi.unknownOffset).Bytes()
|
||||
}
|
||||
}
|
153
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go
generated
vendored
Normal file
153
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go
generated
vendored
Normal file
@ -0,0 +1,153 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/order"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
piface "google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
func (mi *MessageInfo) makeOpaqueCoderMethods(t reflect.Type, si opaqueStructInfo) {
|
||||
mi.sizecacheOffset = si.sizecacheOffset
|
||||
mi.unknownOffset = si.unknownOffset
|
||||
mi.unknownPtrKind = si.unknownType.Kind() == reflect.Ptr
|
||||
mi.extensionOffset = si.extensionOffset
|
||||
mi.lazyOffset = si.lazyOffset
|
||||
mi.presenceOffset = si.presenceOffset
|
||||
|
||||
mi.coderFields = make(map[protowire.Number]*coderFieldInfo)
|
||||
fields := mi.Desc.Fields()
|
||||
for i := 0; i < fields.Len(); i++ {
|
||||
fd := fields.Get(i)
|
||||
|
||||
fs := si.fieldsByNumber[fd.Number()]
|
||||
if fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic() {
|
||||
fs = si.oneofsByName[fd.ContainingOneof().Name()]
|
||||
}
|
||||
ft := fs.Type
|
||||
var wiretag uint64
|
||||
if !fd.IsPacked() {
|
||||
wiretag = protowire.EncodeTag(fd.Number(), wireTypes[fd.Kind()])
|
||||
} else {
|
||||
wiretag = protowire.EncodeTag(fd.Number(), protowire.BytesType)
|
||||
}
|
||||
var fieldOffset offset
|
||||
var funcs pointerCoderFuncs
|
||||
var childMessage *MessageInfo
|
||||
switch {
|
||||
case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
|
||||
fieldOffset = offsetOf(fs)
|
||||
case fd.Message() != nil && !fd.IsMap():
|
||||
fieldOffset = offsetOf(fs)
|
||||
if fd.IsList() {
|
||||
childMessage, funcs = makeOpaqueRepeatedMessageFieldCoder(fd, ft)
|
||||
} else {
|
||||
childMessage, funcs = makeOpaqueMessageFieldCoder(fd, ft)
|
||||
}
|
||||
default:
|
||||
fieldOffset = offsetOf(fs)
|
||||
childMessage, funcs = fieldCoder(fd, ft)
|
||||
}
|
||||
cf := &coderFieldInfo{
|
||||
num: fd.Number(),
|
||||
offset: fieldOffset,
|
||||
wiretag: wiretag,
|
||||
ft: ft,
|
||||
tagsize: protowire.SizeVarint(wiretag),
|
||||
funcs: funcs,
|
||||
mi: childMessage,
|
||||
validation: newFieldValidationInfo(mi, si.structInfo, fd, ft),
|
||||
isPointer: (fd.Cardinality() == protoreflect.Repeated ||
|
||||
fd.Kind() == protoreflect.MessageKind ||
|
||||
fd.Kind() == protoreflect.GroupKind),
|
||||
isRequired: fd.Cardinality() == protoreflect.Required,
|
||||
presenceIndex: noPresence,
|
||||
}
|
||||
|
||||
// TODO: Use presence for all fields.
|
||||
//
|
||||
// In some cases, such as maps, presence means only "might be set" rather
|
||||
// than "is definitely set", but every field should have a presence bit to
|
||||
// permit us to skip over definitely-unset fields at marshal time.
|
||||
|
||||
var hasPresence bool
|
||||
hasPresence, cf.isLazy = usePresenceForField(si, fd)
|
||||
|
||||
if hasPresence {
|
||||
cf.presenceIndex, mi.presenceSize = presenceIndex(mi.Desc, fd)
|
||||
}
|
||||
|
||||
mi.orderedCoderFields = append(mi.orderedCoderFields, cf)
|
||||
mi.coderFields[cf.num] = cf
|
||||
}
|
||||
for i, oneofs := 0, mi.Desc.Oneofs(); i < oneofs.Len(); i++ {
|
||||
if od := oneofs.Get(i); !od.IsSynthetic() {
|
||||
mi.initOneofFieldCoders(od, si.structInfo)
|
||||
}
|
||||
}
|
||||
if messageset.IsMessageSet(mi.Desc) {
|
||||
if !mi.extensionOffset.IsValid() {
|
||||
panic(fmt.Sprintf("%v: MessageSet with no extensions field", mi.Desc.FullName()))
|
||||
}
|
||||
if !mi.unknownOffset.IsValid() {
|
||||
panic(fmt.Sprintf("%v: MessageSet with no unknown field", mi.Desc.FullName()))
|
||||
}
|
||||
mi.isMessageSet = true
|
||||
}
|
||||
sort.Slice(mi.orderedCoderFields, func(i, j int) bool {
|
||||
return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num
|
||||
})
|
||||
|
||||
var maxDense protoreflect.FieldNumber
|
||||
for _, cf := range mi.orderedCoderFields {
|
||||
if cf.num >= 16 && cf.num >= 2*maxDense {
|
||||
break
|
||||
}
|
||||
maxDense = cf.num
|
||||
}
|
||||
mi.denseCoderFields = make([]*coderFieldInfo, maxDense+1)
|
||||
for _, cf := range mi.orderedCoderFields {
|
||||
if int(cf.num) > len(mi.denseCoderFields) {
|
||||
break
|
||||
}
|
||||
mi.denseCoderFields[cf.num] = cf
|
||||
}
|
||||
|
||||
// To preserve compatibility with historic wire output, marshal oneofs last.
|
||||
if mi.Desc.Oneofs().Len() > 0 {
|
||||
sort.Slice(mi.orderedCoderFields, func(i, j int) bool {
|
||||
fi := fields.ByNumber(mi.orderedCoderFields[i].num)
|
||||
fj := fields.ByNumber(mi.orderedCoderFields[j].num)
|
||||
return order.LegacyFieldOrder(fi, fj)
|
||||
})
|
||||
}
|
||||
|
||||
mi.needsInitCheck = needsInitCheck(mi.Desc)
|
||||
if mi.methods.Marshal == nil && mi.methods.Size == nil {
|
||||
mi.methods.Flags |= piface.SupportMarshalDeterministic
|
||||
mi.methods.Marshal = mi.marshal
|
||||
mi.methods.Size = mi.size
|
||||
}
|
||||
if mi.methods.Unmarshal == nil {
|
||||
mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown
|
||||
mi.methods.Unmarshal = mi.unmarshal
|
||||
}
|
||||
if mi.methods.CheckInitialized == nil {
|
||||
mi.methods.CheckInitialized = mi.checkInitialized
|
||||
}
|
||||
if mi.methods.Merge == nil {
|
||||
mi.methods.Merge = mi.merge
|
||||
}
|
||||
if mi.methods.Equal == nil {
|
||||
mi.methods.Equal = equal
|
||||
}
|
||||
}
|
145
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go
generated
vendored
Normal file
145
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go
generated
vendored
Normal file
@ -0,0 +1,145 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
)
|
||||
|
||||
func sizeMessageSet(mi *MessageInfo, p pointer, opts marshalOptions) (size int) {
|
||||
if !flags.ProtoLegacy {
|
||||
return 0
|
||||
}
|
||||
|
||||
ext := *p.Apply(mi.extensionOffset).Extensions()
|
||||
for _, x := range ext {
|
||||
xi := getExtensionFieldInfo(x.Type())
|
||||
if xi.funcs.size == nil {
|
||||
continue
|
||||
}
|
||||
num, _ := protowire.DecodeTag(xi.wiretag)
|
||||
size += messageset.SizeField(num)
|
||||
if fullyLazyExtensions(opts) {
|
||||
// Don't expand the extension, instead use the buffer to calculate size
|
||||
if lb := x.lazyBuffer(); lb != nil {
|
||||
// We got hold of the buffer, so it's still lazy.
|
||||
// Don't count the tag size in the extension buffer, it's already added.
|
||||
size += protowire.SizeTag(messageset.FieldMessage) + len(lb) - xi.tagsize
|
||||
continue
|
||||
}
|
||||
}
|
||||
size += xi.funcs.size(x.Value(), protowire.SizeTag(messageset.FieldMessage), opts)
|
||||
}
|
||||
|
||||
if u := mi.getUnknownBytes(p); u != nil {
|
||||
size += messageset.SizeUnknown(*u)
|
||||
}
|
||||
|
||||
return size
|
||||
}
|
||||
|
||||
func marshalMessageSet(mi *MessageInfo, b []byte, p pointer, opts marshalOptions) ([]byte, error) {
|
||||
if !flags.ProtoLegacy {
|
||||
return b, errors.New("no support for message_set_wire_format")
|
||||
}
|
||||
|
||||
ext := *p.Apply(mi.extensionOffset).Extensions()
|
||||
switch len(ext) {
|
||||
case 0:
|
||||
case 1:
|
||||
// Fast-path for one extension: Don't bother sorting the keys.
|
||||
for _, x := range ext {
|
||||
var err error
|
||||
b, err = marshalMessageSetField(mi, b, x, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
default:
|
||||
// Sort the keys to provide a deterministic encoding.
|
||||
// Not sure this is required, but the old code does it.
|
||||
keys := make([]int, 0, len(ext))
|
||||
for k := range ext {
|
||||
keys = append(keys, int(k))
|
||||
}
|
||||
sort.Ints(keys)
|
||||
for _, k := range keys {
|
||||
var err error
|
||||
b, err = marshalMessageSetField(mi, b, ext[int32(k)], opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if u := mi.getUnknownBytes(p); u != nil {
|
||||
var err error
|
||||
b, err = messageset.AppendUnknown(b, *u)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func marshalMessageSetField(mi *MessageInfo, b []byte, x ExtensionField, opts marshalOptions) ([]byte, error) {
|
||||
xi := getExtensionFieldInfo(x.Type())
|
||||
num, _ := protowire.DecodeTag(xi.wiretag)
|
||||
b = messageset.AppendFieldStart(b, num)
|
||||
|
||||
if fullyLazyExtensions(opts) {
|
||||
// Don't expand the extension if it's still in wire format, instead use the buffer content.
|
||||
if lb := x.lazyBuffer(); lb != nil {
|
||||
// The tag inside the lazy buffer is a different tag (the extension
|
||||
// number), but what we need here is the tag for FieldMessage:
|
||||
b = protowire.AppendVarint(b, protowire.EncodeTag(messageset.FieldMessage, protowire.BytesType))
|
||||
b = append(b, lb[xi.tagsize:]...)
|
||||
b = messageset.AppendFieldEnd(b)
|
||||
return b, nil
|
||||
}
|
||||
}
|
||||
|
||||
b, err := xi.funcs.marshal(b, x.Value(), protowire.EncodeTag(messageset.FieldMessage, protowire.BytesType), opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
b = messageset.AppendFieldEnd(b)
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func unmarshalMessageSet(mi *MessageInfo, b []byte, p pointer, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
if !flags.ProtoLegacy {
|
||||
return out, errors.New("no support for message_set_wire_format")
|
||||
}
|
||||
|
||||
ep := p.Apply(mi.extensionOffset).Extensions()
|
||||
if *ep == nil {
|
||||
*ep = make(map[int32]ExtensionField)
|
||||
}
|
||||
ext := *ep
|
||||
initialized := true
|
||||
err = messageset.Unmarshal(b, true, func(num protowire.Number, v []byte) error {
|
||||
o, err := mi.unmarshalExtension(v, num, protowire.BytesType, ext, opts)
|
||||
if err == errUnknown {
|
||||
u := mi.mutableUnknownBytes(p)
|
||||
*u = protowire.AppendTag(*u, num, protowire.BytesType)
|
||||
*u = append(*u, v...)
|
||||
return nil
|
||||
}
|
||||
if !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
return err
|
||||
})
|
||||
out.n = len(b)
|
||||
out.initialized = initialized
|
||||
return out, err
|
||||
}
|
557
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
generated
vendored
Normal file
557
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go
generated
vendored
Normal file
@ -0,0 +1,557 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// pointerCoderFuncs is a set of pointer encoding functions.
|
||||
type pointerCoderFuncs struct {
|
||||
mi *MessageInfo
|
||||
size func(p pointer, f *coderFieldInfo, opts marshalOptions) int
|
||||
marshal func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error)
|
||||
unmarshal func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error)
|
||||
isInit func(p pointer, f *coderFieldInfo) error
|
||||
merge func(dst, src pointer, f *coderFieldInfo, opts mergeOptions)
|
||||
}
|
||||
|
||||
// valueCoderFuncs is a set of protoreflect.Value encoding functions.
|
||||
type valueCoderFuncs struct {
|
||||
size func(v protoreflect.Value, tagsize int, opts marshalOptions) int
|
||||
marshal func(b []byte, v protoreflect.Value, wiretag uint64, opts marshalOptions) ([]byte, error)
|
||||
unmarshal func(b []byte, v protoreflect.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (protoreflect.Value, unmarshalOutput, error)
|
||||
isInit func(v protoreflect.Value) error
|
||||
merge func(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value
|
||||
}
|
||||
|
||||
// fieldCoder returns pointer functions for a field, used for operating on
|
||||
// struct fields.
|
||||
func fieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) {
|
||||
switch {
|
||||
case fd.IsMap():
|
||||
return encoderFuncsForMap(fd, ft)
|
||||
case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked():
|
||||
// Repeated fields (not packed).
|
||||
if ft.Kind() != reflect.Slice {
|
||||
break
|
||||
}
|
||||
ft := ft.Elem()
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if ft.Kind() == reflect.Bool {
|
||||
return nil, coderBoolSlice
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderEnumSlice
|
||||
}
|
||||
case protoreflect.Int32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderInt32Slice
|
||||
}
|
||||
case protoreflect.Sint32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSint32Slice
|
||||
}
|
||||
case protoreflect.Uint32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderUint32Slice
|
||||
}
|
||||
case protoreflect.Int64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderInt64Slice
|
||||
}
|
||||
case protoreflect.Sint64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSint64Slice
|
||||
}
|
||||
case protoreflect.Uint64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderUint64Slice
|
||||
}
|
||||
case protoreflect.Sfixed32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSfixed32Slice
|
||||
}
|
||||
case protoreflect.Fixed32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderFixed32Slice
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if ft.Kind() == reflect.Float32 {
|
||||
return nil, coderFloatSlice
|
||||
}
|
||||
case protoreflect.Sfixed64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSfixed64Slice
|
||||
}
|
||||
case protoreflect.Fixed64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderFixed64Slice
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if ft.Kind() == reflect.Float64 {
|
||||
return nil, coderDoubleSlice
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
|
||||
return nil, coderStringSliceValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringSlice
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
|
||||
return nil, coderBytesSliceValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytesSlice
|
||||
}
|
||||
case protoreflect.BytesKind:
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringSlice
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytesSlice
|
||||
}
|
||||
case protoreflect.MessageKind:
|
||||
return getMessageInfo(ft), makeMessageSliceFieldCoder(fd, ft)
|
||||
case protoreflect.GroupKind:
|
||||
return getMessageInfo(ft), makeGroupSliceFieldCoder(fd, ft)
|
||||
}
|
||||
case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked():
|
||||
// Packed repeated fields.
|
||||
//
|
||||
// Only repeated fields of primitive numeric types
|
||||
// (Varint, Fixed32, or Fixed64 wire type) can be packed.
|
||||
if ft.Kind() != reflect.Slice {
|
||||
break
|
||||
}
|
||||
ft := ft.Elem()
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if ft.Kind() == reflect.Bool {
|
||||
return nil, coderBoolPackedSlice
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderEnumPackedSlice
|
||||
}
|
||||
case protoreflect.Int32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderInt32PackedSlice
|
||||
}
|
||||
case protoreflect.Sint32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSint32PackedSlice
|
||||
}
|
||||
case protoreflect.Uint32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderUint32PackedSlice
|
||||
}
|
||||
case protoreflect.Int64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderInt64PackedSlice
|
||||
}
|
||||
case protoreflect.Sint64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSint64PackedSlice
|
||||
}
|
||||
case protoreflect.Uint64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderUint64PackedSlice
|
||||
}
|
||||
case protoreflect.Sfixed32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSfixed32PackedSlice
|
||||
}
|
||||
case protoreflect.Fixed32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderFixed32PackedSlice
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if ft.Kind() == reflect.Float32 {
|
||||
return nil, coderFloatPackedSlice
|
||||
}
|
||||
case protoreflect.Sfixed64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSfixed64PackedSlice
|
||||
}
|
||||
case protoreflect.Fixed64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderFixed64PackedSlice
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if ft.Kind() == reflect.Float64 {
|
||||
return nil, coderDoublePackedSlice
|
||||
}
|
||||
}
|
||||
case fd.Kind() == protoreflect.MessageKind:
|
||||
return getMessageInfo(ft), makeMessageFieldCoder(fd, ft)
|
||||
case fd.Kind() == protoreflect.GroupKind:
|
||||
return getMessageInfo(ft), makeGroupFieldCoder(fd, ft)
|
||||
case !fd.HasPresence() && fd.ContainingOneof() == nil:
|
||||
// Populated oneof fields always encode even if set to the zero value,
|
||||
// which normally are not encoded in proto3.
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if ft.Kind() == reflect.Bool {
|
||||
return nil, coderBoolNoZero
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderEnumNoZero
|
||||
}
|
||||
case protoreflect.Int32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderInt32NoZero
|
||||
}
|
||||
case protoreflect.Sint32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSint32NoZero
|
||||
}
|
||||
case protoreflect.Uint32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderUint32NoZero
|
||||
}
|
||||
case protoreflect.Int64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderInt64NoZero
|
||||
}
|
||||
case protoreflect.Sint64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSint64NoZero
|
||||
}
|
||||
case protoreflect.Uint64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderUint64NoZero
|
||||
}
|
||||
case protoreflect.Sfixed32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSfixed32NoZero
|
||||
}
|
||||
case protoreflect.Fixed32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderFixed32NoZero
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if ft.Kind() == reflect.Float32 {
|
||||
return nil, coderFloatNoZero
|
||||
}
|
||||
case protoreflect.Sfixed64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSfixed64NoZero
|
||||
}
|
||||
case protoreflect.Fixed64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderFixed64NoZero
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if ft.Kind() == reflect.Float64 {
|
||||
return nil, coderDoubleNoZero
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
|
||||
return nil, coderStringNoZeroValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringNoZero
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
|
||||
return nil, coderBytesNoZeroValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytesNoZero
|
||||
}
|
||||
case protoreflect.BytesKind:
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringNoZero
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytesNoZero
|
||||
}
|
||||
}
|
||||
case ft.Kind() == reflect.Ptr:
|
||||
ft := ft.Elem()
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if ft.Kind() == reflect.Bool {
|
||||
return nil, coderBoolPtr
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderEnumPtr
|
||||
}
|
||||
case protoreflect.Int32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderInt32Ptr
|
||||
}
|
||||
case protoreflect.Sint32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSint32Ptr
|
||||
}
|
||||
case protoreflect.Uint32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderUint32Ptr
|
||||
}
|
||||
case protoreflect.Int64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderInt64Ptr
|
||||
}
|
||||
case protoreflect.Sint64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSint64Ptr
|
||||
}
|
||||
case protoreflect.Uint64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderUint64Ptr
|
||||
}
|
||||
case protoreflect.Sfixed32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSfixed32Ptr
|
||||
}
|
||||
case protoreflect.Fixed32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderFixed32Ptr
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if ft.Kind() == reflect.Float32 {
|
||||
return nil, coderFloatPtr
|
||||
}
|
||||
case protoreflect.Sfixed64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSfixed64Ptr
|
||||
}
|
||||
case protoreflect.Fixed64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderFixed64Ptr
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if ft.Kind() == reflect.Float64 {
|
||||
return nil, coderDoublePtr
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
|
||||
return nil, coderStringPtrValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringPtr
|
||||
}
|
||||
case protoreflect.BytesKind:
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderStringPtr
|
||||
}
|
||||
}
|
||||
default:
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if ft.Kind() == reflect.Bool {
|
||||
return nil, coderBool
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderEnum
|
||||
}
|
||||
case protoreflect.Int32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderInt32
|
||||
}
|
||||
case protoreflect.Sint32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSint32
|
||||
}
|
||||
case protoreflect.Uint32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderUint32
|
||||
}
|
||||
case protoreflect.Int64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderInt64
|
||||
}
|
||||
case protoreflect.Sint64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSint64
|
||||
}
|
||||
case protoreflect.Uint64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderUint64
|
||||
}
|
||||
case protoreflect.Sfixed32Kind:
|
||||
if ft.Kind() == reflect.Int32 {
|
||||
return nil, coderSfixed32
|
||||
}
|
||||
case protoreflect.Fixed32Kind:
|
||||
if ft.Kind() == reflect.Uint32 {
|
||||
return nil, coderFixed32
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if ft.Kind() == reflect.Float32 {
|
||||
return nil, coderFloat
|
||||
}
|
||||
case protoreflect.Sfixed64Kind:
|
||||
if ft.Kind() == reflect.Int64 {
|
||||
return nil, coderSfixed64
|
||||
}
|
||||
case protoreflect.Fixed64Kind:
|
||||
if ft.Kind() == reflect.Uint64 {
|
||||
return nil, coderFixed64
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if ft.Kind() == reflect.Float64 {
|
||||
return nil, coderDouble
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
|
||||
return nil, coderStringValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderString
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
|
||||
return nil, coderBytesValidateUTF8
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytes
|
||||
}
|
||||
case protoreflect.BytesKind:
|
||||
if ft.Kind() == reflect.String {
|
||||
return nil, coderString
|
||||
}
|
||||
if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
|
||||
return nil, coderBytes
|
||||
}
|
||||
}
|
||||
}
|
||||
panic(fmt.Sprintf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
|
||||
}
|
||||
|
||||
// encoderFuncsForValue returns value functions for a field, used for
|
||||
// extension values and map encoding.
|
||||
func encoderFuncsForValue(fd protoreflect.FieldDescriptor) valueCoderFuncs {
|
||||
switch {
|
||||
case fd.Cardinality() == protoreflect.Repeated && !fd.IsPacked():
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
return coderBoolSliceValue
|
||||
case protoreflect.EnumKind:
|
||||
return coderEnumSliceValue
|
||||
case protoreflect.Int32Kind:
|
||||
return coderInt32SliceValue
|
||||
case protoreflect.Sint32Kind:
|
||||
return coderSint32SliceValue
|
||||
case protoreflect.Uint32Kind:
|
||||
return coderUint32SliceValue
|
||||
case protoreflect.Int64Kind:
|
||||
return coderInt64SliceValue
|
||||
case protoreflect.Sint64Kind:
|
||||
return coderSint64SliceValue
|
||||
case protoreflect.Uint64Kind:
|
||||
return coderUint64SliceValue
|
||||
case protoreflect.Sfixed32Kind:
|
||||
return coderSfixed32SliceValue
|
||||
case protoreflect.Fixed32Kind:
|
||||
return coderFixed32SliceValue
|
||||
case protoreflect.FloatKind:
|
||||
return coderFloatSliceValue
|
||||
case protoreflect.Sfixed64Kind:
|
||||
return coderSfixed64SliceValue
|
||||
case protoreflect.Fixed64Kind:
|
||||
return coderFixed64SliceValue
|
||||
case protoreflect.DoubleKind:
|
||||
return coderDoubleSliceValue
|
||||
case protoreflect.StringKind:
|
||||
// We don't have a UTF-8 validating coder for repeated string fields.
|
||||
// Value coders are used for extensions and maps.
|
||||
// Extensions are never proto3, and maps never contain lists.
|
||||
return coderStringSliceValue
|
||||
case protoreflect.BytesKind:
|
||||
return coderBytesSliceValue
|
||||
case protoreflect.MessageKind:
|
||||
return coderMessageSliceValue
|
||||
case protoreflect.GroupKind:
|
||||
return coderGroupSliceValue
|
||||
}
|
||||
case fd.Cardinality() == protoreflect.Repeated && fd.IsPacked():
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
return coderBoolPackedSliceValue
|
||||
case protoreflect.EnumKind:
|
||||
return coderEnumPackedSliceValue
|
||||
case protoreflect.Int32Kind:
|
||||
return coderInt32PackedSliceValue
|
||||
case protoreflect.Sint32Kind:
|
||||
return coderSint32PackedSliceValue
|
||||
case protoreflect.Uint32Kind:
|
||||
return coderUint32PackedSliceValue
|
||||
case protoreflect.Int64Kind:
|
||||
return coderInt64PackedSliceValue
|
||||
case protoreflect.Sint64Kind:
|
||||
return coderSint64PackedSliceValue
|
||||
case protoreflect.Uint64Kind:
|
||||
return coderUint64PackedSliceValue
|
||||
case protoreflect.Sfixed32Kind:
|
||||
return coderSfixed32PackedSliceValue
|
||||
case protoreflect.Fixed32Kind:
|
||||
return coderFixed32PackedSliceValue
|
||||
case protoreflect.FloatKind:
|
||||
return coderFloatPackedSliceValue
|
||||
case protoreflect.Sfixed64Kind:
|
||||
return coderSfixed64PackedSliceValue
|
||||
case protoreflect.Fixed64Kind:
|
||||
return coderFixed64PackedSliceValue
|
||||
case protoreflect.DoubleKind:
|
||||
return coderDoublePackedSliceValue
|
||||
}
|
||||
default:
|
||||
switch fd.Kind() {
|
||||
default:
|
||||
case protoreflect.BoolKind:
|
||||
return coderBoolValue
|
||||
case protoreflect.EnumKind:
|
||||
return coderEnumValue
|
||||
case protoreflect.Int32Kind:
|
||||
return coderInt32Value
|
||||
case protoreflect.Sint32Kind:
|
||||
return coderSint32Value
|
||||
case protoreflect.Uint32Kind:
|
||||
return coderUint32Value
|
||||
case protoreflect.Int64Kind:
|
||||
return coderInt64Value
|
||||
case protoreflect.Sint64Kind:
|
||||
return coderSint64Value
|
||||
case protoreflect.Uint64Kind:
|
||||
return coderUint64Value
|
||||
case protoreflect.Sfixed32Kind:
|
||||
return coderSfixed32Value
|
||||
case protoreflect.Fixed32Kind:
|
||||
return coderFixed32Value
|
||||
case protoreflect.FloatKind:
|
||||
return coderFloatValue
|
||||
case protoreflect.Sfixed64Kind:
|
||||
return coderSfixed64Value
|
||||
case protoreflect.Fixed64Kind:
|
||||
return coderFixed64Value
|
||||
case protoreflect.DoubleKind:
|
||||
return coderDoubleValue
|
||||
case protoreflect.StringKind:
|
||||
if strs.EnforceUTF8(fd) {
|
||||
return coderStringValueValidateUTF8
|
||||
}
|
||||
return coderStringValue
|
||||
case protoreflect.BytesKind:
|
||||
return coderBytesValue
|
||||
case protoreflect.MessageKind:
|
||||
return coderMessageValue
|
||||
case protoreflect.GroupKind:
|
||||
return coderGroupValue
|
||||
}
|
||||
}
|
||||
panic(fmt.Sprintf("invalid field: no encoder for %v %v %v", fd.FullName(), fd.Cardinality(), fd.Kind()))
|
||||
}
|
15
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go
generated
vendored
Normal file
15
e2e/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go
generated
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
// When using unsafe pointers, we can just treat enum values as int32s.
|
||||
|
||||
var (
|
||||
coderEnumNoZero = coderInt32NoZero
|
||||
coderEnum = coderInt32
|
||||
coderEnumPtr = coderInt32Ptr
|
||||
coderEnumSlice = coderInt32Slice
|
||||
coderEnumPackedSlice = coderInt32PackedSlice
|
||||
)
|
495
e2e/vendor/google.golang.org/protobuf/internal/impl/convert.go
generated
vendored
Normal file
495
e2e/vendor/google.golang.org/protobuf/internal/impl/convert.go
generated
vendored
Normal file
@ -0,0 +1,495 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// unwrapper unwraps the value to the underlying value.
|
||||
// This is implemented by List and Map.
|
||||
type unwrapper interface {
|
||||
protoUnwrap() any
|
||||
}
|
||||
|
||||
// A Converter coverts to/from Go reflect.Value types and protobuf protoreflect.Value types.
|
||||
type Converter interface {
|
||||
// PBValueOf converts a reflect.Value to a protoreflect.Value.
|
||||
PBValueOf(reflect.Value) protoreflect.Value
|
||||
|
||||
// GoValueOf converts a protoreflect.Value to a reflect.Value.
|
||||
GoValueOf(protoreflect.Value) reflect.Value
|
||||
|
||||
// IsValidPB returns whether a protoreflect.Value is compatible with this type.
|
||||
IsValidPB(protoreflect.Value) bool
|
||||
|
||||
// IsValidGo returns whether a reflect.Value is compatible with this type.
|
||||
IsValidGo(reflect.Value) bool
|
||||
|
||||
// New returns a new field value.
|
||||
// For scalars, it returns the default value of the field.
|
||||
// For composite types, it returns a new mutable value.
|
||||
New() protoreflect.Value
|
||||
|
||||
// Zero returns a new field value.
|
||||
// For scalars, it returns the default value of the field.
|
||||
// For composite types, it returns an immutable, empty value.
|
||||
Zero() protoreflect.Value
|
||||
}
|
||||
|
||||
// NewConverter matches a Go type with a protobuf field and returns a Converter
|
||||
// that converts between the two. Enums must be a named int32 kind that
|
||||
// implements protoreflect.Enum, and messages must be pointer to a named
|
||||
// struct type that implements protoreflect.ProtoMessage.
|
||||
//
|
||||
// This matcher deliberately supports a wider range of Go types than what
|
||||
// protoc-gen-go historically generated to be able to automatically wrap some
|
||||
// v1 messages generated by other forks of protoc-gen-go.
|
||||
func NewConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter {
|
||||
switch {
|
||||
case fd.IsList():
|
||||
return newListConverter(t, fd)
|
||||
case fd.IsMap():
|
||||
return newMapConverter(t, fd)
|
||||
default:
|
||||
return newSingularConverter(t, fd)
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
boolType = reflect.TypeOf(bool(false))
|
||||
int32Type = reflect.TypeOf(int32(0))
|
||||
int64Type = reflect.TypeOf(int64(0))
|
||||
uint32Type = reflect.TypeOf(uint32(0))
|
||||
uint64Type = reflect.TypeOf(uint64(0))
|
||||
float32Type = reflect.TypeOf(float32(0))
|
||||
float64Type = reflect.TypeOf(float64(0))
|
||||
stringType = reflect.TypeOf(string(""))
|
||||
bytesType = reflect.TypeOf([]byte(nil))
|
||||
byteType = reflect.TypeOf(byte(0))
|
||||
)
|
||||
|
||||
var (
|
||||
boolZero = protoreflect.ValueOfBool(false)
|
||||
int32Zero = protoreflect.ValueOfInt32(0)
|
||||
int64Zero = protoreflect.ValueOfInt64(0)
|
||||
uint32Zero = protoreflect.ValueOfUint32(0)
|
||||
uint64Zero = protoreflect.ValueOfUint64(0)
|
||||
float32Zero = protoreflect.ValueOfFloat32(0)
|
||||
float64Zero = protoreflect.ValueOfFloat64(0)
|
||||
stringZero = protoreflect.ValueOfString("")
|
||||
bytesZero = protoreflect.ValueOfBytes(nil)
|
||||
)
|
||||
|
||||
func newSingularConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter {
|
||||
defVal := func(fd protoreflect.FieldDescriptor, zero protoreflect.Value) protoreflect.Value {
|
||||
if fd.Cardinality() == protoreflect.Repeated {
|
||||
// Default isn't defined for repeated fields.
|
||||
return zero
|
||||
}
|
||||
return fd.Default()
|
||||
}
|
||||
switch fd.Kind() {
|
||||
case protoreflect.BoolKind:
|
||||
if t.Kind() == reflect.Bool {
|
||||
return &boolConverter{t, defVal(fd, boolZero)}
|
||||
}
|
||||
case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
|
||||
if t.Kind() == reflect.Int32 {
|
||||
return &int32Converter{t, defVal(fd, int32Zero)}
|
||||
}
|
||||
case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
|
||||
if t.Kind() == reflect.Int64 {
|
||||
return &int64Converter{t, defVal(fd, int64Zero)}
|
||||
}
|
||||
case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
|
||||
if t.Kind() == reflect.Uint32 {
|
||||
return &uint32Converter{t, defVal(fd, uint32Zero)}
|
||||
}
|
||||
case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
|
||||
if t.Kind() == reflect.Uint64 {
|
||||
return &uint64Converter{t, defVal(fd, uint64Zero)}
|
||||
}
|
||||
case protoreflect.FloatKind:
|
||||
if t.Kind() == reflect.Float32 {
|
||||
return &float32Converter{t, defVal(fd, float32Zero)}
|
||||
}
|
||||
case protoreflect.DoubleKind:
|
||||
if t.Kind() == reflect.Float64 {
|
||||
return &float64Converter{t, defVal(fd, float64Zero)}
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) {
|
||||
return &stringConverter{t, defVal(fd, stringZero)}
|
||||
}
|
||||
case protoreflect.BytesKind:
|
||||
if t.Kind() == reflect.String || (t.Kind() == reflect.Slice && t.Elem() == byteType) {
|
||||
return &bytesConverter{t, defVal(fd, bytesZero)}
|
||||
}
|
||||
case protoreflect.EnumKind:
|
||||
// Handle enums, which must be a named int32 type.
|
||||
if t.Kind() == reflect.Int32 {
|
||||
return newEnumConverter(t, fd)
|
||||
}
|
||||
case protoreflect.MessageKind, protoreflect.GroupKind:
|
||||
return newMessageConverter(t)
|
||||
}
|
||||
panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName()))
|
||||
}
|
||||
|
||||
type boolConverter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *boolConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfBool(v.Bool())
|
||||
}
|
||||
func (c *boolConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(v.Bool()).Convert(c.goType)
|
||||
}
|
||||
func (c *boolConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(bool)
|
||||
return ok
|
||||
}
|
||||
func (c *boolConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *boolConverter) New() protoreflect.Value { return c.def }
|
||||
func (c *boolConverter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type int32Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *int32Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfInt32(int32(v.Int()))
|
||||
}
|
||||
func (c *int32Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(int32(v.Int())).Convert(c.goType)
|
||||
}
|
||||
func (c *int32Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(int32)
|
||||
return ok
|
||||
}
|
||||
func (c *int32Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *int32Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *int32Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type int64Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *int64Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfInt64(int64(v.Int()))
|
||||
}
|
||||
func (c *int64Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(int64(v.Int())).Convert(c.goType)
|
||||
}
|
||||
func (c *int64Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(int64)
|
||||
return ok
|
||||
}
|
||||
func (c *int64Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *int64Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *int64Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type uint32Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *uint32Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfUint32(uint32(v.Uint()))
|
||||
}
|
||||
func (c *uint32Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(uint32(v.Uint())).Convert(c.goType)
|
||||
}
|
||||
func (c *uint32Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(uint32)
|
||||
return ok
|
||||
}
|
||||
func (c *uint32Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *uint32Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *uint32Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type uint64Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *uint64Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfUint64(uint64(v.Uint()))
|
||||
}
|
||||
func (c *uint64Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(uint64(v.Uint())).Convert(c.goType)
|
||||
}
|
||||
func (c *uint64Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(uint64)
|
||||
return ok
|
||||
}
|
||||
func (c *uint64Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *uint64Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *uint64Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type float32Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *float32Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfFloat32(float32(v.Float()))
|
||||
}
|
||||
func (c *float32Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(float32(v.Float())).Convert(c.goType)
|
||||
}
|
||||
func (c *float32Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(float32)
|
||||
return ok
|
||||
}
|
||||
func (c *float32Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *float32Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *float32Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type float64Converter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *float64Converter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfFloat64(float64(v.Float()))
|
||||
}
|
||||
func (c *float64Converter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(float64(v.Float())).Convert(c.goType)
|
||||
}
|
||||
func (c *float64Converter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(float64)
|
||||
return ok
|
||||
}
|
||||
func (c *float64Converter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *float64Converter) New() protoreflect.Value { return c.def }
|
||||
func (c *float64Converter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type stringConverter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *stringConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfString(v.Convert(stringType).String())
|
||||
}
|
||||
func (c *stringConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
// protoreflect.Value.String never panics, so we go through an interface
|
||||
// conversion here to check the type.
|
||||
s := v.Interface().(string)
|
||||
if c.goType.Kind() == reflect.Slice && s == "" {
|
||||
return reflect.Zero(c.goType) // ensure empty string is []byte(nil)
|
||||
}
|
||||
return reflect.ValueOf(s).Convert(c.goType)
|
||||
}
|
||||
func (c *stringConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(string)
|
||||
return ok
|
||||
}
|
||||
func (c *stringConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *stringConverter) New() protoreflect.Value { return c.def }
|
||||
func (c *stringConverter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type bytesConverter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func (c *bytesConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
if c.goType.Kind() == reflect.String && v.Len() == 0 {
|
||||
return protoreflect.ValueOfBytes(nil) // ensure empty string is []byte(nil)
|
||||
}
|
||||
return protoreflect.ValueOfBytes(v.Convert(bytesType).Bytes())
|
||||
}
|
||||
func (c *bytesConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(v.Bytes()).Convert(c.goType)
|
||||
}
|
||||
func (c *bytesConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().([]byte)
|
||||
return ok
|
||||
}
|
||||
func (c *bytesConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
func (c *bytesConverter) New() protoreflect.Value { return c.def }
|
||||
func (c *bytesConverter) Zero() protoreflect.Value { return c.def }
|
||||
|
||||
type enumConverter struct {
|
||||
goType reflect.Type
|
||||
def protoreflect.Value
|
||||
}
|
||||
|
||||
func newEnumConverter(goType reflect.Type, fd protoreflect.FieldDescriptor) Converter {
|
||||
var def protoreflect.Value
|
||||
if fd.Cardinality() == protoreflect.Repeated {
|
||||
def = protoreflect.ValueOfEnum(fd.Enum().Values().Get(0).Number())
|
||||
} else {
|
||||
def = fd.Default()
|
||||
}
|
||||
return &enumConverter{goType, def}
|
||||
}
|
||||
|
||||
func (c *enumConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v.Int()))
|
||||
}
|
||||
|
||||
func (c *enumConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return reflect.ValueOf(v.Enum()).Convert(c.goType)
|
||||
}
|
||||
|
||||
func (c *enumConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
_, ok := v.Interface().(protoreflect.EnumNumber)
|
||||
return ok
|
||||
}
|
||||
|
||||
func (c *enumConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *enumConverter) New() protoreflect.Value {
|
||||
return c.def
|
||||
}
|
||||
|
||||
func (c *enumConverter) Zero() protoreflect.Value {
|
||||
return c.def
|
||||
}
|
||||
|
||||
type messageConverter struct {
|
||||
goType reflect.Type
|
||||
}
|
||||
|
||||
func newMessageConverter(goType reflect.Type) Converter {
|
||||
return &messageConverter{goType}
|
||||
}
|
||||
|
||||
func (c *messageConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
if c.isNonPointer() {
|
||||
if v.CanAddr() {
|
||||
v = v.Addr() // T => *T
|
||||
} else {
|
||||
v = reflect.Zero(reflect.PtrTo(v.Type()))
|
||||
}
|
||||
}
|
||||
if m, ok := v.Interface().(protoreflect.ProtoMessage); ok {
|
||||
return protoreflect.ValueOfMessage(m.ProtoReflect())
|
||||
}
|
||||
return protoreflect.ValueOfMessage(legacyWrapMessage(v))
|
||||
}
|
||||
|
||||
func (c *messageConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
m := v.Message()
|
||||
var rv reflect.Value
|
||||
if u, ok := m.(unwrapper); ok {
|
||||
rv = reflect.ValueOf(u.protoUnwrap())
|
||||
} else {
|
||||
rv = reflect.ValueOf(m.Interface())
|
||||
}
|
||||
if c.isNonPointer() {
|
||||
if rv.Type() != reflect.PtrTo(c.goType) {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", rv.Type(), reflect.PtrTo(c.goType)))
|
||||
}
|
||||
if !rv.IsNil() {
|
||||
rv = rv.Elem() // *T => T
|
||||
} else {
|
||||
rv = reflect.Zero(rv.Type().Elem())
|
||||
}
|
||||
}
|
||||
if rv.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", rv.Type(), c.goType))
|
||||
}
|
||||
return rv
|
||||
}
|
||||
|
||||
func (c *messageConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
m := v.Message()
|
||||
var rv reflect.Value
|
||||
if u, ok := m.(unwrapper); ok {
|
||||
rv = reflect.ValueOf(u.protoUnwrap())
|
||||
} else {
|
||||
rv = reflect.ValueOf(m.Interface())
|
||||
}
|
||||
if c.isNonPointer() {
|
||||
return rv.Type() == reflect.PtrTo(c.goType)
|
||||
}
|
||||
return rv.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *messageConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *messageConverter) New() protoreflect.Value {
|
||||
if c.isNonPointer() {
|
||||
return c.PBValueOf(reflect.New(c.goType).Elem())
|
||||
}
|
||||
return c.PBValueOf(reflect.New(c.goType.Elem()))
|
||||
}
|
||||
|
||||
func (c *messageConverter) Zero() protoreflect.Value {
|
||||
return c.PBValueOf(reflect.Zero(c.goType))
|
||||
}
|
||||
|
||||
// isNonPointer reports whether the type is a non-pointer type.
|
||||
// This never occurs for generated message types.
|
||||
func (c *messageConverter) isNonPointer() bool {
|
||||
return c.goType.Kind() != reflect.Ptr
|
||||
}
|
141
e2e/vendor/google.golang.org/protobuf/internal/impl/convert_list.go
generated
vendored
Normal file
141
e2e/vendor/google.golang.org/protobuf/internal/impl/convert_list.go
generated
vendored
Normal file
@ -0,0 +1,141 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func newListConverter(t reflect.Type, fd protoreflect.FieldDescriptor) Converter {
|
||||
switch {
|
||||
case t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Slice:
|
||||
return &listPtrConverter{t, newSingularConverter(t.Elem().Elem(), fd)}
|
||||
case t.Kind() == reflect.Slice:
|
||||
return &listConverter{t, newSingularConverter(t.Elem(), fd)}
|
||||
}
|
||||
panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName()))
|
||||
}
|
||||
|
||||
type listConverter struct {
|
||||
goType reflect.Type // []T
|
||||
c Converter
|
||||
}
|
||||
|
||||
func (c *listConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
pv := reflect.New(c.goType)
|
||||
pv.Elem().Set(v)
|
||||
return protoreflect.ValueOfList(&listReflect{pv, c.c})
|
||||
}
|
||||
|
||||
func (c *listConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
rv := v.List().(*listReflect).v
|
||||
if rv.IsNil() {
|
||||
return reflect.Zero(c.goType)
|
||||
}
|
||||
return rv.Elem()
|
||||
}
|
||||
|
||||
func (c *listConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
list, ok := v.Interface().(*listReflect)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return list.v.Type().Elem() == c.goType
|
||||
}
|
||||
|
||||
func (c *listConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *listConverter) New() protoreflect.Value {
|
||||
return protoreflect.ValueOfList(&listReflect{reflect.New(c.goType), c.c})
|
||||
}
|
||||
|
||||
func (c *listConverter) Zero() protoreflect.Value {
|
||||
return protoreflect.ValueOfList(&listReflect{reflect.Zero(reflect.PtrTo(c.goType)), c.c})
|
||||
}
|
||||
|
||||
type listPtrConverter struct {
|
||||
goType reflect.Type // *[]T
|
||||
c Converter
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfList(&listReflect{v, c.c})
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return v.List().(*listReflect).v
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
list, ok := v.Interface().(*listReflect)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return list.v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) New() protoreflect.Value {
|
||||
return c.PBValueOf(reflect.New(c.goType.Elem()))
|
||||
}
|
||||
|
||||
func (c *listPtrConverter) Zero() protoreflect.Value {
|
||||
return c.PBValueOf(reflect.Zero(c.goType))
|
||||
}
|
||||
|
||||
type listReflect struct {
|
||||
v reflect.Value // *[]T
|
||||
conv Converter
|
||||
}
|
||||
|
||||
func (ls *listReflect) Len() int {
|
||||
if ls.v.IsNil() {
|
||||
return 0
|
||||
}
|
||||
return ls.v.Elem().Len()
|
||||
}
|
||||
func (ls *listReflect) Get(i int) protoreflect.Value {
|
||||
return ls.conv.PBValueOf(ls.v.Elem().Index(i))
|
||||
}
|
||||
func (ls *listReflect) Set(i int, v protoreflect.Value) {
|
||||
ls.v.Elem().Index(i).Set(ls.conv.GoValueOf(v))
|
||||
}
|
||||
func (ls *listReflect) Append(v protoreflect.Value) {
|
||||
ls.v.Elem().Set(reflect.Append(ls.v.Elem(), ls.conv.GoValueOf(v)))
|
||||
}
|
||||
func (ls *listReflect) AppendMutable() protoreflect.Value {
|
||||
if _, ok := ls.conv.(*messageConverter); !ok {
|
||||
panic("invalid AppendMutable on list with non-message type")
|
||||
}
|
||||
v := ls.NewElement()
|
||||
ls.Append(v)
|
||||
return v
|
||||
}
|
||||
func (ls *listReflect) Truncate(i int) {
|
||||
ls.v.Elem().Set(ls.v.Elem().Slice(0, i))
|
||||
}
|
||||
func (ls *listReflect) NewElement() protoreflect.Value {
|
||||
return ls.conv.New()
|
||||
}
|
||||
func (ls *listReflect) IsValid() bool {
|
||||
return !ls.v.IsNil()
|
||||
}
|
||||
func (ls *listReflect) protoUnwrap() any {
|
||||
return ls.v.Interface()
|
||||
}
|
121
e2e/vendor/google.golang.org/protobuf/internal/impl/convert_map.go
generated
vendored
Normal file
121
e2e/vendor/google.golang.org/protobuf/internal/impl/convert_map.go
generated
vendored
Normal file
@ -0,0 +1,121 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type mapConverter struct {
|
||||
goType reflect.Type // map[K]V
|
||||
keyConv, valConv Converter
|
||||
}
|
||||
|
||||
func newMapConverter(t reflect.Type, fd protoreflect.FieldDescriptor) *mapConverter {
|
||||
if t.Kind() != reflect.Map {
|
||||
panic(fmt.Sprintf("invalid Go type %v for field %v", t, fd.FullName()))
|
||||
}
|
||||
return &mapConverter{
|
||||
goType: t,
|
||||
keyConv: newSingularConverter(t.Key(), fd.MapKey()),
|
||||
valConv: newSingularConverter(t.Elem(), fd.MapValue()),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *mapConverter) PBValueOf(v reflect.Value) protoreflect.Value {
|
||||
if v.Type() != c.goType {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want %v", v.Type(), c.goType))
|
||||
}
|
||||
return protoreflect.ValueOfMap(&mapReflect{v, c.keyConv, c.valConv})
|
||||
}
|
||||
|
||||
func (c *mapConverter) GoValueOf(v protoreflect.Value) reflect.Value {
|
||||
return v.Map().(*mapReflect).v
|
||||
}
|
||||
|
||||
func (c *mapConverter) IsValidPB(v protoreflect.Value) bool {
|
||||
mapv, ok := v.Interface().(*mapReflect)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return mapv.v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *mapConverter) IsValidGo(v reflect.Value) bool {
|
||||
return v.IsValid() && v.Type() == c.goType
|
||||
}
|
||||
|
||||
func (c *mapConverter) New() protoreflect.Value {
|
||||
return c.PBValueOf(reflect.MakeMap(c.goType))
|
||||
}
|
||||
|
||||
func (c *mapConverter) Zero() protoreflect.Value {
|
||||
return c.PBValueOf(reflect.Zero(c.goType))
|
||||
}
|
||||
|
||||
type mapReflect struct {
|
||||
v reflect.Value // map[K]V
|
||||
keyConv Converter
|
||||
valConv Converter
|
||||
}
|
||||
|
||||
func (ms *mapReflect) Len() int {
|
||||
return ms.v.Len()
|
||||
}
|
||||
func (ms *mapReflect) Has(k protoreflect.MapKey) bool {
|
||||
rk := ms.keyConv.GoValueOf(k.Value())
|
||||
rv := ms.v.MapIndex(rk)
|
||||
return rv.IsValid()
|
||||
}
|
||||
func (ms *mapReflect) Get(k protoreflect.MapKey) protoreflect.Value {
|
||||
rk := ms.keyConv.GoValueOf(k.Value())
|
||||
rv := ms.v.MapIndex(rk)
|
||||
if !rv.IsValid() {
|
||||
return protoreflect.Value{}
|
||||
}
|
||||
return ms.valConv.PBValueOf(rv)
|
||||
}
|
||||
func (ms *mapReflect) Set(k protoreflect.MapKey, v protoreflect.Value) {
|
||||
rk := ms.keyConv.GoValueOf(k.Value())
|
||||
rv := ms.valConv.GoValueOf(v)
|
||||
ms.v.SetMapIndex(rk, rv)
|
||||
}
|
||||
func (ms *mapReflect) Clear(k protoreflect.MapKey) {
|
||||
rk := ms.keyConv.GoValueOf(k.Value())
|
||||
ms.v.SetMapIndex(rk, reflect.Value{})
|
||||
}
|
||||
func (ms *mapReflect) Mutable(k protoreflect.MapKey) protoreflect.Value {
|
||||
if _, ok := ms.valConv.(*messageConverter); !ok {
|
||||
panic("invalid Mutable on map with non-message value type")
|
||||
}
|
||||
v := ms.Get(k)
|
||||
if !v.IsValid() {
|
||||
v = ms.NewValue()
|
||||
ms.Set(k, v)
|
||||
}
|
||||
return v
|
||||
}
|
||||
func (ms *mapReflect) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) {
|
||||
iter := ms.v.MapRange()
|
||||
for iter.Next() {
|
||||
k := ms.keyConv.PBValueOf(iter.Key()).MapKey()
|
||||
v := ms.valConv.PBValueOf(iter.Value())
|
||||
if !f(k, v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
func (ms *mapReflect) NewValue() protoreflect.Value {
|
||||
return ms.valConv.New()
|
||||
}
|
||||
func (ms *mapReflect) IsValid() bool {
|
||||
return !ms.v.IsNil()
|
||||
}
|
||||
func (ms *mapReflect) protoUnwrap() any {
|
||||
return ms.v.Interface()
|
||||
}
|
333
e2e/vendor/google.golang.org/protobuf/internal/impl/decode.go
generated
vendored
Normal file
333
e2e/vendor/google.golang.org/protobuf/internal/impl/decode.go
generated
vendored
Normal file
@ -0,0 +1,333 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"math/bits"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
var errDecode = errors.New("cannot parse invalid wire-format data")
|
||||
var errRecursionDepth = errors.New("exceeded maximum recursion depth")
|
||||
|
||||
type unmarshalOptions struct {
|
||||
flags protoiface.UnmarshalInputFlags
|
||||
resolver interface {
|
||||
FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error)
|
||||
FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error)
|
||||
}
|
||||
depth int
|
||||
}
|
||||
|
||||
func (o unmarshalOptions) Options() proto.UnmarshalOptions {
|
||||
return proto.UnmarshalOptions{
|
||||
Merge: true,
|
||||
AllowPartial: true,
|
||||
DiscardUnknown: o.DiscardUnknown(),
|
||||
Resolver: o.resolver,
|
||||
|
||||
NoLazyDecoding: o.NoLazyDecoding(),
|
||||
}
|
||||
}
|
||||
|
||||
func (o unmarshalOptions) DiscardUnknown() bool {
|
||||
return o.flags&protoiface.UnmarshalDiscardUnknown != 0
|
||||
}
|
||||
|
||||
func (o unmarshalOptions) AliasBuffer() bool { return o.flags&protoiface.UnmarshalAliasBuffer != 0 }
|
||||
func (o unmarshalOptions) Validated() bool { return o.flags&protoiface.UnmarshalValidated != 0 }
|
||||
func (o unmarshalOptions) NoLazyDecoding() bool {
|
||||
return o.flags&protoiface.UnmarshalNoLazyDecoding != 0
|
||||
}
|
||||
|
||||
func (o unmarshalOptions) CanBeLazy() bool {
|
||||
if o.resolver != protoregistry.GlobalTypes {
|
||||
return false
|
||||
}
|
||||
// We ignore the UnmarshalInvalidateSizeCache even though it's not in the default set
|
||||
return (o.flags & ^(protoiface.UnmarshalAliasBuffer | protoiface.UnmarshalValidated | protoiface.UnmarshalCheckRequired)) == 0
|
||||
}
|
||||
|
||||
var lazyUnmarshalOptions = unmarshalOptions{
|
||||
resolver: protoregistry.GlobalTypes,
|
||||
|
||||
flags: protoiface.UnmarshalAliasBuffer | protoiface.UnmarshalValidated,
|
||||
|
||||
depth: protowire.DefaultRecursionLimit,
|
||||
}
|
||||
|
||||
type unmarshalOutput struct {
|
||||
n int // number of bytes consumed
|
||||
initialized bool
|
||||
}
|
||||
|
||||
// unmarshal is protoreflect.Methods.Unmarshal.
|
||||
func (mi *MessageInfo) unmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) {
|
||||
var p pointer
|
||||
if ms, ok := in.Message.(*messageState); ok {
|
||||
p = ms.pointer()
|
||||
} else {
|
||||
p = in.Message.(*messageReflectWrapper).pointer()
|
||||
}
|
||||
out, err := mi.unmarshalPointer(in.Buf, p, 0, unmarshalOptions{
|
||||
flags: in.Flags,
|
||||
resolver: in.Resolver,
|
||||
depth: in.Depth,
|
||||
})
|
||||
var flags protoiface.UnmarshalOutputFlags
|
||||
if out.initialized {
|
||||
flags |= protoiface.UnmarshalInitialized
|
||||
}
|
||||
return protoiface.UnmarshalOutput{
|
||||
Flags: flags,
|
||||
}, err
|
||||
}
|
||||
|
||||
// errUnknown is returned during unmarshaling to indicate a parse error that
|
||||
// should result in a field being placed in the unknown fields section (for example,
|
||||
// when the wire type doesn't match) as opposed to the entire unmarshal operation
|
||||
// failing (for example, when a field extends past the available input).
|
||||
//
|
||||
// This is a sentinel error which should never be visible to the user.
|
||||
var errUnknown = errors.New("unknown")
|
||||
|
||||
func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
mi.init()
|
||||
opts.depth--
|
||||
if opts.depth < 0 {
|
||||
return out, errRecursionDepth
|
||||
}
|
||||
if flags.ProtoLegacy && mi.isMessageSet {
|
||||
return unmarshalMessageSet(mi, b, p, opts)
|
||||
}
|
||||
|
||||
lazyDecoding := LazyEnabled() // default
|
||||
if opts.NoLazyDecoding() {
|
||||
lazyDecoding = false // explicitly disabled
|
||||
}
|
||||
if mi.lazyOffset.IsValid() && lazyDecoding {
|
||||
return mi.unmarshalPointerLazy(b, p, groupTag, opts)
|
||||
}
|
||||
return mi.unmarshalPointerEager(b, p, groupTag, opts)
|
||||
}
|
||||
|
||||
// unmarshalPointerEager is the message unmarshalling function for all messages that are not lazy.
|
||||
// The corresponding function for Lazy is in google_lazy.go.
|
||||
func (mi *MessageInfo) unmarshalPointerEager(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
|
||||
initialized := true
|
||||
var requiredMask uint64
|
||||
var exts *map[int32]ExtensionField
|
||||
|
||||
var presence presence
|
||||
if mi.presenceOffset.IsValid() {
|
||||
presence = p.Apply(mi.presenceOffset).PresenceInfo()
|
||||
}
|
||||
|
||||
start := len(b)
|
||||
for len(b) > 0 {
|
||||
// Parse the tag (field number and wire type).
|
||||
var tag uint64
|
||||
if b[0] < 0x80 {
|
||||
tag = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
tag = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
tag, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
var num protowire.Number
|
||||
if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
|
||||
return out, errDecode
|
||||
} else {
|
||||
num = protowire.Number(n)
|
||||
}
|
||||
wtyp := protowire.Type(tag & 7)
|
||||
|
||||
if wtyp == protowire.EndGroupType {
|
||||
if num != groupTag {
|
||||
return out, errDecode
|
||||
}
|
||||
groupTag = 0
|
||||
break
|
||||
}
|
||||
|
||||
var f *coderFieldInfo
|
||||
if int(num) < len(mi.denseCoderFields) {
|
||||
f = mi.denseCoderFields[num]
|
||||
} else {
|
||||
f = mi.coderFields[num]
|
||||
}
|
||||
var n int
|
||||
err := errUnknown
|
||||
switch {
|
||||
case f != nil:
|
||||
if f.funcs.unmarshal == nil {
|
||||
break
|
||||
}
|
||||
var o unmarshalOutput
|
||||
o, err = f.funcs.unmarshal(b, p.Apply(f.offset), wtyp, f, opts)
|
||||
n = o.n
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
requiredMask |= f.validation.requiredBit
|
||||
if f.funcs.isInit != nil && !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
|
||||
if f.presenceIndex != noPresence {
|
||||
presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize)
|
||||
}
|
||||
|
||||
default:
|
||||
// Possible extension.
|
||||
if exts == nil && mi.extensionOffset.IsValid() {
|
||||
exts = p.Apply(mi.extensionOffset).Extensions()
|
||||
if *exts == nil {
|
||||
*exts = make(map[int32]ExtensionField)
|
||||
}
|
||||
}
|
||||
if exts == nil {
|
||||
break
|
||||
}
|
||||
var o unmarshalOutput
|
||||
o, err = mi.unmarshalExtension(b, num, wtyp, *exts, opts)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
n = o.n
|
||||
if !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if err != errUnknown {
|
||||
return out, err
|
||||
}
|
||||
n = protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if !opts.DiscardUnknown() && mi.unknownOffset.IsValid() {
|
||||
u := mi.mutableUnknownBytes(p)
|
||||
*u = protowire.AppendTag(*u, num, wtyp)
|
||||
*u = append(*u, b[:n]...)
|
||||
}
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
if groupTag != 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if mi.numRequiredFields > 0 && bits.OnesCount64(requiredMask) != int(mi.numRequiredFields) {
|
||||
initialized = false
|
||||
}
|
||||
if initialized {
|
||||
out.initialized = true
|
||||
}
|
||||
out.n = start - len(b)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp protowire.Type, exts map[int32]ExtensionField, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
x := exts[int32(num)]
|
||||
xt := x.Type()
|
||||
if xt == nil {
|
||||
var err error
|
||||
xt, err = opts.resolver.FindExtensionByNumber(mi.Desc.FullName(), num)
|
||||
if err != nil {
|
||||
if err == protoregistry.NotFound {
|
||||
return out, errUnknown
|
||||
}
|
||||
return out, errors.New("%v: unable to resolve extension %v: %v", mi.Desc.FullName(), num, err)
|
||||
}
|
||||
}
|
||||
xi := getExtensionFieldInfo(xt)
|
||||
if xi.funcs.unmarshal == nil {
|
||||
return out, errUnknown
|
||||
}
|
||||
if flags.LazyUnmarshalExtensions {
|
||||
if opts.CanBeLazy() && x.canLazy(xt) {
|
||||
out, valid := skipExtension(b, xi, num, wtyp, opts)
|
||||
switch valid {
|
||||
case ValidationValid:
|
||||
if out.initialized {
|
||||
x.appendLazyBytes(xt, xi, num, wtyp, b[:out.n])
|
||||
exts[int32(num)] = x
|
||||
return out, nil
|
||||
}
|
||||
case ValidationInvalid:
|
||||
return out, errDecode
|
||||
case ValidationUnknown:
|
||||
}
|
||||
}
|
||||
}
|
||||
ival := x.Value()
|
||||
if !ival.IsValid() && xi.unmarshalNeedsValue {
|
||||
// Create a new message, list, or map value to fill in.
|
||||
// For enums, create a prototype value to let the unmarshal func know the
|
||||
// concrete type.
|
||||
ival = xt.New()
|
||||
}
|
||||
v, out, err := xi.funcs.unmarshal(b, ival, num, wtyp, opts)
|
||||
if err != nil {
|
||||
return out, err
|
||||
}
|
||||
if xi.funcs.isInit == nil {
|
||||
out.initialized = true
|
||||
}
|
||||
x.Set(xt, v)
|
||||
exts[int32(num)] = x
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func skipExtension(b []byte, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) {
|
||||
if xi.validation.mi == nil {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
xi.validation.mi.init()
|
||||
switch xi.validation.typ {
|
||||
case validationTypeMessage:
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
|
||||
if opts.Validated() {
|
||||
out.initialized = true
|
||||
out.n = n
|
||||
return out, ValidationValid
|
||||
}
|
||||
|
||||
out, st := xi.validation.mi.validate(v, 0, opts)
|
||||
out.n = n
|
||||
return out, st
|
||||
case validationTypeGroup:
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
out, st := xi.validation.mi.validate(b, num, opts)
|
||||
return out, st
|
||||
default:
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
}
|
315
e2e/vendor/google.golang.org/protobuf/internal/impl/encode.go
generated
vendored
Normal file
315
e2e/vendor/google.golang.org/protobuf/internal/impl/encode.go
generated
vendored
Normal file
@ -0,0 +1,315 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"math"
|
||||
"sort"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/protolazy"
|
||||
"google.golang.org/protobuf/proto"
|
||||
piface "google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
type marshalOptions struct {
|
||||
flags piface.MarshalInputFlags
|
||||
}
|
||||
|
||||
func (o marshalOptions) Options() proto.MarshalOptions {
|
||||
return proto.MarshalOptions{
|
||||
AllowPartial: true,
|
||||
Deterministic: o.Deterministic(),
|
||||
UseCachedSize: o.UseCachedSize(),
|
||||
}
|
||||
}
|
||||
|
||||
func (o marshalOptions) Deterministic() bool { return o.flags&piface.MarshalDeterministic != 0 }
|
||||
func (o marshalOptions) UseCachedSize() bool { return o.flags&piface.MarshalUseCachedSize != 0 }
|
||||
|
||||
// size is protoreflect.Methods.Size.
|
||||
func (mi *MessageInfo) size(in piface.SizeInput) piface.SizeOutput {
|
||||
var p pointer
|
||||
if ms, ok := in.Message.(*messageState); ok {
|
||||
p = ms.pointer()
|
||||
} else {
|
||||
p = in.Message.(*messageReflectWrapper).pointer()
|
||||
}
|
||||
size := mi.sizePointer(p, marshalOptions{
|
||||
flags: in.Flags,
|
||||
})
|
||||
return piface.SizeOutput{Size: size}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) sizePointer(p pointer, opts marshalOptions) (size int) {
|
||||
mi.init()
|
||||
if p.IsNil() {
|
||||
return 0
|
||||
}
|
||||
if opts.UseCachedSize() && mi.sizecacheOffset.IsValid() {
|
||||
// The size cache contains the size + 1, to allow the
|
||||
// zero value to be invalid, while also allowing for a
|
||||
// 0 size to be cached.
|
||||
if size := atomic.LoadInt32(p.Apply(mi.sizecacheOffset).Int32()); size > 0 {
|
||||
return int(size - 1)
|
||||
}
|
||||
}
|
||||
return mi.sizePointerSlow(p, opts)
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) sizePointerSlow(p pointer, opts marshalOptions) (size int) {
|
||||
if flags.ProtoLegacy && mi.isMessageSet {
|
||||
size = sizeMessageSet(mi, p, opts)
|
||||
if mi.sizecacheOffset.IsValid() {
|
||||
atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), int32(size+1))
|
||||
}
|
||||
return size
|
||||
}
|
||||
if mi.extensionOffset.IsValid() {
|
||||
e := p.Apply(mi.extensionOffset).Extensions()
|
||||
size += mi.sizeExtensions(e, opts)
|
||||
}
|
||||
|
||||
var lazy **protolazy.XXX_lazyUnmarshalInfo
|
||||
var presence presence
|
||||
if mi.presenceOffset.IsValid() {
|
||||
presence = p.Apply(mi.presenceOffset).PresenceInfo()
|
||||
if mi.lazyOffset.IsValid() {
|
||||
lazy = p.Apply(mi.lazyOffset).LazyInfoPtr()
|
||||
}
|
||||
}
|
||||
|
||||
for _, f := range mi.orderedCoderFields {
|
||||
if f.funcs.size == nil {
|
||||
continue
|
||||
}
|
||||
fptr := p.Apply(f.offset)
|
||||
|
||||
if f.presenceIndex != noPresence {
|
||||
if !presence.Present(f.presenceIndex) {
|
||||
continue
|
||||
}
|
||||
|
||||
if f.isLazy && fptr.AtomicGetPointer().IsNil() {
|
||||
if lazyFields(opts) {
|
||||
size += (*lazy).SizeField(uint32(f.num))
|
||||
continue
|
||||
} else {
|
||||
mi.lazyUnmarshal(p, f.num)
|
||||
}
|
||||
}
|
||||
size += f.funcs.size(fptr, f, opts)
|
||||
continue
|
||||
}
|
||||
|
||||
if f.isPointer && fptr.Elem().IsNil() {
|
||||
continue
|
||||
}
|
||||
size += f.funcs.size(fptr, f, opts)
|
||||
}
|
||||
if mi.unknownOffset.IsValid() {
|
||||
if u := mi.getUnknownBytes(p); u != nil {
|
||||
size += len(*u)
|
||||
}
|
||||
}
|
||||
if mi.sizecacheOffset.IsValid() {
|
||||
if size > (math.MaxInt32 - 1) {
|
||||
// The size is too large for the int32 sizecache field.
|
||||
// We will need to recompute the size when encoding;
|
||||
// unfortunately expensive, but better than invalid output.
|
||||
atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), 0)
|
||||
} else {
|
||||
// The size cache contains the size + 1, to allow the
|
||||
// zero value to be invalid, while also allowing for a
|
||||
// 0 size to be cached.
|
||||
atomic.StoreInt32(p.Apply(mi.sizecacheOffset).Int32(), int32(size+1))
|
||||
}
|
||||
}
|
||||
return size
|
||||
}
|
||||
|
||||
// marshal is protoreflect.Methods.Marshal.
|
||||
func (mi *MessageInfo) marshal(in piface.MarshalInput) (out piface.MarshalOutput, err error) {
|
||||
var p pointer
|
||||
if ms, ok := in.Message.(*messageState); ok {
|
||||
p = ms.pointer()
|
||||
} else {
|
||||
p = in.Message.(*messageReflectWrapper).pointer()
|
||||
}
|
||||
b, err := mi.marshalAppendPointer(in.Buf, p, marshalOptions{
|
||||
flags: in.Flags,
|
||||
})
|
||||
return piface.MarshalOutput{Buf: b}, err
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) marshalAppendPointer(b []byte, p pointer, opts marshalOptions) ([]byte, error) {
|
||||
mi.init()
|
||||
if p.IsNil() {
|
||||
return b, nil
|
||||
}
|
||||
if flags.ProtoLegacy && mi.isMessageSet {
|
||||
return marshalMessageSet(mi, b, p, opts)
|
||||
}
|
||||
var err error
|
||||
// The old marshaler encodes extensions at beginning.
|
||||
if mi.extensionOffset.IsValid() {
|
||||
e := p.Apply(mi.extensionOffset).Extensions()
|
||||
// TODO: Special handling for MessageSet?
|
||||
b, err = mi.appendExtensions(b, e, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
|
||||
var lazy **protolazy.XXX_lazyUnmarshalInfo
|
||||
var presence presence
|
||||
if mi.presenceOffset.IsValid() {
|
||||
presence = p.Apply(mi.presenceOffset).PresenceInfo()
|
||||
if mi.lazyOffset.IsValid() {
|
||||
lazy = p.Apply(mi.lazyOffset).LazyInfoPtr()
|
||||
}
|
||||
}
|
||||
|
||||
for _, f := range mi.orderedCoderFields {
|
||||
if f.funcs.marshal == nil {
|
||||
continue
|
||||
}
|
||||
fptr := p.Apply(f.offset)
|
||||
|
||||
if f.presenceIndex != noPresence {
|
||||
if !presence.Present(f.presenceIndex) {
|
||||
continue
|
||||
}
|
||||
if f.isLazy {
|
||||
// Be careful, this field needs to be read atomically, like for a get
|
||||
if f.isPointer && fptr.AtomicGetPointer().IsNil() {
|
||||
if lazyFields(opts) {
|
||||
b, _ = (*lazy).AppendField(b, uint32(f.num))
|
||||
continue
|
||||
} else {
|
||||
mi.lazyUnmarshal(p, f.num)
|
||||
}
|
||||
}
|
||||
|
||||
b, err = f.funcs.marshal(b, fptr, f, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
continue
|
||||
} else if f.isPointer && fptr.Elem().IsNil() {
|
||||
continue
|
||||
}
|
||||
b, err = f.funcs.marshal(b, fptr, f, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
if f.isPointer && fptr.Elem().IsNil() {
|
||||
continue
|
||||
}
|
||||
b, err = f.funcs.marshal(b, fptr, f, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
if mi.unknownOffset.IsValid() && !mi.isMessageSet {
|
||||
if u := mi.getUnknownBytes(p); u != nil {
|
||||
b = append(b, (*u)...)
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
// fullyLazyExtensions returns true if we should attempt to keep extensions lazy over size and marshal.
|
||||
func fullyLazyExtensions(opts marshalOptions) bool {
|
||||
// When deterministic marshaling is requested, force an unmarshal for lazy
|
||||
// extensions to produce a deterministic result, instead of passing through
|
||||
// bytes lazily that may or may not match what Go Protobuf would produce.
|
||||
return opts.flags&piface.MarshalDeterministic == 0
|
||||
}
|
||||
|
||||
// lazyFields returns true if we should attempt to keep fields lazy over size and marshal.
|
||||
func lazyFields(opts marshalOptions) bool {
|
||||
// When deterministic marshaling is requested, force an unmarshal for lazy
|
||||
// fields to produce a deterministic result, instead of passing through
|
||||
// bytes lazily that may or may not match what Go Protobuf would produce.
|
||||
return opts.flags&piface.MarshalDeterministic == 0
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) sizeExtensions(ext *map[int32]ExtensionField, opts marshalOptions) (n int) {
|
||||
if ext == nil {
|
||||
return 0
|
||||
}
|
||||
for _, x := range *ext {
|
||||
xi := getExtensionFieldInfo(x.Type())
|
||||
if xi.funcs.size == nil {
|
||||
continue
|
||||
}
|
||||
if fullyLazyExtensions(opts) {
|
||||
// Don't expand the extension, instead use the buffer to calculate size
|
||||
if lb := x.lazyBuffer(); lb != nil {
|
||||
// We got hold of the buffer, so it's still lazy.
|
||||
n += len(lb)
|
||||
continue
|
||||
}
|
||||
}
|
||||
n += xi.funcs.size(x.Value(), xi.tagsize, opts)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) appendExtensions(b []byte, ext *map[int32]ExtensionField, opts marshalOptions) ([]byte, error) {
|
||||
if ext == nil {
|
||||
return b, nil
|
||||
}
|
||||
|
||||
switch len(*ext) {
|
||||
case 0:
|
||||
return b, nil
|
||||
case 1:
|
||||
// Fast-path for one extension: Don't bother sorting the keys.
|
||||
var err error
|
||||
for _, x := range *ext {
|
||||
xi := getExtensionFieldInfo(x.Type())
|
||||
if fullyLazyExtensions(opts) {
|
||||
// Don't expand the extension if it's still in wire format, instead use the buffer content.
|
||||
if lb := x.lazyBuffer(); lb != nil {
|
||||
b = append(b, lb...)
|
||||
continue
|
||||
}
|
||||
}
|
||||
b, err = xi.funcs.marshal(b, x.Value(), xi.wiretag, opts)
|
||||
}
|
||||
return b, err
|
||||
default:
|
||||
// Sort the keys to provide a deterministic encoding.
|
||||
// Not sure this is required, but the old code does it.
|
||||
keys := make([]int, 0, len(*ext))
|
||||
for k := range *ext {
|
||||
keys = append(keys, int(k))
|
||||
}
|
||||
sort.Ints(keys)
|
||||
var err error
|
||||
for _, k := range keys {
|
||||
x := (*ext)[int32(k)]
|
||||
xi := getExtensionFieldInfo(x.Type())
|
||||
if fullyLazyExtensions(opts) {
|
||||
// Don't expand the extension if it's still in wire format, instead use the buffer content.
|
||||
if lb := x.lazyBuffer(); lb != nil {
|
||||
b = append(b, lb...)
|
||||
continue
|
||||
}
|
||||
}
|
||||
b, err = xi.funcs.marshal(b, x.Value(), xi.wiretag, opts)
|
||||
if err != nil {
|
||||
return b, err
|
||||
}
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
}
|
21
e2e/vendor/google.golang.org/protobuf/internal/impl/enum.go
generated
vendored
Normal file
21
e2e/vendor/google.golang.org/protobuf/internal/impl/enum.go
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type EnumInfo struct {
|
||||
GoReflectType reflect.Type // int32 kind
|
||||
Desc protoreflect.EnumDescriptor
|
||||
}
|
||||
|
||||
func (t *EnumInfo) New(n protoreflect.EnumNumber) protoreflect.Enum {
|
||||
return reflect.ValueOf(n).Convert(t.GoReflectType).Interface().(protoreflect.Enum)
|
||||
}
|
||||
func (t *EnumInfo) Descriptor() protoreflect.EnumDescriptor { return t.Desc }
|
224
e2e/vendor/google.golang.org/protobuf/internal/impl/equal.go
generated
vendored
Normal file
224
e2e/vendor/google.golang.org/protobuf/internal/impl/equal.go
generated
vendored
Normal file
@ -0,0 +1,224 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
func equal(in protoiface.EqualInput) protoiface.EqualOutput {
|
||||
return protoiface.EqualOutput{Equal: equalMessage(in.MessageA, in.MessageB)}
|
||||
}
|
||||
|
||||
// equalMessage is a fast-path variant of protoreflect.equalMessage.
|
||||
// It takes advantage of the internal messageState type to avoid
|
||||
// unnecessary allocations, type assertions.
|
||||
func equalMessage(mx, my protoreflect.Message) bool {
|
||||
if mx == nil || my == nil {
|
||||
return mx == my
|
||||
}
|
||||
if mx.Descriptor() != my.Descriptor() {
|
||||
return false
|
||||
}
|
||||
|
||||
msx, ok := mx.(*messageState)
|
||||
if !ok {
|
||||
return protoreflect.ValueOfMessage(mx).Equal(protoreflect.ValueOfMessage(my))
|
||||
}
|
||||
msy, ok := my.(*messageState)
|
||||
if !ok {
|
||||
return protoreflect.ValueOfMessage(mx).Equal(protoreflect.ValueOfMessage(my))
|
||||
}
|
||||
|
||||
mi := msx.messageInfo()
|
||||
miy := msy.messageInfo()
|
||||
if mi != miy {
|
||||
return protoreflect.ValueOfMessage(mx).Equal(protoreflect.ValueOfMessage(my))
|
||||
}
|
||||
mi.init()
|
||||
// Compares regular fields
|
||||
// Modified Message.Range code that compares two messages of the same type
|
||||
// while going over the fields.
|
||||
for _, ri := range mi.rangeInfos {
|
||||
var fd protoreflect.FieldDescriptor
|
||||
var vx, vy protoreflect.Value
|
||||
|
||||
switch ri := ri.(type) {
|
||||
case *fieldInfo:
|
||||
hx := ri.has(msx.pointer())
|
||||
hy := ri.has(msy.pointer())
|
||||
if hx != hy {
|
||||
return false
|
||||
}
|
||||
if !hx {
|
||||
continue
|
||||
}
|
||||
fd = ri.fieldDesc
|
||||
vx = ri.get(msx.pointer())
|
||||
vy = ri.get(msy.pointer())
|
||||
case *oneofInfo:
|
||||
fnx := ri.which(msx.pointer())
|
||||
fny := ri.which(msy.pointer())
|
||||
if fnx != fny {
|
||||
return false
|
||||
}
|
||||
if fnx <= 0 {
|
||||
continue
|
||||
}
|
||||
fi := mi.fields[fnx]
|
||||
fd = fi.fieldDesc
|
||||
vx = fi.get(msx.pointer())
|
||||
vy = fi.get(msy.pointer())
|
||||
}
|
||||
|
||||
if !equalValue(fd, vx, vy) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Compare extensions.
|
||||
// This is more complicated because mx or my could have empty/nil extension maps,
|
||||
// however some populated extension map values are equal to nil extension maps.
|
||||
emx := mi.extensionMap(msx.pointer())
|
||||
emy := mi.extensionMap(msy.pointer())
|
||||
if emx != nil {
|
||||
for k, x := range *emx {
|
||||
xd := x.Type().TypeDescriptor()
|
||||
xv := x.Value()
|
||||
var y ExtensionField
|
||||
ok := false
|
||||
if emy != nil {
|
||||
y, ok = (*emy)[k]
|
||||
}
|
||||
// We need to treat empty lists as equal to nil values
|
||||
if emy == nil || !ok {
|
||||
if xd.IsList() && xv.List().Len() == 0 {
|
||||
continue
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
if !equalValue(xd, xv, y.Value()) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
if emy != nil {
|
||||
// emy may have extensions emx does not have, need to check them as well
|
||||
for k, y := range *emy {
|
||||
if emx != nil {
|
||||
// emx has the field, so we already checked it
|
||||
if _, ok := (*emx)[k]; ok {
|
||||
continue
|
||||
}
|
||||
}
|
||||
// Empty lists are equal to nil
|
||||
if y.Type().TypeDescriptor().IsList() && y.Value().List().Len() == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Cant be equal if the extension is populated
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return equalUnknown(mx.GetUnknown(), my.GetUnknown())
|
||||
}
|
||||
|
||||
func equalValue(fd protoreflect.FieldDescriptor, vx, vy protoreflect.Value) bool {
|
||||
// slow path
|
||||
if fd.Kind() != protoreflect.MessageKind {
|
||||
return vx.Equal(vy)
|
||||
}
|
||||
|
||||
// fast path special cases
|
||||
if fd.IsMap() {
|
||||
if fd.MapValue().Kind() == protoreflect.MessageKind {
|
||||
return equalMessageMap(vx.Map(), vy.Map())
|
||||
}
|
||||
return vx.Equal(vy)
|
||||
}
|
||||
|
||||
if fd.IsList() {
|
||||
return equalMessageList(vx.List(), vy.List())
|
||||
}
|
||||
|
||||
return equalMessage(vx.Message(), vy.Message())
|
||||
}
|
||||
|
||||
// Mostly copied from protoreflect.equalMap.
|
||||
// This variant only works for messages as map types.
|
||||
// All other map types should be handled via Value.Equal.
|
||||
func equalMessageMap(mx, my protoreflect.Map) bool {
|
||||
if mx.Len() != my.Len() {
|
||||
return false
|
||||
}
|
||||
equal := true
|
||||
mx.Range(func(k protoreflect.MapKey, vx protoreflect.Value) bool {
|
||||
if !my.Has(k) {
|
||||
equal = false
|
||||
return false
|
||||
}
|
||||
vy := my.Get(k)
|
||||
equal = equalMessage(vx.Message(), vy.Message())
|
||||
return equal
|
||||
})
|
||||
return equal
|
||||
}
|
||||
|
||||
// Mostly copied from protoreflect.equalList.
|
||||
// The only change is the usage of equalImpl instead of protoreflect.equalValue.
|
||||
func equalMessageList(lx, ly protoreflect.List) bool {
|
||||
if lx.Len() != ly.Len() {
|
||||
return false
|
||||
}
|
||||
for i := 0; i < lx.Len(); i++ {
|
||||
// We only operate on messages here since equalImpl will not call us in any other case.
|
||||
if !equalMessage(lx.Get(i).Message(), ly.Get(i).Message()) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// equalUnknown compares unknown fields by direct comparison on the raw bytes
|
||||
// of each individual field number.
|
||||
// Copied from protoreflect.equalUnknown.
|
||||
func equalUnknown(x, y protoreflect.RawFields) bool {
|
||||
if len(x) != len(y) {
|
||||
return false
|
||||
}
|
||||
if bytes.Equal([]byte(x), []byte(y)) {
|
||||
return true
|
||||
}
|
||||
|
||||
mx := make(map[protoreflect.FieldNumber]protoreflect.RawFields)
|
||||
my := make(map[protoreflect.FieldNumber]protoreflect.RawFields)
|
||||
for len(x) > 0 {
|
||||
fnum, _, n := protowire.ConsumeField(x)
|
||||
mx[fnum] = append(mx[fnum], x[:n]...)
|
||||
x = x[n:]
|
||||
}
|
||||
for len(y) > 0 {
|
||||
fnum, _, n := protowire.ConsumeField(y)
|
||||
my[fnum] = append(my[fnum], y[:n]...)
|
||||
y = y[n:]
|
||||
}
|
||||
if len(mx) != len(my) {
|
||||
return false
|
||||
}
|
||||
|
||||
for k, v1 := range mx {
|
||||
if v2, ok := my[k]; !ok || !bytes.Equal([]byte(v1), []byte(v2)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
156
e2e/vendor/google.golang.org/protobuf/internal/impl/extension.go
generated
vendored
Normal file
156
e2e/vendor/google.golang.org/protobuf/internal/impl/extension.go
generated
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// ExtensionInfo implements ExtensionType.
|
||||
//
|
||||
// This type contains a number of exported fields for legacy compatibility.
|
||||
// The only non-deprecated use of this type is through the methods of the
|
||||
// ExtensionType interface.
|
||||
type ExtensionInfo struct {
|
||||
// An ExtensionInfo may exist in several stages of initialization.
|
||||
//
|
||||
// extensionInfoUninitialized: Some or all of the legacy exported
|
||||
// fields may be set, but none of the unexported fields have been
|
||||
// initialized. This is the starting state for an ExtensionInfo
|
||||
// in legacy generated code.
|
||||
//
|
||||
// extensionInfoDescInit: The desc field is set, but other unexported fields
|
||||
// may not be initialized. Legacy exported fields may or may not be set.
|
||||
// This is the starting state for an ExtensionInfo in newly generated code.
|
||||
//
|
||||
// extensionInfoFullInit: The ExtensionInfo is fully initialized.
|
||||
// This state is only entered after lazy initialization is complete.
|
||||
init uint32
|
||||
mu sync.Mutex
|
||||
|
||||
goType reflect.Type
|
||||
desc extensionTypeDescriptor
|
||||
conv Converter
|
||||
info *extensionFieldInfo // for fast-path method implementations
|
||||
|
||||
// ExtendedType is a typed nil-pointer to the parent message type that
|
||||
// is being extended. It is possible for this to be unpopulated in v2
|
||||
// since the message may no longer implement the MessageV1 interface.
|
||||
//
|
||||
// Deprecated: Use the ExtendedType method instead.
|
||||
ExtendedType protoiface.MessageV1
|
||||
|
||||
// ExtensionType is the zero value of the extension type.
|
||||
//
|
||||
// For historical reasons, reflect.TypeOf(ExtensionType) and the
|
||||
// type returned by InterfaceOf may not be identical.
|
||||
//
|
||||
// Deprecated: Use InterfaceOf(xt.Zero()) instead.
|
||||
ExtensionType any
|
||||
|
||||
// Field is the field number of the extension.
|
||||
//
|
||||
// Deprecated: Use the Descriptor().Number method instead.
|
||||
Field int32
|
||||
|
||||
// Name is the fully qualified name of extension.
|
||||
//
|
||||
// Deprecated: Use the Descriptor().FullName method instead.
|
||||
Name string
|
||||
|
||||
// Tag is the protobuf struct tag used in the v1 API.
|
||||
//
|
||||
// Deprecated: Do not use.
|
||||
Tag string
|
||||
|
||||
// Filename is the proto filename in which the extension is defined.
|
||||
//
|
||||
// Deprecated: Use Descriptor().ParentFile().Path() instead.
|
||||
Filename string
|
||||
}
|
||||
|
||||
// Stages of initialization: See the ExtensionInfo.init field.
|
||||
const (
|
||||
extensionInfoUninitialized = 0
|
||||
extensionInfoDescInit = 1
|
||||
extensionInfoFullInit = 2
|
||||
)
|
||||
|
||||
func InitExtensionInfo(xi *ExtensionInfo, xd protoreflect.ExtensionDescriptor, goType reflect.Type) {
|
||||
xi.goType = goType
|
||||
xi.desc = extensionTypeDescriptor{xd, xi}
|
||||
xi.init = extensionInfoDescInit
|
||||
}
|
||||
|
||||
func (xi *ExtensionInfo) New() protoreflect.Value {
|
||||
return xi.lazyInit().New()
|
||||
}
|
||||
func (xi *ExtensionInfo) Zero() protoreflect.Value {
|
||||
return xi.lazyInit().Zero()
|
||||
}
|
||||
func (xi *ExtensionInfo) ValueOf(v any) protoreflect.Value {
|
||||
return xi.lazyInit().PBValueOf(reflect.ValueOf(v))
|
||||
}
|
||||
func (xi *ExtensionInfo) InterfaceOf(v protoreflect.Value) any {
|
||||
return xi.lazyInit().GoValueOf(v).Interface()
|
||||
}
|
||||
func (xi *ExtensionInfo) IsValidValue(v protoreflect.Value) bool {
|
||||
return xi.lazyInit().IsValidPB(v)
|
||||
}
|
||||
func (xi *ExtensionInfo) IsValidInterface(v any) bool {
|
||||
return xi.lazyInit().IsValidGo(reflect.ValueOf(v))
|
||||
}
|
||||
func (xi *ExtensionInfo) TypeDescriptor() protoreflect.ExtensionTypeDescriptor {
|
||||
if atomic.LoadUint32(&xi.init) < extensionInfoDescInit {
|
||||
xi.lazyInitSlow()
|
||||
}
|
||||
return &xi.desc
|
||||
}
|
||||
|
||||
func (xi *ExtensionInfo) lazyInit() Converter {
|
||||
if atomic.LoadUint32(&xi.init) < extensionInfoFullInit {
|
||||
xi.lazyInitSlow()
|
||||
}
|
||||
return xi.conv
|
||||
}
|
||||
|
||||
func (xi *ExtensionInfo) lazyInitSlow() {
|
||||
xi.mu.Lock()
|
||||
defer xi.mu.Unlock()
|
||||
|
||||
if xi.init == extensionInfoFullInit {
|
||||
return
|
||||
}
|
||||
defer atomic.StoreUint32(&xi.init, extensionInfoFullInit)
|
||||
|
||||
if xi.desc.ExtensionDescriptor == nil {
|
||||
xi.initFromLegacy()
|
||||
}
|
||||
if !xi.desc.ExtensionDescriptor.IsPlaceholder() {
|
||||
if xi.ExtensionType == nil {
|
||||
xi.initToLegacy()
|
||||
}
|
||||
xi.conv = NewConverter(xi.goType, xi.desc.ExtensionDescriptor)
|
||||
xi.info = makeExtensionFieldInfo(xi.desc.ExtensionDescriptor)
|
||||
xi.info.validation = newValidationInfo(xi.desc.ExtensionDescriptor, xi.goType)
|
||||
}
|
||||
}
|
||||
|
||||
type extensionTypeDescriptor struct {
|
||||
protoreflect.ExtensionDescriptor
|
||||
xi *ExtensionInfo
|
||||
}
|
||||
|
||||
func (xtd *extensionTypeDescriptor) Type() protoreflect.ExtensionType {
|
||||
return xtd.xi
|
||||
}
|
||||
func (xtd *extensionTypeDescriptor) Descriptor() protoreflect.ExtensionDescriptor {
|
||||
return xtd.ExtensionDescriptor
|
||||
}
|
433
e2e/vendor/google.golang.org/protobuf/internal/impl/lazy.go
generated
vendored
Normal file
433
e2e/vendor/google.golang.org/protobuf/internal/impl/lazy.go
generated
vendored
Normal file
@ -0,0 +1,433 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/bits"
|
||||
"os"
|
||||
"reflect"
|
||||
"sort"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/protolazy"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
preg "google.golang.org/protobuf/reflect/protoregistry"
|
||||
piface "google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
var enableLazy int32 = func() int32 {
|
||||
if os.Getenv("GOPROTODEBUG") == "nolazy" {
|
||||
return 0
|
||||
}
|
||||
return 1
|
||||
}()
|
||||
|
||||
// EnableLazyUnmarshal enables lazy unmarshaling.
|
||||
func EnableLazyUnmarshal(enable bool) {
|
||||
if enable {
|
||||
atomic.StoreInt32(&enableLazy, 1)
|
||||
return
|
||||
}
|
||||
atomic.StoreInt32(&enableLazy, 0)
|
||||
}
|
||||
|
||||
// LazyEnabled reports whether lazy unmarshalling is currently enabled.
|
||||
func LazyEnabled() bool {
|
||||
return atomic.LoadInt32(&enableLazy) != 0
|
||||
}
|
||||
|
||||
// UnmarshalField unmarshals a field in a message.
|
||||
func UnmarshalField(m interface{}, num protowire.Number) {
|
||||
switch m := m.(type) {
|
||||
case *messageState:
|
||||
m.messageInfo().lazyUnmarshal(m.pointer(), num)
|
||||
case *messageReflectWrapper:
|
||||
m.messageInfo().lazyUnmarshal(m.pointer(), num)
|
||||
default:
|
||||
panic(fmt.Sprintf("unsupported wrapper type %T", m))
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) lazyUnmarshal(p pointer, num protoreflect.FieldNumber) {
|
||||
var f *coderFieldInfo
|
||||
if int(num) < len(mi.denseCoderFields) {
|
||||
f = mi.denseCoderFields[num]
|
||||
} else {
|
||||
f = mi.coderFields[num]
|
||||
}
|
||||
if f == nil {
|
||||
panic(fmt.Sprintf("lazyUnmarshal: field info for %v.%v", mi.Desc.FullName(), num))
|
||||
}
|
||||
lazy := *p.Apply(mi.lazyOffset).LazyInfoPtr()
|
||||
start, end, found, _, multipleEntries := lazy.FindFieldInProto(uint32(num))
|
||||
if !found && multipleEntries == nil {
|
||||
panic(fmt.Sprintf("lazyUnmarshal: can't find field data for %v.%v", mi.Desc.FullName(), num))
|
||||
}
|
||||
// The actual pointer in the message can not be set until the whole struct is filled in, otherwise we will have races.
|
||||
// Create another pointer and set it atomically, if we won the race and the pointer in the original message is still nil.
|
||||
fp := pointerOfValue(reflect.New(f.ft))
|
||||
if multipleEntries != nil {
|
||||
for _, entry := range multipleEntries {
|
||||
mi.unmarshalField(lazy.Buffer()[entry.Start:entry.End], fp, f, lazy, lazy.UnmarshalFlags())
|
||||
}
|
||||
} else {
|
||||
mi.unmarshalField(lazy.Buffer()[start:end], fp, f, lazy, lazy.UnmarshalFlags())
|
||||
}
|
||||
p.Apply(f.offset).AtomicSetPointerIfNil(fp.Elem())
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) unmarshalField(b []byte, p pointer, f *coderFieldInfo, lazyInfo *protolazy.XXX_lazyUnmarshalInfo, flags piface.UnmarshalInputFlags) error {
|
||||
opts := lazyUnmarshalOptions
|
||||
opts.flags |= flags
|
||||
for len(b) > 0 {
|
||||
// Parse the tag (field number and wire type).
|
||||
var tag uint64
|
||||
if b[0] < 0x80 {
|
||||
tag = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
tag = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
tag, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return errors.New("invalid wire data")
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
var num protowire.Number
|
||||
if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
|
||||
return errors.New("invalid wire data")
|
||||
} else {
|
||||
num = protowire.Number(n)
|
||||
}
|
||||
wtyp := protowire.Type(tag & 7)
|
||||
if num == f.num {
|
||||
o, err := f.funcs.unmarshal(b, p, wtyp, f, opts)
|
||||
if err == nil {
|
||||
b = b[o.n:]
|
||||
continue
|
||||
}
|
||||
if err != errUnknown {
|
||||
return err
|
||||
}
|
||||
}
|
||||
n := protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return errors.New("invalid wire data")
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) skipField(b []byte, f *coderFieldInfo, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) {
|
||||
fmi := f.validation.mi
|
||||
if fmi == nil {
|
||||
fd := mi.Desc.Fields().ByNumber(f.num)
|
||||
if fd == nil {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
messageName := fd.Message().FullName()
|
||||
messageType, err := preg.GlobalTypes.FindMessageByName(messageName)
|
||||
if err != nil {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
var ok bool
|
||||
fmi, ok = messageType.(*MessageInfo)
|
||||
if !ok {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
}
|
||||
fmi.init()
|
||||
switch f.validation.typ {
|
||||
case validationTypeMessage:
|
||||
if wtyp != protowire.BytesType {
|
||||
return out, ValidationWrongWireType
|
||||
}
|
||||
v, n := protowire.ConsumeBytes(b)
|
||||
if n < 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
out, st := fmi.validate(v, 0, opts)
|
||||
out.n = n
|
||||
return out, st
|
||||
case validationTypeGroup:
|
||||
if wtyp != protowire.StartGroupType {
|
||||
return out, ValidationWrongWireType
|
||||
}
|
||||
out, st := fmi.validate(b, f.num, opts)
|
||||
return out, st
|
||||
default:
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
}
|
||||
|
||||
// unmarshalPointerLazy is similar to unmarshalPointerEager, but it
|
||||
// specifically handles lazy unmarshalling. it expects lazyOffset and
|
||||
// presenceOffset to both be valid.
|
||||
func (mi *MessageInfo) unmarshalPointerLazy(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
|
||||
initialized := true
|
||||
var requiredMask uint64
|
||||
var lazy **protolazy.XXX_lazyUnmarshalInfo
|
||||
var presence presence
|
||||
var lazyIndex []protolazy.IndexEntry
|
||||
var lastNum protowire.Number
|
||||
outOfOrder := false
|
||||
lazyDecode := false
|
||||
presence = p.Apply(mi.presenceOffset).PresenceInfo()
|
||||
lazy = p.Apply(mi.lazyOffset).LazyInfoPtr()
|
||||
if !presence.AnyPresent(mi.presenceSize) {
|
||||
if opts.CanBeLazy() {
|
||||
// If the message contains existing data, we need to merge into it.
|
||||
// Lazy unmarshaling doesn't merge, so only enable it when the
|
||||
// message is empty (has no presence bitmap).
|
||||
lazyDecode = true
|
||||
if *lazy == nil {
|
||||
*lazy = &protolazy.XXX_lazyUnmarshalInfo{}
|
||||
}
|
||||
(*lazy).SetUnmarshalFlags(opts.flags)
|
||||
if !opts.AliasBuffer() {
|
||||
// Make a copy of the buffer for lazy unmarshaling.
|
||||
// Set the AliasBuffer flag so recursive unmarshal
|
||||
// operations reuse the copy.
|
||||
b = append([]byte{}, b...)
|
||||
opts.flags |= piface.UnmarshalAliasBuffer
|
||||
}
|
||||
(*lazy).SetBuffer(b)
|
||||
}
|
||||
}
|
||||
// Track special handling of lazy fields.
|
||||
//
|
||||
// In the common case, all fields are lazyValidateOnly (and lazyFields remains nil).
|
||||
// In the event that validation for a field fails, this map tracks handling of the field.
|
||||
type lazyAction uint8
|
||||
const (
|
||||
lazyValidateOnly lazyAction = iota // validate the field only
|
||||
lazyUnmarshalNow // eagerly unmarshal the field
|
||||
lazyUnmarshalLater // unmarshal the field after the message is fully processed
|
||||
)
|
||||
var lazyFields map[*coderFieldInfo]lazyAction
|
||||
var exts *map[int32]ExtensionField
|
||||
start := len(b)
|
||||
pos := 0
|
||||
for len(b) > 0 {
|
||||
// Parse the tag (field number and wire type).
|
||||
var tag uint64
|
||||
if b[0] < 0x80 {
|
||||
tag = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
tag = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
tag, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
var num protowire.Number
|
||||
if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
|
||||
return out, errors.New("invalid field number")
|
||||
} else {
|
||||
num = protowire.Number(n)
|
||||
}
|
||||
wtyp := protowire.Type(tag & 7)
|
||||
|
||||
if wtyp == protowire.EndGroupType {
|
||||
if num != groupTag {
|
||||
return out, errors.New("mismatching end group marker")
|
||||
}
|
||||
groupTag = 0
|
||||
break
|
||||
}
|
||||
|
||||
var f *coderFieldInfo
|
||||
if int(num) < len(mi.denseCoderFields) {
|
||||
f = mi.denseCoderFields[num]
|
||||
} else {
|
||||
f = mi.coderFields[num]
|
||||
}
|
||||
var n int
|
||||
err := errUnknown
|
||||
discardUnknown := false
|
||||
Field:
|
||||
switch {
|
||||
case f != nil:
|
||||
if f.funcs.unmarshal == nil {
|
||||
break
|
||||
}
|
||||
if f.isLazy && lazyDecode {
|
||||
switch {
|
||||
case lazyFields == nil || lazyFields[f] == lazyValidateOnly:
|
||||
// Attempt to validate this field and leave it for later lazy unmarshaling.
|
||||
o, valid := mi.skipField(b, f, wtyp, opts)
|
||||
switch valid {
|
||||
case ValidationValid:
|
||||
// Skip over the valid field and continue.
|
||||
err = nil
|
||||
presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize)
|
||||
requiredMask |= f.validation.requiredBit
|
||||
if !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
n = o.n
|
||||
break Field
|
||||
case ValidationInvalid:
|
||||
return out, errors.New("invalid proto wire format")
|
||||
case ValidationWrongWireType:
|
||||
break Field
|
||||
case ValidationUnknown:
|
||||
if lazyFields == nil {
|
||||
lazyFields = make(map[*coderFieldInfo]lazyAction)
|
||||
}
|
||||
if presence.Present(f.presenceIndex) {
|
||||
// We were unable to determine if the field is valid or not,
|
||||
// and we've already skipped over at least one instance of this
|
||||
// field. Clear the presence bit (so if we stop decoding early,
|
||||
// we don't leave a partially-initialized field around) and flag
|
||||
// the field for unmarshaling before we return.
|
||||
presence.ClearPresent(f.presenceIndex)
|
||||
lazyFields[f] = lazyUnmarshalLater
|
||||
discardUnknown = true
|
||||
break Field
|
||||
} else {
|
||||
// We were unable to determine if the field is valid or not,
|
||||
// but this is the first time we've seen it. Flag it as needing
|
||||
// eager unmarshaling and fall through to the eager unmarshal case below.
|
||||
lazyFields[f] = lazyUnmarshalNow
|
||||
}
|
||||
}
|
||||
case lazyFields[f] == lazyUnmarshalLater:
|
||||
// This field will be unmarshaled in a separate pass below.
|
||||
// Skip over it here.
|
||||
discardUnknown = true
|
||||
break Field
|
||||
default:
|
||||
// Eagerly unmarshal the field.
|
||||
}
|
||||
}
|
||||
if f.isLazy && !lazyDecode && presence.Present(f.presenceIndex) {
|
||||
if p.Apply(f.offset).AtomicGetPointer().IsNil() {
|
||||
mi.lazyUnmarshal(p, f.num)
|
||||
}
|
||||
}
|
||||
var o unmarshalOutput
|
||||
o, err = f.funcs.unmarshal(b, p.Apply(f.offset), wtyp, f, opts)
|
||||
n = o.n
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
requiredMask |= f.validation.requiredBit
|
||||
if f.funcs.isInit != nil && !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
if f.presenceIndex != noPresence {
|
||||
presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize)
|
||||
}
|
||||
default:
|
||||
// Possible extension.
|
||||
if exts == nil && mi.extensionOffset.IsValid() {
|
||||
exts = p.Apply(mi.extensionOffset).Extensions()
|
||||
if *exts == nil {
|
||||
*exts = make(map[int32]ExtensionField)
|
||||
}
|
||||
}
|
||||
if exts == nil {
|
||||
break
|
||||
}
|
||||
var o unmarshalOutput
|
||||
o, err = mi.unmarshalExtension(b, num, wtyp, *exts, opts)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
n = o.n
|
||||
if !o.initialized {
|
||||
initialized = false
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if err != errUnknown {
|
||||
return out, err
|
||||
}
|
||||
n = protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return out, errDecode
|
||||
}
|
||||
if !discardUnknown && !opts.DiscardUnknown() && mi.unknownOffset.IsValid() {
|
||||
u := mi.mutableUnknownBytes(p)
|
||||
*u = protowire.AppendTag(*u, num, wtyp)
|
||||
*u = append(*u, b[:n]...)
|
||||
}
|
||||
}
|
||||
b = b[n:]
|
||||
end := start - len(b)
|
||||
if lazyDecode && f != nil && f.isLazy {
|
||||
if num != lastNum {
|
||||
lazyIndex = append(lazyIndex, protolazy.IndexEntry{
|
||||
FieldNum: uint32(num),
|
||||
Start: uint32(pos),
|
||||
End: uint32(end),
|
||||
})
|
||||
} else {
|
||||
i := len(lazyIndex) - 1
|
||||
lazyIndex[i].End = uint32(end)
|
||||
lazyIndex[i].MultipleContiguous = true
|
||||
}
|
||||
}
|
||||
if num < lastNum {
|
||||
outOfOrder = true
|
||||
}
|
||||
pos = end
|
||||
lastNum = num
|
||||
}
|
||||
if groupTag != 0 {
|
||||
return out, errors.New("missing end group marker")
|
||||
}
|
||||
if lazyFields != nil {
|
||||
// Some fields failed validation, and now need to be unmarshaled.
|
||||
for f, action := range lazyFields {
|
||||
if action != lazyUnmarshalLater {
|
||||
continue
|
||||
}
|
||||
initialized = false
|
||||
if *lazy == nil {
|
||||
*lazy = &protolazy.XXX_lazyUnmarshalInfo{}
|
||||
}
|
||||
if err := mi.unmarshalField((*lazy).Buffer(), p.Apply(f.offset), f, *lazy, opts.flags); err != nil {
|
||||
return out, err
|
||||
}
|
||||
presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize)
|
||||
}
|
||||
}
|
||||
if lazyDecode {
|
||||
if outOfOrder {
|
||||
sort.Slice(lazyIndex, func(i, j int) bool {
|
||||
return lazyIndex[i].FieldNum < lazyIndex[j].FieldNum ||
|
||||
(lazyIndex[i].FieldNum == lazyIndex[j].FieldNum &&
|
||||
lazyIndex[i].Start < lazyIndex[j].Start)
|
||||
})
|
||||
}
|
||||
if *lazy == nil {
|
||||
*lazy = &protolazy.XXX_lazyUnmarshalInfo{}
|
||||
}
|
||||
|
||||
(*lazy).SetIndex(lazyIndex)
|
||||
}
|
||||
if mi.numRequiredFields > 0 && bits.OnesCount64(requiredMask) != int(mi.numRequiredFields) {
|
||||
initialized = false
|
||||
}
|
||||
if initialized {
|
||||
out.initialized = true
|
||||
}
|
||||
out.n = start - len(b)
|
||||
return out, nil
|
||||
}
|
219
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go
generated
vendored
Normal file
219
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go
generated
vendored
Normal file
@ -0,0 +1,219 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// legacyEnumName returns the name of enums used in legacy code.
|
||||
// It is neither the protobuf full name nor the qualified Go name,
|
||||
// but rather an odd hybrid of both.
|
||||
func legacyEnumName(ed protoreflect.EnumDescriptor) string {
|
||||
var protoPkg string
|
||||
enumName := string(ed.FullName())
|
||||
if fd := ed.ParentFile(); fd != nil {
|
||||
protoPkg = string(fd.Package())
|
||||
enumName = strings.TrimPrefix(enumName, protoPkg+".")
|
||||
}
|
||||
if protoPkg == "" {
|
||||
return strs.GoCamelCase(enumName)
|
||||
}
|
||||
return protoPkg + "." + strs.GoCamelCase(enumName)
|
||||
}
|
||||
|
||||
// legacyWrapEnum wraps v as a protoreflect.Enum,
|
||||
// where v must be a int32 kind and not implement the v2 API already.
|
||||
func legacyWrapEnum(v reflect.Value) protoreflect.Enum {
|
||||
et := legacyLoadEnumType(v.Type())
|
||||
return et.New(protoreflect.EnumNumber(v.Int()))
|
||||
}
|
||||
|
||||
var legacyEnumTypeCache sync.Map // map[reflect.Type]protoreflect.EnumType
|
||||
|
||||
// legacyLoadEnumType dynamically loads a protoreflect.EnumType for t,
|
||||
// where t must be an int32 kind and not implement the v2 API already.
|
||||
func legacyLoadEnumType(t reflect.Type) protoreflect.EnumType {
|
||||
// Fast-path: check if a EnumType is cached for this concrete type.
|
||||
if et, ok := legacyEnumTypeCache.Load(t); ok {
|
||||
return et.(protoreflect.EnumType)
|
||||
}
|
||||
|
||||
// Slow-path: derive enum descriptor and initialize EnumType.
|
||||
var et protoreflect.EnumType
|
||||
ed := LegacyLoadEnumDesc(t)
|
||||
et = &legacyEnumType{
|
||||
desc: ed,
|
||||
goType: t,
|
||||
}
|
||||
if et, ok := legacyEnumTypeCache.LoadOrStore(t, et); ok {
|
||||
return et.(protoreflect.EnumType)
|
||||
}
|
||||
return et
|
||||
}
|
||||
|
||||
type legacyEnumType struct {
|
||||
desc protoreflect.EnumDescriptor
|
||||
goType reflect.Type
|
||||
m sync.Map // map[protoreflect.EnumNumber]proto.Enum
|
||||
}
|
||||
|
||||
func (t *legacyEnumType) New(n protoreflect.EnumNumber) protoreflect.Enum {
|
||||
if e, ok := t.m.Load(n); ok {
|
||||
return e.(protoreflect.Enum)
|
||||
}
|
||||
e := &legacyEnumWrapper{num: n, pbTyp: t, goTyp: t.goType}
|
||||
t.m.Store(n, e)
|
||||
return e
|
||||
}
|
||||
func (t *legacyEnumType) Descriptor() protoreflect.EnumDescriptor {
|
||||
return t.desc
|
||||
}
|
||||
|
||||
type legacyEnumWrapper struct {
|
||||
num protoreflect.EnumNumber
|
||||
pbTyp protoreflect.EnumType
|
||||
goTyp reflect.Type
|
||||
}
|
||||
|
||||
func (e *legacyEnumWrapper) Descriptor() protoreflect.EnumDescriptor {
|
||||
return e.pbTyp.Descriptor()
|
||||
}
|
||||
func (e *legacyEnumWrapper) Type() protoreflect.EnumType {
|
||||
return e.pbTyp
|
||||
}
|
||||
func (e *legacyEnumWrapper) Number() protoreflect.EnumNumber {
|
||||
return e.num
|
||||
}
|
||||
func (e *legacyEnumWrapper) ProtoReflect() protoreflect.Enum {
|
||||
return e
|
||||
}
|
||||
func (e *legacyEnumWrapper) protoUnwrap() any {
|
||||
v := reflect.New(e.goTyp).Elem()
|
||||
v.SetInt(int64(e.num))
|
||||
return v.Interface()
|
||||
}
|
||||
|
||||
var (
|
||||
_ protoreflect.Enum = (*legacyEnumWrapper)(nil)
|
||||
_ unwrapper = (*legacyEnumWrapper)(nil)
|
||||
)
|
||||
|
||||
var legacyEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor
|
||||
|
||||
// LegacyLoadEnumDesc returns an EnumDescriptor derived from the Go type,
|
||||
// which must be an int32 kind and not implement the v2 API already.
|
||||
//
|
||||
// This is exported for testing purposes.
|
||||
func LegacyLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor {
|
||||
// Fast-path: check if an EnumDescriptor is cached for this concrete type.
|
||||
if ed, ok := legacyEnumDescCache.Load(t); ok {
|
||||
return ed.(protoreflect.EnumDescriptor)
|
||||
}
|
||||
|
||||
// Slow-path: initialize EnumDescriptor from the raw descriptor.
|
||||
ev := reflect.Zero(t).Interface()
|
||||
if _, ok := ev.(protoreflect.Enum); ok {
|
||||
panic(fmt.Sprintf("%v already implements proto.Enum", t))
|
||||
}
|
||||
edV1, ok := ev.(enumV1)
|
||||
if !ok {
|
||||
return aberrantLoadEnumDesc(t)
|
||||
}
|
||||
b, idxs := edV1.EnumDescriptor()
|
||||
|
||||
var ed protoreflect.EnumDescriptor
|
||||
if len(idxs) == 1 {
|
||||
ed = legacyLoadFileDesc(b).Enums().Get(idxs[0])
|
||||
} else {
|
||||
md := legacyLoadFileDesc(b).Messages().Get(idxs[0])
|
||||
for _, i := range idxs[1 : len(idxs)-1] {
|
||||
md = md.Messages().Get(i)
|
||||
}
|
||||
ed = md.Enums().Get(idxs[len(idxs)-1])
|
||||
}
|
||||
if ed, ok := legacyEnumDescCache.LoadOrStore(t, ed); ok {
|
||||
return ed.(protoreflect.EnumDescriptor)
|
||||
}
|
||||
return ed
|
||||
}
|
||||
|
||||
var aberrantEnumDescCache sync.Map // map[reflect.Type]protoreflect.EnumDescriptor
|
||||
|
||||
// aberrantLoadEnumDesc returns an EnumDescriptor derived from the Go type,
|
||||
// which must not implement protoreflect.Enum or enumV1.
|
||||
//
|
||||
// If the type does not implement enumV1, then there is no reliable
|
||||
// way to derive the original protobuf type information.
|
||||
// We are unable to use the global enum registry since it is
|
||||
// unfortunately keyed by the protobuf full name, which we also do not know.
|
||||
// Thus, this produces some bogus enum descriptor based on the Go type name.
|
||||
func aberrantLoadEnumDesc(t reflect.Type) protoreflect.EnumDescriptor {
|
||||
// Fast-path: check if an EnumDescriptor is cached for this concrete type.
|
||||
if ed, ok := aberrantEnumDescCache.Load(t); ok {
|
||||
return ed.(protoreflect.EnumDescriptor)
|
||||
}
|
||||
|
||||
// Slow-path: construct a bogus, but unique EnumDescriptor.
|
||||
ed := &filedesc.Enum{L2: new(filedesc.EnumL2)}
|
||||
ed.L0.FullName = AberrantDeriveFullName(t) // e.g., github_com.user.repo.MyEnum
|
||||
ed.L0.ParentFile = filedesc.SurrogateProto3
|
||||
ed.L1.EditionFeatures = ed.L0.ParentFile.L1.EditionFeatures
|
||||
ed.L2.Values.List = append(ed.L2.Values.List, filedesc.EnumValue{})
|
||||
|
||||
// TODO: Use the presence of a UnmarshalJSON method to determine proto2?
|
||||
|
||||
vd := &ed.L2.Values.List[0]
|
||||
vd.L0.FullName = ed.L0.FullName + "_UNKNOWN" // e.g., github_com.user.repo.MyEnum_UNKNOWN
|
||||
vd.L0.ParentFile = ed.L0.ParentFile
|
||||
vd.L0.Parent = ed
|
||||
|
||||
// TODO: We could use the String method to obtain some enum value names by
|
||||
// starting at 0 and print the enum until it produces invalid identifiers.
|
||||
// An exhaustive query is clearly impractical, but can be best-effort.
|
||||
|
||||
if ed, ok := aberrantEnumDescCache.LoadOrStore(t, ed); ok {
|
||||
return ed.(protoreflect.EnumDescriptor)
|
||||
}
|
||||
return ed
|
||||
}
|
||||
|
||||
// AberrantDeriveFullName derives a fully qualified protobuf name for the given Go type
|
||||
// The provided name is not guaranteed to be stable nor universally unique.
|
||||
// It should be sufficiently unique within a program.
|
||||
//
|
||||
// This is exported for testing purposes.
|
||||
func AberrantDeriveFullName(t reflect.Type) protoreflect.FullName {
|
||||
sanitize := func(r rune) rune {
|
||||
switch {
|
||||
case r == '/':
|
||||
return '.'
|
||||
case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', '0' <= r && r <= '9':
|
||||
return r
|
||||
default:
|
||||
return '_'
|
||||
}
|
||||
}
|
||||
prefix := strings.Map(sanitize, t.PkgPath())
|
||||
suffix := strings.Map(sanitize, t.Name())
|
||||
if suffix == "" {
|
||||
suffix = fmt.Sprintf("UnknownX%X", reflect.ValueOf(t).Pointer())
|
||||
}
|
||||
|
||||
ss := append(strings.Split(prefix, "."), suffix)
|
||||
for i, s := range ss {
|
||||
if s == "" || ('0' <= s[0] && s[0] <= '9') {
|
||||
ss[i] = "x" + s
|
||||
}
|
||||
}
|
||||
return protoreflect.FullName(strings.Join(ss, "."))
|
||||
}
|
92
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
generated
vendored
Normal file
92
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go
generated
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"hash/crc32"
|
||||
"math"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// These functions exist to support exported APIs in generated protobufs.
|
||||
// While these are deprecated, they cannot be removed for compatibility reasons.
|
||||
|
||||
// LegacyEnumName returns the name of enums used in legacy code.
|
||||
func (Export) LegacyEnumName(ed protoreflect.EnumDescriptor) string {
|
||||
return legacyEnumName(ed)
|
||||
}
|
||||
|
||||
// LegacyMessageTypeOf returns the protoreflect.MessageType for m,
|
||||
// with name used as the message name if necessary.
|
||||
func (Export) LegacyMessageTypeOf(m protoiface.MessageV1, name protoreflect.FullName) protoreflect.MessageType {
|
||||
if mv := (Export{}).protoMessageV2Of(m); mv != nil {
|
||||
return mv.ProtoReflect().Type()
|
||||
}
|
||||
return legacyLoadMessageType(reflect.TypeOf(m), name)
|
||||
}
|
||||
|
||||
// UnmarshalJSONEnum unmarshals an enum from a JSON-encoded input.
|
||||
// The input can either be a string representing the enum value by name,
|
||||
// or a number representing the enum number itself.
|
||||
func (Export) UnmarshalJSONEnum(ed protoreflect.EnumDescriptor, b []byte) (protoreflect.EnumNumber, error) {
|
||||
if b[0] == '"' {
|
||||
var name protoreflect.Name
|
||||
if err := json.Unmarshal(b, &name); err != nil {
|
||||
return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b)
|
||||
}
|
||||
ev := ed.Values().ByName(name)
|
||||
if ev == nil {
|
||||
return 0, errors.New("invalid value for enum %v: %s", ed.FullName(), name)
|
||||
}
|
||||
return ev.Number(), nil
|
||||
} else {
|
||||
var num protoreflect.EnumNumber
|
||||
if err := json.Unmarshal(b, &num); err != nil {
|
||||
return 0, errors.New("invalid input for enum %v: %s", ed.FullName(), b)
|
||||
}
|
||||
return num, nil
|
||||
}
|
||||
}
|
||||
|
||||
// CompressGZIP compresses the input as a GZIP-encoded file.
|
||||
// The current implementation does no compression.
|
||||
func (Export) CompressGZIP(in []byte) (out []byte) {
|
||||
// RFC 1952, section 2.3.1.
|
||||
var gzipHeader = [10]byte{0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}
|
||||
|
||||
// RFC 1951, section 3.2.4.
|
||||
var blockHeader [5]byte
|
||||
const maxBlockSize = math.MaxUint16
|
||||
numBlocks := 1 + len(in)/maxBlockSize
|
||||
|
||||
// RFC 1952, section 2.3.1.
|
||||
var gzipFooter [8]byte
|
||||
binary.LittleEndian.PutUint32(gzipFooter[0:4], crc32.ChecksumIEEE(in))
|
||||
binary.LittleEndian.PutUint32(gzipFooter[4:8], uint32(len(in)))
|
||||
|
||||
// Encode the input without compression using raw DEFLATE blocks.
|
||||
out = make([]byte, 0, len(gzipHeader)+len(blockHeader)*numBlocks+len(in)+len(gzipFooter))
|
||||
out = append(out, gzipHeader[:]...)
|
||||
for blockHeader[0] == 0 {
|
||||
blockSize := maxBlockSize
|
||||
if blockSize > len(in) {
|
||||
blockHeader[0] = 0x01 // final bit per RFC 1951, section 3.2.3.
|
||||
blockSize = len(in)
|
||||
}
|
||||
binary.LittleEndian.PutUint16(blockHeader[1:3], uint16(blockSize))
|
||||
binary.LittleEndian.PutUint16(blockHeader[3:5], ^uint16(blockSize))
|
||||
out = append(out, blockHeader[:]...)
|
||||
out = append(out, in[:blockSize]...)
|
||||
in = in[blockSize:]
|
||||
}
|
||||
out = append(out, gzipFooter[:]...)
|
||||
return out
|
||||
}
|
177
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
generated
vendored
Normal file
177
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go
generated
vendored
Normal file
@ -0,0 +1,177 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
ptag "google.golang.org/protobuf/internal/encoding/tag"
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
func (xi *ExtensionInfo) initToLegacy() {
|
||||
xd := xi.desc
|
||||
var parent protoiface.MessageV1
|
||||
messageName := xd.ContainingMessage().FullName()
|
||||
if mt, _ := protoregistry.GlobalTypes.FindMessageByName(messageName); mt != nil {
|
||||
// Create a new parent message and unwrap it if possible.
|
||||
mv := mt.New().Interface()
|
||||
t := reflect.TypeOf(mv)
|
||||
if mv, ok := mv.(unwrapper); ok {
|
||||
t = reflect.TypeOf(mv.protoUnwrap())
|
||||
}
|
||||
|
||||
// Check whether the message implements the legacy v1 Message interface.
|
||||
mz := reflect.Zero(t).Interface()
|
||||
if mz, ok := mz.(protoiface.MessageV1); ok {
|
||||
parent = mz
|
||||
}
|
||||
}
|
||||
|
||||
// Determine the v1 extension type, which is unfortunately not the same as
|
||||
// the v2 ExtensionType.GoType.
|
||||
extType := xi.goType
|
||||
switch extType.Kind() {
|
||||
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
||||
extType = reflect.PtrTo(extType) // T -> *T for singular scalar fields
|
||||
}
|
||||
|
||||
// Reconstruct the legacy enum full name.
|
||||
var enumName string
|
||||
if xd.Kind() == protoreflect.EnumKind {
|
||||
enumName = legacyEnumName(xd.Enum())
|
||||
}
|
||||
|
||||
// Derive the proto file that the extension was declared within.
|
||||
var filename string
|
||||
if fd := xd.ParentFile(); fd != nil {
|
||||
filename = fd.Path()
|
||||
}
|
||||
|
||||
// For MessageSet extensions, the name used is the parent message.
|
||||
name := xd.FullName()
|
||||
if messageset.IsMessageSetExtension(xd) {
|
||||
name = name.Parent()
|
||||
}
|
||||
|
||||
xi.ExtendedType = parent
|
||||
xi.ExtensionType = reflect.Zero(extType).Interface()
|
||||
xi.Field = int32(xd.Number())
|
||||
xi.Name = string(name)
|
||||
xi.Tag = ptag.Marshal(xd, enumName)
|
||||
xi.Filename = filename
|
||||
}
|
||||
|
||||
// initFromLegacy initializes an ExtensionInfo from
|
||||
// the contents of the deprecated exported fields of the type.
|
||||
func (xi *ExtensionInfo) initFromLegacy() {
|
||||
// The v1 API returns "type incomplete" descriptors where only the
|
||||
// field number is specified. In such a case, use a placeholder.
|
||||
if xi.ExtendedType == nil || xi.ExtensionType == nil {
|
||||
xd := placeholderExtension{
|
||||
name: protoreflect.FullName(xi.Name),
|
||||
number: protoreflect.FieldNumber(xi.Field),
|
||||
}
|
||||
xi.desc = extensionTypeDescriptor{xd, xi}
|
||||
return
|
||||
}
|
||||
|
||||
// Resolve enum or message dependencies.
|
||||
var ed protoreflect.EnumDescriptor
|
||||
var md protoreflect.MessageDescriptor
|
||||
t := reflect.TypeOf(xi.ExtensionType)
|
||||
isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct
|
||||
isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8
|
||||
if isOptional || isRepeated {
|
||||
t = t.Elem()
|
||||
}
|
||||
switch v := reflect.Zero(t).Interface().(type) {
|
||||
case protoreflect.Enum:
|
||||
ed = v.Descriptor()
|
||||
case enumV1:
|
||||
ed = LegacyLoadEnumDesc(t)
|
||||
case protoreflect.ProtoMessage:
|
||||
md = v.ProtoReflect().Descriptor()
|
||||
case messageV1:
|
||||
md = LegacyLoadMessageDesc(t)
|
||||
}
|
||||
|
||||
// Derive basic field information from the struct tag.
|
||||
var evs protoreflect.EnumValueDescriptors
|
||||
if ed != nil {
|
||||
evs = ed.Values()
|
||||
}
|
||||
fd := ptag.Unmarshal(xi.Tag, t, evs).(*filedesc.Field)
|
||||
|
||||
// Construct a v2 ExtensionType.
|
||||
xd := &filedesc.Extension{L2: new(filedesc.ExtensionL2)}
|
||||
xd.L0.ParentFile = filedesc.SurrogateProto2
|
||||
xd.L0.FullName = protoreflect.FullName(xi.Name)
|
||||
xd.L1.Number = protoreflect.FieldNumber(xi.Field)
|
||||
xd.L1.Cardinality = fd.L1.Cardinality
|
||||
xd.L1.Kind = fd.L1.Kind
|
||||
xd.L1.EditionFeatures = fd.L1.EditionFeatures
|
||||
xd.L2.Default = fd.L1.Default
|
||||
xd.L1.Extendee = Export{}.MessageDescriptorOf(xi.ExtendedType)
|
||||
xd.L2.Enum = ed
|
||||
xd.L2.Message = md
|
||||
|
||||
// Derive real extension field name for MessageSets.
|
||||
if messageset.IsMessageSet(xd.L1.Extendee) && md.FullName() == xd.L0.FullName {
|
||||
xd.L0.FullName = xd.L0.FullName.Append(messageset.ExtensionName)
|
||||
}
|
||||
|
||||
tt := reflect.TypeOf(xi.ExtensionType)
|
||||
if isOptional {
|
||||
tt = tt.Elem()
|
||||
}
|
||||
xi.goType = tt
|
||||
xi.desc = extensionTypeDescriptor{xd, xi}
|
||||
}
|
||||
|
||||
type placeholderExtension struct {
|
||||
name protoreflect.FullName
|
||||
number protoreflect.FieldNumber
|
||||
}
|
||||
|
||||
func (x placeholderExtension) ParentFile() protoreflect.FileDescriptor { return nil }
|
||||
func (x placeholderExtension) Parent() protoreflect.Descriptor { return nil }
|
||||
func (x placeholderExtension) Index() int { return 0 }
|
||||
func (x placeholderExtension) Syntax() protoreflect.Syntax { return 0 }
|
||||
func (x placeholderExtension) Name() protoreflect.Name { return x.name.Name() }
|
||||
func (x placeholderExtension) FullName() protoreflect.FullName { return x.name }
|
||||
func (x placeholderExtension) IsPlaceholder() bool { return true }
|
||||
func (x placeholderExtension) Options() protoreflect.ProtoMessage { return descopts.Field }
|
||||
func (x placeholderExtension) Number() protoreflect.FieldNumber { return x.number }
|
||||
func (x placeholderExtension) Cardinality() protoreflect.Cardinality { return 0 }
|
||||
func (x placeholderExtension) Kind() protoreflect.Kind { return 0 }
|
||||
func (x placeholderExtension) HasJSONName() bool { return false }
|
||||
func (x placeholderExtension) JSONName() string { return "[" + string(x.name) + "]" }
|
||||
func (x placeholderExtension) TextName() string { return "[" + string(x.name) + "]" }
|
||||
func (x placeholderExtension) HasPresence() bool { return false }
|
||||
func (x placeholderExtension) HasOptionalKeyword() bool { return false }
|
||||
func (x placeholderExtension) IsExtension() bool { return true }
|
||||
func (x placeholderExtension) IsWeak() bool { return false }
|
||||
func (x placeholderExtension) IsLazy() bool { return false }
|
||||
func (x placeholderExtension) IsPacked() bool { return false }
|
||||
func (x placeholderExtension) IsList() bool { return false }
|
||||
func (x placeholderExtension) IsMap() bool { return false }
|
||||
func (x placeholderExtension) MapKey() protoreflect.FieldDescriptor { return nil }
|
||||
func (x placeholderExtension) MapValue() protoreflect.FieldDescriptor { return nil }
|
||||
func (x placeholderExtension) HasDefault() bool { return false }
|
||||
func (x placeholderExtension) Default() protoreflect.Value { return protoreflect.Value{} }
|
||||
func (x placeholderExtension) DefaultEnumValue() protoreflect.EnumValueDescriptor { return nil }
|
||||
func (x placeholderExtension) ContainingOneof() protoreflect.OneofDescriptor { return nil }
|
||||
func (x placeholderExtension) ContainingMessage() protoreflect.MessageDescriptor { return nil }
|
||||
func (x placeholderExtension) Enum() protoreflect.EnumDescriptor { return nil }
|
||||
func (x placeholderExtension) Message() protoreflect.MessageDescriptor { return nil }
|
||||
func (x placeholderExtension) ProtoType(protoreflect.FieldDescriptor) { return }
|
||||
func (x placeholderExtension) ProtoInternal(pragma.DoNotImplement) { return }
|
81
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go
generated
vendored
Normal file
81
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go
generated
vendored
Normal file
@ -0,0 +1,81 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"io"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
)
|
||||
|
||||
// Every enum and message type generated by protoc-gen-go since commit 2fc053c5
|
||||
// on February 25th, 2016 has had a method to get the raw descriptor.
|
||||
// Types that were not generated by protoc-gen-go or were generated prior
|
||||
// to that version are not supported.
|
||||
//
|
||||
// The []byte returned is the encoded form of a FileDescriptorProto message
|
||||
// compressed using GZIP. The []int is the path from the top-level file
|
||||
// to the specific message or enum declaration.
|
||||
type (
|
||||
enumV1 interface {
|
||||
EnumDescriptor() ([]byte, []int)
|
||||
}
|
||||
messageV1 interface {
|
||||
Descriptor() ([]byte, []int)
|
||||
}
|
||||
)
|
||||
|
||||
var legacyFileDescCache sync.Map // map[*byte]protoreflect.FileDescriptor
|
||||
|
||||
// legacyLoadFileDesc unmarshals b as a compressed FileDescriptorProto message.
|
||||
//
|
||||
// This assumes that b is immutable and that b does not refer to part of a
|
||||
// concatenated series of GZIP files (which would require shenanigans that
|
||||
// rely on the concatenation properties of both protobufs and GZIP).
|
||||
// File descriptors generated by protoc-gen-go do not rely on that property.
|
||||
func legacyLoadFileDesc(b []byte) protoreflect.FileDescriptor {
|
||||
// Fast-path: check whether we already have a cached file descriptor.
|
||||
if fd, ok := legacyFileDescCache.Load(&b[0]); ok {
|
||||
return fd.(protoreflect.FileDescriptor)
|
||||
}
|
||||
|
||||
// Slow-path: decompress and unmarshal the file descriptor proto.
|
||||
zr, err := gzip.NewReader(bytes.NewReader(b))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
b2, err := io.ReadAll(zr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fd := filedesc.Builder{
|
||||
RawDescriptor: b2,
|
||||
FileRegistry: resolverOnly{protoregistry.GlobalFiles}, // do not register back to global registry
|
||||
}.Build().File
|
||||
if fd, ok := legacyFileDescCache.LoadOrStore(&b[0], fd); ok {
|
||||
return fd.(protoreflect.FileDescriptor)
|
||||
}
|
||||
return fd
|
||||
}
|
||||
|
||||
type resolverOnly struct {
|
||||
reg *protoregistry.Files
|
||||
}
|
||||
|
||||
func (r resolverOnly) FindFileByPath(path string) (protoreflect.FileDescriptor, error) {
|
||||
return r.reg.FindFileByPath(path)
|
||||
}
|
||||
func (r resolverOnly) FindDescriptorByName(name protoreflect.FullName) (protoreflect.Descriptor, error) {
|
||||
return r.reg.FindDescriptorByName(name)
|
||||
}
|
||||
func (resolverOnly) RegisterFile(protoreflect.FileDescriptor) error {
|
||||
return nil
|
||||
}
|
569
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go
generated
vendored
Normal file
569
e2e/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go
generated
vendored
Normal file
@ -0,0 +1,569 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/internal/descopts"
|
||||
ptag "google.golang.org/protobuf/internal/encoding/tag"
|
||||
"google.golang.org/protobuf/internal/errors"
|
||||
"google.golang.org/protobuf/internal/filedesc"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// legacyWrapMessage wraps v as a protoreflect.Message,
|
||||
// where v must be a *struct kind and not implement the v2 API already.
|
||||
func legacyWrapMessage(v reflect.Value) protoreflect.Message {
|
||||
t := v.Type()
|
||||
if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct {
|
||||
return aberrantMessage{v: v}
|
||||
}
|
||||
mt := legacyLoadMessageInfo(t, "")
|
||||
return mt.MessageOf(v.Interface())
|
||||
}
|
||||
|
||||
// legacyLoadMessageType dynamically loads a protoreflect.Type for t,
|
||||
// where t must be not implement the v2 API already.
|
||||
// The provided name is used if it cannot be determined from the message.
|
||||
func legacyLoadMessageType(t reflect.Type, name protoreflect.FullName) protoreflect.MessageType {
|
||||
if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct {
|
||||
return aberrantMessageType{t}
|
||||
}
|
||||
return legacyLoadMessageInfo(t, name)
|
||||
}
|
||||
|
||||
var legacyMessageTypeCache sync.Map // map[reflect.Type]*MessageInfo
|
||||
|
||||
// legacyLoadMessageInfo dynamically loads a *MessageInfo for t,
|
||||
// where t must be a *struct kind and not implement the v2 API already.
|
||||
// The provided name is used if it cannot be determined from the message.
|
||||
func legacyLoadMessageInfo(t reflect.Type, name protoreflect.FullName) *MessageInfo {
|
||||
// Fast-path: check if a MessageInfo is cached for this concrete type.
|
||||
if mt, ok := legacyMessageTypeCache.Load(t); ok {
|
||||
return mt.(*MessageInfo)
|
||||
}
|
||||
|
||||
// Slow-path: derive message descriptor and initialize MessageInfo.
|
||||
mi := &MessageInfo{
|
||||
Desc: legacyLoadMessageDesc(t, name),
|
||||
GoReflectType: t,
|
||||
}
|
||||
|
||||
var hasMarshal, hasUnmarshal bool
|
||||
v := reflect.Zero(t).Interface()
|
||||
if _, hasMarshal = v.(legacyMarshaler); hasMarshal {
|
||||
mi.methods.Marshal = legacyMarshal
|
||||
|
||||
// We have no way to tell whether the type's Marshal method
|
||||
// supports deterministic serialization or not, but this
|
||||
// preserves the v1 implementation's behavior of always
|
||||
// calling Marshal methods when present.
|
||||
mi.methods.Flags |= protoiface.SupportMarshalDeterministic
|
||||
}
|
||||
if _, hasUnmarshal = v.(legacyUnmarshaler); hasUnmarshal {
|
||||
mi.methods.Unmarshal = legacyUnmarshal
|
||||
}
|
||||
if _, hasMerge := v.(legacyMerger); hasMerge || (hasMarshal && hasUnmarshal) {
|
||||
mi.methods.Merge = legacyMerge
|
||||
}
|
||||
|
||||
if mi, ok := legacyMessageTypeCache.LoadOrStore(t, mi); ok {
|
||||
return mi.(*MessageInfo)
|
||||
}
|
||||
return mi
|
||||
}
|
||||
|
||||
var legacyMessageDescCache sync.Map // map[reflect.Type]protoreflect.MessageDescriptor
|
||||
|
||||
// LegacyLoadMessageDesc returns an MessageDescriptor derived from the Go type,
|
||||
// which should be a *struct kind and must not implement the v2 API already.
|
||||
//
|
||||
// This is exported for testing purposes.
|
||||
func LegacyLoadMessageDesc(t reflect.Type) protoreflect.MessageDescriptor {
|
||||
return legacyLoadMessageDesc(t, "")
|
||||
}
|
||||
func legacyLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor {
|
||||
// Fast-path: check if a MessageDescriptor is cached for this concrete type.
|
||||
if mi, ok := legacyMessageDescCache.Load(t); ok {
|
||||
return mi.(protoreflect.MessageDescriptor)
|
||||
}
|
||||
|
||||
// Slow-path: initialize MessageDescriptor from the raw descriptor.
|
||||
mv := reflect.Zero(t).Interface()
|
||||
if _, ok := mv.(protoreflect.ProtoMessage); ok {
|
||||
panic(fmt.Sprintf("%v already implements proto.Message", t))
|
||||
}
|
||||
mdV1, ok := mv.(messageV1)
|
||||
if !ok {
|
||||
return aberrantLoadMessageDesc(t, name)
|
||||
}
|
||||
|
||||
// If this is a dynamic message type where there isn't a 1-1 mapping between
|
||||
// Go and protobuf types, calling the Descriptor method on the zero value of
|
||||
// the message type isn't likely to work. If it panics, swallow the panic and
|
||||
// continue as if the Descriptor method wasn't present.
|
||||
b, idxs := func() ([]byte, []int) {
|
||||
defer func() {
|
||||
recover()
|
||||
}()
|
||||
return mdV1.Descriptor()
|
||||
}()
|
||||
if b == nil {
|
||||
return aberrantLoadMessageDesc(t, name)
|
||||
}
|
||||
|
||||
// If the Go type has no fields, then this might be a proto3 empty message
|
||||
// from before the size cache was added. If there are any fields, check to
|
||||
// see that at least one of them looks like something we generated.
|
||||
if t.Elem().Kind() == reflect.Struct {
|
||||
if nfield := t.Elem().NumField(); nfield > 0 {
|
||||
hasProtoField := false
|
||||
for i := 0; i < nfield; i++ {
|
||||
f := t.Elem().Field(i)
|
||||
if f.Tag.Get("protobuf") != "" || f.Tag.Get("protobuf_oneof") != "" || strings.HasPrefix(f.Name, "XXX_") {
|
||||
hasProtoField = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !hasProtoField {
|
||||
return aberrantLoadMessageDesc(t, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
md := legacyLoadFileDesc(b).Messages().Get(idxs[0])
|
||||
for _, i := range idxs[1:] {
|
||||
md = md.Messages().Get(i)
|
||||
}
|
||||
if name != "" && md.FullName() != name {
|
||||
panic(fmt.Sprintf("mismatching message name: got %v, want %v", md.FullName(), name))
|
||||
}
|
||||
if md, ok := legacyMessageDescCache.LoadOrStore(t, md); ok {
|
||||
return md.(protoreflect.MessageDescriptor)
|
||||
}
|
||||
return md
|
||||
}
|
||||
|
||||
var (
|
||||
aberrantMessageDescLock sync.Mutex
|
||||
aberrantMessageDescCache map[reflect.Type]protoreflect.MessageDescriptor
|
||||
)
|
||||
|
||||
// aberrantLoadMessageDesc returns an MessageDescriptor derived from the Go type,
|
||||
// which must not implement protoreflect.ProtoMessage or messageV1.
|
||||
//
|
||||
// This is a best-effort derivation of the message descriptor using the protobuf
|
||||
// tags on the struct fields.
|
||||
func aberrantLoadMessageDesc(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor {
|
||||
aberrantMessageDescLock.Lock()
|
||||
defer aberrantMessageDescLock.Unlock()
|
||||
if aberrantMessageDescCache == nil {
|
||||
aberrantMessageDescCache = make(map[reflect.Type]protoreflect.MessageDescriptor)
|
||||
}
|
||||
return aberrantLoadMessageDescReentrant(t, name)
|
||||
}
|
||||
func aberrantLoadMessageDescReentrant(t reflect.Type, name protoreflect.FullName) protoreflect.MessageDescriptor {
|
||||
// Fast-path: check if an MessageDescriptor is cached for this concrete type.
|
||||
if md, ok := aberrantMessageDescCache[t]; ok {
|
||||
return md
|
||||
}
|
||||
|
||||
// Slow-path: construct a descriptor from the Go struct type (best-effort).
|
||||
// Cache the MessageDescriptor early on so that we can resolve internal
|
||||
// cyclic references.
|
||||
md := &filedesc.Message{L2: new(filedesc.MessageL2)}
|
||||
md.L0.FullName = aberrantDeriveMessageName(t, name)
|
||||
md.L0.ParentFile = filedesc.SurrogateProto2
|
||||
aberrantMessageDescCache[t] = md
|
||||
|
||||
if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Struct {
|
||||
return md
|
||||
}
|
||||
|
||||
// Try to determine if the message is using proto3 by checking scalars.
|
||||
for i := 0; i < t.Elem().NumField(); i++ {
|
||||
f := t.Elem().Field(i)
|
||||
if tag := f.Tag.Get("protobuf"); tag != "" {
|
||||
switch f.Type.Kind() {
|
||||
case reflect.Bool, reflect.Int32, reflect.Int64, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64, reflect.String:
|
||||
md.L0.ParentFile = filedesc.SurrogateProto3
|
||||
}
|
||||
for _, s := range strings.Split(tag, ",") {
|
||||
if s == "proto3" {
|
||||
md.L0.ParentFile = filedesc.SurrogateProto3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
md.L1.EditionFeatures = md.L0.ParentFile.L1.EditionFeatures
|
||||
// Obtain a list of oneof wrapper types.
|
||||
var oneofWrappers []reflect.Type
|
||||
methods := make([]reflect.Method, 0, 2)
|
||||
if m, ok := t.MethodByName("XXX_OneofFuncs"); ok {
|
||||
methods = append(methods, m)
|
||||
}
|
||||
if m, ok := t.MethodByName("XXX_OneofWrappers"); ok {
|
||||
methods = append(methods, m)
|
||||
}
|
||||
for _, fn := range methods {
|
||||
for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) {
|
||||
if vs, ok := v.Interface().([]any); ok {
|
||||
for _, v := range vs {
|
||||
oneofWrappers = append(oneofWrappers, reflect.TypeOf(v))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Obtain a list of the extension ranges.
|
||||
if fn, ok := t.MethodByName("ExtensionRangeArray"); ok {
|
||||
vs := fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))})[0]
|
||||
for i := 0; i < vs.Len(); i++ {
|
||||
v := vs.Index(i)
|
||||
md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, [2]protoreflect.FieldNumber{
|
||||
protoreflect.FieldNumber(v.FieldByName("Start").Int()),
|
||||
protoreflect.FieldNumber(v.FieldByName("End").Int() + 1),
|
||||
})
|
||||
md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, nil)
|
||||
}
|
||||
}
|
||||
|
||||
// Derive the message fields by inspecting the struct fields.
|
||||
for i := 0; i < t.Elem().NumField(); i++ {
|
||||
f := t.Elem().Field(i)
|
||||
if tag := f.Tag.Get("protobuf"); tag != "" {
|
||||
tagKey := f.Tag.Get("protobuf_key")
|
||||
tagVal := f.Tag.Get("protobuf_val")
|
||||
aberrantAppendField(md, f.Type, tag, tagKey, tagVal)
|
||||
}
|
||||
if tag := f.Tag.Get("protobuf_oneof"); tag != "" {
|
||||
n := len(md.L2.Oneofs.List)
|
||||
md.L2.Oneofs.List = append(md.L2.Oneofs.List, filedesc.Oneof{})
|
||||
od := &md.L2.Oneofs.List[n]
|
||||
od.L0.FullName = md.FullName().Append(protoreflect.Name(tag))
|
||||
od.L0.ParentFile = md.L0.ParentFile
|
||||
od.L1.EditionFeatures = md.L1.EditionFeatures
|
||||
od.L0.Parent = md
|
||||
od.L0.Index = n
|
||||
|
||||
for _, t := range oneofWrappers {
|
||||
if t.Implements(f.Type) {
|
||||
f := t.Elem().Field(0)
|
||||
if tag := f.Tag.Get("protobuf"); tag != "" {
|
||||
aberrantAppendField(md, f.Type, tag, "", "")
|
||||
fd := &md.L2.Fields.List[len(md.L2.Fields.List)-1]
|
||||
fd.L1.ContainingOneof = od
|
||||
fd.L1.EditionFeatures = od.L1.EditionFeatures
|
||||
od.L1.Fields.List = append(od.L1.Fields.List, fd)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return md
|
||||
}
|
||||
|
||||
func aberrantDeriveMessageName(t reflect.Type, name protoreflect.FullName) protoreflect.FullName {
|
||||
if name.IsValid() {
|
||||
return name
|
||||
}
|
||||
func() {
|
||||
defer func() { recover() }() // swallow possible nil panics
|
||||
if m, ok := reflect.Zero(t).Interface().(interface{ XXX_MessageName() string }); ok {
|
||||
name = protoreflect.FullName(m.XXX_MessageName())
|
||||
}
|
||||
}()
|
||||
if name.IsValid() {
|
||||
return name
|
||||
}
|
||||
if t.Kind() == reflect.Ptr {
|
||||
t = t.Elem()
|
||||
}
|
||||
return AberrantDeriveFullName(t)
|
||||
}
|
||||
|
||||
func aberrantAppendField(md *filedesc.Message, goType reflect.Type, tag, tagKey, tagVal string) {
|
||||
t := goType
|
||||
isOptional := t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct
|
||||
isRepeated := t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8
|
||||
if isOptional || isRepeated {
|
||||
t = t.Elem()
|
||||
}
|
||||
fd := ptag.Unmarshal(tag, t, placeholderEnumValues{}).(*filedesc.Field)
|
||||
|
||||
// Append field descriptor to the message.
|
||||
n := len(md.L2.Fields.List)
|
||||
md.L2.Fields.List = append(md.L2.Fields.List, *fd)
|
||||
fd = &md.L2.Fields.List[n]
|
||||
fd.L0.FullName = md.FullName().Append(fd.Name())
|
||||
fd.L0.ParentFile = md.L0.ParentFile
|
||||
fd.L0.Parent = md
|
||||
fd.L0.Index = n
|
||||
|
||||
if fd.L1.EditionFeatures.IsPacked {
|
||||
fd.L1.Options = func() protoreflect.ProtoMessage {
|
||||
opts := descopts.Field.ProtoReflect().New()
|
||||
if fd.L1.EditionFeatures.IsPacked {
|
||||
opts.Set(opts.Descriptor().Fields().ByName("packed"), protoreflect.ValueOfBool(fd.L1.EditionFeatures.IsPacked))
|
||||
}
|
||||
return opts.Interface()
|
||||
}
|
||||
}
|
||||
|
||||
// Populate Enum and Message.
|
||||
if fd.Enum() == nil && fd.Kind() == protoreflect.EnumKind {
|
||||
switch v := reflect.Zero(t).Interface().(type) {
|
||||
case protoreflect.Enum:
|
||||
fd.L1.Enum = v.Descriptor()
|
||||
default:
|
||||
fd.L1.Enum = LegacyLoadEnumDesc(t)
|
||||
}
|
||||
}
|
||||
if fd.Message() == nil && (fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind) {
|
||||
switch v := reflect.Zero(t).Interface().(type) {
|
||||
case protoreflect.ProtoMessage:
|
||||
fd.L1.Message = v.ProtoReflect().Descriptor()
|
||||
case messageV1:
|
||||
fd.L1.Message = LegacyLoadMessageDesc(t)
|
||||
default:
|
||||
if t.Kind() == reflect.Map {
|
||||
n := len(md.L1.Messages.List)
|
||||
md.L1.Messages.List = append(md.L1.Messages.List, filedesc.Message{L2: new(filedesc.MessageL2)})
|
||||
md2 := &md.L1.Messages.List[n]
|
||||
md2.L0.FullName = md.FullName().Append(protoreflect.Name(strs.MapEntryName(string(fd.Name()))))
|
||||
md2.L0.ParentFile = md.L0.ParentFile
|
||||
md2.L0.Parent = md
|
||||
md2.L0.Index = n
|
||||
md2.L1.EditionFeatures = md.L1.EditionFeatures
|
||||
|
||||
md2.L1.IsMapEntry = true
|
||||
md2.L2.Options = func() protoreflect.ProtoMessage {
|
||||
opts := descopts.Message.ProtoReflect().New()
|
||||
opts.Set(opts.Descriptor().Fields().ByName("map_entry"), protoreflect.ValueOfBool(true))
|
||||
return opts.Interface()
|
||||
}
|
||||
|
||||
aberrantAppendField(md2, t.Key(), tagKey, "", "")
|
||||
aberrantAppendField(md2, t.Elem(), tagVal, "", "")
|
||||
|
||||
fd.L1.Message = md2
|
||||
break
|
||||
}
|
||||
fd.L1.Message = aberrantLoadMessageDescReentrant(t, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type placeholderEnumValues struct {
|
||||
protoreflect.EnumValueDescriptors
|
||||
}
|
||||
|
||||
func (placeholderEnumValues) ByNumber(n protoreflect.EnumNumber) protoreflect.EnumValueDescriptor {
|
||||
return filedesc.PlaceholderEnumValue(protoreflect.FullName(fmt.Sprintf("UNKNOWN_%d", n)))
|
||||
}
|
||||
|
||||
// legacyMarshaler is the proto.Marshaler interface superseded by protoiface.Methoder.
|
||||
type legacyMarshaler interface {
|
||||
Marshal() ([]byte, error)
|
||||
}
|
||||
|
||||
// legacyUnmarshaler is the proto.Unmarshaler interface superseded by protoiface.Methoder.
|
||||
type legacyUnmarshaler interface {
|
||||
Unmarshal([]byte) error
|
||||
}
|
||||
|
||||
// legacyMerger is the proto.Merger interface superseded by protoiface.Methoder.
|
||||
type legacyMerger interface {
|
||||
Merge(protoiface.MessageV1)
|
||||
}
|
||||
|
||||
var aberrantProtoMethods = &protoiface.Methods{
|
||||
Marshal: legacyMarshal,
|
||||
Unmarshal: legacyUnmarshal,
|
||||
Merge: legacyMerge,
|
||||
|
||||
// We have no way to tell whether the type's Marshal method
|
||||
// supports deterministic serialization or not, but this
|
||||
// preserves the v1 implementation's behavior of always
|
||||
// calling Marshal methods when present.
|
||||
Flags: protoiface.SupportMarshalDeterministic,
|
||||
}
|
||||
|
||||
func legacyMarshal(in protoiface.MarshalInput) (protoiface.MarshalOutput, error) {
|
||||
v := in.Message.(unwrapper).protoUnwrap()
|
||||
marshaler, ok := v.(legacyMarshaler)
|
||||
if !ok {
|
||||
return protoiface.MarshalOutput{}, errors.New("%T does not implement Marshal", v)
|
||||
}
|
||||
out, err := marshaler.Marshal()
|
||||
if in.Buf != nil {
|
||||
out = append(in.Buf, out...)
|
||||
}
|
||||
return protoiface.MarshalOutput{
|
||||
Buf: out,
|
||||
}, err
|
||||
}
|
||||
|
||||
func legacyUnmarshal(in protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) {
|
||||
v := in.Message.(unwrapper).protoUnwrap()
|
||||
unmarshaler, ok := v.(legacyUnmarshaler)
|
||||
if !ok {
|
||||
return protoiface.UnmarshalOutput{}, errors.New("%T does not implement Unmarshal", v)
|
||||
}
|
||||
return protoiface.UnmarshalOutput{}, unmarshaler.Unmarshal(in.Buf)
|
||||
}
|
||||
|
||||
func legacyMerge(in protoiface.MergeInput) protoiface.MergeOutput {
|
||||
// Check whether this supports the legacy merger.
|
||||
dstv := in.Destination.(unwrapper).protoUnwrap()
|
||||
merger, ok := dstv.(legacyMerger)
|
||||
if ok {
|
||||
merger.Merge(Export{}.ProtoMessageV1Of(in.Source))
|
||||
return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
|
||||
}
|
||||
|
||||
// If legacy merger is unavailable, implement merge in terms of
|
||||
// a marshal and unmarshal operation.
|
||||
srcv := in.Source.(unwrapper).protoUnwrap()
|
||||
marshaler, ok := srcv.(legacyMarshaler)
|
||||
if !ok {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
dstv = in.Destination.(unwrapper).protoUnwrap()
|
||||
unmarshaler, ok := dstv.(legacyUnmarshaler)
|
||||
if !ok {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
if !in.Source.IsValid() {
|
||||
// Legacy Marshal methods may not function on nil messages.
|
||||
// Check for a typed nil source only after we confirm that
|
||||
// legacy Marshal/Unmarshal methods are present, for
|
||||
// consistency.
|
||||
return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
|
||||
}
|
||||
b, err := marshaler.Marshal()
|
||||
if err != nil {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
err = unmarshaler.Unmarshal(b)
|
||||
if err != nil {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
|
||||
}
|
||||
|
||||
// aberrantMessageType implements MessageType for all types other than pointer-to-struct.
|
||||
type aberrantMessageType struct {
|
||||
t reflect.Type
|
||||
}
|
||||
|
||||
func (mt aberrantMessageType) New() protoreflect.Message {
|
||||
if mt.t.Kind() == reflect.Ptr {
|
||||
return aberrantMessage{reflect.New(mt.t.Elem())}
|
||||
}
|
||||
return aberrantMessage{reflect.Zero(mt.t)}
|
||||
}
|
||||
func (mt aberrantMessageType) Zero() protoreflect.Message {
|
||||
return aberrantMessage{reflect.Zero(mt.t)}
|
||||
}
|
||||
func (mt aberrantMessageType) GoType() reflect.Type {
|
||||
return mt.t
|
||||
}
|
||||
func (mt aberrantMessageType) Descriptor() protoreflect.MessageDescriptor {
|
||||
return LegacyLoadMessageDesc(mt.t)
|
||||
}
|
||||
|
||||
// aberrantMessage implements Message for all types other than pointer-to-struct.
|
||||
//
|
||||
// When the underlying type implements legacyMarshaler or legacyUnmarshaler,
|
||||
// the aberrant Message can be marshaled or unmarshaled. Otherwise, there is
|
||||
// not much that can be done with values of this type.
|
||||
type aberrantMessage struct {
|
||||
v reflect.Value
|
||||
}
|
||||
|
||||
// Reset implements the v1 proto.Message.Reset method.
|
||||
func (m aberrantMessage) Reset() {
|
||||
if mr, ok := m.v.Interface().(interface{ Reset() }); ok {
|
||||
mr.Reset()
|
||||
return
|
||||
}
|
||||
if m.v.Kind() == reflect.Ptr && !m.v.IsNil() {
|
||||
m.v.Elem().Set(reflect.Zero(m.v.Type().Elem()))
|
||||
}
|
||||
}
|
||||
|
||||
func (m aberrantMessage) ProtoReflect() protoreflect.Message {
|
||||
return m
|
||||
}
|
||||
|
||||
func (m aberrantMessage) Descriptor() protoreflect.MessageDescriptor {
|
||||
return LegacyLoadMessageDesc(m.v.Type())
|
||||
}
|
||||
func (m aberrantMessage) Type() protoreflect.MessageType {
|
||||
return aberrantMessageType{m.v.Type()}
|
||||
}
|
||||
func (m aberrantMessage) New() protoreflect.Message {
|
||||
if m.v.Type().Kind() == reflect.Ptr {
|
||||
return aberrantMessage{reflect.New(m.v.Type().Elem())}
|
||||
}
|
||||
return aberrantMessage{reflect.Zero(m.v.Type())}
|
||||
}
|
||||
func (m aberrantMessage) Interface() protoreflect.ProtoMessage {
|
||||
return m
|
||||
}
|
||||
func (m aberrantMessage) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
||||
return
|
||||
}
|
||||
func (m aberrantMessage) Has(protoreflect.FieldDescriptor) bool {
|
||||
return false
|
||||
}
|
||||
func (m aberrantMessage) Clear(protoreflect.FieldDescriptor) {
|
||||
panic("invalid Message.Clear on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
if fd.Default().IsValid() {
|
||||
return fd.Default()
|
||||
}
|
||||
panic("invalid Message.Get on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) Set(protoreflect.FieldDescriptor, protoreflect.Value) {
|
||||
panic("invalid Message.Set on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) Mutable(protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
panic("invalid Message.Mutable on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) NewField(protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
panic("invalid Message.NewField on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) WhichOneof(protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
||||
panic("invalid Message.WhichOneof descriptor on " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m aberrantMessage) GetUnknown() protoreflect.RawFields {
|
||||
return nil
|
||||
}
|
||||
func (m aberrantMessage) SetUnknown(protoreflect.RawFields) {
|
||||
// SetUnknown discards its input on messages which don't support unknown field storage.
|
||||
}
|
||||
func (m aberrantMessage) IsValid() bool {
|
||||
if m.v.Kind() == reflect.Ptr {
|
||||
return !m.v.IsNil()
|
||||
}
|
||||
return false
|
||||
}
|
||||
func (m aberrantMessage) ProtoMethods() *protoiface.Methods {
|
||||
return aberrantProtoMethods
|
||||
}
|
||||
func (m aberrantMessage) protoUnwrap() any {
|
||||
return m.v.Interface()
|
||||
}
|
203
e2e/vendor/google.golang.org/protobuf/internal/impl/merge.go
generated
vendored
Normal file
203
e2e/vendor/google.golang.org/protobuf/internal/impl/merge.go
generated
vendored
Normal file
@ -0,0 +1,203 @@
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
type mergeOptions struct{}
|
||||
|
||||
func (o mergeOptions) Merge(dst, src proto.Message) {
|
||||
proto.Merge(dst, src)
|
||||
}
|
||||
|
||||
// merge is protoreflect.Methods.Merge.
|
||||
func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput {
|
||||
dp, ok := mi.getPointer(in.Destination)
|
||||
if !ok {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
sp, ok := mi.getPointer(in.Source)
|
||||
if !ok {
|
||||
return protoiface.MergeOutput{}
|
||||
}
|
||||
mi.mergePointer(dp, sp, mergeOptions{})
|
||||
return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) {
|
||||
mi.init()
|
||||
if dst.IsNil() {
|
||||
panic(fmt.Sprintf("invalid value: merging into nil message"))
|
||||
}
|
||||
if src.IsNil() {
|
||||
return
|
||||
}
|
||||
|
||||
var presenceSrc presence
|
||||
var presenceDst presence
|
||||
if mi.presenceOffset.IsValid() {
|
||||
presenceSrc = src.Apply(mi.presenceOffset).PresenceInfo()
|
||||
presenceDst = dst.Apply(mi.presenceOffset).PresenceInfo()
|
||||
}
|
||||
|
||||
for _, f := range mi.orderedCoderFields {
|
||||
if f.funcs.merge == nil {
|
||||
continue
|
||||
}
|
||||
sfptr := src.Apply(f.offset)
|
||||
|
||||
if f.presenceIndex != noPresence {
|
||||
if !presenceSrc.Present(f.presenceIndex) {
|
||||
continue
|
||||
}
|
||||
dfptr := dst.Apply(f.offset)
|
||||
if f.isLazy {
|
||||
if sfptr.AtomicGetPointer().IsNil() {
|
||||
mi.lazyUnmarshal(src, f.num)
|
||||
}
|
||||
if presenceDst.Present(f.presenceIndex) && dfptr.AtomicGetPointer().IsNil() {
|
||||
mi.lazyUnmarshal(dst, f.num)
|
||||
}
|
||||
}
|
||||
f.funcs.merge(dst.Apply(f.offset), sfptr, f, opts)
|
||||
presenceDst.SetPresentUnatomic(f.presenceIndex, mi.presenceSize)
|
||||
continue
|
||||
}
|
||||
|
||||
if f.isPointer && sfptr.Elem().IsNil() {
|
||||
continue
|
||||
}
|
||||
f.funcs.merge(dst.Apply(f.offset), sfptr, f, opts)
|
||||
}
|
||||
if mi.extensionOffset.IsValid() {
|
||||
sext := src.Apply(mi.extensionOffset).Extensions()
|
||||
dext := dst.Apply(mi.extensionOffset).Extensions()
|
||||
if *dext == nil {
|
||||
*dext = make(map[int32]ExtensionField)
|
||||
}
|
||||
for num, sx := range *sext {
|
||||
xt := sx.Type()
|
||||
xi := getExtensionFieldInfo(xt)
|
||||
if xi.funcs.merge == nil {
|
||||
continue
|
||||
}
|
||||
dx := (*dext)[num]
|
||||
var dv protoreflect.Value
|
||||
if dx.Type() == sx.Type() {
|
||||
dv = dx.Value()
|
||||
}
|
||||
if !dv.IsValid() && xi.unmarshalNeedsValue {
|
||||
dv = xt.New()
|
||||
}
|
||||
dv = xi.funcs.merge(dv, sx.Value(), opts)
|
||||
dx.Set(sx.Type(), dv)
|
||||
(*dext)[num] = dx
|
||||
}
|
||||
}
|
||||
if mi.unknownOffset.IsValid() {
|
||||
su := mi.getUnknownBytes(src)
|
||||
if su != nil && len(*su) > 0 {
|
||||
du := mi.mutableUnknownBytes(dst)
|
||||
*du = append(*du, *su...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
return src
|
||||
}
|
||||
|
||||
func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...))
|
||||
}
|
||||
|
||||
func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
dstl := dst.List()
|
||||
srcl := src.List()
|
||||
for i, llen := 0, srcl.Len(); i < llen; i++ {
|
||||
dstl.Append(srcl.Get(i))
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
dstl := dst.List()
|
||||
srcl := src.List()
|
||||
for i, llen := 0, srcl.Len(); i < llen; i++ {
|
||||
sb := srcl.Get(i).Bytes()
|
||||
db := append(emptyBuf[:], sb...)
|
||||
dstl.Append(protoreflect.ValueOfBytes(db))
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
dstl := dst.List()
|
||||
srcl := src.List()
|
||||
for i, llen := 0, srcl.Len(); i < llen; i++ {
|
||||
sm := srcl.Get(i).Message()
|
||||
dm := proto.Clone(sm.Interface()).ProtoReflect()
|
||||
dstl.Append(protoreflect.ValueOfMessage(dm))
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
|
||||
opts.Merge(dst.Message().Interface(), src.Message().Interface())
|
||||
return dst
|
||||
}
|
||||
|
||||
func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
if f.mi != nil {
|
||||
if dst.Elem().IsNil() {
|
||||
dst.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
|
||||
}
|
||||
f.mi.mergePointer(dst.Elem(), src.Elem(), opts)
|
||||
} else {
|
||||
dm := dst.AsValueOf(f.ft).Elem()
|
||||
sm := src.AsValueOf(f.ft).Elem()
|
||||
if dm.IsNil() {
|
||||
dm.Set(reflect.New(f.ft.Elem()))
|
||||
}
|
||||
opts.Merge(asMessage(dm), asMessage(sm))
|
||||
}
|
||||
}
|
||||
|
||||
func mergeMessageSlice(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
|
||||
for _, sp := range src.PointerSlice() {
|
||||
dm := reflect.New(f.ft.Elem().Elem())
|
||||
if f.mi != nil {
|
||||
f.mi.mergePointer(pointerOfValue(dm), sp, opts)
|
||||
} else {
|
||||
opts.Merge(asMessage(dm), asMessage(sp.AsValueOf(f.ft.Elem().Elem())))
|
||||
}
|
||||
dst.AppendPointerSlice(pointerOfValue(dm))
|
||||
}
|
||||
}
|
||||
|
||||
func mergeBytes(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Bytes() = append(emptyBuf[:], *src.Bytes()...)
|
||||
}
|
||||
|
||||
func mergeBytesNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Bytes()
|
||||
if len(v) > 0 {
|
||||
*dst.Bytes() = append(emptyBuf[:], v...)
|
||||
}
|
||||
}
|
||||
|
||||
func mergeBytesSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.BytesSlice()
|
||||
for _, v := range *src.BytesSlice() {
|
||||
*ds = append(*ds, append(emptyBuf[:], v...))
|
||||
}
|
||||
}
|
209
e2e/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go
generated
vendored
Normal file
209
e2e/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go
generated
vendored
Normal file
@ -0,0 +1,209 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-types. DO NOT EDIT.
|
||||
|
||||
package impl
|
||||
|
||||
import ()
|
||||
|
||||
func mergeBool(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Bool() = *src.Bool()
|
||||
}
|
||||
|
||||
func mergeBoolNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Bool()
|
||||
if v != false {
|
||||
*dst.Bool() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeBoolPtr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.BoolPtr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.BoolPtr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeBoolSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.BoolSlice()
|
||||
ss := src.BoolSlice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeInt32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Int32() = *src.Int32()
|
||||
}
|
||||
|
||||
func mergeInt32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Int32()
|
||||
if v != 0 {
|
||||
*dst.Int32() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeInt32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Int32Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Int32Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeInt32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Int32Slice()
|
||||
ss := src.Int32Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeUint32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Uint32() = *src.Uint32()
|
||||
}
|
||||
|
||||
func mergeUint32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Uint32()
|
||||
if v != 0 {
|
||||
*dst.Uint32() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeUint32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Uint32Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Uint32Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeUint32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Uint32Slice()
|
||||
ss := src.Uint32Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeInt64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Int64() = *src.Int64()
|
||||
}
|
||||
|
||||
func mergeInt64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Int64()
|
||||
if v != 0 {
|
||||
*dst.Int64() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeInt64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Int64Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Int64Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeInt64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Int64Slice()
|
||||
ss := src.Int64Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeUint64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Uint64() = *src.Uint64()
|
||||
}
|
||||
|
||||
func mergeUint64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Uint64()
|
||||
if v != 0 {
|
||||
*dst.Uint64() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeUint64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Uint64Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Uint64Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeUint64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Uint64Slice()
|
||||
ss := src.Uint64Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeFloat32(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Float32() = *src.Float32()
|
||||
}
|
||||
|
||||
func mergeFloat32NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Float32()
|
||||
if v != 0 {
|
||||
*dst.Float32() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeFloat32Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Float32Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Float32Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeFloat32Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Float32Slice()
|
||||
ss := src.Float32Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeFloat64(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.Float64() = *src.Float64()
|
||||
}
|
||||
|
||||
func mergeFloat64NoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.Float64()
|
||||
if v != 0 {
|
||||
*dst.Float64() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeFloat64Ptr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.Float64Ptr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.Float64Ptr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeFloat64Slice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.Float64Slice()
|
||||
ss := src.Float64Slice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
||||
|
||||
func mergeString(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
*dst.String() = *src.String()
|
||||
}
|
||||
|
||||
func mergeStringNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
v := *src.String()
|
||||
if v != "" {
|
||||
*dst.String() = v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeStringPtr(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
p := *src.StringPtr()
|
||||
if p != nil {
|
||||
v := *p
|
||||
*dst.StringPtr() = &v
|
||||
}
|
||||
}
|
||||
|
||||
func mergeStringSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
|
||||
ds := dst.StringSlice()
|
||||
ss := src.StringSlice()
|
||||
*ds = append(*ds, *ss...)
|
||||
}
|
283
e2e/vendor/google.golang.org/protobuf/internal/impl/message.go
generated
vendored
Normal file
283
e2e/vendor/google.golang.org/protobuf/internal/impl/message.go
generated
vendored
Normal file
@ -0,0 +1,283 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// MessageInfo provides protobuf related functionality for a given Go type
|
||||
// that represents a message. A given instance of MessageInfo is tied to
|
||||
// exactly one Go type, which must be a pointer to a struct type.
|
||||
//
|
||||
// The exported fields must be populated before any methods are called
|
||||
// and cannot be mutated after set.
|
||||
type MessageInfo struct {
|
||||
// GoReflectType is the underlying message Go type and must be populated.
|
||||
GoReflectType reflect.Type // pointer to struct
|
||||
|
||||
// Desc is the underlying message descriptor type and must be populated.
|
||||
Desc protoreflect.MessageDescriptor
|
||||
|
||||
// Deprecated: Exporter will be removed the next time we bump
|
||||
// protoimpl.GenVersion. See https://github.com/golang/protobuf/issues/1640
|
||||
Exporter exporter
|
||||
|
||||
// OneofWrappers is list of pointers to oneof wrapper struct types.
|
||||
OneofWrappers []any
|
||||
|
||||
initMu sync.Mutex // protects all unexported fields
|
||||
initDone uint32
|
||||
|
||||
reflectMessageInfo // for reflection implementation
|
||||
coderMessageInfo // for fast-path method implementations
|
||||
}
|
||||
|
||||
// exporter is a function that returns a reference to the ith field of v,
|
||||
// where v is a pointer to a struct. It returns nil if it does not support
|
||||
// exporting the requested field (e.g., already exported).
|
||||
type exporter func(v any, i int) any
|
||||
|
||||
// getMessageInfo returns the MessageInfo for any message type that
|
||||
// is generated by our implementation of protoc-gen-go (for v2 and on).
|
||||
// If it is unable to obtain a MessageInfo, it returns nil.
|
||||
func getMessageInfo(mt reflect.Type) *MessageInfo {
|
||||
m, ok := reflect.Zero(mt).Interface().(protoreflect.ProtoMessage)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
mr, ok := m.ProtoReflect().(interface{ ProtoMessageInfo() *MessageInfo })
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
return mr.ProtoMessageInfo()
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) init() {
|
||||
// This function is called in the hot path. Inline the sync.Once logic,
|
||||
// since allocating a closure for Once.Do is expensive.
|
||||
// Keep init small to ensure that it can be inlined.
|
||||
if atomic.LoadUint32(&mi.initDone) == 0 {
|
||||
mi.initOnce()
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) initOnce() {
|
||||
mi.initMu.Lock()
|
||||
defer mi.initMu.Unlock()
|
||||
if mi.initDone == 1 {
|
||||
return
|
||||
}
|
||||
if opaqueInitHook(mi) {
|
||||
return
|
||||
}
|
||||
|
||||
t := mi.GoReflectType
|
||||
if t.Kind() != reflect.Ptr && t.Elem().Kind() != reflect.Struct {
|
||||
panic(fmt.Sprintf("got %v, want *struct kind", t))
|
||||
}
|
||||
t = t.Elem()
|
||||
|
||||
si := mi.makeStructInfo(t)
|
||||
mi.makeReflectFuncs(t, si)
|
||||
mi.makeCoderMethods(t, si)
|
||||
|
||||
atomic.StoreUint32(&mi.initDone, 1)
|
||||
}
|
||||
|
||||
// getPointer returns the pointer for a message, which should be of
|
||||
// the type of the MessageInfo. If the message is of a different type,
|
||||
// it returns ok==false.
|
||||
func (mi *MessageInfo) getPointer(m protoreflect.Message) (p pointer, ok bool) {
|
||||
switch m := m.(type) {
|
||||
case *messageState:
|
||||
return m.pointer(), m.messageInfo() == mi
|
||||
case *messageReflectWrapper:
|
||||
return m.pointer(), m.messageInfo() == mi
|
||||
}
|
||||
return pointer{}, false
|
||||
}
|
||||
|
||||
type (
|
||||
SizeCache = int32
|
||||
WeakFields = map[int32]protoreflect.ProtoMessage
|
||||
UnknownFields = unknownFieldsA // TODO: switch to unknownFieldsB
|
||||
unknownFieldsA = []byte
|
||||
unknownFieldsB = *[]byte
|
||||
ExtensionFields = map[int32]ExtensionField
|
||||
)
|
||||
|
||||
var (
|
||||
sizecacheType = reflect.TypeOf(SizeCache(0))
|
||||
unknownFieldsAType = reflect.TypeOf(unknownFieldsA(nil))
|
||||
unknownFieldsBType = reflect.TypeOf(unknownFieldsB(nil))
|
||||
extensionFieldsType = reflect.TypeOf(ExtensionFields(nil))
|
||||
)
|
||||
|
||||
type structInfo struct {
|
||||
sizecacheOffset offset
|
||||
sizecacheType reflect.Type
|
||||
unknownOffset offset
|
||||
unknownType reflect.Type
|
||||
extensionOffset offset
|
||||
extensionType reflect.Type
|
||||
|
||||
lazyOffset offset
|
||||
presenceOffset offset
|
||||
|
||||
fieldsByNumber map[protoreflect.FieldNumber]reflect.StructField
|
||||
oneofsByName map[protoreflect.Name]reflect.StructField
|
||||
oneofWrappersByType map[reflect.Type]protoreflect.FieldNumber
|
||||
oneofWrappersByNumber map[protoreflect.FieldNumber]reflect.Type
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo {
|
||||
si := structInfo{
|
||||
sizecacheOffset: invalidOffset,
|
||||
unknownOffset: invalidOffset,
|
||||
extensionOffset: invalidOffset,
|
||||
lazyOffset: invalidOffset,
|
||||
presenceOffset: invalidOffset,
|
||||
|
||||
fieldsByNumber: map[protoreflect.FieldNumber]reflect.StructField{},
|
||||
oneofsByName: map[protoreflect.Name]reflect.StructField{},
|
||||
oneofWrappersByType: map[reflect.Type]protoreflect.FieldNumber{},
|
||||
oneofWrappersByNumber: map[protoreflect.FieldNumber]reflect.Type{},
|
||||
}
|
||||
|
||||
fieldLoop:
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
switch f := t.Field(i); f.Name {
|
||||
case genid.SizeCache_goname, genid.SizeCacheA_goname:
|
||||
if f.Type == sizecacheType {
|
||||
si.sizecacheOffset = offsetOf(f)
|
||||
si.sizecacheType = f.Type
|
||||
}
|
||||
case genid.UnknownFields_goname, genid.UnknownFieldsA_goname:
|
||||
if f.Type == unknownFieldsAType || f.Type == unknownFieldsBType {
|
||||
si.unknownOffset = offsetOf(f)
|
||||
si.unknownType = f.Type
|
||||
}
|
||||
case genid.ExtensionFields_goname, genid.ExtensionFieldsA_goname, genid.ExtensionFieldsB_goname:
|
||||
if f.Type == extensionFieldsType {
|
||||
si.extensionOffset = offsetOf(f)
|
||||
si.extensionType = f.Type
|
||||
}
|
||||
case "lazyFields", "XXX_lazyUnmarshalInfo":
|
||||
si.lazyOffset = offsetOf(f)
|
||||
case "XXX_presence":
|
||||
si.presenceOffset = offsetOf(f)
|
||||
default:
|
||||
for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") {
|
||||
if len(s) > 0 && strings.Trim(s, "0123456789") == "" {
|
||||
n, _ := strconv.ParseUint(s, 10, 64)
|
||||
si.fieldsByNumber[protoreflect.FieldNumber(n)] = f
|
||||
continue fieldLoop
|
||||
}
|
||||
}
|
||||
if s := f.Tag.Get("protobuf_oneof"); len(s) > 0 {
|
||||
si.oneofsByName[protoreflect.Name(s)] = f
|
||||
continue fieldLoop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Derive a mapping of oneof wrappers to fields.
|
||||
oneofWrappers := mi.OneofWrappers
|
||||
methods := make([]reflect.Method, 0, 2)
|
||||
if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofFuncs"); ok {
|
||||
methods = append(methods, m)
|
||||
}
|
||||
if m, ok := reflect.PtrTo(t).MethodByName("XXX_OneofWrappers"); ok {
|
||||
methods = append(methods, m)
|
||||
}
|
||||
for _, fn := range methods {
|
||||
for _, v := range fn.Func.Call([]reflect.Value{reflect.Zero(fn.Type.In(0))}) {
|
||||
if vs, ok := v.Interface().([]any); ok {
|
||||
oneofWrappers = vs
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, v := range oneofWrappers {
|
||||
tf := reflect.TypeOf(v).Elem()
|
||||
f := tf.Field(0)
|
||||
for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") {
|
||||
if len(s) > 0 && strings.Trim(s, "0123456789") == "" {
|
||||
n, _ := strconv.ParseUint(s, 10, 64)
|
||||
si.oneofWrappersByType[tf] = protoreflect.FieldNumber(n)
|
||||
si.oneofWrappersByNumber[protoreflect.FieldNumber(n)] = tf
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return si
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) New() protoreflect.Message {
|
||||
m := reflect.New(mi.GoReflectType.Elem()).Interface()
|
||||
if r, ok := m.(protoreflect.ProtoMessage); ok {
|
||||
return r.ProtoReflect()
|
||||
}
|
||||
return mi.MessageOf(m)
|
||||
}
|
||||
func (mi *MessageInfo) Zero() protoreflect.Message {
|
||||
return mi.MessageOf(reflect.Zero(mi.GoReflectType).Interface())
|
||||
}
|
||||
func (mi *MessageInfo) Descriptor() protoreflect.MessageDescriptor {
|
||||
return mi.Desc
|
||||
}
|
||||
func (mi *MessageInfo) Enum(i int) protoreflect.EnumType {
|
||||
mi.init()
|
||||
fd := mi.Desc.Fields().Get(i)
|
||||
return Export{}.EnumTypeOf(mi.fieldTypes[fd.Number()])
|
||||
}
|
||||
func (mi *MessageInfo) Message(i int) protoreflect.MessageType {
|
||||
mi.init()
|
||||
fd := mi.Desc.Fields().Get(i)
|
||||
switch {
|
||||
case fd.IsMap():
|
||||
return mapEntryType{fd.Message(), mi.fieldTypes[fd.Number()]}
|
||||
default:
|
||||
return Export{}.MessageTypeOf(mi.fieldTypes[fd.Number()])
|
||||
}
|
||||
}
|
||||
|
||||
type mapEntryType struct {
|
||||
desc protoreflect.MessageDescriptor
|
||||
valType any // zero value of enum or message type
|
||||
}
|
||||
|
||||
func (mt mapEntryType) New() protoreflect.Message {
|
||||
return nil
|
||||
}
|
||||
func (mt mapEntryType) Zero() protoreflect.Message {
|
||||
return nil
|
||||
}
|
||||
func (mt mapEntryType) Descriptor() protoreflect.MessageDescriptor {
|
||||
return mt.desc
|
||||
}
|
||||
func (mt mapEntryType) Enum(i int) protoreflect.EnumType {
|
||||
fd := mt.desc.Fields().Get(i)
|
||||
if fd.Enum() == nil {
|
||||
return nil
|
||||
}
|
||||
return Export{}.EnumTypeOf(mt.valType)
|
||||
}
|
||||
func (mt mapEntryType) Message(i int) protoreflect.MessageType {
|
||||
fd := mt.desc.Fields().Get(i)
|
||||
if fd.Message() == nil {
|
||||
return nil
|
||||
}
|
||||
return Export{}.MessageTypeOf(mt.valType)
|
||||
}
|
627
e2e/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go
generated
vendored
Normal file
627
e2e/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go
generated
vendored
Normal file
@ -0,0 +1,627 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type opaqueStructInfo struct {
|
||||
structInfo
|
||||
}
|
||||
|
||||
// isOpaque determines whether a protobuf message type is on the Opaque API. It
|
||||
// checks whether the type is a Go struct that protoc-gen-go would generate.
|
||||
//
|
||||
// This function only detects newly generated messages from the v2
|
||||
// implementation of protoc-gen-go. It is unable to classify generated messages
|
||||
// that are too old or those that are generated by a different generator
|
||||
// such as protoc-gen-gogo.
|
||||
func isOpaque(t reflect.Type) bool {
|
||||
// The current detection mechanism is to simply check the first field
|
||||
// for a struct tag with the "protogen" key.
|
||||
if t.Kind() == reflect.Struct && t.NumField() > 0 {
|
||||
pgt := t.Field(0).Tag.Get("protogen")
|
||||
return strings.HasPrefix(pgt, "opaque.")
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func opaqueInitHook(mi *MessageInfo) bool {
|
||||
mt := mi.GoReflectType.Elem()
|
||||
si := opaqueStructInfo{
|
||||
structInfo: mi.makeStructInfo(mt),
|
||||
}
|
||||
|
||||
if !isOpaque(mt) {
|
||||
return false
|
||||
}
|
||||
|
||||
defer atomic.StoreUint32(&mi.initDone, 1)
|
||||
|
||||
mi.fields = map[protoreflect.FieldNumber]*fieldInfo{}
|
||||
fds := mi.Desc.Fields()
|
||||
for i := 0; i < fds.Len(); i++ {
|
||||
fd := fds.Get(i)
|
||||
fs := si.fieldsByNumber[fd.Number()]
|
||||
var fi fieldInfo
|
||||
usePresence, _ := usePresenceForField(si, fd)
|
||||
|
||||
switch {
|
||||
case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
|
||||
// Oneofs are no different for opaque.
|
||||
fi = fieldInfoForOneof(fd, si.oneofsByName[fd.ContainingOneof().Name()], mi.Exporter, si.oneofWrappersByNumber[fd.Number()])
|
||||
case fd.IsMap():
|
||||
fi = mi.fieldInfoForMapOpaque(si, fd, fs)
|
||||
case fd.IsList() && fd.Message() == nil && usePresence:
|
||||
fi = mi.fieldInfoForScalarListOpaque(si, fd, fs)
|
||||
case fd.IsList() && fd.Message() == nil:
|
||||
// Proto3 lists without presence can use same access methods as open
|
||||
fi = fieldInfoForList(fd, fs, mi.Exporter)
|
||||
case fd.IsList() && usePresence:
|
||||
fi = mi.fieldInfoForMessageListOpaque(si, fd, fs)
|
||||
case fd.IsList():
|
||||
// Proto3 opaque messages that does not need presence bitmap.
|
||||
// Different representation than open struct, but same logic
|
||||
fi = mi.fieldInfoForMessageListOpaqueNoPresence(si, fd, fs)
|
||||
case fd.Message() != nil && usePresence:
|
||||
fi = mi.fieldInfoForMessageOpaque(si, fd, fs)
|
||||
case fd.Message() != nil:
|
||||
// Proto3 messages without presence can use same access methods as open
|
||||
fi = fieldInfoForMessage(fd, fs, mi.Exporter)
|
||||
default:
|
||||
fi = mi.fieldInfoForScalarOpaque(si, fd, fs)
|
||||
}
|
||||
mi.fields[fd.Number()] = &fi
|
||||
}
|
||||
mi.oneofs = map[protoreflect.Name]*oneofInfo{}
|
||||
for i := 0; i < mi.Desc.Oneofs().Len(); i++ {
|
||||
od := mi.Desc.Oneofs().Get(i)
|
||||
mi.oneofs[od.Name()] = makeOneofInfoOpaque(mi, od, si.structInfo, mi.Exporter)
|
||||
}
|
||||
|
||||
mi.denseFields = make([]*fieldInfo, fds.Len()*2)
|
||||
for i := 0; i < fds.Len(); i++ {
|
||||
if fd := fds.Get(i); int(fd.Number()) < len(mi.denseFields) {
|
||||
mi.denseFields[fd.Number()] = mi.fields[fd.Number()]
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < fds.Len(); {
|
||||
fd := fds.Get(i)
|
||||
if od := fd.ContainingOneof(); od != nil && !fd.ContainingOneof().IsSynthetic() {
|
||||
mi.rangeInfos = append(mi.rangeInfos, mi.oneofs[od.Name()])
|
||||
i += od.Fields().Len()
|
||||
} else {
|
||||
mi.rangeInfos = append(mi.rangeInfos, mi.fields[fd.Number()])
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
mi.makeExtensionFieldsFunc(mt, si.structInfo)
|
||||
mi.makeUnknownFieldsFunc(mt, si.structInfo)
|
||||
mi.makeOpaqueCoderMethods(mt, si)
|
||||
mi.makeFieldTypes(si.structInfo)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func makeOneofInfoOpaque(mi *MessageInfo, od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo {
|
||||
oi := &oneofInfo{oneofDesc: od}
|
||||
if od.IsSynthetic() {
|
||||
fd := od.Fields().Get(0)
|
||||
index, _ := presenceIndex(mi.Desc, fd)
|
||||
oi.which = func(p pointer) protoreflect.FieldNumber {
|
||||
if p.IsNil() {
|
||||
return 0
|
||||
}
|
||||
if !mi.present(p, index) {
|
||||
return 0
|
||||
}
|
||||
return od.Fields().Get(0).Number()
|
||||
}
|
||||
return oi
|
||||
}
|
||||
// Dispatch to non-opaque oneof implementation for non-synthetic oneofs.
|
||||
return makeOneofInfo(od, si, x)
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForMapOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Map {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want map kind", ft))
|
||||
}
|
||||
fieldOffset := offsetOf(fs)
|
||||
conv := NewConverter(ft, fd)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
// Don't bother checking presence bits, since we need to
|
||||
// look at the map length even if the presence bit is set.
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return rv.Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
pv := conv.GoValueOf(v)
|
||||
if pv.IsNil() {
|
||||
panic(fmt.Sprintf("invalid value: setting map field to read-only value"))
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(pv)
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if v.IsNil() {
|
||||
v.Set(reflect.MakeMap(fs.Type))
|
||||
}
|
||||
return conv.PBValueOf(v)
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForScalarListOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft))
|
||||
}
|
||||
conv := NewConverter(reflect.PtrTo(ft), fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
index, _ := presenceIndex(mi.Desc, fd)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return rv.Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type)
|
||||
if rv.Elem().Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
pv := conv.GoValueOf(v)
|
||||
if pv.IsNil() {
|
||||
panic(fmt.Sprintf("invalid value: setting repeated field to read-only value"))
|
||||
}
|
||||
mi.setPresent(p, index)
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(pv.Elem())
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
mi.setPresent(p, index)
|
||||
return conv.PBValueOf(p.Apply(fieldOffset).AsValueOf(fs.Type))
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForMessageListOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft))
|
||||
}
|
||||
conv := NewConverter(ft, fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
index, _ := presenceIndex(mi.Desc, fd)
|
||||
fieldNumber := fd.Number()
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
if !mi.present(p, index) {
|
||||
return false
|
||||
}
|
||||
sp := p.Apply(fieldOffset).AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
// Lazily unmarshal this field.
|
||||
mi.lazyUnmarshal(p, fieldNumber)
|
||||
sp = p.Apply(fieldOffset).AtomicGetPointer()
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
return rv.Elem().Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
fp := p.Apply(fieldOffset)
|
||||
sp := fp.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem())))
|
||||
mi.setPresent(p, index)
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
rv.Elem().Set(reflect.Zero(rv.Type().Elem()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
if !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
sp := p.Apply(fieldOffset).AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
// Lazily unmarshal this field.
|
||||
mi.lazyUnmarshal(p, fieldNumber)
|
||||
sp = p.Apply(fieldOffset).AtomicGetPointer()
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
if rv.Elem().Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
fp := p.Apply(fieldOffset)
|
||||
sp := fp.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem())))
|
||||
mi.setPresent(p, index)
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
val := conv.GoValueOf(v)
|
||||
if val.IsNil() {
|
||||
panic(fmt.Sprintf("invalid value: setting repeated field to read-only value"))
|
||||
} else {
|
||||
rv.Elem().Set(val.Elem())
|
||||
}
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
fp := p.Apply(fieldOffset)
|
||||
sp := fp.AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
if mi.present(p, index) {
|
||||
// Lazily unmarshal this field.
|
||||
mi.lazyUnmarshal(p, fieldNumber)
|
||||
sp = p.Apply(fieldOffset).AtomicGetPointer()
|
||||
} else {
|
||||
sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem())))
|
||||
mi.setPresent(p, index)
|
||||
}
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForMessageListOpaqueNoPresence(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft))
|
||||
}
|
||||
conv := NewConverter(ft, fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
sp := p.Apply(fieldOffset).AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
return rv.Elem().Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
sp := p.Apply(fieldOffset).AtomicGetPointer()
|
||||
if !sp.IsNil() {
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
rv.Elem().Set(reflect.Zero(rv.Type().Elem()))
|
||||
}
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
sp := p.Apply(fieldOffset).AtomicGetPointer()
|
||||
if sp.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := sp.AsValueOf(fs.Type.Elem())
|
||||
if rv.Elem().Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() {
|
||||
rv.Set(reflect.New(fs.Type.Elem()))
|
||||
}
|
||||
val := conv.GoValueOf(v)
|
||||
if val.IsNil() {
|
||||
panic(fmt.Sprintf("invalid value: setting repeated field to read-only value"))
|
||||
} else {
|
||||
rv.Elem().Set(val.Elem())
|
||||
}
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() {
|
||||
rv.Set(reflect.New(fs.Type.Elem()))
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForScalarOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
nullable := fd.HasPresence()
|
||||
if oneof := fd.ContainingOneof(); oneof != nil && oneof.IsSynthetic() {
|
||||
nullable = true
|
||||
}
|
||||
deref := false
|
||||
if nullable && ft.Kind() == reflect.Ptr {
|
||||
ft = ft.Elem()
|
||||
deref = true
|
||||
}
|
||||
conv := NewConverter(ft, fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
index, _ := presenceIndex(mi.Desc, fd)
|
||||
var getter func(p pointer) protoreflect.Value
|
||||
if !nullable {
|
||||
getter = getterForDirectScalar(fd, fs, conv, fieldOffset)
|
||||
} else {
|
||||
getter = getterForOpaqueNullableScalar(mi, index, fd, fs, conv, fieldOffset)
|
||||
}
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
if nullable {
|
||||
return mi.present(p, index)
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
switch rv.Kind() {
|
||||
case reflect.Bool:
|
||||
return rv.Bool()
|
||||
case reflect.Int32, reflect.Int64:
|
||||
return rv.Int() != 0
|
||||
case reflect.Uint32, reflect.Uint64:
|
||||
return rv.Uint() != 0
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return rv.Float() != 0 || math.Signbit(rv.Float())
|
||||
case reflect.String, reflect.Slice:
|
||||
return rv.Len() > 0
|
||||
default:
|
||||
panic(fmt.Sprintf("invalid type: %v", rv.Type())) // should never happen
|
||||
}
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
if nullable {
|
||||
mi.clearPresent(p, index)
|
||||
}
|
||||
// This is only valuable for bytes and strings, but we do it unconditionally.
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: getter,
|
||||
// TODO: Implement unsafe fast path for set?
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if deref {
|
||||
if rv.IsNil() {
|
||||
rv.Set(reflect.New(ft))
|
||||
}
|
||||
rv = rv.Elem()
|
||||
}
|
||||
|
||||
rv.Set(conv.GoValueOf(v))
|
||||
if nullable && rv.Kind() == reflect.Slice && rv.IsNil() {
|
||||
rv.Set(emptyBytes)
|
||||
}
|
||||
if nullable {
|
||||
mi.setPresent(p, index)
|
||||
}
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) fieldInfoForMessageOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo {
|
||||
ft := fs.Type
|
||||
conv := NewConverter(ft, fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
index, _ := presenceIndex(mi.Desc, fd)
|
||||
fieldNumber := fd.Number()
|
||||
elemType := fs.Type.Elem()
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
return mi.present(p, index)
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
mi.clearPresent(p, index)
|
||||
p.Apply(fieldOffset).AtomicSetNilPointer()
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
fp := p.Apply(fieldOffset)
|
||||
mp := fp.AtomicGetPointer()
|
||||
if mp.IsNil() {
|
||||
// Lazily unmarshal this field.
|
||||
mi.lazyUnmarshal(p, fieldNumber)
|
||||
mp = fp.AtomicGetPointer()
|
||||
}
|
||||
rv := mp.AsValueOf(elemType)
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
val := pointerOfValue(conv.GoValueOf(v))
|
||||
if val.IsNil() {
|
||||
panic("invalid nil pointer")
|
||||
}
|
||||
p.Apply(fieldOffset).AtomicSetPointer(val)
|
||||
mi.setPresent(p, index)
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
fp := p.Apply(fieldOffset)
|
||||
mp := fp.AtomicGetPointer()
|
||||
if mp.IsNil() {
|
||||
if mi.present(p, index) {
|
||||
// Lazily unmarshal this field.
|
||||
mi.lazyUnmarshal(p, fieldNumber)
|
||||
mp = fp.AtomicGetPointer()
|
||||
} else {
|
||||
mp = pointerOfValue(conv.GoValueOf(conv.New()))
|
||||
fp.AtomicSetPointer(mp)
|
||||
mi.setPresent(p, index)
|
||||
}
|
||||
}
|
||||
return conv.PBValueOf(mp.AsValueOf(fs.Type.Elem()))
|
||||
},
|
||||
newMessage: func() protoreflect.Message {
|
||||
return conv.New().Message()
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// A presenceList wraps a List, updating presence bits as necessary when the
|
||||
// list contents change.
|
||||
type presenceList struct {
|
||||
pvalueList
|
||||
setPresence func(bool)
|
||||
}
|
||||
type pvalueList interface {
|
||||
protoreflect.List
|
||||
//Unwrapper
|
||||
}
|
||||
|
||||
func (list presenceList) Append(v protoreflect.Value) {
|
||||
list.pvalueList.Append(v)
|
||||
list.setPresence(true)
|
||||
}
|
||||
func (list presenceList) Truncate(i int) {
|
||||
list.pvalueList.Truncate(i)
|
||||
list.setPresence(i > 0)
|
||||
}
|
||||
|
||||
// presenceIndex returns the index to pass to presence functions.
|
||||
//
|
||||
// TODO: field.Desc.Index() would be simpler, and would give space to record the presence of oneof fields.
|
||||
func presenceIndex(md protoreflect.MessageDescriptor, fd protoreflect.FieldDescriptor) (uint32, presenceSize) {
|
||||
found := false
|
||||
var index, numIndices uint32
|
||||
for i := 0; i < md.Fields().Len(); i++ {
|
||||
f := md.Fields().Get(i)
|
||||
if f == fd {
|
||||
found = true
|
||||
index = numIndices
|
||||
}
|
||||
if f.ContainingOneof() == nil || isLastOneofField(f) {
|
||||
numIndices++
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
panic(fmt.Sprintf("BUG: %v not in %v", fd.Name(), md.FullName()))
|
||||
}
|
||||
return index, presenceSize(numIndices)
|
||||
}
|
||||
|
||||
func isLastOneofField(fd protoreflect.FieldDescriptor) bool {
|
||||
fields := fd.ContainingOneof().Fields()
|
||||
return fields.Get(fields.Len()-1) == fd
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) setPresent(p pointer, index uint32) {
|
||||
p.Apply(mi.presenceOffset).PresenceInfo().SetPresent(index, mi.presenceSize)
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) clearPresent(p pointer, index uint32) {
|
||||
p.Apply(mi.presenceOffset).PresenceInfo().ClearPresent(index)
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) present(p pointer, index uint32) bool {
|
||||
return p.Apply(mi.presenceOffset).PresenceInfo().Present(index)
|
||||
}
|
||||
|
||||
// usePresenceForField implements the somewhat intricate logic of when
|
||||
// the presence bitmap is used for a field. The main logic is that a
|
||||
// field that is optional or that can be lazy will use the presence
|
||||
// bit, but for proto2, also maps have a presence bit. It also records
|
||||
// if the field can ever be lazy, which is true if we have a
|
||||
// lazyOffset and the field is a message or a slice of messages. A
|
||||
// field that is lazy will always need a presence bit. Oneofs are not
|
||||
// lazy and do not use presence, unless they are a synthetic oneof,
|
||||
// which is a proto3 optional field. For proto3 optionals, we use the
|
||||
// presence and they can also be lazy when applicable (a message).
|
||||
func usePresenceForField(si opaqueStructInfo, fd protoreflect.FieldDescriptor) (usePresence, canBeLazy bool) {
|
||||
hasLazyField := fd.(interface{ IsLazy() bool }).IsLazy()
|
||||
|
||||
// Non-oneof scalar fields with explicit field presence use the presence array.
|
||||
usesPresenceArray := fd.HasPresence() && fd.Message() == nil && (fd.ContainingOneof() == nil || fd.ContainingOneof().IsSynthetic())
|
||||
switch {
|
||||
case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
|
||||
return false, false
|
||||
case fd.IsMap():
|
||||
return false, false
|
||||
case fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind:
|
||||
return hasLazyField, hasLazyField
|
||||
default:
|
||||
return usesPresenceArray || (hasLazyField && fd.HasPresence()), false
|
||||
}
|
||||
}
|
132
e2e/vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go
generated
vendored
Normal file
132
e2e/vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go
generated
vendored
Normal file
@ -0,0 +1,132 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-types. DO NOT EDIT.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func getterForOpaqueNullableScalar(mi *MessageInfo, index uint32, fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value {
|
||||
ft := fs.Type
|
||||
if ft.Kind() == reflect.Ptr {
|
||||
ft = ft.Elem()
|
||||
}
|
||||
if fd.Kind() == protoreflect.EnumKind {
|
||||
// Enums for nullable opaque types.
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return conv.PBValueOf(rv)
|
||||
}
|
||||
}
|
||||
switch ft.Kind() {
|
||||
case reflect.Bool:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bool()
|
||||
return protoreflect.ValueOfBool(*x)
|
||||
}
|
||||
case reflect.Int32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int32()
|
||||
return protoreflect.ValueOfInt32(*x)
|
||||
}
|
||||
case reflect.Uint32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint32()
|
||||
return protoreflect.ValueOfUint32(*x)
|
||||
}
|
||||
case reflect.Int64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int64()
|
||||
return protoreflect.ValueOfInt64(*x)
|
||||
}
|
||||
case reflect.Uint64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint64()
|
||||
return protoreflect.ValueOfUint64(*x)
|
||||
}
|
||||
case reflect.Float32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float32()
|
||||
return protoreflect.ValueOfFloat32(*x)
|
||||
}
|
||||
case reflect.Float64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float64()
|
||||
return protoreflect.ValueOfFloat64(*x)
|
||||
}
|
||||
case reflect.String:
|
||||
if fd.Kind() == protoreflect.BytesKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).StringPtr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
if len(**x) == 0 {
|
||||
return protoreflect.ValueOfBytes(nil)
|
||||
}
|
||||
return protoreflect.ValueOfBytes([]byte(**x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).StringPtr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfString(**x)
|
||||
}
|
||||
case reflect.Slice:
|
||||
if fd.Kind() == protoreflect.StringKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
return protoreflect.ValueOfString(string(*x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() || !mi.present(p, index) {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
return protoreflect.ValueOfBytes(*x)
|
||||
}
|
||||
}
|
||||
panic("unexpected protobuf kind: " + ft.Kind().String())
|
||||
}
|
462
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
generated
vendored
Normal file
462
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go
generated
vendored
Normal file
@ -0,0 +1,462 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/internal/detrand"
|
||||
"google.golang.org/protobuf/internal/pragma"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type reflectMessageInfo struct {
|
||||
fields map[protoreflect.FieldNumber]*fieldInfo
|
||||
oneofs map[protoreflect.Name]*oneofInfo
|
||||
|
||||
// fieldTypes contains the zero value of an enum or message field.
|
||||
// For lists, it contains the element type.
|
||||
// For maps, it contains the entry value type.
|
||||
fieldTypes map[protoreflect.FieldNumber]any
|
||||
|
||||
// denseFields is a subset of fields where:
|
||||
// 0 < fieldDesc.Number() < len(denseFields)
|
||||
// It provides faster access to the fieldInfo, but may be incomplete.
|
||||
denseFields []*fieldInfo
|
||||
|
||||
// rangeInfos is a list of all fields (not belonging to a oneof) and oneofs.
|
||||
rangeInfos []any // either *fieldInfo or *oneofInfo
|
||||
|
||||
getUnknown func(pointer) protoreflect.RawFields
|
||||
setUnknown func(pointer, protoreflect.RawFields)
|
||||
extensionMap func(pointer) *extensionMap
|
||||
|
||||
nilMessage atomicNilMessage
|
||||
}
|
||||
|
||||
// makeReflectFuncs generates the set of functions to support reflection.
|
||||
func (mi *MessageInfo) makeReflectFuncs(t reflect.Type, si structInfo) {
|
||||
mi.makeKnownFieldsFunc(si)
|
||||
mi.makeUnknownFieldsFunc(t, si)
|
||||
mi.makeExtensionFieldsFunc(t, si)
|
||||
mi.makeFieldTypes(si)
|
||||
}
|
||||
|
||||
// makeKnownFieldsFunc generates functions for operations that can be performed
|
||||
// on each protobuf message field. It takes in a reflect.Type representing the
|
||||
// Go struct and matches message fields with struct fields.
|
||||
//
|
||||
// This code assumes that the struct is well-formed and panics if there are
|
||||
// any discrepancies.
|
||||
func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
|
||||
mi.fields = map[protoreflect.FieldNumber]*fieldInfo{}
|
||||
md := mi.Desc
|
||||
fds := md.Fields()
|
||||
for i := 0; i < fds.Len(); i++ {
|
||||
fd := fds.Get(i)
|
||||
fs := si.fieldsByNumber[fd.Number()]
|
||||
isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic()
|
||||
if isOneof {
|
||||
fs = si.oneofsByName[fd.ContainingOneof().Name()]
|
||||
}
|
||||
var fi fieldInfo
|
||||
switch {
|
||||
case fs.Type == nil:
|
||||
fi = fieldInfoForMissing(fd) // never occurs for officially generated message types
|
||||
case isOneof:
|
||||
fi = fieldInfoForOneof(fd, fs, mi.Exporter, si.oneofWrappersByNumber[fd.Number()])
|
||||
case fd.IsMap():
|
||||
fi = fieldInfoForMap(fd, fs, mi.Exporter)
|
||||
case fd.IsList():
|
||||
fi = fieldInfoForList(fd, fs, mi.Exporter)
|
||||
case fd.Message() != nil:
|
||||
fi = fieldInfoForMessage(fd, fs, mi.Exporter)
|
||||
default:
|
||||
fi = fieldInfoForScalar(fd, fs, mi.Exporter)
|
||||
}
|
||||
mi.fields[fd.Number()] = &fi
|
||||
}
|
||||
|
||||
mi.oneofs = map[protoreflect.Name]*oneofInfo{}
|
||||
for i := 0; i < md.Oneofs().Len(); i++ {
|
||||
od := md.Oneofs().Get(i)
|
||||
mi.oneofs[od.Name()] = makeOneofInfo(od, si, mi.Exporter)
|
||||
}
|
||||
|
||||
mi.denseFields = make([]*fieldInfo, fds.Len()*2)
|
||||
for i := 0; i < fds.Len(); i++ {
|
||||
if fd := fds.Get(i); int(fd.Number()) < len(mi.denseFields) {
|
||||
mi.denseFields[fd.Number()] = mi.fields[fd.Number()]
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < fds.Len(); {
|
||||
fd := fds.Get(i)
|
||||
if od := fd.ContainingOneof(); od != nil && !od.IsSynthetic() {
|
||||
mi.rangeInfos = append(mi.rangeInfos, mi.oneofs[od.Name()])
|
||||
i += od.Fields().Len()
|
||||
} else {
|
||||
mi.rangeInfos = append(mi.rangeInfos, mi.fields[fd.Number()])
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
// Introduce instability to iteration order, but keep it deterministic.
|
||||
if len(mi.rangeInfos) > 1 && detrand.Bool() {
|
||||
i := detrand.Intn(len(mi.rangeInfos) - 1)
|
||||
mi.rangeInfos[i], mi.rangeInfos[i+1] = mi.rangeInfos[i+1], mi.rangeInfos[i]
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) makeUnknownFieldsFunc(t reflect.Type, si structInfo) {
|
||||
switch {
|
||||
case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsAType:
|
||||
// Handle as []byte.
|
||||
mi.getUnknown = func(p pointer) protoreflect.RawFields {
|
||||
if p.IsNil() {
|
||||
return nil
|
||||
}
|
||||
return *p.Apply(mi.unknownOffset).Bytes()
|
||||
}
|
||||
mi.setUnknown = func(p pointer, b protoreflect.RawFields) {
|
||||
if p.IsNil() {
|
||||
panic("invalid SetUnknown on nil Message")
|
||||
}
|
||||
*p.Apply(mi.unknownOffset).Bytes() = b
|
||||
}
|
||||
case si.unknownOffset.IsValid() && si.unknownType == unknownFieldsBType:
|
||||
// Handle as *[]byte.
|
||||
mi.getUnknown = func(p pointer) protoreflect.RawFields {
|
||||
if p.IsNil() {
|
||||
return nil
|
||||
}
|
||||
bp := p.Apply(mi.unknownOffset).BytesPtr()
|
||||
if *bp == nil {
|
||||
return nil
|
||||
}
|
||||
return **bp
|
||||
}
|
||||
mi.setUnknown = func(p pointer, b protoreflect.RawFields) {
|
||||
if p.IsNil() {
|
||||
panic("invalid SetUnknown on nil Message")
|
||||
}
|
||||
bp := p.Apply(mi.unknownOffset).BytesPtr()
|
||||
if *bp == nil {
|
||||
*bp = new([]byte)
|
||||
}
|
||||
**bp = b
|
||||
}
|
||||
default:
|
||||
mi.getUnknown = func(pointer) protoreflect.RawFields {
|
||||
return nil
|
||||
}
|
||||
mi.setUnknown = func(p pointer, _ protoreflect.RawFields) {
|
||||
if p.IsNil() {
|
||||
panic("invalid SetUnknown on nil Message")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) makeExtensionFieldsFunc(t reflect.Type, si structInfo) {
|
||||
if si.extensionOffset.IsValid() {
|
||||
mi.extensionMap = func(p pointer) *extensionMap {
|
||||
if p.IsNil() {
|
||||
return (*extensionMap)(nil)
|
||||
}
|
||||
v := p.Apply(si.extensionOffset).AsValueOf(extensionFieldsType)
|
||||
return (*extensionMap)(v.Interface().(*map[int32]ExtensionField))
|
||||
}
|
||||
} else {
|
||||
mi.extensionMap = func(pointer) *extensionMap {
|
||||
return (*extensionMap)(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
func (mi *MessageInfo) makeFieldTypes(si structInfo) {
|
||||
md := mi.Desc
|
||||
fds := md.Fields()
|
||||
for i := 0; i < fds.Len(); i++ {
|
||||
var ft reflect.Type
|
||||
fd := fds.Get(i)
|
||||
fs := si.fieldsByNumber[fd.Number()]
|
||||
isOneof := fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic()
|
||||
if isOneof {
|
||||
fs = si.oneofsByName[fd.ContainingOneof().Name()]
|
||||
}
|
||||
var isMessage bool
|
||||
switch {
|
||||
case fs.Type == nil:
|
||||
continue // never occurs for officially generated message types
|
||||
case isOneof:
|
||||
if fd.Enum() != nil || fd.Message() != nil {
|
||||
ft = si.oneofWrappersByNumber[fd.Number()].Field(0).Type
|
||||
}
|
||||
case fd.IsMap():
|
||||
if fd.MapValue().Enum() != nil || fd.MapValue().Message() != nil {
|
||||
ft = fs.Type.Elem()
|
||||
}
|
||||
isMessage = fd.MapValue().Message() != nil
|
||||
case fd.IsList():
|
||||
if fd.Enum() != nil || fd.Message() != nil {
|
||||
ft = fs.Type.Elem()
|
||||
|
||||
if ft.Kind() == reflect.Slice {
|
||||
ft = ft.Elem()
|
||||
}
|
||||
|
||||
}
|
||||
isMessage = fd.Message() != nil
|
||||
case fd.Enum() != nil:
|
||||
ft = fs.Type
|
||||
if fd.HasPresence() && ft.Kind() == reflect.Ptr {
|
||||
ft = ft.Elem()
|
||||
}
|
||||
case fd.Message() != nil:
|
||||
ft = fs.Type
|
||||
isMessage = true
|
||||
}
|
||||
if isMessage && ft != nil && ft.Kind() != reflect.Ptr {
|
||||
ft = reflect.PtrTo(ft) // never occurs for officially generated message types
|
||||
}
|
||||
if ft != nil {
|
||||
if mi.fieldTypes == nil {
|
||||
mi.fieldTypes = make(map[protoreflect.FieldNumber]any)
|
||||
}
|
||||
mi.fieldTypes[fd.Number()] = reflect.Zero(ft).Interface()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type extensionMap map[int32]ExtensionField
|
||||
|
||||
func (m *extensionMap) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
||||
if m != nil {
|
||||
for _, x := range *m {
|
||||
xd := x.Type().TypeDescriptor()
|
||||
v := x.Value()
|
||||
if xd.IsList() && v.List().Len() == 0 {
|
||||
continue
|
||||
}
|
||||
if !f(xd, v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func (m *extensionMap) Has(xd protoreflect.ExtensionTypeDescriptor) (ok bool) {
|
||||
if m == nil {
|
||||
return false
|
||||
}
|
||||
x, ok := (*m)[int32(xd.Number())]
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
if x.isUnexpandedLazy() {
|
||||
// Avoid calling x.Value(), which triggers a lazy unmarshal.
|
||||
return true
|
||||
}
|
||||
switch {
|
||||
case xd.IsList():
|
||||
return x.Value().List().Len() > 0
|
||||
case xd.IsMap():
|
||||
return x.Value().Map().Len() > 0
|
||||
}
|
||||
return true
|
||||
}
|
||||
func (m *extensionMap) Clear(xd protoreflect.ExtensionTypeDescriptor) {
|
||||
delete(*m, int32(xd.Number()))
|
||||
}
|
||||
func (m *extensionMap) Get(xd protoreflect.ExtensionTypeDescriptor) protoreflect.Value {
|
||||
if m != nil {
|
||||
if x, ok := (*m)[int32(xd.Number())]; ok {
|
||||
return x.Value()
|
||||
}
|
||||
}
|
||||
return xd.Type().Zero()
|
||||
}
|
||||
func (m *extensionMap) Set(xd protoreflect.ExtensionTypeDescriptor, v protoreflect.Value) {
|
||||
xt := xd.Type()
|
||||
isValid := true
|
||||
switch {
|
||||
case !xt.IsValidValue(v):
|
||||
isValid = false
|
||||
case xd.IsList():
|
||||
isValid = v.List().IsValid()
|
||||
case xd.IsMap():
|
||||
isValid = v.Map().IsValid()
|
||||
case xd.Message() != nil:
|
||||
isValid = v.Message().IsValid()
|
||||
}
|
||||
if !isValid {
|
||||
panic(fmt.Sprintf("%v: assigning invalid value", xd.FullName()))
|
||||
}
|
||||
|
||||
if *m == nil {
|
||||
*m = make(map[int32]ExtensionField)
|
||||
}
|
||||
var x ExtensionField
|
||||
x.Set(xt, v)
|
||||
(*m)[int32(xd.Number())] = x
|
||||
}
|
||||
func (m *extensionMap) Mutable(xd protoreflect.ExtensionTypeDescriptor) protoreflect.Value {
|
||||
if xd.Kind() != protoreflect.MessageKind && xd.Kind() != protoreflect.GroupKind && !xd.IsList() && !xd.IsMap() {
|
||||
panic("invalid Mutable on field with non-composite type")
|
||||
}
|
||||
if x, ok := (*m)[int32(xd.Number())]; ok {
|
||||
return x.Value()
|
||||
}
|
||||
v := xd.Type().New()
|
||||
m.Set(xd, v)
|
||||
return v
|
||||
}
|
||||
|
||||
// MessageState is a data structure that is nested as the first field in a
|
||||
// concrete message. It provides a way to implement the ProtoReflect method
|
||||
// in an allocation-free way without needing to have a shadow Go type generated
|
||||
// for every message type. This technique only works using unsafe.
|
||||
//
|
||||
// Example generated code:
|
||||
//
|
||||
// type M struct {
|
||||
// state protoimpl.MessageState
|
||||
//
|
||||
// Field1 int32
|
||||
// Field2 string
|
||||
// Field3 *BarMessage
|
||||
// ...
|
||||
// }
|
||||
//
|
||||
// func (m *M) ProtoReflect() protoreflect.Message {
|
||||
// mi := &file_fizz_buzz_proto_msgInfos[5]
|
||||
// if protoimpl.UnsafeEnabled && m != nil {
|
||||
// ms := protoimpl.X.MessageStateOf(Pointer(m))
|
||||
// if ms.LoadMessageInfo() == nil {
|
||||
// ms.StoreMessageInfo(mi)
|
||||
// }
|
||||
// return ms
|
||||
// }
|
||||
// return mi.MessageOf(m)
|
||||
// }
|
||||
//
|
||||
// The MessageState type holds a *MessageInfo, which must be atomically set to
|
||||
// the message info associated with a given message instance.
|
||||
// By unsafely converting a *M into a *MessageState, the MessageState object
|
||||
// has access to all the information needed to implement protobuf reflection.
|
||||
// It has access to the message info as its first field, and a pointer to the
|
||||
// MessageState is identical to a pointer to the concrete message value.
|
||||
//
|
||||
// Requirements:
|
||||
// - The type M must implement protoreflect.ProtoMessage.
|
||||
// - The address of m must not be nil.
|
||||
// - The address of m and the address of m.state must be equal,
|
||||
// even though they are different Go types.
|
||||
type MessageState struct {
|
||||
pragma.NoUnkeyedLiterals
|
||||
pragma.DoNotCompare
|
||||
pragma.DoNotCopy
|
||||
|
||||
atomicMessageInfo *MessageInfo
|
||||
}
|
||||
|
||||
type messageState MessageState
|
||||
|
||||
var (
|
||||
_ protoreflect.Message = (*messageState)(nil)
|
||||
_ unwrapper = (*messageState)(nil)
|
||||
)
|
||||
|
||||
// messageDataType is a tuple of a pointer to the message data and
|
||||
// a pointer to the message type. It is a generalized way of providing a
|
||||
// reflective view over a message instance. The disadvantage of this approach
|
||||
// is the need to allocate this tuple of 16B.
|
||||
type messageDataType struct {
|
||||
p pointer
|
||||
mi *MessageInfo
|
||||
}
|
||||
|
||||
type (
|
||||
messageReflectWrapper messageDataType
|
||||
messageIfaceWrapper messageDataType
|
||||
)
|
||||
|
||||
var (
|
||||
_ protoreflect.Message = (*messageReflectWrapper)(nil)
|
||||
_ unwrapper = (*messageReflectWrapper)(nil)
|
||||
_ protoreflect.ProtoMessage = (*messageIfaceWrapper)(nil)
|
||||
_ unwrapper = (*messageIfaceWrapper)(nil)
|
||||
)
|
||||
|
||||
// MessageOf returns a reflective view over a message. The input must be a
|
||||
// pointer to a named Go struct. If the provided type has a ProtoReflect method,
|
||||
// it must be implemented by calling this method.
|
||||
func (mi *MessageInfo) MessageOf(m any) protoreflect.Message {
|
||||
if reflect.TypeOf(m) != mi.GoReflectType {
|
||||
panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoReflectType))
|
||||
}
|
||||
p := pointerOfIface(m)
|
||||
if p.IsNil() {
|
||||
return mi.nilMessage.Init(mi)
|
||||
}
|
||||
return &messageReflectWrapper{p, mi}
|
||||
}
|
||||
|
||||
func (m *messageReflectWrapper) pointer() pointer { return m.p }
|
||||
func (m *messageReflectWrapper) messageInfo() *MessageInfo { return m.mi }
|
||||
|
||||
// Reset implements the v1 proto.Message.Reset method.
|
||||
func (m *messageIfaceWrapper) Reset() {
|
||||
if mr, ok := m.protoUnwrap().(interface{ Reset() }); ok {
|
||||
mr.Reset()
|
||||
return
|
||||
}
|
||||
rv := reflect.ValueOf(m.protoUnwrap())
|
||||
if rv.Kind() == reflect.Ptr && !rv.IsNil() {
|
||||
rv.Elem().Set(reflect.Zero(rv.Type().Elem()))
|
||||
}
|
||||
}
|
||||
func (m *messageIfaceWrapper) ProtoReflect() protoreflect.Message {
|
||||
return (*messageReflectWrapper)(m)
|
||||
}
|
||||
func (m *messageIfaceWrapper) protoUnwrap() any {
|
||||
return m.p.AsIfaceOf(m.mi.GoReflectType.Elem())
|
||||
}
|
||||
|
||||
// checkField verifies that the provided field descriptor is valid.
|
||||
// Exactly one of the returned values is populated.
|
||||
func (mi *MessageInfo) checkField(fd protoreflect.FieldDescriptor) (*fieldInfo, protoreflect.ExtensionTypeDescriptor) {
|
||||
var fi *fieldInfo
|
||||
if n := fd.Number(); 0 < n && int(n) < len(mi.denseFields) {
|
||||
fi = mi.denseFields[n]
|
||||
} else {
|
||||
fi = mi.fields[n]
|
||||
}
|
||||
if fi != nil {
|
||||
if fi.fieldDesc != fd {
|
||||
if got, want := fd.FullName(), fi.fieldDesc.FullName(); got != want {
|
||||
panic(fmt.Sprintf("mismatching field: got %v, want %v", got, want))
|
||||
}
|
||||
panic(fmt.Sprintf("mismatching field: %v", fd.FullName()))
|
||||
}
|
||||
return fi, nil
|
||||
}
|
||||
|
||||
if fd.IsExtension() {
|
||||
if got, want := fd.ContainingMessage().FullName(), mi.Desc.FullName(); got != want {
|
||||
// TODO: Should this be exact containing message descriptor match?
|
||||
panic(fmt.Sprintf("extension %v has mismatching containing message: got %v, want %v", fd.FullName(), got, want))
|
||||
}
|
||||
if !mi.Desc.ExtensionRanges().Has(fd.Number()) {
|
||||
panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName()))
|
||||
}
|
||||
xtd, ok := fd.(protoreflect.ExtensionTypeDescriptor)
|
||||
if !ok {
|
||||
panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName()))
|
||||
}
|
||||
return nil, xtd
|
||||
}
|
||||
panic(fmt.Sprintf("field %v is invalid", fd.FullName()))
|
||||
}
|
423
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
generated
vendored
Normal file
423
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go
generated
vendored
Normal file
@ -0,0 +1,423 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type fieldInfo struct {
|
||||
fieldDesc protoreflect.FieldDescriptor
|
||||
|
||||
// These fields are used for protobuf reflection support.
|
||||
has func(pointer) bool
|
||||
clear func(pointer)
|
||||
get func(pointer) protoreflect.Value
|
||||
set func(pointer, protoreflect.Value)
|
||||
mutable func(pointer) protoreflect.Value
|
||||
newMessage func() protoreflect.Message
|
||||
newField func() protoreflect.Value
|
||||
}
|
||||
|
||||
func fieldInfoForMissing(fd protoreflect.FieldDescriptor) fieldInfo {
|
||||
// This never occurs for generated message types.
|
||||
// It implies that a hand-crafted type has missing Go fields
|
||||
// for specific protobuf message fields.
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
return false
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
return fd.Default()
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
newMessage: func() protoreflect.Message {
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
if v := fd.Default(); v.IsValid() {
|
||||
return v
|
||||
}
|
||||
panic("missing Go struct field for " + string(fd.FullName()))
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func fieldInfoForOneof(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Interface {
|
||||
panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft))
|
||||
}
|
||||
if ot.Kind() != reflect.Struct {
|
||||
panic(fmt.Sprintf("field %v has invalid type: got %v, want struct kind", fd.FullName(), ot))
|
||||
}
|
||||
if !reflect.PtrTo(ot).Implements(ft) {
|
||||
panic(fmt.Sprintf("field %v has invalid type: %v does not implement %v", fd.FullName(), ot, ft))
|
||||
}
|
||||
conv := NewConverter(ot.Field(0).Type, fd)
|
||||
isMessage := fd.Message() != nil
|
||||
|
||||
// TODO: Implement unsafe fast path?
|
||||
fieldOffset := offsetOf(fs)
|
||||
return fieldInfo{
|
||||
// NOTE: The logic below intentionally assumes that oneof fields are
|
||||
// well-formatted. That is, the oneof interface never contains a
|
||||
// typed nil pointer to one of the wrapper structs.
|
||||
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() || rv.Elem().Type().Elem() != ot {
|
||||
// NOTE: We intentionally don't check for rv.Elem().IsNil()
|
||||
// so that (*OneofWrapperType)(nil) gets cleared to nil.
|
||||
return
|
||||
}
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv = rv.Elem().Elem().Field(0)
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() {
|
||||
rv.Set(reflect.New(ot))
|
||||
}
|
||||
rv = rv.Elem().Elem().Field(0)
|
||||
rv.Set(conv.GoValueOf(v))
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
if !isMessage {
|
||||
panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName()))
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() {
|
||||
rv.Set(reflect.New(ot))
|
||||
}
|
||||
rv = rv.Elem().Elem().Field(0)
|
||||
if rv.Kind() == reflect.Ptr && rv.IsNil() {
|
||||
rv.Set(conv.GoValueOf(protoreflect.ValueOfMessage(conv.New().Message())))
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
newMessage: func() protoreflect.Message {
|
||||
return conv.New().Message()
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func fieldInfoForMap(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Map {
|
||||
panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft))
|
||||
}
|
||||
conv := NewConverter(ft, fd)
|
||||
|
||||
// TODO: Implement unsafe fast path?
|
||||
fieldOffset := offsetOf(fs)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return rv.Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
pv := conv.GoValueOf(v)
|
||||
if pv.IsNil() {
|
||||
panic(fmt.Sprintf("map field %v cannot be set with read-only value", fd.FullName()))
|
||||
}
|
||||
rv.Set(pv)
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if v.IsNil() {
|
||||
v.Set(reflect.MakeMap(fs.Type))
|
||||
}
|
||||
return conv.PBValueOf(v)
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func fieldInfoForList(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo {
|
||||
ft := fs.Type
|
||||
if ft.Kind() != reflect.Slice {
|
||||
panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft))
|
||||
}
|
||||
conv := NewConverter(reflect.PtrTo(ft), fd)
|
||||
|
||||
// TODO: Implement unsafe fast path?
|
||||
fieldOffset := offsetOf(fs)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return rv.Len() > 0
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type)
|
||||
if rv.Elem().Len() == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
pv := conv.GoValueOf(v)
|
||||
if pv.IsNil() {
|
||||
panic(fmt.Sprintf("list field %v cannot be set with read-only value", fd.FullName()))
|
||||
}
|
||||
rv.Set(pv.Elem())
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
v := p.Apply(fieldOffset).AsValueOf(fs.Type)
|
||||
return conv.PBValueOf(v)
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
nilBytes = reflect.ValueOf([]byte(nil))
|
||||
emptyBytes = reflect.ValueOf([]byte{})
|
||||
)
|
||||
|
||||
func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo {
|
||||
ft := fs.Type
|
||||
nullable := fd.HasPresence()
|
||||
isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8
|
||||
var getter func(p pointer) protoreflect.Value
|
||||
if nullable {
|
||||
if ft.Kind() != reflect.Ptr && ft.Kind() != reflect.Slice {
|
||||
// This never occurs for generated message types.
|
||||
// Despite the protobuf type system specifying presence,
|
||||
// the Go field type cannot represent it.
|
||||
nullable = false
|
||||
}
|
||||
if ft.Kind() == reflect.Ptr {
|
||||
ft = ft.Elem()
|
||||
}
|
||||
}
|
||||
conv := NewConverter(ft, fd)
|
||||
fieldOffset := offsetOf(fs)
|
||||
|
||||
// Generate specialized getter functions to avoid going through reflect.Value
|
||||
if nullable {
|
||||
getter = getterForNullableScalar(fd, fs, conv, fieldOffset)
|
||||
} else {
|
||||
getter = getterForDirectScalar(fd, fs, conv, fieldOffset)
|
||||
}
|
||||
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
if nullable {
|
||||
return !p.Apply(fieldOffset).Elem().IsNil()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
switch rv.Kind() {
|
||||
case reflect.Bool:
|
||||
return rv.Bool()
|
||||
case reflect.Int32, reflect.Int64:
|
||||
return rv.Int() != 0
|
||||
case reflect.Uint32, reflect.Uint64:
|
||||
return rv.Uint() != 0
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return rv.Float() != 0 || math.Signbit(rv.Float())
|
||||
case reflect.String, reflect.Slice:
|
||||
return rv.Len() > 0
|
||||
default:
|
||||
panic(fmt.Sprintf("field %v has invalid type: %v", fd.FullName(), rv.Type())) // should never happen
|
||||
}
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: getter,
|
||||
// TODO: Implement unsafe fast path for set?
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if nullable && rv.Kind() == reflect.Ptr {
|
||||
if rv.IsNil() {
|
||||
rv.Set(reflect.New(ft))
|
||||
}
|
||||
rv = rv.Elem()
|
||||
}
|
||||
rv.Set(conv.GoValueOf(v))
|
||||
if isBytes && rv.Len() == 0 {
|
||||
if nullable {
|
||||
rv.Set(emptyBytes) // preserve presence
|
||||
} else {
|
||||
rv.Set(nilBytes) // do not preserve presence
|
||||
}
|
||||
}
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func fieldInfoForMessage(fd protoreflect.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo {
|
||||
ft := fs.Type
|
||||
conv := NewConverter(ft, fd)
|
||||
|
||||
// TODO: Implement unsafe fast path?
|
||||
fieldOffset := offsetOf(fs)
|
||||
return fieldInfo{
|
||||
fieldDesc: fd,
|
||||
has: func(p pointer) bool {
|
||||
if p.IsNil() {
|
||||
return false
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if fs.Type.Kind() != reflect.Ptr {
|
||||
return !rv.IsZero()
|
||||
}
|
||||
return !rv.IsNil()
|
||||
},
|
||||
clear: func(p pointer) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(reflect.Zero(rv.Type()))
|
||||
},
|
||||
get: func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
set: func(p pointer, v protoreflect.Value) {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
rv.Set(conv.GoValueOf(v))
|
||||
if fs.Type.Kind() == reflect.Ptr && rv.IsNil() {
|
||||
panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName()))
|
||||
}
|
||||
},
|
||||
mutable: func(p pointer) protoreflect.Value {
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if fs.Type.Kind() == reflect.Ptr && rv.IsNil() {
|
||||
rv.Set(conv.GoValueOf(conv.New()))
|
||||
}
|
||||
return conv.PBValueOf(rv)
|
||||
},
|
||||
newMessage: func() protoreflect.Message {
|
||||
return conv.New().Message()
|
||||
},
|
||||
newField: func() protoreflect.Value {
|
||||
return conv.New()
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type oneofInfo struct {
|
||||
oneofDesc protoreflect.OneofDescriptor
|
||||
which func(pointer) protoreflect.FieldNumber
|
||||
}
|
||||
|
||||
func makeOneofInfo(od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo {
|
||||
oi := &oneofInfo{oneofDesc: od}
|
||||
if od.IsSynthetic() {
|
||||
fs := si.fieldsByNumber[od.Fields().Get(0).Number()]
|
||||
fieldOffset := offsetOf(fs)
|
||||
oi.which = func(p pointer) protoreflect.FieldNumber {
|
||||
if p.IsNil() {
|
||||
return 0
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() { // valid on either *T or []byte
|
||||
return 0
|
||||
}
|
||||
return od.Fields().Get(0).Number()
|
||||
}
|
||||
} else {
|
||||
fs := si.oneofsByName[od.Name()]
|
||||
fieldOffset := offsetOf(fs)
|
||||
oi.which = func(p pointer) protoreflect.FieldNumber {
|
||||
if p.IsNil() {
|
||||
return 0
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
if rv.IsNil() {
|
||||
return 0
|
||||
}
|
||||
rv = rv.Elem()
|
||||
if rv.IsNil() {
|
||||
return 0
|
||||
}
|
||||
return si.oneofWrappersByType[rv.Type().Elem()]
|
||||
}
|
||||
}
|
||||
return oi
|
||||
}
|
273
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go
generated
vendored
Normal file
273
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go
generated
vendored
Normal file
@ -0,0 +1,273 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-types. DO NOT EDIT.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
func getterForNullableScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value {
|
||||
ft := fs.Type
|
||||
if ft.Kind() == reflect.Ptr {
|
||||
ft = ft.Elem()
|
||||
}
|
||||
if fd.Kind() == protoreflect.EnumKind {
|
||||
elemType := fs.Type.Elem()
|
||||
// Enums for nullable types.
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).Elem().AsValueOf(elemType)
|
||||
if rv.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
return conv.PBValueOf(rv.Elem())
|
||||
}
|
||||
}
|
||||
switch ft.Kind() {
|
||||
case reflect.Bool:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).BoolPtr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfBool(**x)
|
||||
}
|
||||
case reflect.Int32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int32Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfInt32(**x)
|
||||
}
|
||||
case reflect.Uint32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint32Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfUint32(**x)
|
||||
}
|
||||
case reflect.Int64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int64Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfInt64(**x)
|
||||
}
|
||||
case reflect.Uint64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint64Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfUint64(**x)
|
||||
}
|
||||
case reflect.Float32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float32Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfFloat32(**x)
|
||||
}
|
||||
case reflect.Float64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float64Ptr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfFloat64(**x)
|
||||
}
|
||||
case reflect.String:
|
||||
if fd.Kind() == protoreflect.BytesKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).StringPtr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
if len(**x) == 0 {
|
||||
return protoreflect.ValueOfBytes(nil)
|
||||
}
|
||||
return protoreflect.ValueOfBytes([]byte(**x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).StringPtr()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfString(**x)
|
||||
}
|
||||
case reflect.Slice:
|
||||
if fd.Kind() == protoreflect.StringKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
if len(*x) == 0 {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfString(string(*x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
if *x == nil {
|
||||
return conv.Zero()
|
||||
}
|
||||
return protoreflect.ValueOfBytes(*x)
|
||||
}
|
||||
}
|
||||
panic("unexpected protobuf kind: " + ft.Kind().String())
|
||||
}
|
||||
|
||||
func getterForDirectScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value {
|
||||
ft := fs.Type
|
||||
if fd.Kind() == protoreflect.EnumKind {
|
||||
// Enums for non nullable types.
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem()
|
||||
return conv.PBValueOf(rv)
|
||||
}
|
||||
}
|
||||
switch ft.Kind() {
|
||||
case reflect.Bool:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bool()
|
||||
return protoreflect.ValueOfBool(*x)
|
||||
}
|
||||
case reflect.Int32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int32()
|
||||
return protoreflect.ValueOfInt32(*x)
|
||||
}
|
||||
case reflect.Uint32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint32()
|
||||
return protoreflect.ValueOfUint32(*x)
|
||||
}
|
||||
case reflect.Int64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Int64()
|
||||
return protoreflect.ValueOfInt64(*x)
|
||||
}
|
||||
case reflect.Uint64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Uint64()
|
||||
return protoreflect.ValueOfUint64(*x)
|
||||
}
|
||||
case reflect.Float32:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float32()
|
||||
return protoreflect.ValueOfFloat32(*x)
|
||||
}
|
||||
case reflect.Float64:
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Float64()
|
||||
return protoreflect.ValueOfFloat64(*x)
|
||||
}
|
||||
case reflect.String:
|
||||
if fd.Kind() == protoreflect.BytesKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).String()
|
||||
if len(*x) == 0 {
|
||||
return protoreflect.ValueOfBytes(nil)
|
||||
}
|
||||
return protoreflect.ValueOfBytes([]byte(*x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).String()
|
||||
return protoreflect.ValueOfString(*x)
|
||||
}
|
||||
case reflect.Slice:
|
||||
if fd.Kind() == protoreflect.StringKind {
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
return protoreflect.ValueOfString(string(*x))
|
||||
}
|
||||
}
|
||||
return func(p pointer) protoreflect.Value {
|
||||
if p.IsNil() {
|
||||
return conv.Zero()
|
||||
}
|
||||
x := p.Apply(fieldOffset).Bytes()
|
||||
return protoreflect.ValueOfBytes(*x)
|
||||
}
|
||||
}
|
||||
panic("unexpected protobuf kind: " + ft.Kind().String())
|
||||
}
|
271
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go
generated
vendored
Normal file
271
e2e/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go
generated
vendored
Normal file
@ -0,0 +1,271 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Code generated by generate-types. DO NOT EDIT.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
func (m *messageState) Descriptor() protoreflect.MessageDescriptor {
|
||||
return m.messageInfo().Desc
|
||||
}
|
||||
func (m *messageState) Type() protoreflect.MessageType {
|
||||
return m.messageInfo()
|
||||
}
|
||||
func (m *messageState) New() protoreflect.Message {
|
||||
return m.messageInfo().New()
|
||||
}
|
||||
func (m *messageState) Interface() protoreflect.ProtoMessage {
|
||||
return m.protoUnwrap().(protoreflect.ProtoMessage)
|
||||
}
|
||||
func (m *messageState) protoUnwrap() any {
|
||||
return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem())
|
||||
}
|
||||
func (m *messageState) ProtoMethods() *protoiface.Methods {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
return &mi.methods
|
||||
}
|
||||
|
||||
// ProtoMessageInfo is a pseudo-internal API for allowing the v1 code
|
||||
// to be able to retrieve a v2 MessageInfo struct.
|
||||
//
|
||||
// WARNING: This method is exempt from the compatibility promise and
|
||||
// may be removed in the future without warning.
|
||||
func (m *messageState) ProtoMessageInfo() *MessageInfo {
|
||||
return m.messageInfo()
|
||||
}
|
||||
|
||||
func (m *messageState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
for _, ri := range mi.rangeInfos {
|
||||
switch ri := ri.(type) {
|
||||
case *fieldInfo:
|
||||
if ri.has(m.pointer()) {
|
||||
if !f(ri.fieldDesc, ri.get(m.pointer())) {
|
||||
return
|
||||
}
|
||||
}
|
||||
case *oneofInfo:
|
||||
if n := ri.which(m.pointer()); n > 0 {
|
||||
fi := mi.fields[n]
|
||||
if !f(fi.fieldDesc, fi.get(m.pointer())) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mi.extensionMap(m.pointer()).Range(f)
|
||||
}
|
||||
func (m *messageState) Has(fd protoreflect.FieldDescriptor) bool {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.has(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Has(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageState) Clear(fd protoreflect.FieldDescriptor) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
fi.clear(m.pointer())
|
||||
} else {
|
||||
mi.extensionMap(m.pointer()).Clear(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageState) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.get(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Get(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageState) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
fi.set(m.pointer(), v)
|
||||
} else {
|
||||
mi.extensionMap(m.pointer()).Set(xd, v)
|
||||
}
|
||||
}
|
||||
func (m *messageState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.mutable(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Mutable(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageState) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.newField()
|
||||
} else {
|
||||
return xd.Type().New()
|
||||
}
|
||||
}
|
||||
func (m *messageState) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if oi := mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
|
||||
return od.Fields().ByNumber(oi.which(m.pointer()))
|
||||
}
|
||||
panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m *messageState) GetUnknown() protoreflect.RawFields {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
return mi.getUnknown(m.pointer())
|
||||
}
|
||||
func (m *messageState) SetUnknown(b protoreflect.RawFields) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
mi.setUnknown(m.pointer(), b)
|
||||
}
|
||||
func (m *messageState) IsValid() bool {
|
||||
return !m.pointer().IsNil()
|
||||
}
|
||||
|
||||
func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor {
|
||||
return m.messageInfo().Desc
|
||||
}
|
||||
func (m *messageReflectWrapper) Type() protoreflect.MessageType {
|
||||
return m.messageInfo()
|
||||
}
|
||||
func (m *messageReflectWrapper) New() protoreflect.Message {
|
||||
return m.messageInfo().New()
|
||||
}
|
||||
func (m *messageReflectWrapper) Interface() protoreflect.ProtoMessage {
|
||||
if m, ok := m.protoUnwrap().(protoreflect.ProtoMessage); ok {
|
||||
return m
|
||||
}
|
||||
return (*messageIfaceWrapper)(m)
|
||||
}
|
||||
func (m *messageReflectWrapper) protoUnwrap() any {
|
||||
return m.pointer().AsIfaceOf(m.messageInfo().GoReflectType.Elem())
|
||||
}
|
||||
func (m *messageReflectWrapper) ProtoMethods() *protoiface.Methods {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
return &mi.methods
|
||||
}
|
||||
|
||||
// ProtoMessageInfo is a pseudo-internal API for allowing the v1 code
|
||||
// to be able to retrieve a v2 MessageInfo struct.
|
||||
//
|
||||
// WARNING: This method is exempt from the compatibility promise and
|
||||
// may be removed in the future without warning.
|
||||
func (m *messageReflectWrapper) ProtoMessageInfo() *MessageInfo {
|
||||
return m.messageInfo()
|
||||
}
|
||||
|
||||
func (m *messageReflectWrapper) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
for _, ri := range mi.rangeInfos {
|
||||
switch ri := ri.(type) {
|
||||
case *fieldInfo:
|
||||
if ri.has(m.pointer()) {
|
||||
if !f(ri.fieldDesc, ri.get(m.pointer())) {
|
||||
return
|
||||
}
|
||||
}
|
||||
case *oneofInfo:
|
||||
if n := ri.which(m.pointer()); n > 0 {
|
||||
fi := mi.fields[n]
|
||||
if !f(fi.fieldDesc, fi.get(m.pointer())) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mi.extensionMap(m.pointer()).Range(f)
|
||||
}
|
||||
func (m *messageReflectWrapper) Has(fd protoreflect.FieldDescriptor) bool {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.has(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Has(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) Clear(fd protoreflect.FieldDescriptor) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
fi.clear(m.pointer())
|
||||
} else {
|
||||
mi.extensionMap(m.pointer()).Clear(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.get(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Get(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
fi.set(m.pointer(), v)
|
||||
} else {
|
||||
mi.extensionMap(m.pointer()).Set(xd, v)
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.mutable(m.pointer())
|
||||
} else {
|
||||
return mi.extensionMap(m.pointer()).Mutable(xd)
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if fi, xd := mi.checkField(fd); fi != nil {
|
||||
return fi.newField()
|
||||
} else {
|
||||
return xd.Type().New()
|
||||
}
|
||||
}
|
||||
func (m *messageReflectWrapper) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
if oi := mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
|
||||
return od.Fields().ByNumber(oi.which(m.pointer()))
|
||||
}
|
||||
panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName()))
|
||||
}
|
||||
func (m *messageReflectWrapper) GetUnknown() protoreflect.RawFields {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
return mi.getUnknown(m.pointer())
|
||||
}
|
||||
func (m *messageReflectWrapper) SetUnknown(b protoreflect.RawFields) {
|
||||
mi := m.messageInfo()
|
||||
mi.init()
|
||||
mi.setUnknown(m.pointer(), b)
|
||||
}
|
||||
func (m *messageReflectWrapper) IsValid() bool {
|
||||
return !m.pointer().IsNil()
|
||||
}
|
220
e2e/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go
generated
vendored
Normal file
220
e2e/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go
generated
vendored
Normal file
@ -0,0 +1,220 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
|
||||
"google.golang.org/protobuf/internal/protolazy"
|
||||
)
|
||||
|
||||
const UnsafeEnabled = true
|
||||
|
||||
// Pointer is an opaque pointer type.
|
||||
type Pointer unsafe.Pointer
|
||||
|
||||
// offset represents the offset to a struct field, accessible from a pointer.
|
||||
// The offset is the byte offset to the field from the start of the struct.
|
||||
type offset uintptr
|
||||
|
||||
// offsetOf returns a field offset for the struct field.
|
||||
func offsetOf(f reflect.StructField) offset {
|
||||
return offset(f.Offset)
|
||||
}
|
||||
|
||||
// IsValid reports whether the offset is valid.
|
||||
func (f offset) IsValid() bool { return f != invalidOffset }
|
||||
|
||||
// invalidOffset is an invalid field offset.
|
||||
var invalidOffset = ^offset(0)
|
||||
|
||||
// zeroOffset is a noop when calling pointer.Apply.
|
||||
var zeroOffset = offset(0)
|
||||
|
||||
// pointer is a pointer to a message struct or field.
|
||||
type pointer struct{ p unsafe.Pointer }
|
||||
|
||||
// pointerOf returns p as a pointer.
|
||||
func pointerOf(p Pointer) pointer {
|
||||
return pointer{p: unsafe.Pointer(p)}
|
||||
}
|
||||
|
||||
// pointerOfValue returns v as a pointer.
|
||||
func pointerOfValue(v reflect.Value) pointer {
|
||||
return pointer{p: unsafe.Pointer(v.Pointer())}
|
||||
}
|
||||
|
||||
// pointerOfIface returns the pointer portion of an interface.
|
||||
func pointerOfIface(v any) pointer {
|
||||
type ifaceHeader struct {
|
||||
Type unsafe.Pointer
|
||||
Data unsafe.Pointer
|
||||
}
|
||||
return pointer{p: (*ifaceHeader)(unsafe.Pointer(&v)).Data}
|
||||
}
|
||||
|
||||
// IsNil reports whether the pointer is nil.
|
||||
func (p pointer) IsNil() bool {
|
||||
return p.p == nil
|
||||
}
|
||||
|
||||
// Apply adds an offset to the pointer to derive a new pointer
|
||||
// to a specified field. The pointer must be valid and pointing at a struct.
|
||||
func (p pointer) Apply(f offset) pointer {
|
||||
if p.IsNil() {
|
||||
panic("invalid nil pointer")
|
||||
}
|
||||
return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))}
|
||||
}
|
||||
|
||||
// AsValueOf treats p as a pointer to an object of type t and returns the value.
|
||||
// It is equivalent to reflect.ValueOf(p.AsIfaceOf(t))
|
||||
func (p pointer) AsValueOf(t reflect.Type) reflect.Value {
|
||||
return reflect.NewAt(t, p.p)
|
||||
}
|
||||
|
||||
// AsIfaceOf treats p as a pointer to an object of type t and returns the value.
|
||||
// It is equivalent to p.AsValueOf(t).Interface()
|
||||
func (p pointer) AsIfaceOf(t reflect.Type) any {
|
||||
// TODO: Use tricky unsafe magic to directly create ifaceHeader.
|
||||
return p.AsValueOf(t).Interface()
|
||||
}
|
||||
|
||||
func (p pointer) Bool() *bool { return (*bool)(p.p) }
|
||||
func (p pointer) BoolPtr() **bool { return (**bool)(p.p) }
|
||||
func (p pointer) BoolSlice() *[]bool { return (*[]bool)(p.p) }
|
||||
func (p pointer) Int32() *int32 { return (*int32)(p.p) }
|
||||
func (p pointer) Int32Ptr() **int32 { return (**int32)(p.p) }
|
||||
func (p pointer) Int32Slice() *[]int32 { return (*[]int32)(p.p) }
|
||||
func (p pointer) Int64() *int64 { return (*int64)(p.p) }
|
||||
func (p pointer) Int64Ptr() **int64 { return (**int64)(p.p) }
|
||||
func (p pointer) Int64Slice() *[]int64 { return (*[]int64)(p.p) }
|
||||
func (p pointer) Uint32() *uint32 { return (*uint32)(p.p) }
|
||||
func (p pointer) Uint32Ptr() **uint32 { return (**uint32)(p.p) }
|
||||
func (p pointer) Uint32Slice() *[]uint32 { return (*[]uint32)(p.p) }
|
||||
func (p pointer) Uint64() *uint64 { return (*uint64)(p.p) }
|
||||
func (p pointer) Uint64Ptr() **uint64 { return (**uint64)(p.p) }
|
||||
func (p pointer) Uint64Slice() *[]uint64 { return (*[]uint64)(p.p) }
|
||||
func (p pointer) Float32() *float32 { return (*float32)(p.p) }
|
||||
func (p pointer) Float32Ptr() **float32 { return (**float32)(p.p) }
|
||||
func (p pointer) Float32Slice() *[]float32 { return (*[]float32)(p.p) }
|
||||
func (p pointer) Float64() *float64 { return (*float64)(p.p) }
|
||||
func (p pointer) Float64Ptr() **float64 { return (**float64)(p.p) }
|
||||
func (p pointer) Float64Slice() *[]float64 { return (*[]float64)(p.p) }
|
||||
func (p pointer) String() *string { return (*string)(p.p) }
|
||||
func (p pointer) StringPtr() **string { return (**string)(p.p) }
|
||||
func (p pointer) StringSlice() *[]string { return (*[]string)(p.p) }
|
||||
func (p pointer) Bytes() *[]byte { return (*[]byte)(p.p) }
|
||||
func (p pointer) BytesPtr() **[]byte { return (**[]byte)(p.p) }
|
||||
func (p pointer) BytesSlice() *[][]byte { return (*[][]byte)(p.p) }
|
||||
func (p pointer) Extensions() *map[int32]ExtensionField { return (*map[int32]ExtensionField)(p.p) }
|
||||
func (p pointer) LazyInfoPtr() **protolazy.XXX_lazyUnmarshalInfo {
|
||||
return (**protolazy.XXX_lazyUnmarshalInfo)(p.p)
|
||||
}
|
||||
|
||||
func (p pointer) PresenceInfo() presence {
|
||||
return presence{P: p.p}
|
||||
}
|
||||
|
||||
func (p pointer) Elem() pointer {
|
||||
return pointer{p: *(*unsafe.Pointer)(p.p)}
|
||||
}
|
||||
|
||||
// PointerSlice loads []*T from p as a []pointer.
|
||||
// The value returned is aliased with the original slice.
|
||||
// This behavior differs from the implementation in pointer_reflect.go.
|
||||
func (p pointer) PointerSlice() []pointer {
|
||||
// Super-tricky - p should point to a []*T where T is a
|
||||
// message type. We load it as []pointer.
|
||||
return *(*[]pointer)(p.p)
|
||||
}
|
||||
|
||||
// AppendPointerSlice appends v to p, which must be a []*T.
|
||||
func (p pointer) AppendPointerSlice(v pointer) {
|
||||
*(*[]pointer)(p.p) = append(*(*[]pointer)(p.p), v)
|
||||
}
|
||||
|
||||
// SetPointer sets *p to v.
|
||||
func (p pointer) SetPointer(v pointer) {
|
||||
*(*unsafe.Pointer)(p.p) = (unsafe.Pointer)(v.p)
|
||||
}
|
||||
|
||||
func (p pointer) growBoolSlice(addCap int) {
|
||||
sp := p.BoolSlice()
|
||||
s := make([]bool, 0, addCap+len(*sp))
|
||||
s = s[:len(*sp)]
|
||||
copy(s, *sp)
|
||||
*sp = s
|
||||
}
|
||||
|
||||
func (p pointer) growInt32Slice(addCap int) {
|
||||
sp := p.Int32Slice()
|
||||
s := make([]int32, 0, addCap+len(*sp))
|
||||
s = s[:len(*sp)]
|
||||
copy(s, *sp)
|
||||
*sp = s
|
||||
}
|
||||
|
||||
func (p pointer) growUint32Slice(addCap int) {
|
||||
p.growInt32Slice(addCap)
|
||||
}
|
||||
|
||||
func (p pointer) growFloat32Slice(addCap int) {
|
||||
p.growInt32Slice(addCap)
|
||||
}
|
||||
|
||||
func (p pointer) growInt64Slice(addCap int) {
|
||||
sp := p.Int64Slice()
|
||||
s := make([]int64, 0, addCap+len(*sp))
|
||||
s = s[:len(*sp)]
|
||||
copy(s, *sp)
|
||||
*sp = s
|
||||
}
|
||||
|
||||
func (p pointer) growUint64Slice(addCap int) {
|
||||
p.growInt64Slice(addCap)
|
||||
}
|
||||
|
||||
func (p pointer) growFloat64Slice(addCap int) {
|
||||
p.growInt64Slice(addCap)
|
||||
}
|
||||
|
||||
// Static check that MessageState does not exceed the size of a pointer.
|
||||
const _ = uint(unsafe.Sizeof(unsafe.Pointer(nil)) - unsafe.Sizeof(MessageState{}))
|
||||
|
||||
func (Export) MessageStateOf(p Pointer) *messageState {
|
||||
// Super-tricky - see documentation on MessageState.
|
||||
return (*messageState)(unsafe.Pointer(p))
|
||||
}
|
||||
func (ms *messageState) pointer() pointer {
|
||||
// Super-tricky - see documentation on MessageState.
|
||||
return pointer{p: unsafe.Pointer(ms)}
|
||||
}
|
||||
func (ms *messageState) messageInfo() *MessageInfo {
|
||||
mi := ms.LoadMessageInfo()
|
||||
if mi == nil {
|
||||
panic("invalid nil message info; this suggests memory corruption due to a race or shallow copy on the message struct")
|
||||
}
|
||||
return mi
|
||||
}
|
||||
func (ms *messageState) LoadMessageInfo() *MessageInfo {
|
||||
return (*MessageInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&ms.atomicMessageInfo))))
|
||||
}
|
||||
func (ms *messageState) StoreMessageInfo(mi *MessageInfo) {
|
||||
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&ms.atomicMessageInfo)), unsafe.Pointer(mi))
|
||||
}
|
||||
|
||||
type atomicNilMessage struct{ p unsafe.Pointer } // p is a *messageReflectWrapper
|
||||
|
||||
func (m *atomicNilMessage) Init(mi *MessageInfo) *messageReflectWrapper {
|
||||
if p := atomic.LoadPointer(&m.p); p != nil {
|
||||
return (*messageReflectWrapper)(p)
|
||||
}
|
||||
w := &messageReflectWrapper{mi: mi}
|
||||
atomic.CompareAndSwapPointer(&m.p, nil, (unsafe.Pointer)(w))
|
||||
return (*messageReflectWrapper)(atomic.LoadPointer(&m.p))
|
||||
}
|
42
e2e/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go
generated
vendored
Normal file
42
e2e/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go
generated
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func (p pointer) AtomicGetPointer() pointer {
|
||||
return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
|
||||
}
|
||||
|
||||
func (p pointer) AtomicSetPointer(v pointer) {
|
||||
atomic.StorePointer((*unsafe.Pointer)(p.p), v.p)
|
||||
}
|
||||
|
||||
func (p pointer) AtomicSetNilPointer() {
|
||||
atomic.StorePointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil))
|
||||
}
|
||||
|
||||
func (p pointer) AtomicSetPointerIfNil(v pointer) pointer {
|
||||
if atomic.CompareAndSwapPointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil), v.p) {
|
||||
return v
|
||||
}
|
||||
return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))}
|
||||
}
|
||||
|
||||
type atomicV1MessageInfo struct{ p Pointer }
|
||||
|
||||
func (mi *atomicV1MessageInfo) Get() Pointer {
|
||||
return Pointer(atomic.LoadPointer((*unsafe.Pointer)(&mi.p)))
|
||||
}
|
||||
|
||||
func (mi *atomicV1MessageInfo) SetIfNil(p Pointer) Pointer {
|
||||
if atomic.CompareAndSwapPointer((*unsafe.Pointer)(&mi.p), nil, unsafe.Pointer(p)) {
|
||||
return p
|
||||
}
|
||||
return mi.Get()
|
||||
}
|
142
e2e/vendor/google.golang.org/protobuf/internal/impl/presence.go
generated
vendored
Normal file
142
e2e/vendor/google.golang.org/protobuf/internal/impl/presence.go
generated
vendored
Normal file
@ -0,0 +1,142 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// presenceSize represents the size of a presence set, which should be the largest index of the set+1
|
||||
type presenceSize uint32
|
||||
|
||||
// presence is the internal representation of the bitmap array in a generated protobuf
|
||||
type presence struct {
|
||||
// This is a pointer to the beginning of an array of uint32
|
||||
P unsafe.Pointer
|
||||
}
|
||||
|
||||
func (p presence) toElem(num uint32) (ret *uint32) {
|
||||
const (
|
||||
bitsPerByte = 8
|
||||
siz = unsafe.Sizeof(*ret)
|
||||
)
|
||||
// p.P points to an array of uint32, num is the bit in this array that the
|
||||
// caller wants to check/manipulate. Calculate the index in the array that
|
||||
// contains this specific bit. E.g.: 76 / 32 = 2 (integer division).
|
||||
offset := uintptr(num) / (siz * bitsPerByte) * siz
|
||||
return (*uint32)(unsafe.Pointer(uintptr(p.P) + offset))
|
||||
}
|
||||
|
||||
// Present checks for the presence of a specific field number in a presence set.
|
||||
func (p presence) Present(num uint32) bool {
|
||||
if p.P == nil {
|
||||
return false
|
||||
}
|
||||
return Export{}.Present(p.toElem(num), num)
|
||||
}
|
||||
|
||||
// SetPresent adds presence for a specific field number in a presence set.
|
||||
func (p presence) SetPresent(num uint32, size presenceSize) {
|
||||
Export{}.SetPresent(p.toElem(num), num, uint32(size))
|
||||
}
|
||||
|
||||
// SetPresentUnatomic adds presence for a specific field number in a presence set without using
|
||||
// atomic operations. Only to be called during unmarshaling.
|
||||
func (p presence) SetPresentUnatomic(num uint32, size presenceSize) {
|
||||
Export{}.SetPresentNonAtomic(p.toElem(num), num, uint32(size))
|
||||
}
|
||||
|
||||
// ClearPresent removes presence for a specific field number in a presence set.
|
||||
func (p presence) ClearPresent(num uint32) {
|
||||
Export{}.ClearPresent(p.toElem(num), num)
|
||||
}
|
||||
|
||||
// LoadPresenceCache (together with PresentInCache) allows for a
|
||||
// cached version of checking for presence without re-reading the word
|
||||
// for every field. It is optimized for efficiency and assumes no
|
||||
// simltaneous mutation of the presence set (or at least does not have
|
||||
// a problem with simultaneous mutation giving inconsistent results).
|
||||
func (p presence) LoadPresenceCache() (current uint32) {
|
||||
if p.P == nil {
|
||||
return 0
|
||||
}
|
||||
return atomic.LoadUint32((*uint32)(p.P))
|
||||
}
|
||||
|
||||
// PresentInCache reads presence from a cached word in the presence
|
||||
// bitmap. It caches up a new word if the bit is outside the
|
||||
// word. This is for really fast iteration through bitmaps in cases
|
||||
// where we either know that the bitmap will not be altered, or we
|
||||
// don't care about inconsistencies caused by simultaneous writes.
|
||||
func (p presence) PresentInCache(num uint32, cachedElement *uint32, current *uint32) bool {
|
||||
if num/32 != *cachedElement {
|
||||
o := uintptr(num/32) * unsafe.Sizeof(uint32(0))
|
||||
q := (*uint32)(unsafe.Pointer(uintptr(p.P) + o))
|
||||
*current = atomic.LoadUint32(q)
|
||||
*cachedElement = num / 32
|
||||
}
|
||||
return (*current & (1 << (num % 32))) > 0
|
||||
}
|
||||
|
||||
// AnyPresent checks if any field is marked as present in the bitmap.
|
||||
func (p presence) AnyPresent(size presenceSize) bool {
|
||||
n := uintptr((size + 31) / 32)
|
||||
for j := uintptr(0); j < n; j++ {
|
||||
o := j * unsafe.Sizeof(uint32(0))
|
||||
q := (*uint32)(unsafe.Pointer(uintptr(p.P) + o))
|
||||
b := atomic.LoadUint32(q)
|
||||
if b > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// toRaceDetectData finds the preceding RaceDetectHookData in a
|
||||
// message by using pointer arithmetic. As the type of the presence
|
||||
// set (bitmap) varies with the number of fields in the protobuf, we
|
||||
// can not have a struct type containing the array and the
|
||||
// RaceDetectHookData. instead the RaceDetectHookData is placed
|
||||
// immediately before the bitmap array, and we find it by walking
|
||||
// backwards in the struct.
|
||||
//
|
||||
// This method is only called from the race-detect version of the code,
|
||||
// so RaceDetectHookData is never an empty struct.
|
||||
func (p presence) toRaceDetectData() *RaceDetectHookData {
|
||||
var template struct {
|
||||
d RaceDetectHookData
|
||||
a [1]uint32
|
||||
}
|
||||
o := (uintptr(unsafe.Pointer(&template.a)) - uintptr(unsafe.Pointer(&template.d)))
|
||||
return (*RaceDetectHookData)(unsafe.Pointer(uintptr(p.P) - o))
|
||||
}
|
||||
|
||||
func atomicLoadShadowPresence(p **[]byte) *[]byte {
|
||||
return (*[]byte)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
|
||||
}
|
||||
func atomicStoreShadowPresence(p **[]byte, v *[]byte) {
|
||||
atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(p)), nil, unsafe.Pointer(v))
|
||||
}
|
||||
|
||||
// findPointerToRaceDetectData finds the preceding RaceDetectHookData
|
||||
// in a message by using pointer arithmetic. For the methods called
|
||||
// directy from generated code, we don't have a pointer to the
|
||||
// beginning of the presence set, but a pointer inside the array. As
|
||||
// we know the index of the bit we're manipulating (num), we can
|
||||
// calculate which element of the array ptr is pointing to. With that
|
||||
// information we find the preceding RaceDetectHookData and can
|
||||
// manipulate the shadow bitmap.
|
||||
//
|
||||
// This method is only called from the race-detect version of the
|
||||
// code, so RaceDetectHookData is never an empty struct.
|
||||
func findPointerToRaceDetectData(ptr *uint32, num uint32) *RaceDetectHookData {
|
||||
var template struct {
|
||||
d RaceDetectHookData
|
||||
a [1]uint32
|
||||
}
|
||||
o := (uintptr(unsafe.Pointer(&template.a)) - uintptr(unsafe.Pointer(&template.d))) + uintptr(num/32)*unsafe.Sizeof(uint32(0))
|
||||
return (*RaceDetectHookData)(unsafe.Pointer(uintptr(unsafe.Pointer(ptr)) - o))
|
||||
}
|
570
e2e/vendor/google.golang.org/protobuf/internal/impl/validate.go
generated
vendored
Normal file
570
e2e/vendor/google.golang.org/protobuf/internal/impl/validate.go
generated
vendored
Normal file
@ -0,0 +1,570 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package impl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"math/bits"
|
||||
"reflect"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
"google.golang.org/protobuf/internal/encoding/messageset"
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/internal/genid"
|
||||
"google.golang.org/protobuf/internal/strs"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
"google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// ValidationStatus is the result of validating the wire-format encoding of a message.
|
||||
type ValidationStatus int
|
||||
|
||||
const (
|
||||
// ValidationUnknown indicates that unmarshaling the message might succeed or fail.
|
||||
// The validator was unable to render a judgement.
|
||||
//
|
||||
// The only causes of this status are an aberrant message type appearing somewhere
|
||||
// in the message or a failure in the extension resolver.
|
||||
ValidationUnknown ValidationStatus = iota + 1
|
||||
|
||||
// ValidationInvalid indicates that unmarshaling the message will fail.
|
||||
ValidationInvalid
|
||||
|
||||
// ValidationValid indicates that unmarshaling the message will succeed.
|
||||
ValidationValid
|
||||
|
||||
// ValidationWrongWireType indicates that a validated field does not have
|
||||
// the expected wire type.
|
||||
ValidationWrongWireType
|
||||
)
|
||||
|
||||
func (v ValidationStatus) String() string {
|
||||
switch v {
|
||||
case ValidationUnknown:
|
||||
return "ValidationUnknown"
|
||||
case ValidationInvalid:
|
||||
return "ValidationInvalid"
|
||||
case ValidationValid:
|
||||
return "ValidationValid"
|
||||
default:
|
||||
return fmt.Sprintf("ValidationStatus(%d)", int(v))
|
||||
}
|
||||
}
|
||||
|
||||
// Validate determines whether the contents of the buffer are a valid wire encoding
|
||||
// of the message type.
|
||||
//
|
||||
// This function is exposed for testing.
|
||||
func Validate(mt protoreflect.MessageType, in protoiface.UnmarshalInput) (out protoiface.UnmarshalOutput, _ ValidationStatus) {
|
||||
mi, ok := mt.(*MessageInfo)
|
||||
if !ok {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
if in.Resolver == nil {
|
||||
in.Resolver = protoregistry.GlobalTypes
|
||||
}
|
||||
o, st := mi.validate(in.Buf, 0, unmarshalOptions{
|
||||
flags: in.Flags,
|
||||
resolver: in.Resolver,
|
||||
})
|
||||
if o.initialized {
|
||||
out.Flags |= protoiface.UnmarshalInitialized
|
||||
}
|
||||
return out, st
|
||||
}
|
||||
|
||||
type validationInfo struct {
|
||||
mi *MessageInfo
|
||||
typ validationType
|
||||
keyType, valType validationType
|
||||
|
||||
// For non-required fields, requiredBit is 0.
|
||||
//
|
||||
// For required fields, requiredBit's nth bit is set, where n is a
|
||||
// unique index in the range [0, MessageInfo.numRequiredFields).
|
||||
//
|
||||
// If there are more than 64 required fields, requiredBit is 0.
|
||||
requiredBit uint64
|
||||
}
|
||||
|
||||
type validationType uint8
|
||||
|
||||
const (
|
||||
validationTypeOther validationType = iota
|
||||
validationTypeMessage
|
||||
validationTypeGroup
|
||||
validationTypeMap
|
||||
validationTypeRepeatedVarint
|
||||
validationTypeRepeatedFixed32
|
||||
validationTypeRepeatedFixed64
|
||||
validationTypeVarint
|
||||
validationTypeFixed32
|
||||
validationTypeFixed64
|
||||
validationTypeBytes
|
||||
validationTypeUTF8String
|
||||
validationTypeMessageSetItem
|
||||
)
|
||||
|
||||
func newFieldValidationInfo(mi *MessageInfo, si structInfo, fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo {
|
||||
var vi validationInfo
|
||||
switch {
|
||||
case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic():
|
||||
switch fd.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
vi.typ = validationTypeMessage
|
||||
if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok {
|
||||
vi.mi = getMessageInfo(ot.Field(0).Type)
|
||||
}
|
||||
case protoreflect.GroupKind:
|
||||
vi.typ = validationTypeGroup
|
||||
if ot, ok := si.oneofWrappersByNumber[fd.Number()]; ok {
|
||||
vi.mi = getMessageInfo(ot.Field(0).Type)
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if strs.EnforceUTF8(fd) {
|
||||
vi.typ = validationTypeUTF8String
|
||||
}
|
||||
}
|
||||
default:
|
||||
vi = newValidationInfo(fd, ft)
|
||||
}
|
||||
if fd.Cardinality() == protoreflect.Required {
|
||||
// Avoid overflow. The required field check is done with a 64-bit mask, with
|
||||
// any message containing more than 64 required fields always reported as
|
||||
// potentially uninitialized, so it is not important to get a precise count
|
||||
// of the required fields past 64.
|
||||
if mi.numRequiredFields < math.MaxUint8 {
|
||||
mi.numRequiredFields++
|
||||
vi.requiredBit = 1 << (mi.numRequiredFields - 1)
|
||||
}
|
||||
}
|
||||
return vi
|
||||
}
|
||||
|
||||
func newValidationInfo(fd protoreflect.FieldDescriptor, ft reflect.Type) validationInfo {
|
||||
var vi validationInfo
|
||||
switch {
|
||||
case fd.IsList():
|
||||
switch fd.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
vi.typ = validationTypeMessage
|
||||
|
||||
if ft.Kind() == reflect.Ptr {
|
||||
// Repeated opaque message fields are *[]*T.
|
||||
ft = ft.Elem()
|
||||
}
|
||||
|
||||
if ft.Kind() == reflect.Slice {
|
||||
vi.mi = getMessageInfo(ft.Elem())
|
||||
}
|
||||
case protoreflect.GroupKind:
|
||||
vi.typ = validationTypeGroup
|
||||
|
||||
if ft.Kind() == reflect.Ptr {
|
||||
// Repeated opaque message fields are *[]*T.
|
||||
ft = ft.Elem()
|
||||
}
|
||||
|
||||
if ft.Kind() == reflect.Slice {
|
||||
vi.mi = getMessageInfo(ft.Elem())
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
vi.typ = validationTypeBytes
|
||||
if strs.EnforceUTF8(fd) {
|
||||
vi.typ = validationTypeUTF8String
|
||||
}
|
||||
default:
|
||||
switch wireTypes[fd.Kind()] {
|
||||
case protowire.VarintType:
|
||||
vi.typ = validationTypeRepeatedVarint
|
||||
case protowire.Fixed32Type:
|
||||
vi.typ = validationTypeRepeatedFixed32
|
||||
case protowire.Fixed64Type:
|
||||
vi.typ = validationTypeRepeatedFixed64
|
||||
}
|
||||
}
|
||||
case fd.IsMap():
|
||||
vi.typ = validationTypeMap
|
||||
switch fd.MapKey().Kind() {
|
||||
case protoreflect.StringKind:
|
||||
if strs.EnforceUTF8(fd) {
|
||||
vi.keyType = validationTypeUTF8String
|
||||
}
|
||||
}
|
||||
switch fd.MapValue().Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
vi.valType = validationTypeMessage
|
||||
if ft.Kind() == reflect.Map {
|
||||
vi.mi = getMessageInfo(ft.Elem())
|
||||
}
|
||||
case protoreflect.StringKind:
|
||||
if strs.EnforceUTF8(fd) {
|
||||
vi.valType = validationTypeUTF8String
|
||||
}
|
||||
}
|
||||
default:
|
||||
switch fd.Kind() {
|
||||
case protoreflect.MessageKind:
|
||||
vi.typ = validationTypeMessage
|
||||
vi.mi = getMessageInfo(ft)
|
||||
case protoreflect.GroupKind:
|
||||
vi.typ = validationTypeGroup
|
||||
vi.mi = getMessageInfo(ft)
|
||||
case protoreflect.StringKind:
|
||||
vi.typ = validationTypeBytes
|
||||
if strs.EnforceUTF8(fd) {
|
||||
vi.typ = validationTypeUTF8String
|
||||
}
|
||||
default:
|
||||
switch wireTypes[fd.Kind()] {
|
||||
case protowire.VarintType:
|
||||
vi.typ = validationTypeVarint
|
||||
case protowire.Fixed32Type:
|
||||
vi.typ = validationTypeFixed32
|
||||
case protowire.Fixed64Type:
|
||||
vi.typ = validationTypeFixed64
|
||||
case protowire.BytesType:
|
||||
vi.typ = validationTypeBytes
|
||||
}
|
||||
}
|
||||
}
|
||||
return vi
|
||||
}
|
||||
|
||||
func (mi *MessageInfo) validate(b []byte, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, result ValidationStatus) {
|
||||
mi.init()
|
||||
type validationState struct {
|
||||
typ validationType
|
||||
keyType, valType validationType
|
||||
endGroup protowire.Number
|
||||
mi *MessageInfo
|
||||
tail []byte
|
||||
requiredMask uint64
|
||||
}
|
||||
|
||||
// Pre-allocate some slots to avoid repeated slice reallocation.
|
||||
states := make([]validationState, 0, 16)
|
||||
states = append(states, validationState{
|
||||
typ: validationTypeMessage,
|
||||
mi: mi,
|
||||
})
|
||||
if groupTag > 0 {
|
||||
states[0].typ = validationTypeGroup
|
||||
states[0].endGroup = groupTag
|
||||
}
|
||||
initialized := true
|
||||
start := len(b)
|
||||
State:
|
||||
for len(states) > 0 {
|
||||
st := &states[len(states)-1]
|
||||
for len(b) > 0 {
|
||||
// Parse the tag (field number and wire type).
|
||||
var tag uint64
|
||||
if b[0] < 0x80 {
|
||||
tag = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
tag = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
tag, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
var num protowire.Number
|
||||
if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
|
||||
return out, ValidationInvalid
|
||||
} else {
|
||||
num = protowire.Number(n)
|
||||
}
|
||||
wtyp := protowire.Type(tag & 7)
|
||||
|
||||
if wtyp == protowire.EndGroupType {
|
||||
if st.endGroup == num {
|
||||
goto PopState
|
||||
}
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
var vi validationInfo
|
||||
switch {
|
||||
case st.typ == validationTypeMap:
|
||||
switch num {
|
||||
case genid.MapEntry_Key_field_number:
|
||||
vi.typ = st.keyType
|
||||
case genid.MapEntry_Value_field_number:
|
||||
vi.typ = st.valType
|
||||
vi.mi = st.mi
|
||||
vi.requiredBit = 1
|
||||
}
|
||||
case flags.ProtoLegacy && st.mi.isMessageSet:
|
||||
switch num {
|
||||
case messageset.FieldItem:
|
||||
vi.typ = validationTypeMessageSetItem
|
||||
}
|
||||
default:
|
||||
var f *coderFieldInfo
|
||||
if int(num) < len(st.mi.denseCoderFields) {
|
||||
f = st.mi.denseCoderFields[num]
|
||||
} else {
|
||||
f = st.mi.coderFields[num]
|
||||
}
|
||||
if f != nil {
|
||||
vi = f.validation
|
||||
break
|
||||
}
|
||||
// Possible extension field.
|
||||
//
|
||||
// TODO: We should return ValidationUnknown when:
|
||||
// 1. The resolver is not frozen. (More extensions may be added to it.)
|
||||
// 2. The resolver returns preg.NotFound.
|
||||
// In this case, a type added to the resolver in the future could cause
|
||||
// unmarshaling to begin failing. Supporting this requires some way to
|
||||
// determine if the resolver is frozen.
|
||||
xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), num)
|
||||
if err != nil && err != protoregistry.NotFound {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
if err == nil {
|
||||
vi = getExtensionFieldInfo(xt).validation
|
||||
}
|
||||
}
|
||||
if vi.requiredBit != 0 {
|
||||
// Check that the field has a compatible wire type.
|
||||
// We only need to consider non-repeated field types,
|
||||
// since repeated fields (and maps) can never be required.
|
||||
ok := false
|
||||
switch vi.typ {
|
||||
case validationTypeVarint:
|
||||
ok = wtyp == protowire.VarintType
|
||||
case validationTypeFixed32:
|
||||
ok = wtyp == protowire.Fixed32Type
|
||||
case validationTypeFixed64:
|
||||
ok = wtyp == protowire.Fixed64Type
|
||||
case validationTypeBytes, validationTypeUTF8String, validationTypeMessage:
|
||||
ok = wtyp == protowire.BytesType
|
||||
case validationTypeGroup:
|
||||
ok = wtyp == protowire.StartGroupType
|
||||
}
|
||||
if ok {
|
||||
st.requiredMask |= vi.requiredBit
|
||||
}
|
||||
}
|
||||
|
||||
switch wtyp {
|
||||
case protowire.VarintType:
|
||||
if len(b) >= 10 {
|
||||
switch {
|
||||
case b[0] < 0x80:
|
||||
b = b[1:]
|
||||
case b[1] < 0x80:
|
||||
b = b[2:]
|
||||
case b[2] < 0x80:
|
||||
b = b[3:]
|
||||
case b[3] < 0x80:
|
||||
b = b[4:]
|
||||
case b[4] < 0x80:
|
||||
b = b[5:]
|
||||
case b[5] < 0x80:
|
||||
b = b[6:]
|
||||
case b[6] < 0x80:
|
||||
b = b[7:]
|
||||
case b[7] < 0x80:
|
||||
b = b[8:]
|
||||
case b[8] < 0x80:
|
||||
b = b[9:]
|
||||
case b[9] < 0x80 && b[9] < 2:
|
||||
b = b[10:]
|
||||
default:
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
} else {
|
||||
switch {
|
||||
case len(b) > 0 && b[0] < 0x80:
|
||||
b = b[1:]
|
||||
case len(b) > 1 && b[1] < 0x80:
|
||||
b = b[2:]
|
||||
case len(b) > 2 && b[2] < 0x80:
|
||||
b = b[3:]
|
||||
case len(b) > 3 && b[3] < 0x80:
|
||||
b = b[4:]
|
||||
case len(b) > 4 && b[4] < 0x80:
|
||||
b = b[5:]
|
||||
case len(b) > 5 && b[5] < 0x80:
|
||||
b = b[6:]
|
||||
case len(b) > 6 && b[6] < 0x80:
|
||||
b = b[7:]
|
||||
case len(b) > 7 && b[7] < 0x80:
|
||||
b = b[8:]
|
||||
case len(b) > 8 && b[8] < 0x80:
|
||||
b = b[9:]
|
||||
case len(b) > 9 && b[9] < 2:
|
||||
b = b[10:]
|
||||
default:
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
}
|
||||
continue State
|
||||
case protowire.BytesType:
|
||||
var size uint64
|
||||
if len(b) >= 1 && b[0] < 0x80 {
|
||||
size = uint64(b[0])
|
||||
b = b[1:]
|
||||
} else if len(b) >= 2 && b[1] < 128 {
|
||||
size = uint64(b[0]&0x7f) + uint64(b[1])<<7
|
||||
b = b[2:]
|
||||
} else {
|
||||
var n int
|
||||
size, n = protowire.ConsumeVarint(b)
|
||||
if n < 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
if size > uint64(len(b)) {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
v := b[:size]
|
||||
b = b[size:]
|
||||
switch vi.typ {
|
||||
case validationTypeMessage:
|
||||
if vi.mi == nil {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
vi.mi.init()
|
||||
fallthrough
|
||||
case validationTypeMap:
|
||||
if vi.mi != nil {
|
||||
vi.mi.init()
|
||||
}
|
||||
states = append(states, validationState{
|
||||
typ: vi.typ,
|
||||
keyType: vi.keyType,
|
||||
valType: vi.valType,
|
||||
mi: vi.mi,
|
||||
tail: b,
|
||||
})
|
||||
b = v
|
||||
continue State
|
||||
case validationTypeRepeatedVarint:
|
||||
// Packed field.
|
||||
for len(v) > 0 {
|
||||
_, n := protowire.ConsumeVarint(v)
|
||||
if n < 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
v = v[n:]
|
||||
}
|
||||
case validationTypeRepeatedFixed32:
|
||||
// Packed field.
|
||||
if len(v)%4 != 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
case validationTypeRepeatedFixed64:
|
||||
// Packed field.
|
||||
if len(v)%8 != 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
case validationTypeUTF8String:
|
||||
if !utf8.Valid(v) {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
}
|
||||
case protowire.Fixed32Type:
|
||||
if len(b) < 4 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = b[4:]
|
||||
case protowire.Fixed64Type:
|
||||
if len(b) < 8 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = b[8:]
|
||||
case protowire.StartGroupType:
|
||||
switch {
|
||||
case vi.typ == validationTypeGroup:
|
||||
if vi.mi == nil {
|
||||
return out, ValidationUnknown
|
||||
}
|
||||
vi.mi.init()
|
||||
states = append(states, validationState{
|
||||
typ: validationTypeGroup,
|
||||
mi: vi.mi,
|
||||
endGroup: num,
|
||||
})
|
||||
continue State
|
||||
case flags.ProtoLegacy && vi.typ == validationTypeMessageSetItem:
|
||||
typeid, v, n, err := messageset.ConsumeFieldValue(b, false)
|
||||
if err != nil {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
xt, err := opts.resolver.FindExtensionByNumber(st.mi.Desc.FullName(), typeid)
|
||||
switch {
|
||||
case err == protoregistry.NotFound:
|
||||
b = b[n:]
|
||||
case err != nil:
|
||||
return out, ValidationUnknown
|
||||
default:
|
||||
xvi := getExtensionFieldInfo(xt).validation
|
||||
if xvi.mi != nil {
|
||||
xvi.mi.init()
|
||||
}
|
||||
states = append(states, validationState{
|
||||
typ: xvi.typ,
|
||||
mi: xvi.mi,
|
||||
tail: b[n:],
|
||||
})
|
||||
b = v
|
||||
continue State
|
||||
}
|
||||
default:
|
||||
n := protowire.ConsumeFieldValue(num, wtyp, b)
|
||||
if n < 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = b[n:]
|
||||
}
|
||||
default:
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
}
|
||||
if st.endGroup != 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
if len(b) != 0 {
|
||||
return out, ValidationInvalid
|
||||
}
|
||||
b = st.tail
|
||||
PopState:
|
||||
numRequiredFields := 0
|
||||
switch st.typ {
|
||||
case validationTypeMessage, validationTypeGroup:
|
||||
numRequiredFields = int(st.mi.numRequiredFields)
|
||||
case validationTypeMap:
|
||||
// If this is a map field with a message value that contains
|
||||
// required fields, require that the value be present.
|
||||
if st.mi != nil && st.mi.numRequiredFields > 0 {
|
||||
numRequiredFields = 1
|
||||
}
|
||||
}
|
||||
// If there are more than 64 required fields, this check will
|
||||
// always fail and we will report that the message is potentially
|
||||
// uninitialized.
|
||||
if numRequiredFields > 0 && bits.OnesCount64(st.requiredMask) != numRequiredFields {
|
||||
initialized = false
|
||||
}
|
||||
states = states[:len(states)-1]
|
||||
}
|
||||
out.n = start - len(b)
|
||||
if initialized {
|
||||
out.initialized = true
|
||||
}
|
||||
return out, ValidationValid
|
||||
}
|
89
e2e/vendor/google.golang.org/protobuf/internal/order/order.go
generated
vendored
Normal file
89
e2e/vendor/google.golang.org/protobuf/internal/order/order.go
generated
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package order
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// FieldOrder specifies the ordering to visit message fields.
|
||||
// It is a function that reports whether x is ordered before y.
|
||||
type FieldOrder func(x, y protoreflect.FieldDescriptor) bool
|
||||
|
||||
var (
|
||||
// AnyFieldOrder specifies no specific field ordering.
|
||||
AnyFieldOrder FieldOrder = nil
|
||||
|
||||
// LegacyFieldOrder sorts fields in the same ordering as emitted by
|
||||
// wire serialization in the github.com/golang/protobuf implementation.
|
||||
LegacyFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool {
|
||||
ox, oy := x.ContainingOneof(), y.ContainingOneof()
|
||||
inOneof := func(od protoreflect.OneofDescriptor) bool {
|
||||
return od != nil && !od.IsSynthetic()
|
||||
}
|
||||
|
||||
// Extension fields sort before non-extension fields.
|
||||
if x.IsExtension() != y.IsExtension() {
|
||||
return x.IsExtension() && !y.IsExtension()
|
||||
}
|
||||
// Fields not within a oneof sort before those within a oneof.
|
||||
if inOneof(ox) != inOneof(oy) {
|
||||
return !inOneof(ox) && inOneof(oy)
|
||||
}
|
||||
// Fields in disjoint oneof sets are sorted by declaration index.
|
||||
if inOneof(ox) && inOneof(oy) && ox != oy {
|
||||
return ox.Index() < oy.Index()
|
||||
}
|
||||
// Fields sorted by field number.
|
||||
return x.Number() < y.Number()
|
||||
}
|
||||
|
||||
// NumberFieldOrder sorts fields by their field number.
|
||||
NumberFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool {
|
||||
return x.Number() < y.Number()
|
||||
}
|
||||
|
||||
// IndexNameFieldOrder sorts non-extension fields before extension fields.
|
||||
// Non-extensions are sorted according to their declaration index.
|
||||
// Extensions are sorted according to their full name.
|
||||
IndexNameFieldOrder FieldOrder = func(x, y protoreflect.FieldDescriptor) bool {
|
||||
// Non-extension fields sort before extension fields.
|
||||
if x.IsExtension() != y.IsExtension() {
|
||||
return !x.IsExtension() && y.IsExtension()
|
||||
}
|
||||
// Extensions sorted by fullname.
|
||||
if x.IsExtension() && y.IsExtension() {
|
||||
return x.FullName() < y.FullName()
|
||||
}
|
||||
// Non-extensions sorted by declaration index.
|
||||
return x.Index() < y.Index()
|
||||
}
|
||||
)
|
||||
|
||||
// KeyOrder specifies the ordering to visit map entries.
|
||||
// It is a function that reports whether x is ordered before y.
|
||||
type KeyOrder func(x, y protoreflect.MapKey) bool
|
||||
|
||||
var (
|
||||
// AnyKeyOrder specifies no specific key ordering.
|
||||
AnyKeyOrder KeyOrder = nil
|
||||
|
||||
// GenericKeyOrder sorts false before true, numeric keys in ascending order,
|
||||
// and strings in lexicographical ordering according to UTF-8 codepoints.
|
||||
GenericKeyOrder KeyOrder = func(x, y protoreflect.MapKey) bool {
|
||||
switch x.Interface().(type) {
|
||||
case bool:
|
||||
return !x.Bool() && y.Bool()
|
||||
case int32, int64:
|
||||
return x.Int() < y.Int()
|
||||
case uint32, uint64:
|
||||
return x.Uint() < y.Uint()
|
||||
case string:
|
||||
return x.String() < y.String()
|
||||
default:
|
||||
panic("invalid map key type")
|
||||
}
|
||||
}
|
||||
)
|
115
e2e/vendor/google.golang.org/protobuf/internal/order/range.go
generated
vendored
Normal file
115
e2e/vendor/google.golang.org/protobuf/internal/order/range.go
generated
vendored
Normal file
@ -0,0 +1,115 @@
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package order provides ordered access to messages and maps.
|
||||
package order
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
type messageField struct {
|
||||
fd protoreflect.FieldDescriptor
|
||||
v protoreflect.Value
|
||||
}
|
||||
|
||||
var messageFieldPool = sync.Pool{
|
||||
New: func() any { return new([]messageField) },
|
||||
}
|
||||
|
||||
type (
|
||||
// FieldRnger is an interface for visiting all fields in a message.
|
||||
// The protoreflect.Message type implements this interface.
|
||||
FieldRanger interface{ Range(VisitField) }
|
||||
// VisitField is called every time a message field is visited.
|
||||
VisitField = func(protoreflect.FieldDescriptor, protoreflect.Value) bool
|
||||
)
|
||||
|
||||
// RangeFields iterates over the fields of fs according to the specified order.
|
||||
func RangeFields(fs FieldRanger, less FieldOrder, fn VisitField) {
|
||||
if less == nil {
|
||||
fs.Range(fn)
|
||||
return
|
||||
}
|
||||
|
||||
// Obtain a pre-allocated scratch buffer.
|
||||
p := messageFieldPool.Get().(*[]messageField)
|
||||
fields := (*p)[:0]
|
||||
defer func() {
|
||||
if cap(fields) < 1024 {
|
||||
*p = fields
|
||||
messageFieldPool.Put(p)
|
||||
}
|
||||
}()
|
||||
|
||||
// Collect all fields in the message and sort them.
|
||||
fs.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
|
||||
fields = append(fields, messageField{fd, v})
|
||||
return true
|
||||
})
|
||||
sort.Slice(fields, func(i, j int) bool {
|
||||
return less(fields[i].fd, fields[j].fd)
|
||||
})
|
||||
|
||||
// Visit the fields in the specified ordering.
|
||||
for _, f := range fields {
|
||||
if !fn(f.fd, f.v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type mapEntry struct {
|
||||
k protoreflect.MapKey
|
||||
v protoreflect.Value
|
||||
}
|
||||
|
||||
var mapEntryPool = sync.Pool{
|
||||
New: func() any { return new([]mapEntry) },
|
||||
}
|
||||
|
||||
type (
|
||||
// EntryRanger is an interface for visiting all fields in a message.
|
||||
// The protoreflect.Map type implements this interface.
|
||||
EntryRanger interface{ Range(VisitEntry) }
|
||||
// VisitEntry is called every time a map entry is visited.
|
||||
VisitEntry = func(protoreflect.MapKey, protoreflect.Value) bool
|
||||
)
|
||||
|
||||
// RangeEntries iterates over the entries of es according to the specified order.
|
||||
func RangeEntries(es EntryRanger, less KeyOrder, fn VisitEntry) {
|
||||
if less == nil {
|
||||
es.Range(fn)
|
||||
return
|
||||
}
|
||||
|
||||
// Obtain a pre-allocated scratch buffer.
|
||||
p := mapEntryPool.Get().(*[]mapEntry)
|
||||
entries := (*p)[:0]
|
||||
defer func() {
|
||||
if cap(entries) < 1024 {
|
||||
*p = entries
|
||||
mapEntryPool.Put(p)
|
||||
}
|
||||
}()
|
||||
|
||||
// Collect all entries in the map and sort them.
|
||||
es.Range(func(k protoreflect.MapKey, v protoreflect.Value) bool {
|
||||
entries = append(entries, mapEntry{k, v})
|
||||
return true
|
||||
})
|
||||
sort.Slice(entries, func(i, j int) bool {
|
||||
return less(entries[i].k, entries[j].k)
|
||||
})
|
||||
|
||||
// Visit the entries in the specified ordering.
|
||||
for _, e := range entries {
|
||||
if !fn(e.k, e.v) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
29
e2e/vendor/google.golang.org/protobuf/internal/pragma/pragma.go
generated
vendored
Normal file
29
e2e/vendor/google.golang.org/protobuf/internal/pragma/pragma.go
generated
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package pragma provides types that can be embedded into a struct to
|
||||
// statically enforce or prevent certain language properties.
|
||||
package pragma
|
||||
|
||||
import "sync"
|
||||
|
||||
// NoUnkeyedLiterals can be embedded in a struct to prevent unkeyed literals.
|
||||
type NoUnkeyedLiterals struct{}
|
||||
|
||||
// DoNotImplement can be embedded in an interface to prevent trivial
|
||||
// implementations of the interface.
|
||||
//
|
||||
// This is useful to prevent unauthorized implementations of an interface
|
||||
// so that it can be extended in the future for any protobuf language changes.
|
||||
type DoNotImplement interface{ ProtoInternal(DoNotImplement) }
|
||||
|
||||
// DoNotCompare can be embedded in a struct to prevent comparability.
|
||||
type DoNotCompare [0]func()
|
||||
|
||||
// DoNotCopy can be embedded in a struct to help prevent shallow copies.
|
||||
// This does not rely on a Go language feature, but rather a special case
|
||||
// within the vet checker.
|
||||
//
|
||||
// See https://golang.org/issues/8005.
|
||||
type DoNotCopy [0]sync.Mutex
|
364
e2e/vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go
generated
vendored
Normal file
364
e2e/vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go
generated
vendored
Normal file
@ -0,0 +1,364 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Helper code for parsing a protocol buffer
|
||||
|
||||
package protolazy
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
)
|
||||
|
||||
// BufferReader is a structure encapsulating a protobuf and a current position
|
||||
type BufferReader struct {
|
||||
Buf []byte
|
||||
Pos int
|
||||
}
|
||||
|
||||
// NewBufferReader creates a new BufferRead from a protobuf
|
||||
func NewBufferReader(buf []byte) BufferReader {
|
||||
return BufferReader{Buf: buf, Pos: 0}
|
||||
}
|
||||
|
||||
var errOutOfBounds = errors.New("protobuf decoding: out of bounds")
|
||||
var errOverflow = errors.New("proto: integer overflow")
|
||||
|
||||
func (b *BufferReader) DecodeVarintSlow() (x uint64, err error) {
|
||||
i := b.Pos
|
||||
l := len(b.Buf)
|
||||
|
||||
for shift := uint(0); shift < 64; shift += 7 {
|
||||
if i >= l {
|
||||
err = io.ErrUnexpectedEOF
|
||||
return
|
||||
}
|
||||
v := b.Buf[i]
|
||||
i++
|
||||
x |= (uint64(v) & 0x7F) << shift
|
||||
if v < 0x80 {
|
||||
b.Pos = i
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// The number is too large to represent in a 64-bit value.
|
||||
err = errOverflow
|
||||
return
|
||||
}
|
||||
|
||||
// decodeVarint decodes a varint at the current position
|
||||
func (b *BufferReader) DecodeVarint() (x uint64, err error) {
|
||||
i := b.Pos
|
||||
buf := b.Buf
|
||||
|
||||
if i >= len(buf) {
|
||||
return 0, io.ErrUnexpectedEOF
|
||||
} else if buf[i] < 0x80 {
|
||||
b.Pos++
|
||||
return uint64(buf[i]), nil
|
||||
} else if len(buf)-i < 10 {
|
||||
return b.DecodeVarintSlow()
|
||||
}
|
||||
|
||||
var v uint64
|
||||
// we already checked the first byte
|
||||
x = uint64(buf[i]) & 127
|
||||
i++
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 7
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 14
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 21
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 28
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 35
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 42
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 49
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 56
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint64(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 63
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
return 0, errOverflow
|
||||
|
||||
done:
|
||||
b.Pos = i
|
||||
return
|
||||
}
|
||||
|
||||
// decodeVarint32 decodes a varint32 at the current position
|
||||
func (b *BufferReader) DecodeVarint32() (x uint32, err error) {
|
||||
i := b.Pos
|
||||
buf := b.Buf
|
||||
|
||||
if i >= len(buf) {
|
||||
return 0, io.ErrUnexpectedEOF
|
||||
} else if buf[i] < 0x80 {
|
||||
b.Pos++
|
||||
return uint32(buf[i]), nil
|
||||
} else if len(buf)-i < 5 {
|
||||
v, err := b.DecodeVarintSlow()
|
||||
return uint32(v), err
|
||||
}
|
||||
|
||||
var v uint32
|
||||
// we already checked the first byte
|
||||
x = uint32(buf[i]) & 127
|
||||
i++
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 7
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 14
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 21
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
x |= (v & 127) << 28
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
return 0, errOverflow
|
||||
|
||||
done:
|
||||
b.Pos = i
|
||||
return
|
||||
}
|
||||
|
||||
// skipValue skips a value in the protobuf, based on the specified tag
|
||||
func (b *BufferReader) SkipValue(tag uint32) (err error) {
|
||||
wireType := tag & 0x7
|
||||
switch protowire.Type(wireType) {
|
||||
case protowire.VarintType:
|
||||
err = b.SkipVarint()
|
||||
case protowire.Fixed64Type:
|
||||
err = b.SkipFixed64()
|
||||
case protowire.BytesType:
|
||||
var n uint32
|
||||
n, err = b.DecodeVarint32()
|
||||
if err == nil {
|
||||
err = b.Skip(int(n))
|
||||
}
|
||||
case protowire.StartGroupType:
|
||||
err = b.SkipGroup(tag)
|
||||
case protowire.Fixed32Type:
|
||||
err = b.SkipFixed32()
|
||||
default:
|
||||
err = fmt.Errorf("Unexpected wire type (%d)", wireType)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// skipGroup skips a group with the specified tag. It executes efficiently using a tag stack
|
||||
func (b *BufferReader) SkipGroup(tag uint32) (err error) {
|
||||
tagStack := make([]uint32, 0, 16)
|
||||
tagStack = append(tagStack, tag)
|
||||
var n uint32
|
||||
for len(tagStack) > 0 {
|
||||
tag, err = b.DecodeVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch protowire.Type(tag & 0x7) {
|
||||
case protowire.VarintType:
|
||||
err = b.SkipVarint()
|
||||
case protowire.Fixed64Type:
|
||||
err = b.Skip(8)
|
||||
case protowire.BytesType:
|
||||
n, err = b.DecodeVarint32()
|
||||
if err == nil {
|
||||
err = b.Skip(int(n))
|
||||
}
|
||||
case protowire.StartGroupType:
|
||||
tagStack = append(tagStack, tag)
|
||||
case protowire.Fixed32Type:
|
||||
err = b.SkipFixed32()
|
||||
case protowire.EndGroupType:
|
||||
if protoFieldNumber(tagStack[len(tagStack)-1]) == protoFieldNumber(tag) {
|
||||
tagStack = tagStack[:len(tagStack)-1]
|
||||
} else {
|
||||
err = fmt.Errorf("end group tag %d does not match begin group tag %d at pos %d",
|
||||
protoFieldNumber(tag), protoFieldNumber(tagStack[len(tagStack)-1]), b.Pos)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// skipVarint effiently skips a varint
|
||||
func (b *BufferReader) SkipVarint() (err error) {
|
||||
i := b.Pos
|
||||
|
||||
if len(b.Buf)-i < 10 {
|
||||
// Use DecodeVarintSlow() to check for buffer overflow, but ignore result
|
||||
if _, err := b.DecodeVarintSlow(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if b.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
return errOverflow
|
||||
|
||||
out:
|
||||
b.Pos = i + 1
|
||||
return nil
|
||||
}
|
||||
|
||||
// skip skips the specified number of bytes
|
||||
func (b *BufferReader) Skip(n int) (err error) {
|
||||
if len(b.Buf) < b.Pos+n {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b.Pos += n
|
||||
return
|
||||
}
|
||||
|
||||
// skipFixed64 skips a fixed64
|
||||
func (b *BufferReader) SkipFixed64() (err error) {
|
||||
return b.Skip(8)
|
||||
}
|
||||
|
||||
// skipFixed32 skips a fixed32
|
||||
func (b *BufferReader) SkipFixed32() (err error) {
|
||||
return b.Skip(4)
|
||||
}
|
||||
|
||||
// skipBytes skips a set of bytes
|
||||
func (b *BufferReader) SkipBytes() (err error) {
|
||||
n, err := b.DecodeVarint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return b.Skip(int(n))
|
||||
}
|
||||
|
||||
// Done returns whether we are at the end of the protobuf
|
||||
func (b *BufferReader) Done() bool {
|
||||
return b.Pos == len(b.Buf)
|
||||
}
|
||||
|
||||
// Remaining returns how many bytes remain
|
||||
func (b *BufferReader) Remaining() int {
|
||||
return len(b.Buf) - b.Pos
|
||||
}
|
359
e2e/vendor/google.golang.org/protobuf/internal/protolazy/lazy.go
generated
vendored
Normal file
359
e2e/vendor/google.golang.org/protobuf/internal/protolazy/lazy.go
generated
vendored
Normal file
@ -0,0 +1,359 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package protolazy contains internal data structures for lazy message decoding.
|
||||
package protolazy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"google.golang.org/protobuf/encoding/protowire"
|
||||
piface "google.golang.org/protobuf/runtime/protoiface"
|
||||
)
|
||||
|
||||
// IndexEntry is the structure for an index of the fields in a message of a
|
||||
// proto (not descending to sub-messages)
|
||||
type IndexEntry struct {
|
||||
FieldNum uint32
|
||||
// first byte of this tag/field
|
||||
Start uint32
|
||||
// first byte after a contiguous sequence of bytes for this tag/field, which could
|
||||
// include a single encoding of the field, or multiple encodings for the field
|
||||
End uint32
|
||||
// True if this protobuf segment includes multiple encodings of the field
|
||||
MultipleContiguous bool
|
||||
}
|
||||
|
||||
// XXX_lazyUnmarshalInfo has information about a particular lazily decoded message
|
||||
//
|
||||
// Deprecated: Do not use. This will be deleted in the near future.
|
||||
type XXX_lazyUnmarshalInfo struct {
|
||||
// Index of fields and their positions in the protobuf for this
|
||||
// message. Make index be a pointer to a slice so it can be updated
|
||||
// atomically. The index pointer is only set once (lazily when/if
|
||||
// the index is first needed), and must always be SET and LOADED
|
||||
// ATOMICALLY.
|
||||
index *[]IndexEntry
|
||||
// The protobuf associated with this lazily decoded message. It is
|
||||
// only set during proto.Unmarshal(). It doesn't need to be set and
|
||||
// loaded atomically, since any simultaneous set (Unmarshal) and read
|
||||
// (during a get) would already be a race in the app code.
|
||||
Protobuf []byte
|
||||
// The flags present when Unmarshal was originally called for this particular message
|
||||
unmarshalFlags piface.UnmarshalInputFlags
|
||||
}
|
||||
|
||||
// The Buffer and SetBuffer methods let v2/internal/impl interact with
|
||||
// XXX_lazyUnmarshalInfo via an interface, to avoid an import cycle.
|
||||
|
||||
// Buffer returns the lazy unmarshal buffer.
|
||||
//
|
||||
// Deprecated: Do not use. This will be deleted in the near future.
|
||||
func (lazy *XXX_lazyUnmarshalInfo) Buffer() []byte {
|
||||
return lazy.Protobuf
|
||||
}
|
||||
|
||||
// SetBuffer sets the lazy unmarshal buffer.
|
||||
//
|
||||
// Deprecated: Do not use. This will be deleted in the near future.
|
||||
func (lazy *XXX_lazyUnmarshalInfo) SetBuffer(b []byte) {
|
||||
lazy.Protobuf = b
|
||||
}
|
||||
|
||||
// SetUnmarshalFlags is called to set a copy of the original unmarshalInputFlags.
|
||||
// The flags should reflect how Unmarshal was called.
|
||||
func (lazy *XXX_lazyUnmarshalInfo) SetUnmarshalFlags(f piface.UnmarshalInputFlags) {
|
||||
lazy.unmarshalFlags = f
|
||||
}
|
||||
|
||||
// UnmarshalFlags returns the original unmarshalInputFlags.
|
||||
func (lazy *XXX_lazyUnmarshalInfo) UnmarshalFlags() piface.UnmarshalInputFlags {
|
||||
return lazy.unmarshalFlags
|
||||
}
|
||||
|
||||
// AllowedPartial returns true if the user originally unmarshalled this message with
|
||||
// AllowPartial set to true
|
||||
func (lazy *XXX_lazyUnmarshalInfo) AllowedPartial() bool {
|
||||
return (lazy.unmarshalFlags & piface.UnmarshalCheckRequired) == 0
|
||||
}
|
||||
|
||||
func protoFieldNumber(tag uint32) uint32 {
|
||||
return tag >> 3
|
||||
}
|
||||
|
||||
// buildIndex builds an index of the specified protobuf, return the index
|
||||
// array and an error.
|
||||
func buildIndex(buf []byte) ([]IndexEntry, error) {
|
||||
index := make([]IndexEntry, 0, 16)
|
||||
var lastProtoFieldNum uint32
|
||||
var outOfOrder bool
|
||||
|
||||
var r BufferReader = NewBufferReader(buf)
|
||||
|
||||
for !r.Done() {
|
||||
var tag uint32
|
||||
var err error
|
||||
var curPos = r.Pos
|
||||
// INLINED: tag, err = r.DecodeVarint32()
|
||||
{
|
||||
i := r.Pos
|
||||
buf := r.Buf
|
||||
|
||||
if i >= len(buf) {
|
||||
return nil, errOutOfBounds
|
||||
} else if buf[i] < 0x80 {
|
||||
r.Pos++
|
||||
tag = uint32(buf[i])
|
||||
} else if r.Remaining() < 5 {
|
||||
var v uint64
|
||||
v, err = r.DecodeVarintSlow()
|
||||
tag = uint32(v)
|
||||
} else {
|
||||
var v uint32
|
||||
// we already checked the first byte
|
||||
tag = uint32(buf[i]) & 127
|
||||
i++
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
tag |= (v & 127) << 7
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
tag |= (v & 127) << 14
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
tag |= (v & 127) << 21
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
v = uint32(buf[i])
|
||||
i++
|
||||
tag |= (v & 127) << 28
|
||||
if v < 128 {
|
||||
goto done
|
||||
}
|
||||
|
||||
return nil, errOutOfBounds
|
||||
|
||||
done:
|
||||
r.Pos = i
|
||||
}
|
||||
}
|
||||
// DONE: tag, err = r.DecodeVarint32()
|
||||
|
||||
fieldNum := protoFieldNumber(tag)
|
||||
if fieldNum < lastProtoFieldNum {
|
||||
outOfOrder = true
|
||||
}
|
||||
|
||||
// Skip the current value -- will skip over an entire group as well.
|
||||
// INLINED: err = r.SkipValue(tag)
|
||||
wireType := tag & 0x7
|
||||
switch protowire.Type(wireType) {
|
||||
case protowire.VarintType:
|
||||
// INLINED: err = r.SkipVarint()
|
||||
i := r.Pos
|
||||
|
||||
if len(r.Buf)-i < 10 {
|
||||
// Use DecodeVarintSlow() to skip while
|
||||
// checking for buffer overflow, but ignore result
|
||||
_, err = r.DecodeVarintSlow()
|
||||
goto out2
|
||||
}
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
i++
|
||||
|
||||
if r.Buf[i] < 0x80 {
|
||||
goto out
|
||||
}
|
||||
return nil, errOverflow
|
||||
out:
|
||||
r.Pos = i + 1
|
||||
// DONE: err = r.SkipVarint()
|
||||
case protowire.Fixed64Type:
|
||||
err = r.SkipFixed64()
|
||||
case protowire.BytesType:
|
||||
var n uint32
|
||||
n, err = r.DecodeVarint32()
|
||||
if err == nil {
|
||||
err = r.Skip(int(n))
|
||||
}
|
||||
case protowire.StartGroupType:
|
||||
err = r.SkipGroup(tag)
|
||||
case protowire.Fixed32Type:
|
||||
err = r.SkipFixed32()
|
||||
default:
|
||||
err = fmt.Errorf("Unexpected wire type (%d)", wireType)
|
||||
}
|
||||
// DONE: err = r.SkipValue(tag)
|
||||
|
||||
out2:
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if fieldNum != lastProtoFieldNum {
|
||||
index = append(index, IndexEntry{FieldNum: fieldNum,
|
||||
Start: uint32(curPos),
|
||||
End: uint32(r.Pos)},
|
||||
)
|
||||
} else {
|
||||
index[len(index)-1].End = uint32(r.Pos)
|
||||
index[len(index)-1].MultipleContiguous = true
|
||||
}
|
||||
lastProtoFieldNum = fieldNum
|
||||
}
|
||||
if outOfOrder {
|
||||
sort.Slice(index, func(i, j int) bool {
|
||||
return index[i].FieldNum < index[j].FieldNum ||
|
||||
(index[i].FieldNum == index[j].FieldNum &&
|
||||
index[i].Start < index[j].Start)
|
||||
})
|
||||
}
|
||||
return index, nil
|
||||
}
|
||||
|
||||
func (lazy *XXX_lazyUnmarshalInfo) SizeField(num uint32) (size int) {
|
||||
start, end, found, _, multipleEntries := lazy.FindFieldInProto(num)
|
||||
if multipleEntries != nil {
|
||||
for _, entry := range multipleEntries {
|
||||
size += int(entry.End - entry.Start)
|
||||
}
|
||||
return size
|
||||
}
|
||||
if !found {
|
||||
return 0
|
||||
}
|
||||
return int(end - start)
|
||||
}
|
||||
|
||||
func (lazy *XXX_lazyUnmarshalInfo) AppendField(b []byte, num uint32) ([]byte, bool) {
|
||||
start, end, found, _, multipleEntries := lazy.FindFieldInProto(num)
|
||||
if multipleEntries != nil {
|
||||
for _, entry := range multipleEntries {
|
||||
b = append(b, lazy.Protobuf[entry.Start:entry.End]...)
|
||||
}
|
||||
return b, true
|
||||
}
|
||||
if !found {
|
||||
return nil, false
|
||||
}
|
||||
b = append(b, lazy.Protobuf[start:end]...)
|
||||
return b, true
|
||||
}
|
||||
|
||||
func (lazy *XXX_lazyUnmarshalInfo) SetIndex(index []IndexEntry) {
|
||||
atomicStoreIndex(&lazy.index, &index)
|
||||
}
|
||||
|
||||
// FindFieldInProto looks for field fieldNum in lazyUnmarshalInfo information
|
||||
// (including protobuf), returns startOffset/endOffset/found.
|
||||
func (lazy *XXX_lazyUnmarshalInfo) FindFieldInProto(fieldNum uint32) (start, end uint32, found, multipleContiguous bool, multipleEntries []IndexEntry) {
|
||||
if lazy.Protobuf == nil {
|
||||
// There is no backing protobuf for this message -- it was made from a builder
|
||||
return 0, 0, false, false, nil
|
||||
}
|
||||
index := atomicLoadIndex(&lazy.index)
|
||||
if index == nil {
|
||||
r, err := buildIndex(lazy.Protobuf)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("findFieldInfo: error building index when looking for field %d: %v", fieldNum, err))
|
||||
}
|
||||
// lazy.index is a pointer to the slice returned by BuildIndex
|
||||
index = &r
|
||||
atomicStoreIndex(&lazy.index, index)
|
||||
}
|
||||
return lookupField(index, fieldNum)
|
||||
}
|
||||
|
||||
// lookupField returns the offset at which the indicated field starts using
|
||||
// the index, offset immediately after field ends (including all instances of
|
||||
// a repeated field), and bools indicating if field was found and if there
|
||||
// are multiple encodings of the field in the byte range.
|
||||
//
|
||||
// To hande the uncommon case where there are repeated encodings for the same
|
||||
// field which are not consecutive in the protobuf (so we need to returns
|
||||
// multiple start/end offsets), we also return a slice multipleEntries. If
|
||||
// multipleEntries is non-nil, then multiple entries were found, and the
|
||||
// values in the slice should be used, rather than start/end/found.
|
||||
func lookupField(indexp *[]IndexEntry, fieldNum uint32) (start, end uint32, found bool, multipleContiguous bool, multipleEntries []IndexEntry) {
|
||||
// The pointer indexp to the index was already loaded atomically.
|
||||
// The slice is uniquely associated with the pointer, so it doesn't
|
||||
// need to be loaded atomically.
|
||||
index := *indexp
|
||||
for i, entry := range index {
|
||||
if fieldNum == entry.FieldNum {
|
||||
if i < len(index)-1 && entry.FieldNum == index[i+1].FieldNum {
|
||||
// Handle the uncommon case where there are
|
||||
// repeated entries for the same field which
|
||||
// are not contiguous in the protobuf.
|
||||
multiple := make([]IndexEntry, 1, 2)
|
||||
multiple[0] = IndexEntry{fieldNum, entry.Start, entry.End, entry.MultipleContiguous}
|
||||
i++
|
||||
for i < len(index) && index[i].FieldNum == fieldNum {
|
||||
multiple = append(multiple, IndexEntry{fieldNum, index[i].Start, index[i].End, index[i].MultipleContiguous})
|
||||
i++
|
||||
}
|
||||
return 0, 0, false, false, multiple
|
||||
|
||||
}
|
||||
return entry.Start, entry.End, true, entry.MultipleContiguous, nil
|
||||
}
|
||||
if fieldNum < entry.FieldNum {
|
||||
return 0, 0, false, false, nil
|
||||
}
|
||||
}
|
||||
return 0, 0, false, false, nil
|
||||
}
|
17
e2e/vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go
generated
vendored
Normal file
17
e2e/vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright 2024 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package protolazy
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func atomicLoadIndex(p **[]IndexEntry) *[]IndexEntry {
|
||||
return (*[]IndexEntry)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p))))
|
||||
}
|
||||
func atomicStoreIndex(p **[]IndexEntry, v *[]IndexEntry) {
|
||||
atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v))
|
||||
}
|
58
e2e/vendor/google.golang.org/protobuf/internal/set/ints.go
generated
vendored
Normal file
58
e2e/vendor/google.golang.org/protobuf/internal/set/ints.go
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package set provides simple set data structures for uint64s.
|
||||
package set
|
||||
|
||||
import "math/bits"
|
||||
|
||||
// int64s represents a set of integers within the range of 0..63.
|
||||
type int64s uint64
|
||||
|
||||
func (bs *int64s) Len() int {
|
||||
return bits.OnesCount64(uint64(*bs))
|
||||
}
|
||||
func (bs *int64s) Has(n uint64) bool {
|
||||
return uint64(*bs)&(uint64(1)<<n) > 0
|
||||
}
|
||||
func (bs *int64s) Set(n uint64) {
|
||||
*(*uint64)(bs) |= uint64(1) << n
|
||||
}
|
||||
func (bs *int64s) Clear(n uint64) {
|
||||
*(*uint64)(bs) &^= uint64(1) << n
|
||||
}
|
||||
|
||||
// Ints represents a set of integers within the range of 0..math.MaxUint64.
|
||||
type Ints struct {
|
||||
lo int64s
|
||||
hi map[uint64]struct{}
|
||||
}
|
||||
|
||||
func (bs *Ints) Len() int {
|
||||
return bs.lo.Len() + len(bs.hi)
|
||||
}
|
||||
func (bs *Ints) Has(n uint64) bool {
|
||||
if n < 64 {
|
||||
return bs.lo.Has(n)
|
||||
}
|
||||
_, ok := bs.hi[n]
|
||||
return ok
|
||||
}
|
||||
func (bs *Ints) Set(n uint64) {
|
||||
if n < 64 {
|
||||
bs.lo.Set(n)
|
||||
return
|
||||
}
|
||||
if bs.hi == nil {
|
||||
bs.hi = make(map[uint64]struct{})
|
||||
}
|
||||
bs.hi[n] = struct{}{}
|
||||
}
|
||||
func (bs *Ints) Clear(n uint64) {
|
||||
if n < 64 {
|
||||
bs.lo.Clear(n)
|
||||
return
|
||||
}
|
||||
delete(bs.hi, n)
|
||||
}
|
196
e2e/vendor/google.golang.org/protobuf/internal/strs/strings.go
generated
vendored
Normal file
196
e2e/vendor/google.golang.org/protobuf/internal/strs/strings.go
generated
vendored
Normal file
@ -0,0 +1,196 @@
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package strs provides string manipulation functionality specific to protobuf.
|
||||
package strs
|
||||
|
||||
import (
|
||||
"go/token"
|
||||
"strings"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
|
||||
"google.golang.org/protobuf/internal/flags"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
)
|
||||
|
||||
// EnforceUTF8 reports whether to enforce strict UTF-8 validation.
|
||||
func EnforceUTF8(fd protoreflect.FieldDescriptor) bool {
|
||||
if flags.ProtoLegacy || fd.Syntax() == protoreflect.Editions {
|
||||
if fd, ok := fd.(interface{ EnforceUTF8() bool }); ok {
|
||||
return fd.EnforceUTF8()
|
||||
}
|
||||
}
|
||||
return fd.Syntax() == protoreflect.Proto3
|
||||
}
|
||||
|
||||
// GoCamelCase camel-cases a protobuf name for use as a Go identifier.
|
||||
//
|
||||
// If there is an interior underscore followed by a lower case letter,
|
||||
// drop the underscore and convert the letter to upper case.
|
||||
func GoCamelCase(s string) string {
|
||||
// Invariant: if the next letter is lower case, it must be converted
|
||||
// to upper case.
|
||||
// That is, we process a word at a time, where words are marked by _ or
|
||||
// upper case letter. Digits are treated as words.
|
||||
var b []byte
|
||||
for i := 0; i < len(s); i++ {
|
||||
c := s[i]
|
||||
switch {
|
||||
case c == '.' && i+1 < len(s) && isASCIILower(s[i+1]):
|
||||
// Skip over '.' in ".{{lowercase}}".
|
||||
case c == '.':
|
||||
b = append(b, '_') // convert '.' to '_'
|
||||
case c == '_' && (i == 0 || s[i-1] == '.'):
|
||||
// Convert initial '_' to ensure we start with a capital letter.
|
||||
// Do the same for '_' after '.' to match historic behavior.
|
||||
b = append(b, 'X') // convert '_' to 'X'
|
||||
case c == '_' && i+1 < len(s) && isASCIILower(s[i+1]):
|
||||
// Skip over '_' in "_{{lowercase}}".
|
||||
case isASCIIDigit(c):
|
||||
b = append(b, c)
|
||||
default:
|
||||
// Assume we have a letter now - if not, it's a bogus identifier.
|
||||
// The next word is a sequence of characters that must start upper case.
|
||||
if isASCIILower(c) {
|
||||
c -= 'a' - 'A' // convert lowercase to uppercase
|
||||
}
|
||||
b = append(b, c)
|
||||
|
||||
// Accept lower case sequence that follows.
|
||||
for ; i+1 < len(s) && isASCIILower(s[i+1]); i++ {
|
||||
b = append(b, s[i+1])
|
||||
}
|
||||
}
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// GoSanitized converts a string to a valid Go identifier.
|
||||
func GoSanitized(s string) string {
|
||||
// Sanitize the input to the set of valid characters,
|
||||
// which must be '_' or be in the Unicode L or N categories.
|
||||
s = strings.Map(func(r rune) rune {
|
||||
if unicode.IsLetter(r) || unicode.IsDigit(r) {
|
||||
return r
|
||||
}
|
||||
return '_'
|
||||
}, s)
|
||||
|
||||
// Prepend '_' in the event of a Go keyword conflict or if
|
||||
// the identifier is invalid (does not start in the Unicode L category).
|
||||
r, _ := utf8.DecodeRuneInString(s)
|
||||
if token.Lookup(s).IsKeyword() || !unicode.IsLetter(r) {
|
||||
return "_" + s
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// JSONCamelCase converts a snake_case identifier to a camelCase identifier,
|
||||
// according to the protobuf JSON specification.
|
||||
func JSONCamelCase(s string) string {
|
||||
var b []byte
|
||||
var wasUnderscore bool
|
||||
for i := 0; i < len(s); i++ { // proto identifiers are always ASCII
|
||||
c := s[i]
|
||||
if c != '_' {
|
||||
if wasUnderscore && isASCIILower(c) {
|
||||
c -= 'a' - 'A' // convert to uppercase
|
||||
}
|
||||
b = append(b, c)
|
||||
}
|
||||
wasUnderscore = c == '_'
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// JSONSnakeCase converts a camelCase identifier to a snake_case identifier,
|
||||
// according to the protobuf JSON specification.
|
||||
func JSONSnakeCase(s string) string {
|
||||
var b []byte
|
||||
for i := 0; i < len(s); i++ { // proto identifiers are always ASCII
|
||||
c := s[i]
|
||||
if isASCIIUpper(c) {
|
||||
b = append(b, '_')
|
||||
c += 'a' - 'A' // convert to lowercase
|
||||
}
|
||||
b = append(b, c)
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// MapEntryName derives the name of the map entry message given the field name.
|
||||
// See protoc v3.8.0: src/google/protobuf/descriptor.cc:254-276,6057
|
||||
func MapEntryName(s string) string {
|
||||
var b []byte
|
||||
upperNext := true
|
||||
for _, c := range s {
|
||||
switch {
|
||||
case c == '_':
|
||||
upperNext = true
|
||||
case upperNext:
|
||||
b = append(b, byte(unicode.ToUpper(c)))
|
||||
upperNext = false
|
||||
default:
|
||||
b = append(b, byte(c))
|
||||
}
|
||||
}
|
||||
b = append(b, "Entry"...)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// EnumValueName derives the camel-cased enum value name.
|
||||
// See protoc v3.8.0: src/google/protobuf/descriptor.cc:297-313
|
||||
func EnumValueName(s string) string {
|
||||
var b []byte
|
||||
upperNext := true
|
||||
for _, c := range s {
|
||||
switch {
|
||||
case c == '_':
|
||||
upperNext = true
|
||||
case upperNext:
|
||||
b = append(b, byte(unicode.ToUpper(c)))
|
||||
upperNext = false
|
||||
default:
|
||||
b = append(b, byte(unicode.ToLower(c)))
|
||||
upperNext = false
|
||||
}
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
// TrimEnumPrefix trims the enum name prefix from an enum value name,
|
||||
// where the prefix is all lowercase without underscores.
|
||||
// See protoc v3.8.0: src/google/protobuf/descriptor.cc:330-375
|
||||
func TrimEnumPrefix(s, prefix string) string {
|
||||
s0 := s // original input
|
||||
for len(s) > 0 && len(prefix) > 0 {
|
||||
if s[0] == '_' {
|
||||
s = s[1:]
|
||||
continue
|
||||
}
|
||||
if unicode.ToLower(rune(s[0])) != rune(prefix[0]) {
|
||||
return s0 // no prefix match
|
||||
}
|
||||
s, prefix = s[1:], prefix[1:]
|
||||
}
|
||||
if len(prefix) > 0 {
|
||||
return s0 // no prefix match
|
||||
}
|
||||
s = strings.TrimLeft(s, "_")
|
||||
if len(s) == 0 {
|
||||
return s0 // avoid returning empty string
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func isASCIILower(c byte) bool {
|
||||
return 'a' <= c && c <= 'z'
|
||||
}
|
||||
func isASCIIUpper(c byte) bool {
|
||||
return 'A' <= c && c <= 'Z'
|
||||
}
|
||||
func isASCIIDigit(c byte) bool {
|
||||
return '0' <= c && c <= '9'
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user