runtime: handle GODEBUG on wasip2 (#5312)

* runtime: handle GODEBUG on wasip2
* Support env on more platforms to get GODEBUG working
This commit is contained in:
Jake Bailey
2026-04-18 14:15:47 -07:00
committed by GitHub
parent ddb848816f
commit bcb191c01e
7 changed files with 98 additions and 8 deletions
+1 -1
View File
@@ -488,7 +488,7 @@ TEST_PACKAGES_HOST := $(TEST_PACKAGES_FAST) $(TEST_PACKAGES_WINDOWS)
TEST_IOFS := false
endif
TEST_SKIP_FLAG := -skip='TestExtraMethods|TestParseAndBytesRoundTrip/P256/Generic|TestParseQueryLimits|TestParseStrictIpv6|TestAsValidation'
TEST_SKIP_FLAG := -skip='TestExtraMethods|TestParseAndBytesRoundTrip/P256/Generic|TestAsValidation'
TEST_ADDITIONAL_FLAGS ?=
# Test known-working standard library packages.
+1 -1
View File
@@ -1,4 +1,4 @@
//go:build linux || darwin || windows || wasip1
//go:build (linux || darwin || windows || wasip1) && !wasip2 && !baremetal && !wasm_unknown
package runtime
+43
View File
@@ -0,0 +1,43 @@
//go:build baremetal || js || wasm_unknown
package runtime
//go:linkname syscallSetenv syscall.runtimeSetenv
func syscallSetenv(key, value string) {
entry := key + "=" + value
for i, e := range env {
if envKey(e) == key {
env[i] = entry
if key == "GODEBUG" && godebugUpdate != nil {
godebugUpdate(key, value)
}
return
}
}
env = append(env, entry)
if key == "GODEBUG" && godebugUpdate != nil {
godebugUpdate(key, value)
}
}
//go:linkname syscallUnsetenv syscall.runtimeUnsetenv
func syscallUnsetenv(key string) {
for i, e := range env {
if envKey(e) == key {
env = append(env[:i], env[i+1:]...)
if key == "GODEBUG" && godebugUpdate != nil {
godebugUpdate(key, "")
}
return
}
}
}
func envKey(entry string) string {
for i := 0; i < len(entry); i++ {
if entry[i] == '=' {
return entry[:i]
}
}
return entry
}
+21
View File
@@ -0,0 +1,21 @@
//go:build wasip2
package runtime
// Notify the runtime when environment variables change.
// On wasip2, the environment is managed in Go (no C setenv), but
// internal/godebug still needs to be notified of GODEBUG changes.
//go:linkname syscallSetenv syscall.runtimeSetenv
func syscallSetenv(key, value string) {
if key == "GODEBUG" && godebugUpdate != nil {
godebugUpdate(key, value)
}
}
//go:linkname syscallUnsetenv syscall.runtimeUnsetenv
func syscallUnsetenv(key string) {
if key == "GODEBUG" && godebugUpdate != nil {
godebugUpdate(key, "")
}
}
+26 -6
View File
@@ -28,18 +28,38 @@ func Getenv(key string) (value string, found bool) {
}
func Setenv(key, val string) (err error) {
// stub for now
return ENOSYS
if len(key) == 0 {
return EINVAL
}
for i := 0; i < len(key); i++ {
if key[i] == '=' || key[i] == 0 {
return EINVAL
}
}
for i := 0; i < len(val); i++ {
if val[i] == 0 {
return EINVAL
}
}
runtimeSetenv(key, val)
return nil
}
func Unsetenv(key string) (err error) {
// stub for now
return ENOSYS
runtimeUnsetenv(key)
return nil
}
func Clearenv() (err error) {
// stub for now
return ENOSYS
for _, s := range Environ() {
for j := 0; j < len(s); j++ {
if s[j] == '=' {
Unsetenv(s[:j])
break
}
}
}
return nil
}
func runtime_envs() []string
+2
View File
@@ -43,11 +43,13 @@ func Setenv(key, val string) (err error) {
}
}
libc_envs[key] = val
runtimeSetenv(key, val)
return nil
}
func Unsetenv(key string) (err error) {
delete(libc_envs, key)
runtimeUnsetenv(key)
return nil
}
+4
View File
@@ -176,3 +176,7 @@ type RawSockaddrInet4 struct {
type RawSockaddrInet6 struct {
// stub
}
// These two functions are provided by the runtime.
func runtimeSetenv(key, value string)
func runtimeUnsetenv(key string)