@@ -309,8 +309,15 @@ let value v =
309
309
| Num n -> [Const (n @@ v.at) @@ v.at]
310
310
| Vec s -> [VecConst (s @@ v.at) @@ v.at]
311
311
| Ref (NullRef ht ) -> [RefNull (Match. bot_of_heap_type [] ht) @@ v.at]
312
+ | Ref (HostRef n ) ->
313
+ [ Const (I32 n @@ v.at) @@ v.at;
314
+ Call (hostref_idx @@ v.at) @@ v.at;
315
+ ]
312
316
| Ref (Extern. ExternRef (HostRef n )) ->
313
- [Const (I32 n @@ v.at) @@ v.at; Call (hostref_idx @@ v.at) @@ v.at]
317
+ [ Const (I32 n @@ v.at) @@ v.at;
318
+ Call (hostref_idx @@ v.at) @@ v.at;
319
+ ExternConvert Externalize @@ v.at;
320
+ ]
314
321
| Ref _ -> assert false
315
322
316
323
let invoke ft vs at =
@@ -357,6 +364,7 @@ let rec type_of_result res =
357
364
) (List. hd ts) ts
358
365
359
366
let assert_return ress ts at =
367
+ let locals = ref [] in
360
368
let rec test (res , t ) =
361
369
if
362
370
not (
@@ -436,10 +444,17 @@ let assert_return ress ts at =
436
444
[ RefIsNull @@ at;
437
445
Test (Value. I32 I32Op. Eqz ) @@ at;
438
446
BrIf (0l @@ at) @@ at ]
439
- | RefResult (RefPat {it = (HostRef n | Extern. ExternRef (HostRef n )); _} ) ->
447
+ | RefResult (RefPat {it = HostRef n ; _} ) ->
448
+ [ Const (Value. I32 n @@ at) @@ at;
449
+ Call (hostref_idx @@ at) @@ at;
450
+ Call (eq_ref_idx @@ at) @@ at;
451
+ Test (Value. I32 I32Op. Eqz ) @@ at;
452
+ BrIf (0l @@ at) @@ at ]
453
+ | RefResult (RefPat {it = Extern. ExternRef (HostRef n ); _} ) ->
440
454
[ Const (Value. I32 n @@ at) @@ at;
441
455
Call (hostref_idx @@ at) @@ at;
442
- Call (eq_ref_idx @@ at) @@ at;
456
+ ExternConvert Externalize @@ at;
457
+ Call (eq_ref_idx @@ at) @@ at;
443
458
Test (Value. I32 I32Op. Eqz ) @@ at;
444
459
BrIf (0l @@ at) @@ at ]
445
460
| RefResult (RefPat _ ) ->
@@ -455,17 +470,21 @@ let assert_return ress ts at =
455
470
Test (I32 I32Op. Eqz ) @@ at;
456
471
BrIf (0l @@ at) @@ at ]
457
472
| EitherResult ress ->
458
- [ Block (ValBlockType None ,
473
+ let idx = Lib.List32. length ! locals in
474
+ locals := ! locals @ [{ltype = t} @@ res.at];
475
+ [ LocalSet (idx @@ res.at) @@ res.at;
476
+ Block (ValBlockType None ,
459
477
List. map (fun resI ->
460
478
Block (ValBlockType None ,
479
+ [LocalGet (idx @@ resI.at) @@ resI.at] @
461
480
test (resI, t) @
462
481
[Br (1l @@ resI.at) @@ resI.at]
463
482
) @@ resI.at
464
483
) ress @
465
484
[Br (1l @@ at) @@ at]
466
485
) @@ at
467
486
]
468
- in [] , List. flatten (List. rev_map test (List. combine ress ts))
487
+ in ! locals , List. flatten (List. rev_map test (List. combine ress ts))
469
488
470
489
let i32 = NumT I32T
471
490
let anyref = RefT (Null , AnyHT )
@@ -504,12 +523,20 @@ let wrap item_name wrap_action wrap_assertion at =
504
523
in
505
524
let funcs = [{ftype = 0l @@ at; locals; body} @@ at] in
506
525
let m = {empty_module with types; funcs; imports; exports} @@ at in
526
+ (try
527
+ Valid. check_module m; (* sanity check *)
528
+ with Valid. Invalid _ as exn ->
529
+ prerr_endline (string_of_region at ^
530
+ " : internal error in JS converter, invalid wrapper module generated:" );
531
+ Sexpr. output stderr 80 (Arrange. module_ m);
532
+ raise exn
533
+ );
507
534
Encode. encode m
508
535
509
536
510
537
let is_js_num_type = function
511
- | I32T -> true
512
- | I64T | F32T | F64T -> false
538
+ | I32T | I64T -> true
539
+ | F32T | F64T -> false
513
540
514
541
let is_js_vec_type = function
515
542
| _ -> false
@@ -569,7 +596,7 @@ let of_num n =
569
596
let open Value in
570
597
match n with
571
598
| I32 i -> I32. to_string_s i
572
- | I64 i -> " int64( \" " ^ I64. to_string_s i ^ " \" ) "
599
+ | I64 i -> I64. to_string_s i ^ " n "
573
600
| F32 z -> of_float (F32. to_float z)
574
601
| F64 z -> of_float (F64. to_float z)
575
602
0 commit comments