forked from forgejo/forgejo
Upgrade xorm to v1.2.2 (#16663)
* Upgrade xorm to v1.2.2 * Change the Engine interface to match xorm v1.2.2
This commit is contained in:
parent
5fbccad906
commit
7224cfc578
134 changed files with 42889 additions and 5428 deletions
263
vendor/github.com/goccy/go-json/internal/runtime/rtype.go
generated
vendored
Normal file
263
vendor/github.com/goccy/go-json/internal/runtime/rtype.go
generated
vendored
Normal file
|
@ -0,0 +1,263 @@
|
|||
package runtime
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// Type representing reflect.rtype for noescape trick
|
||||
type Type struct{}
|
||||
|
||||
//go:linkname rtype_Align reflect.(*rtype).Align
|
||||
//go:noescape
|
||||
func rtype_Align(*Type) int
|
||||
|
||||
func (t *Type) Align() int {
|
||||
return rtype_Align(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_FieldAlign reflect.(*rtype).FieldAlign
|
||||
//go:noescape
|
||||
func rtype_FieldAlign(*Type) int
|
||||
|
||||
func (t *Type) FieldAlign() int {
|
||||
return rtype_FieldAlign(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Method reflect.(*rtype).Method
|
||||
//go:noescape
|
||||
func rtype_Method(*Type, int) reflect.Method
|
||||
|
||||
func (t *Type) Method(a0 int) reflect.Method {
|
||||
return rtype_Method(t, a0)
|
||||
}
|
||||
|
||||
//go:linkname rtype_MethodByName reflect.(*rtype).MethodByName
|
||||
//go:noescape
|
||||
func rtype_MethodByName(*Type, string) (reflect.Method, bool)
|
||||
|
||||
func (t *Type) MethodByName(a0 string) (reflect.Method, bool) {
|
||||
return rtype_MethodByName(t, a0)
|
||||
}
|
||||
|
||||
//go:linkname rtype_NumMethod reflect.(*rtype).NumMethod
|
||||
//go:noescape
|
||||
func rtype_NumMethod(*Type) int
|
||||
|
||||
func (t *Type) NumMethod() int {
|
||||
return rtype_NumMethod(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Name reflect.(*rtype).Name
|
||||
//go:noescape
|
||||
func rtype_Name(*Type) string
|
||||
|
||||
func (t *Type) Name() string {
|
||||
return rtype_Name(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_PkgPath reflect.(*rtype).PkgPath
|
||||
//go:noescape
|
||||
func rtype_PkgPath(*Type) string
|
||||
|
||||
func (t *Type) PkgPath() string {
|
||||
return rtype_PkgPath(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Size reflect.(*rtype).Size
|
||||
//go:noescape
|
||||
func rtype_Size(*Type) uintptr
|
||||
|
||||
func (t *Type) Size() uintptr {
|
||||
return rtype_Size(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_String reflect.(*rtype).String
|
||||
//go:noescape
|
||||
func rtype_String(*Type) string
|
||||
|
||||
func (t *Type) String() string {
|
||||
return rtype_String(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Kind reflect.(*rtype).Kind
|
||||
//go:noescape
|
||||
func rtype_Kind(*Type) reflect.Kind
|
||||
|
||||
func (t *Type) Kind() reflect.Kind {
|
||||
return rtype_Kind(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Implements reflect.(*rtype).Implements
|
||||
//go:noescape
|
||||
func rtype_Implements(*Type, reflect.Type) bool
|
||||
|
||||
func (t *Type) Implements(u reflect.Type) bool {
|
||||
return rtype_Implements(t, u)
|
||||
}
|
||||
|
||||
//go:linkname rtype_AssignableTo reflect.(*rtype).AssignableTo
|
||||
//go:noescape
|
||||
func rtype_AssignableTo(*Type, reflect.Type) bool
|
||||
|
||||
func (t *Type) AssignableTo(u reflect.Type) bool {
|
||||
return rtype_AssignableTo(t, u)
|
||||
}
|
||||
|
||||
//go:linkname rtype_ConvertibleTo reflect.(*rtype).ConvertibleTo
|
||||
//go:noescape
|
||||
func rtype_ConvertibleTo(*Type, reflect.Type) bool
|
||||
|
||||
func (t *Type) ConvertibleTo(u reflect.Type) bool {
|
||||
return rtype_ConvertibleTo(t, u)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Comparable reflect.(*rtype).Comparable
|
||||
//go:noescape
|
||||
func rtype_Comparable(*Type) bool
|
||||
|
||||
func (t *Type) Comparable() bool {
|
||||
return rtype_Comparable(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Bits reflect.(*rtype).Bits
|
||||
//go:noescape
|
||||
func rtype_Bits(*Type) int
|
||||
|
||||
func (t *Type) Bits() int {
|
||||
return rtype_Bits(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_ChanDir reflect.(*rtype).ChanDir
|
||||
//go:noescape
|
||||
func rtype_ChanDir(*Type) reflect.ChanDir
|
||||
|
||||
func (t *Type) ChanDir() reflect.ChanDir {
|
||||
return rtype_ChanDir(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_IsVariadic reflect.(*rtype).IsVariadic
|
||||
//go:noescape
|
||||
func rtype_IsVariadic(*Type) bool
|
||||
|
||||
func (t *Type) IsVariadic() bool {
|
||||
return rtype_IsVariadic(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Elem reflect.(*rtype).Elem
|
||||
//go:noescape
|
||||
func rtype_Elem(*Type) reflect.Type
|
||||
|
||||
func (t *Type) Elem() *Type {
|
||||
return Type2RType(rtype_Elem(t))
|
||||
}
|
||||
|
||||
//go:linkname rtype_Field reflect.(*rtype).Field
|
||||
//go:noescape
|
||||
func rtype_Field(*Type, int) reflect.StructField
|
||||
|
||||
func (t *Type) Field(i int) reflect.StructField {
|
||||
return rtype_Field(t, i)
|
||||
}
|
||||
|
||||
//go:linkname rtype_FieldByIndex reflect.(*rtype).FieldByIndex
|
||||
//go:noescape
|
||||
func rtype_FieldByIndex(*Type, []int) reflect.StructField
|
||||
|
||||
func (t *Type) FieldByIndex(index []int) reflect.StructField {
|
||||
return rtype_FieldByIndex(t, index)
|
||||
}
|
||||
|
||||
//go:linkname rtype_FieldByName reflect.(*rtype).FieldByName
|
||||
//go:noescape
|
||||
func rtype_FieldByName(*Type, string) (reflect.StructField, bool)
|
||||
|
||||
func (t *Type) FieldByName(name string) (reflect.StructField, bool) {
|
||||
return rtype_FieldByName(t, name)
|
||||
}
|
||||
|
||||
//go:linkname rtype_FieldByNameFunc reflect.(*rtype).FieldByNameFunc
|
||||
//go:noescape
|
||||
func rtype_FieldByNameFunc(*Type, func(string) bool) (reflect.StructField, bool)
|
||||
|
||||
func (t *Type) FieldByNameFunc(match func(string) bool) (reflect.StructField, bool) {
|
||||
return rtype_FieldByNameFunc(t, match)
|
||||
}
|
||||
|
||||
//go:linkname rtype_In reflect.(*rtype).In
|
||||
//go:noescape
|
||||
func rtype_In(*Type, int) reflect.Type
|
||||
|
||||
func (t *Type) In(i int) reflect.Type {
|
||||
return rtype_In(t, i)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Key reflect.(*rtype).Key
|
||||
//go:noescape
|
||||
func rtype_Key(*Type) reflect.Type
|
||||
|
||||
func (t *Type) Key() *Type {
|
||||
return Type2RType(rtype_Key(t))
|
||||
}
|
||||
|
||||
//go:linkname rtype_Len reflect.(*rtype).Len
|
||||
//go:noescape
|
||||
func rtype_Len(*Type) int
|
||||
|
||||
func (t *Type) Len() int {
|
||||
return rtype_Len(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_NumField reflect.(*rtype).NumField
|
||||
//go:noescape
|
||||
func rtype_NumField(*Type) int
|
||||
|
||||
func (t *Type) NumField() int {
|
||||
return rtype_NumField(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_NumIn reflect.(*rtype).NumIn
|
||||
//go:noescape
|
||||
func rtype_NumIn(*Type) int
|
||||
|
||||
func (t *Type) NumIn() int {
|
||||
return rtype_NumIn(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_NumOut reflect.(*rtype).NumOut
|
||||
//go:noescape
|
||||
func rtype_NumOut(*Type) int
|
||||
|
||||
func (t *Type) NumOut() int {
|
||||
return rtype_NumOut(t)
|
||||
}
|
||||
|
||||
//go:linkname rtype_Out reflect.(*rtype).Out
|
||||
//go:noescape
|
||||
func rtype_Out(*Type, int) reflect.Type
|
||||
|
||||
//go:linkname PtrTo reflect.(*rtype).ptrTo
|
||||
//go:noescape
|
||||
func PtrTo(*Type) *Type
|
||||
|
||||
func (t *Type) Out(i int) reflect.Type {
|
||||
return rtype_Out(t, i)
|
||||
}
|
||||
|
||||
//go:linkname IfaceIndir reflect.ifaceIndir
|
||||
//go:noescape
|
||||
func IfaceIndir(*Type) bool
|
||||
|
||||
//go:linkname RType2Type reflect.toType
|
||||
//go:noescape
|
||||
func RType2Type(t *Type) reflect.Type
|
||||
|
||||
//go:nolint structcheck
|
||||
type emptyInterface struct {
|
||||
_ *Type
|
||||
ptr unsafe.Pointer
|
||||
}
|
||||
|
||||
func Type2RType(t reflect.Type) *Type {
|
||||
return (*Type)(((*emptyInterface)(unsafe.Pointer(&t))).ptr)
|
||||
}
|
87
vendor/github.com/goccy/go-json/internal/runtime/struct_field.go
generated
vendored
Normal file
87
vendor/github.com/goccy/go-json/internal/runtime/struct_field.go
generated
vendored
Normal file
|
@ -0,0 +1,87 @@
|
|||
package runtime
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
func getTag(field reflect.StructField) string {
|
||||
return field.Tag.Get("json")
|
||||
}
|
||||
|
||||
func IsIgnoredStructField(field reflect.StructField) bool {
|
||||
if field.PkgPath != "" {
|
||||
if field.Anonymous {
|
||||
if !(field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct) && field.Type.Kind() != reflect.Struct {
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
// private field
|
||||
return true
|
||||
}
|
||||
}
|
||||
tag := getTag(field)
|
||||
return tag == "-"
|
||||
}
|
||||
|
||||
type StructTag struct {
|
||||
Key string
|
||||
IsTaggedKey bool
|
||||
IsOmitEmpty bool
|
||||
IsString bool
|
||||
Field reflect.StructField
|
||||
}
|
||||
|
||||
type StructTags []*StructTag
|
||||
|
||||
func (t StructTags) ExistsKey(key string) bool {
|
||||
for _, tt := range t {
|
||||
if tt.Key == key {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func isValidTag(s string) bool {
|
||||
if s == "" {
|
||||
return false
|
||||
}
|
||||
for _, c := range s {
|
||||
switch {
|
||||
case strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", c):
|
||||
// Backslash and quote chars are reserved, but
|
||||
// otherwise any punctuation chars are allowed
|
||||
// in a tag name.
|
||||
case !unicode.IsLetter(c) && !unicode.IsDigit(c):
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func StructTagFromField(field reflect.StructField) *StructTag {
|
||||
keyName := field.Name
|
||||
tag := getTag(field)
|
||||
st := &StructTag{Field: field}
|
||||
opts := strings.Split(tag, ",")
|
||||
if len(opts) > 0 {
|
||||
if opts[0] != "" && isValidTag(opts[0]) {
|
||||
keyName = opts[0]
|
||||
st.IsTaggedKey = true
|
||||
}
|
||||
}
|
||||
st.Key = keyName
|
||||
if len(opts) > 1 {
|
||||
for _, opt := range opts[1:] {
|
||||
switch opt {
|
||||
case "omitempty":
|
||||
st.IsOmitEmpty = true
|
||||
case "string":
|
||||
st.IsString = true
|
||||
}
|
||||
}
|
||||
}
|
||||
return st
|
||||
}
|
100
vendor/github.com/goccy/go-json/internal/runtime/type.go
generated
vendored
Normal file
100
vendor/github.com/goccy/go-json/internal/runtime/type.go
generated
vendored
Normal file
|
@ -0,0 +1,100 @@
|
|||
package runtime
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type SliceHeader struct {
|
||||
Data unsafe.Pointer
|
||||
Len int
|
||||
Cap int
|
||||
}
|
||||
|
||||
const (
|
||||
maxAcceptableTypeAddrRange = 1024 * 1024 * 2 // 2 Mib
|
||||
)
|
||||
|
||||
type TypeAddr struct {
|
||||
BaseTypeAddr uintptr
|
||||
MaxTypeAddr uintptr
|
||||
AddrRange uintptr
|
||||
AddrShift uintptr
|
||||
}
|
||||
|
||||
var (
|
||||
typeAddr *TypeAddr
|
||||
alreadyAnalyzed bool
|
||||
)
|
||||
|
||||
//go:linkname typelinks reflect.typelinks
|
||||
func typelinks() ([]unsafe.Pointer, [][]int32)
|
||||
|
||||
//go:linkname rtypeOff reflect.rtypeOff
|
||||
func rtypeOff(unsafe.Pointer, int32) unsafe.Pointer
|
||||
|
||||
func AnalyzeTypeAddr() *TypeAddr {
|
||||
defer func() {
|
||||
alreadyAnalyzed = true
|
||||
}()
|
||||
if alreadyAnalyzed {
|
||||
return typeAddr
|
||||
}
|
||||
sections, offsets := typelinks()
|
||||
if len(sections) != 1 {
|
||||
return nil
|
||||
}
|
||||
if len(offsets) != 1 {
|
||||
return nil
|
||||
}
|
||||
section := sections[0]
|
||||
offset := offsets[0]
|
||||
var (
|
||||
min uintptr = uintptr(^uint(0))
|
||||
max uintptr = 0
|
||||
isAligned64 = true
|
||||
isAligned32 = true
|
||||
)
|
||||
for i := 0; i < len(offset); i++ {
|
||||
typ := (*Type)(rtypeOff(section, offset[i]))
|
||||
addr := uintptr(unsafe.Pointer(typ))
|
||||
if min > addr {
|
||||
min = addr
|
||||
}
|
||||
if max < addr {
|
||||
max = addr
|
||||
}
|
||||
if typ.Kind() == reflect.Ptr {
|
||||
addr = uintptr(unsafe.Pointer(typ.Elem()))
|
||||
if min > addr {
|
||||
min = addr
|
||||
}
|
||||
if max < addr {
|
||||
max = addr
|
||||
}
|
||||
}
|
||||
isAligned64 = isAligned64 && (addr-min)&63 == 0
|
||||
isAligned32 = isAligned32 && (addr-min)&31 == 0
|
||||
}
|
||||
addrRange := max - min
|
||||
if addrRange == 0 {
|
||||
return nil
|
||||
}
|
||||
var addrShift uintptr
|
||||
if isAligned64 {
|
||||
addrShift = 6
|
||||
} else if isAligned32 {
|
||||
addrShift = 5
|
||||
}
|
||||
cacheSize := addrRange >> addrShift
|
||||
if cacheSize > maxAcceptableTypeAddrRange {
|
||||
return nil
|
||||
}
|
||||
typeAddr = &TypeAddr{
|
||||
BaseTypeAddr: min,
|
||||
MaxTypeAddr: max,
|
||||
AddrRange: addrRange,
|
||||
AddrShift: addrShift,
|
||||
}
|
||||
return typeAddr
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue