unsafe_ptr.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package reflect2
  2. import (
  3. "reflect"
  4. "unsafe"
  5. )
  6. type UnsafePtrType struct {
  7. unsafeType
  8. }
  9. func newUnsafePtrType(cfg *frozenConfig, type1 reflect.Type) *UnsafePtrType {
  10. return &UnsafePtrType{
  11. unsafeType: *newUnsafeType(cfg, type1),
  12. }
  13. }
  14. func (type2 *UnsafePtrType) IsNil(obj interface{}) bool {
  15. if obj == nil {
  16. return true
  17. }
  18. objEFace := unpackEFace(obj)
  19. assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype)
  20. return type2.UnsafeIsNil(objEFace.data)
  21. }
  22. func (type2 *UnsafePtrType) UnsafeIsNil(ptr unsafe.Pointer) bool {
  23. if ptr == nil {
  24. return true
  25. }
  26. return *(*unsafe.Pointer)(ptr) == nil
  27. }
  28. func (type2 *UnsafePtrType) LikePtr() bool {
  29. return true
  30. }
  31. func (type2 *UnsafePtrType) Indirect(obj interface{}) interface{} {
  32. objEFace := unpackEFace(obj)
  33. assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype)
  34. return type2.UnsafeIndirect(objEFace.data)
  35. }
  36. func (type2 *UnsafePtrType) UnsafeIndirect(ptr unsafe.Pointer) interface{} {
  37. return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr))
  38. }