diff --git a/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs b/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs index b2cc19b9f5e83d9225c7b6acf4c8588e720ce140..46f5b6deac5b802830f08feae79c0cbdaec0dd84 100644 --- a/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs +++ b/libraries/ghc-internal/src/GHC/Internal/Wasm/Prim/Types.hs @@ -82,7 +82,7 @@ newtype JSVal# = JSVal# (Any :: UnliftedType) data JSVal - = forall a . JSVal JSVal# (Weak# JSVal#) (StablePtr# a) + = forall a . JSVal JSVal# (Weak# JSVal) (StablePtr# a) freeJSVal :: JSVal -> IO () freeJSVal v@(JSVal _ w sp) = do diff --git a/rts/wasm/JSFFI.c b/rts/wasm/JSFFI.c index 56e260d95004b2a00bcd82ea1c4f1b9ac7d04fbc..ba824200021f3867a5e67ca3ad8d16e8ad09613e 100644 --- a/rts/wasm/JSFFI.c +++ b/rts/wasm/JSFFI.c @@ -107,7 +107,6 @@ HaskellObj rts_mkJSVal(Capability *cap, HsJSVal v) { SET_HDR(w, &stg_WEAK_info, CCS_SYSTEM); w->cfinalizers = (StgClosure *)cfin; w->key = p; - w->value = Unit_closure; w->finalizer = &stg_NO_FINALIZER_closure; w->link = cap->weak_ptr_list_hd; cap->weak_ptr_list_hd = w; @@ -120,7 +119,9 @@ HaskellObj rts_mkJSVal(Capability *cap, HsJSVal v) { box->payload[0] = p; box->payload[1] = (HaskellObj)w; box->payload[2] = NULL; - return TAG_CLOSURE(1, box); + + w->value = TAG_CLOSURE(1, box); + return w->value; } __attribute__((import_module("ghc_wasm_jsffi"), import_name("getJSVal"))) diff --git a/testsuite/tests/jsffi/jsffigc.hs b/testsuite/tests/jsffi/jsffigc.hs index a7427cad17c1700769d55c6be2980f288d4a2d53..f260e10f6eb292157e15d61c3cf5680cf3107068 100644 --- a/testsuite/tests/jsffi/jsffigc.hs +++ b/testsuite/tests/jsffi/jsffigc.hs @@ -27,7 +27,7 @@ foreign export javascript "testDynExportFree sync" -- JSVal#. Do not use this in your own codebase since this is purely -- an implementation detail of JSVal and subject to change! jsvalWeak :: JSVal -> Weak JSVal -jsvalWeak (JSVal _ w _) = Weak $ unsafeCoerce# Weak w +jsvalWeak (JSVal _ w _) = Weak w probeWeak :: Weak v -> IO () probeWeak wk = print =<< isJust <$> deRefWeak wk