Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / github.com / google / go-cmp@v0.5.1 / cmp / export_unsafe.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/github.com/google/go-cmp@v0.5.1/cmp/export_unsafe.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/github.com/google/go-cmp@v0.5.1/cmp/export_unsafe.go
new file mode 100644 (file)
index 0000000..351f1a3
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright 2017, 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.md file.
+
+// +build !purego
+
+package cmp
+
+import (
+       "reflect"
+       "unsafe"
+)
+
+const supportExporters = true
+
+// retrieveUnexportedField uses unsafe to forcibly retrieve any field from
+// a struct such that the value has read-write permissions.
+//
+// The parent struct, v, must be addressable, while f must be a StructField
+// describing the field to retrieve. If addr is false,
+// then the returned value will be shallowed copied to be non-addressable.
+func retrieveUnexportedField(v reflect.Value, f reflect.StructField, addr bool) reflect.Value {
+       ve := reflect.NewAt(f.Type, unsafe.Pointer(uintptr(unsafe.Pointer(v.UnsafeAddr()))+f.Offset)).Elem()
+       if !addr {
+               // A field is addressable if and only if the struct is addressable.
+               // If the original parent value was not addressable, shallow copy the
+               // value to make it non-addressable to avoid leaking an implementation
+               // detail of how forcibly exporting a field works.
+               if ve.Kind() == reflect.Interface && ve.IsNil() {
+                       return reflect.Zero(f.Type)
+               }
+               return reflect.ValueOf(ve.Interface()).Convert(f.Type)
+       }
+       return ve
+}