runtime: implement weak.runtime_makeStrongFromWeak - #5633
Open
yohimik wants to merge 1 commit into
Open
Conversation
This was referenced Aug 30, 2026
The runtime had weak.runtime_registerWeakPointer but not its counterpart, so a program that reads a weak pointer back did not link. crypto/tls does this in the certificate cache that it keeps behind a weak.Pointer. Weak pointers are not weak here. registerWeakPointer returns the pointer that it got, so the value it refers to stays and the way back to a strong pointer is the identity too. weak.Pointer.Value thus never reports a collected value, which the documented contract permits. testdata/weak.go does not link on the current dev branch and prints the expected value with this change.
yohimik
force-pushed
the
upstream-pr/weak-strong-from-weak
branch
from
September 2, 2026 08:50
1388449 to
931c476
Compare
Author
|
Rebased on dev after the 0.42.0 release. The change applies on top of v0.42.0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
runtime: implement weak.runtime_makeStrongFromWeak
What this does
The runtime has
weak.runtime_registerWeakPointerbut not its counterpart, so aprogram that reads a weak pointer back does not link. The missing function is 7
lines.
Weak pointers are not weak here.
registerWeakPointerreturns the pointer thatit got, so the value it refers to stays and the way back to a strong pointer is
the identity too.
weak.Pointer.Valuethus never reports a collected value,which the documented contract permits.
Evidence
testdata/weak.gomakes a weak pointer and reads it back. It is registered inTestBuildunder theminor >= 24gate, because theweakpackage came withGo 1.24.
Measured on macOS 26.6 arm64.
weak/pointer.go:89: linker could not find symbol _weak.runtime_makeStrongFromWeakweak value: 42The program also builds for
cortex-m-qemu,riscv-qemuandsimavr.A downstream product also ships binaries built with a fork that carries this
change, in the published release dispat v1.4.0.
https://github.com/yohimik/dispat/releases/tag/services%2Fdispat%2Fv1.4.0
Why it matters
crypto/tlsusesweak.Pointerfor its certificate cache, so this is aprerequisite for the standard library
crypto/tlson any target. Any userprogram that uses
weakhits the same link error today.Scope
src/runtime/runtime.go. No API change, no behaviourchange for a program that does not use
weak.Related pull requests
Each open PR in this series has a separate change. A dependency is not a copied commit.
In tinygo-org/net
Full Darwin networking also needs the merged net changes and a later src/net pin update. No upstream merge or current full-suite pass is implied by this list.
Additional independent gaps found in Crier are covered by #5655 (cookie-jar loader merge) and tinygo-org/net#82 (ListenConfig). They do not duplicate the process, TLS, deadline or server-TLS changes above. Current Crier comparison work is separate from its standard-Go release.
Current Crier evidence
The Crier report separates the original size comparison from a new CI-built candidate test. The original stripped Linux ARM64 result is 13,829,248 bytes versus Go's 30,277,794 bytes. Two render fixtures exceed pixel tolerance.
Candidate
e7d34c8c126e0eecd2ce711915f2f88d112d833a, with net0f460803, passed all 24 fork CI checks. Its downloaded compiler artifacts, with no source overlays, build unchanged Crier7edaff9. Linux ARM64 E2E passed 143 cases with no failures or skips. Darwin ARM64 passed 142 with no failures and one platform trust-store skip. Darwin startup now works. A separate Darwin local-TLS matrix passes certificate rejection, plaintext refusal, update to a Go 1.1.0 target, and offline rollback. Both platforms pass spawn, signal, cookiejar, os/fcntl, and network probes.These are combined-candidate results, not proof that this PR alone supplies all features. No new pixel or stripped-size comparison, amd64 execution, or current Dispat acceptance is claimed. WaitDelay and the recorded net limits remain open. No fork release was published.