]> Cypherpunks repositories - gostls13.git/commitdiff
weak: don't panic when calling Value on a zero Pointer
authorMichael Anthony Knyszek <mknyszek@google.com>
Tue, 7 Jan 2025 16:01:46 +0000 (16:01 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 7 Jan 2025 18:08:42 +0000 (10:08 -0800)
Currently weak.Pointer.Value will panic if the weak.Pointer is
uninitialized (zero value) which goes against it's documentation. Fix
this and add a test. While we're here, also add a test to ensure
weak.Make[T](nil) is equivalent to the zero value of weak.Pointer[T].

Fixes #71153.

Change-Id: I4d9196026360bc42a5bfcb33ce449131ec251dba
Reviewed-on: https://go-review.googlesource.com/c/go/+/641095
Reviewed-by: David Finkel <david.finkel@gmail.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
src/weak/pointer.go
src/weak/pointer_test.go

index 50af0c2fdc0a16422c5d66232ab0b67cfa657ae7..39c512e76d6fe463a2e341ca925e7e8dd4e5ad3a 100644 (file)
@@ -78,6 +78,9 @@ func Make[T any](ptr *T) Pointer[T] {
 // If a weak pointer points to an object with a finalizer, then Value will
 // return nil as soon as the object's finalizer is queued for execution.
 func (p Pointer[T]) Value() *T {
+       if p.u == nil {
+               return nil
+       }
        return (*T)(runtime_makeStrongFromWeak(p.u))
 }
 
index 002b4130f0b5534f4de4bb1b1edb61b9f20b2967..e0ef30377e9e81cc3952c9938b7a17bccec9a1eb 100644 (file)
@@ -21,6 +21,15 @@ type T struct {
 }
 
 func TestPointer(t *testing.T) {
+       var zero weak.Pointer[T]
+       if zero.Value() != nil {
+               t.Error("Value of zero value of weak.Pointer is not nil")
+       }
+       zeroNil := weak.Make[T](nil)
+       if zeroNil.Value() != nil {
+               t.Error("Value of weak.Make[T](nil) is not nil")
+       }
+
        bt := new(T)
        wt := weak.Make(bt)
        if st := wt.Value(); st != bt {
@@ -41,6 +50,12 @@ func TestPointer(t *testing.T) {
 }
 
 func TestPointerEquality(t *testing.T) {
+       var zero weak.Pointer[T]
+       zeroNil := weak.Make[T](nil)
+       if zero != zeroNil {
+               t.Error("weak.Make[T](nil) != zero value of weak.Pointer[T]")
+       }
+
        bt := make([]*T, 10)
        wt := make([]weak.Pointer[T], 10)
        wo := make([]weak.Pointer[int], 10)