Skip to content

Commit 6aac869

Browse files
committed
Update to new JavaScript-Promise Integration API
1 parent 7bfec53 commit 6aac869

File tree

4 files changed

+23
-60
lines changed

4 files changed

+23
-60
lines changed

.github/workflows/build-wasm_of_ocaml.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
- name: Install node
4343
uses: actions/setup-node@v4
4444
with:
45-
node-version: 22
45+
node-version: 23
4646

4747
- name: Restore cached binaryen
4848
id: cache-binaryen

compiler/lib-wasm/gc_target.ml

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,26 +1703,23 @@ let handle_exceptions ~result_typ ~fall_through ~context body x exn_handler =
17031703
let post_process_function_body = Initialize_locals.f
17041704

17051705
let entry_point ~toplevel_fun =
1706-
let suspender = Code.Var.fresh () in
17071706
let code =
1708-
let* f =
1709-
register_import
1710-
~name:
1711-
(if Config.Flag.effects ()
1712-
then "caml_cps_initialize_effects"
1713-
else "caml_initialize_effects")
1714-
(Fun { W.params = [ W.Ref { nullable = true; typ = Extern } ]; result = [] })
1707+
let* () =
1708+
if Config.Flag.effects ()
1709+
then
1710+
let* f =
1711+
register_import
1712+
~name:"caml_cps_initialize_effects"
1713+
(Fun { W.params = []; result = [] })
1714+
in
1715+
instr (W.CallInstr (f, []))
1716+
else return ()
17151717
in
1716-
let* _ = add_var suspender in
1717-
let* s = load suspender in
1718-
let* () = instr (W.CallInstr (f, [ s ])) in
17191718
let* main =
17201719
register_import
17211720
~name:"caml_main"
17221721
(Fun { params = [ W.Ref { nullable = false; typ = Func } ]; result = [] })
17231722
in
17241723
instr (W.CallInstr (main, [ RefFunc toplevel_fun ]))
17251724
in
1726-
( { W.params = [ W.Ref { nullable = true; typ = Extern } ]; result = [] }
1727-
, [ suspender ]
1728-
, code )
1725+
{ W.params = []; result = [] }, [], code

runtime/wasm/effect.wat

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@
3333
(import "bindings" "start_fiber" (func $start_fiber (param (ref eq))))
3434
(import "bindings" "suspend_fiber"
3535
(func $suspend_fiber
36-
(param externref) (param $f funcref) (param $env eqref)
37-
(result eqref)))
36+
(param $f funcref) (param $env eqref) (result anyref)))
3837
(import "bindings" "resume_fiber"
3938
(func $resume_fiber (param externref) (param (ref eq))))
4039

@@ -60,9 +59,6 @@
6059

6160
;; Low-level primitives
6261

63-
(global $current_suspender (export "current_suspender") (mut externref)
64-
(ref.null extern))
65-
6662
;; Capturing the current continuation
6763

6864
(type $cont_func (func (param (ref $pair)) (param (ref eq))))
@@ -102,7 +98,6 @@
10298
(return_call $apply_pair
10399
(ref.cast (ref $pair)
104100
(call $suspend_fiber
105-
(global.get $current_suspender)
106101
(ref.func $apply_continuation)
107102
(struct.new $thunk (local.get $f) (local.get $v))))))
108103

@@ -121,7 +116,6 @@
121116
(struct
122117
(field $handlers (mut (ref $handlers)))
123118
(field $cont (ref $cont))
124-
(field $suspender externref)
125119
(field $next (ref null $fiber)))))
126120

127121
(data $effect_unhandled "Effect.Unhandled")
@@ -178,7 +172,6 @@
178172
(ref.func $dummy_fun)
179173
(ref.func $uncaught_effect_handler)))
180174
(struct.new $cont (ref.func $default_continuation))
181-
(ref.null extern)
182175
(ref.null $fiber)))
183176

184177
;; Utility functions moving fibers between a continuation and the
@@ -189,8 +182,6 @@
189182
(local.set $f (ref.as_non_null (global.get $stack)))
190183
(global.set $stack
191184
(struct.get $fiber $next (local.get $f)))
192-
(global.set $current_suspender
193-
(struct.get $fiber $suspender (local.get $f)))
194185
(struct.get $fiber $cont (local.get $f)))
195186

