diff --git a/main_test.go b/main_test.go index 17b2b5a572..a42afd2ee5 100644 --- a/main_test.go +++ b/main_test.go @@ -108,6 +108,7 @@ func TestBuild(t *testing.T) { } if minor >= 24 { tests = append(tests, "typealias.go") + tests = append(tests, "weak.go") } if *testTarget != "" { diff --git a/src/runtime/runtime.go b/src/runtime/runtime.go index 6ad14fe101..2a8b016731 100644 --- a/src/runtime/runtime.go +++ b/src/runtime/runtime.go @@ -139,6 +139,13 @@ func registerWeakPointer(ptr unsafe.Pointer) unsafe.Pointer { return ptr } +//go:linkname makeStrongFromWeak weak.runtime_makeStrongFromWeak +func makeStrongFromWeak(ptr unsafe.Pointer) unsafe.Pointer { + // Weak pointers are not weak here. registerWeakPointer above returns the + // pointer that it got, so the value stays and this is the identity too. + return ptr +} + var godebugUpdate func(string, string) //go:linkname godebug_setUpdate internal/godebug.setUpdate diff --git a/testdata/weak.go b/testdata/weak.go new file mode 100644 index 0000000000..0cc6d79e85 --- /dev/null +++ b/testdata/weak.go @@ -0,0 +1,21 @@ +package main + +import ( + "runtime" + "weak" +) + +type value struct { + n int +} + +func main() { + v := &value{n: 42} + p := weak.Make(v) + if got := p.Value(); got == nil { + println("weak pointer lost its value") + } else { + println("weak value:", got.n) + } + runtime.KeepAlive(v) +} diff --git a/testdata/weak.txt b/testdata/weak.txt new file mode 100644 index 0000000000..e89078851e --- /dev/null +++ b/testdata/weak.txt @@ -0,0 +1 @@ +weak value: 42