Skip to content

Commit 2dd3f12

Browse files
committed
[wasm] Json.output improvements
Make it work with native ints and JavaScript values
1 parent 70aac7f commit 2dd3f12

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
lines changed

lib/js_of_ocaml/json.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,15 @@ let rec write b v =
9494
then
9595
match custom_identifier v with
9696
| "_i" -> Printf.bprintf b "%ld" (Obj.obj v : int32)
97+
| "_n" -> Printf.bprintf b "%nd" (Obj.obj v : nativeint)
9798
| "_j" ->
9899
let i : int64 = Obj.obj v in
99100
write_int64 b i
100101
| id -> failwith (Printf.sprintf "Json.output: unsupported custom value %s " id)
102+
else if t = Obj.abstract_tag
103+
then
104+
(* Presumably a JavaScript value *)
105+
Buffer.add_string b (Js.to_string (Unsafe.global##._JSON##stringify v))
101106
else failwith (Printf.sprintf "Json.output: unsupported tag %d " t)
102107

103108
let to_json v =

lib/tests/gen-rules/gen.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ type enabled_if =
5555
let enabled_if = function
5656
| "test_sys" -> GE5
5757
| "test_fun_call" -> No_effects_not_wasm
58-
| "test_json" | "test_poly_compare" -> Not_wasm
58+
| "test_poly_compare" -> Not_wasm
5959
| _ -> Any
6060

6161
let () =

lib/tests/test_json.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,10 @@ let%expect_test _ =
6161
[%expect {| [254,1,2,3] |}];
6262
round_trip 2n;
6363
[%expect {| 2 |}]
64+
65+
let%expect_test "JavaScript object" =
66+
let x = object%js val x = 1 val y = Js.string "abcd" end in
67+
let s = Json.output x in
68+
let s1 = Js.to_string s in
69+
Printf.printf "%s\n" s1;
70+
[%expect {| {"x":1,"y":"abcd"} |}]

0 commit comments

Comments
 (0)