reflect_unsafe.go 3.0 KB

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