1*88d15eacSSasha Smundak// Copyright 2018, The Go Authors. All rights reserved. 2*88d15eacSSasha Smundak// Use of this source code is governed by a BSD-style 3*88d15eacSSasha Smundak// license that can be found in the LICENSE file. 4*88d15eacSSasha Smundak 5*88d15eacSSasha Smundak//go:build purego 6*88d15eacSSasha Smundak// +build purego 7*88d15eacSSasha Smundak 8*88d15eacSSasha Smundakpackage value 9*88d15eacSSasha Smundak 10*88d15eacSSasha Smundakimport "reflect" 11*88d15eacSSasha Smundak 12*88d15eacSSasha Smundak// Pointer is an opaque typed pointer and is guaranteed to be comparable. 13*88d15eacSSasha Smundaktype Pointer struct { 14*88d15eacSSasha Smundak p uintptr 15*88d15eacSSasha Smundak t reflect.Type 16*88d15eacSSasha Smundak} 17*88d15eacSSasha Smundak 18*88d15eacSSasha Smundak// PointerOf returns a Pointer from v, which must be a 19*88d15eacSSasha Smundak// reflect.Ptr, reflect.Slice, or reflect.Map. 20*88d15eacSSasha Smundakfunc PointerOf(v reflect.Value) Pointer { 21*88d15eacSSasha Smundak // NOTE: Storing a pointer as an uintptr is technically incorrect as it 22*88d15eacSSasha Smundak // assumes that the GC implementation does not use a moving collector. 23*88d15eacSSasha Smundak return Pointer{v.Pointer(), v.Type()} 24*88d15eacSSasha Smundak} 25*88d15eacSSasha Smundak 26*88d15eacSSasha Smundak// IsNil reports whether the pointer is nil. 27*88d15eacSSasha Smundakfunc (p Pointer) IsNil() bool { 28*88d15eacSSasha Smundak return p.p == 0 29*88d15eacSSasha Smundak} 30*88d15eacSSasha Smundak 31*88d15eacSSasha Smundak// Uintptr returns the pointer as a uintptr. 32*88d15eacSSasha Smundakfunc (p Pointer) Uintptr() uintptr { 33*88d15eacSSasha Smundak return p.p 34*88d15eacSSasha Smundak} 35