reflect_unsafe.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //go:build unsafe
  2. // +build unsafe
  3. package protocol
  4. import (
  5. "reflect"
  6. "unsafe"
  7. )
  8. type iface struct {
  9. typ unsafe.Pointer
  10. ptr unsafe.Pointer
  11. }
  12. type slice struct {
  13. ptr unsafe.Pointer
  14. len int
  15. cap int
  16. }
  17. type index uintptr
  18. type _type struct {
  19. ptr unsafe.Pointer
  20. }
  21. func typeOf(x interface{}) _type {
  22. return _type{ptr: ((*iface)(unsafe.Pointer(&x))).typ}
  23. }
  24. func elemTypeOf(x interface{}) _type {
  25. return makeType(reflect.TypeOf(x).Elem())
  26. }
  27. func makeType(t reflect.Type) _type {
  28. return _type{ptr: ((*iface)(unsafe.Pointer(&t))).ptr}
  29. }
  30. type value struct {
  31. ptr unsafe.Pointer
  32. }
  33. func nonAddressableValueOf(x interface{}) value {
  34. return valueOf(x)
  35. }
  36. func valueOf(x interface{}) value {
  37. return value{ptr: ((*iface)(unsafe.Pointer(&x))).ptr}
  38. }
  39. func makeValue(t reflect.Type) value {
  40. return value{ptr: unsafe.Pointer(reflect.New(t).Pointer())}
  41. }
  42. func (v value) bool() bool { return *(*bool)(v.ptr) }
  43. func (v value) int8() int8 { return *(*int8)(v.ptr) }
  44. func (v value) int16() int16 { return *(*int16)(v.ptr) }
  45. func (v value) int32() int32 { return *(*int32)(v.ptr) }
  46. func (v value) int64() int64 { return *(*int64)(v.ptr) }
  47. func (v value) float64() float64 { return *(*float64)(v.ptr) }
  48. func (v value) string() string { return *(*string)(v.ptr) }
  49. func (v value) bytes() []byte { return *(*[]byte)(v.ptr) }
  50. func (v value) iface(t reflect.Type) interface{} {
  51. return *(*interface{})(unsafe.Pointer(&iface{
  52. typ: ((*iface)(unsafe.Pointer(&t))).ptr,
  53. ptr: v.ptr,
  54. }))
  55. }
  56. func (v value) array(t reflect.Type) array {
  57. return array{
  58. size: uintptr(t.Size()),
  59. elem: ((*slice)(v.ptr)).ptr,
  60. len: ((*slice)(v.ptr)).len,
  61. }
  62. }
  63. func (v value) setBool(b bool) { *(*bool)(v.ptr) = b }
  64. func (v value) setInt8(i int8) { *(*int8)(v.ptr) = i }
  65. func (v value) setInt16(i int16) { *(*int16)(v.ptr) = i }
  66. func (v value) setInt32(i int32) { *(*int32)(v.ptr) = i }
  67. func (v value) setInt64(i int64) { *(*int64)(v.ptr) = i }
  68. func (v value) setFloat64(f float64) { *(*float64)(v.ptr) = f }
  69. func (v value) setString(s string) { *(*string)(v.ptr) = s }
  70. func (v value) setBytes(b []byte) { *(*[]byte)(v.ptr) = b }
  71. func (v value) setArray(a array) { *(*slice)(v.ptr) = slice{ptr: a.elem, len: a.len, cap: a.len} }
  72. func (v value) fieldByIndex(i index) value {
  73. return value{ptr: unsafe.Pointer(uintptr(v.ptr) + uintptr(i))}
  74. }
  75. type array struct {
  76. elem unsafe.Pointer
  77. size uintptr
  78. len int
  79. }
  80. var (
  81. emptyArray struct{}
  82. )
  83. func makeArray(t reflect.Type, n int) array {
  84. var elem unsafe.Pointer
  85. var size = uintptr(t.Size())
  86. if n == 0 {
  87. elem = unsafe.Pointer(&emptyArray)
  88. } else {
  89. elem = unsafe_NewArray(((*iface)(unsafe.Pointer(&t))).ptr, n)
  90. }
  91. return array{elem: elem, size: size, len: n}
  92. }
  93. func (a array) index(i int) value {
  94. return value{ptr: unsafe.Pointer(uintptr(a.elem) + (uintptr(i) * a.size))}
  95. }
  96. func (a array) length() int { return a.len }
  97. func (a array) isNil() bool { return a.elem == nil }
  98. func indexOf(s reflect.StructField) index { return index(s.Offset) }
  99. func bytesToString(b []byte) string { return *(*string)(unsafe.Pointer(&b)) }
  100. //go:linkname unsafe_NewArray reflect.unsafe_NewArray
  101. func unsafe_NewArray(rtype unsafe.Pointer, length int) unsafe.Pointer