196187
(func $push_stack
@@ -202,10 +193,7 @@
202193
(struct.new $fiber
203194
(struct.get $fiber $handlers (local.get $stack))
204195
(local.get $k)
205-
(global.get $current_suspender)
206196
(global.get $stack)))
207-
(global.set $current_suspender
208-
(struct.get $fiber $suspender (local.get $stack)))
209197
(local.set $k
210198
(struct.get $fiber $cont (local.get $stack)))
211199
(local.set $stack
@@ -292,7 +280,6 @@
292280
(struct.new $fiber
293281
(struct.get $fiber $handlers (global.get $stack))
294282
(local.get $k0)
295-
(global.get $current_suspender)
296283
(if (result (ref null $fiber))
297284
(ref.test (ref $fiber) (local.get $next_fiber))
298285
(then (ref.cast (ref $fiber) (local.get $next_fiber)))
@@ -331,12 +318,10 @@
331318
(local.tee $cont (call $pop_fiber))
332319
(struct.get $cont $cont_func (local.get $cont))))
333320

334-
(func (export "caml_start_fiber")
335-
(param $suspender externref) (param $p eqref)
321+
(func (export "caml_start_fiber") (param $p eqref)
336322
;; Start executing some code in a new fiber
337323
(local $exn (ref eq))
338324
(local $res (ref eq))
339-
(global.set $current_suspender (local.get $suspender))
340325
(local.set $res
341326
(try (result (ref eq))
342327
(do
@@ -366,7 +351,6 @@
366351
(struct.new $fiber
367352
(struct.new $handlers (local.get $hv) (local.get $hx) (local.get $hf))
368353
(struct.new $cont (ref.func $initial_cont))
369-
(ref.null extern)
370354
(ref.null $fiber)))
371355

372356
;; Other functions
@@ -414,9 +398,6 @@
414398
(ref.i31 (global.get $cont_tag))))))
415399
(i32.const 0))
416400

417-
(func (export "caml_initialize_effects") (param $s externref)
418-
(global.set $current_suspender (local.get $s)))
419-
420401
;; Effects through CPS transformation
421402

422403
(type $function_2
@@ -749,6 +730,6 @@
749730
(local.get $ms)))
750731
(call $raise_unhandled (local.get $eff) (ref.i31 (i32.const 0))))
751732

752-
(func (export "caml_cps_initialize_effects") (param externref)
733+
(func (export "caml_cps_initialize_effects")
753734
(global.set $caml_trampoline_ref (ref.func $caml_trampoline)))
754735
)

runtime/wasm/runtime.js

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,11 @@
111111

112112
var start_fiber;
113113

114-
function wrap_fun(t, f, a) {
115-
// Don't wrap if js-promise-integration is not enabled
116-
// There is no way to check this without calling WebAssembly.Function
117-
try {
118-
return new WebAssembly.Function(t, f, a);
119-
} catch (e) {
120-
return f;
121-
}
114+
function make_suspending(f) {
115+
return WebAssembly?.Suspending ? new WebAssembly.Suspending(f) : f;
116+
}
117+
function make_promising(f) {
118+
return WebAssembly?.promising && f ? WebAssembly.promising(f) : f;
122119
}
123120

124121
const decoder = new TextDecoder("utf-8", { ignoreBOM: 1 });
@@ -445,11 +442,7 @@
445442
throw e;
446443
},
447444
start_fiber: (x) => start_fiber(x),
448-
suspend_fiber: wrap_fun(
449-
{ parameters: ["externref", "funcref", "eqref"], results: ["eqref"] },
450-
(f, env) => new Promise((k) => f(k, env)),
451-
{ suspending: "first" },
452-
),
445+
suspend_fiber: make_suspending((f, env) => new Promise((k) => f(k, env))),
453446
resume_fiber: (k, v) => k(v),
454447
weak_new: (v) => new WeakRef(v),
455448
weak_deref: (w) => {
@@ -553,16 +546,8 @@
553546
var buffer = caml_buffer?.buffer;
554547
var out_buffer = buffer && new Uint8Array(buffer, 0, buffer.length);
555548

556-
start_fiber = wrap_fun(
557-
{ parameters: ["eqref"], results: ["externref"] },
558-
caml_start_fiber,
559-
{ promising: "first" },
560-
);
561-
var _initialize = wrap_fun(
562-
{ parameters: [], results: ["externref"] },
563-
_initialize,
564-
{ promising: "first" },
565-
);
549+
start_fiber = make_promising(caml_start_fiber);
550+
var _initialize = make_promising(_initialize);
566551
var process = globalThis.process;
567552
if (process && process.on) {
568553
process.on("uncaughtException", (err, origin) =>

0 commit comments

Comments
 (0)