Skip to content

runtime: implement weak.runtime_makeStrongFromWeak - #5633

Open
yohimik wants to merge 1 commit into
tinygo-org:devfrom
yohimik:upstream-pr/weak-strong-from-weak
Open

runtime: implement weak.runtime_makeStrongFromWeak#5633
yohimik wants to merge 1 commit into
tinygo-org:devfrom
yohimik:upstream-pr/weak-strong-from-weak

Conversation

@yohimik

@yohimik yohimik commented Aug 30, 2026

Copy link
Copy Markdown

runtime: implement weak.runtime_makeStrongFromWeak

What this does

The runtime has weak.runtime_registerWeakPointer but not its counterpart, so a
program that reads a weak pointer back does not link. The missing function is 7
lines.

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.

Evidence

testdata/weak.go makes a weak pointer and reads it back. It is registered in
TestBuild under the minor >= 24 gate, because the weak package came with
Go 1.24.

Measured on macOS 26.6 arm64.

Build Result
current dev link error, weak/pointer.go:89: linker could not find symbol _weak.runtime_makeStrongFromWeak
with this change weak value: 42

The program also builds for cortex-m-qemu, riscv-qemu and simavr.

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/tls uses weak.Pointer for its certificate cache, so this is a
prerequisite for the standard library crypto/tls on any target. Any user
program that uses weak hits the same link error today.

Scope

  • One new function in src/runtime/runtime.go. No API change, no behaviour
    change for a program that does not use weak.

Related pull requests

This change is part of one body of work. Together the changes make programs that use the network and child processes work on hosted linux and macOS. A full CLI was tested end to end with all of them and ships binaries built this way, see dispat v1.4.0 in the evidence section.

In this repository

In tinygo-org/net

A merge order that works. The three bug fixes are independent. #5633 goes before #5635. HTTPS on linux needs only #5633 and #5635. Full darwin support also needs #5636, the net changes and a new src/net submodule pin.

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
yohimik force-pushed the upstream-pr/weak-strong-from-weak branch from 1388449 to 931c476 Compare September 2, 2026 08:50
@yohimik

yohimik commented Sep 2, 2026

Copy link
Copy Markdown
Author

Rebased on dev after the 0.42.0 release. The change applies on top of v0.42.0
as released without a conflict, and the diff is unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant