@live-codes/ocaml 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +220 -0
  2. package/README.md +165 -2
  3. package/THIRD-PARTY-NOTICES.md +52 -0
  4. package/assets/compiler/compile_stdout.browser.js +27856 -0
  5. package/assets/compiler/jsoo.js +12631 -0
  6. package/assets/compiler/package.json +3 -0
  7. package/assets/compiler/runtime/bigarray.js +1072 -0
  8. package/assets/compiler/runtime/bigstring.js +137 -0
  9. package/assets/compiler/runtime/domain.js +393 -0
  10. package/assets/compiler/runtime/dynlink.js +91 -0
  11. package/assets/compiler/runtime/float32.js +486 -0
  12. package/assets/compiler/runtime/fs.js +416 -0
  13. package/assets/compiler/runtime/fs_fake.js +600 -0
  14. package/assets/compiler/runtime/fs_node.js +609 -0
  15. package/assets/compiler/runtime/fs_quickjs.js +532 -0
  16. package/assets/compiler/runtime/gc.js +201 -0
  17. package/assets/compiler/runtime/graphics.js +1053 -0
  18. package/assets/compiler/runtime/ieee_754.js +621 -0
  19. package/assets/compiler/runtime/int64.js +516 -0
  20. package/assets/compiler/runtime/io.js +739 -0
  21. package/assets/compiler/runtime/jslib.js +553 -0
  22. package/assets/compiler/runtime/jslib_js_of_ocaml.js +81 -0
  23. package/assets/compiler/runtime/lexing.js +240 -0
  24. package/assets/compiler/runtime/manifest.txt +31 -0
  25. package/assets/compiler/runtime/marshal.js +863 -0
  26. package/assets/compiler/runtime/md5.js +236 -0
  27. package/assets/compiler/runtime/mlBytes.js +1007 -0
  28. package/assets/compiler/runtime/nat.js +469 -0
  29. package/assets/compiler/runtime/parsing.js +317 -0
  30. package/assets/compiler/runtime/prng.js +84 -0
  31. package/assets/compiler/runtime/promise.js +45 -0
  32. package/assets/compiler/runtime/runtime.js +16688 -0
  33. package/assets/compiler/runtime/runtime_events.js +90 -0
  34. package/assets/compiler/runtime/stdlib.js +363 -0
  35. package/assets/compiler/runtime/sync.js +35 -0
  36. package/assets/compiler/runtime/toplevel.js +150 -0
  37. package/assets/compiler/runtime/unix.js +914 -0
  38. package/assets/compiler/runtime/weak.js +247 -0
  39. package/assets/compiler/stdlib.js +254 -0
  40. package/assets/compiler/worker.js +46 -0
  41. package/assets/interpreter/libs/greet.cma +0 -0
  42. package/assets/interpreter/libs/greet.cmi +0 -0
  43. package/assets/interpreter/libs/manifest.txt +1 -0
  44. package/assets/interpreter/package.json +3 -0
  45. package/assets/interpreter/stdlib/camlinternalFormat.cmi +0 -0
  46. package/assets/interpreter/stdlib/camlinternalFormatBasics.cmi +0 -0
  47. package/assets/interpreter/stdlib/camlinternalLazy.cmi +0 -0
  48. package/assets/interpreter/stdlib/camlinternalMod.cmi +0 -0
  49. package/assets/interpreter/stdlib/camlinternalOO.cmi +0 -0
  50. package/assets/interpreter/stdlib/std_exit.cmi +0 -0
  51. package/assets/interpreter/stdlib/stdlib.cmi +0 -0
  52. package/assets/interpreter/stdlib/stdlib__Arg.cmi +0 -0
  53. package/assets/interpreter/stdlib/stdlib__Array.cmi +0 -0
  54. package/assets/interpreter/stdlib/stdlib__ArrayLabels.cmi +0 -0
  55. package/assets/interpreter/stdlib/stdlib__Atomic.cmi +0 -0
  56. package/assets/interpreter/stdlib/stdlib__Bigarray.cmi +0 -0
  57. package/assets/interpreter/stdlib/stdlib__Bool.cmi +0 -0
  58. package/assets/interpreter/stdlib/stdlib__Buffer.cmi +0 -0
  59. package/assets/interpreter/stdlib/stdlib__Bytes.cmi +0 -0
  60. package/assets/interpreter/stdlib/stdlib__BytesLabels.cmi +0 -0
  61. package/assets/interpreter/stdlib/stdlib__Callback.cmi +0 -0
  62. package/assets/interpreter/stdlib/stdlib__Char.cmi +0 -0
  63. package/assets/interpreter/stdlib/stdlib__Complex.cmi +0 -0
  64. package/assets/interpreter/stdlib/stdlib__Condition.cmi +0 -0
  65. package/assets/interpreter/stdlib/stdlib__Digest.cmi +0 -0
  66. package/assets/interpreter/stdlib/stdlib__Domain.cmi +0 -0
  67. package/assets/interpreter/stdlib/stdlib__Dynarray.cmi +0 -0
  68. package/assets/interpreter/stdlib/stdlib__Effect.cmi +0 -0
  69. package/assets/interpreter/stdlib/stdlib__Either.cmi +0 -0
  70. package/assets/interpreter/stdlib/stdlib__Ephemeron.cmi +0 -0
  71. package/assets/interpreter/stdlib/stdlib__Filename.cmi +0 -0
  72. package/assets/interpreter/stdlib/stdlib__Float.cmi +0 -0
  73. package/assets/interpreter/stdlib/stdlib__Format.cmi +0 -0
  74. package/assets/interpreter/stdlib/stdlib__Fun.cmi +0 -0
  75. package/assets/interpreter/stdlib/stdlib__Gc.cmi +0 -0
  76. package/assets/interpreter/stdlib/stdlib__Hashtbl.cmi +0 -0
  77. package/assets/interpreter/stdlib/stdlib__Iarray.cmi +0 -0
  78. package/assets/interpreter/stdlib/stdlib__In_channel.cmi +0 -0
  79. package/assets/interpreter/stdlib/stdlib__Int.cmi +0 -0
  80. package/assets/interpreter/stdlib/stdlib__Int32.cmi +0 -0
  81. package/assets/interpreter/stdlib/stdlib__Int64.cmi +0 -0
  82. package/assets/interpreter/stdlib/stdlib__Lazy.cmi +0 -0
  83. package/assets/interpreter/stdlib/stdlib__Lexing.cmi +0 -0
  84. package/assets/interpreter/stdlib/stdlib__List.cmi +0 -0
  85. package/assets/interpreter/stdlib/stdlib__ListLabels.cmi +0 -0
  86. package/assets/interpreter/stdlib/stdlib__Map.cmi +0 -0
  87. package/assets/interpreter/stdlib/stdlib__Marshal.cmi +0 -0
  88. package/assets/interpreter/stdlib/stdlib__MoreLabels.cmi +0 -0
  89. package/assets/interpreter/stdlib/stdlib__Mutex.cmi +0 -0
  90. package/assets/interpreter/stdlib/stdlib__Nativeint.cmi +0 -0
  91. package/assets/interpreter/stdlib/stdlib__Obj.cmi +0 -0
  92. package/assets/interpreter/stdlib/stdlib__Oo.cmi +0 -0
  93. package/assets/interpreter/stdlib/stdlib__Option.cmi +0 -0
  94. package/assets/interpreter/stdlib/stdlib__Out_channel.cmi +0 -0
  95. package/assets/interpreter/stdlib/stdlib__Pair.cmi +0 -0
  96. package/assets/interpreter/stdlib/stdlib__Parsing.cmi +0 -0
  97. package/assets/interpreter/stdlib/stdlib__Pqueue.cmi +0 -0
  98. package/assets/interpreter/stdlib/stdlib__Printexc.cmi +0 -0
  99. package/assets/interpreter/stdlib/stdlib__Printf.cmi +0 -0
  100. package/assets/interpreter/stdlib/stdlib__Queue.cmi +0 -0
  101. package/assets/interpreter/stdlib/stdlib__Random.cmi +0 -0
  102. package/assets/interpreter/stdlib/stdlib__Repr.cmi +0 -0
  103. package/assets/interpreter/stdlib/stdlib__Result.cmi +0 -0
  104. package/assets/interpreter/stdlib/stdlib__Scanf.cmi +0 -0
  105. package/assets/interpreter/stdlib/stdlib__Semaphore.cmi +0 -0
  106. package/assets/interpreter/stdlib/stdlib__Seq.cmi +0 -0
  107. package/assets/interpreter/stdlib/stdlib__Set.cmi +0 -0
  108. package/assets/interpreter/stdlib/stdlib__Stack.cmi +0 -0
  109. package/assets/interpreter/stdlib/stdlib__StdLabels.cmi +0 -0
  110. package/assets/interpreter/stdlib/stdlib__String.cmi +0 -0
  111. package/assets/interpreter/stdlib/stdlib__StringLabels.cmi +0 -0
  112. package/assets/interpreter/stdlib/stdlib__Sys.cmi +0 -0
  113. package/assets/interpreter/stdlib/stdlib__Type.cmi +0 -0
  114. package/assets/interpreter/stdlib/stdlib__Uchar.cmi +0 -0
  115. package/assets/interpreter/stdlib/stdlib__Unit.cmi +0 -0
  116. package/assets/interpreter/stdlib/stdlib__Weak.cmi +0 -0
  117. package/assets/interpreter/stdlib/topdirs.cmi +0 -0
  118. package/assets/interpreter/stdlib/units.txt +75 -0
  119. package/assets/interpreter/stdlib/unix.cmi +0 -0
  120. package/assets/interpreter/stdlib/unixLabels.cmi +0 -0
  121. package/assets/interpreter/worker-entry.js +39 -0
  122. package/assets/interpreter/worker.js +42356 -0
  123. package/bin/copy-assets.mjs +75 -0
  124. package/package.json +41 -4
  125. package/src/compiler/compile.js +195 -0
  126. package/src/compiler/index.js +46 -0
  127. package/src/compiler/worker.js +46 -0
  128. package/src/index.js +12 -0
  129. package/src/interpreter/api.js +182 -0
  130. package/src/interpreter/index.js +5 -0
@@ -0,0 +1,863 @@
1
+ // Js_of_ocaml runtime support
2
+ // http://www.ocsigen.org/js_of_ocaml/
3
+ // Copyright (C) 2010 Jérôme Vouillon
4
+ // Laboratoire PPS - CNRS Université Paris Diderot
5
+ //
6
+ // This program is free software; you can redistribute it and/or modify
7
+ // it under the terms of the GNU Lesser General Public License as published by
8
+ // the Free Software Foundation, with linking exception;
9
+ // either version 2.1 of the License, or (at your option) any later version.
10
+ //
11
+ // This program is distributed in the hope that it will be useful,
12
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ // GNU Lesser General Public License for more details.
15
+ //
16
+ // You should have received a copy of the GNU Lesser General Public License
17
+ // along with this program; if not, write to the Free Software
18
+ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+
20
+ //Provides: caml_marshal_constants
21
+ var caml_marshal_constants = {
22
+ PREFIX_SMALL_BLOCK: 0x80,
23
+ PREFIX_SMALL_INT: 0x40,
24
+ PREFIX_SMALL_STRING: 0x20,
25
+ CODE_INT8: 0x00,
26
+ CODE_INT16: 0x01,
27
+ CODE_INT32: 0x02,
28
+ CODE_INT64: 0x03,
29
+ CODE_SHARED8: 0x04,
30
+ CODE_SHARED16: 0x05,
31
+ CODE_SHARED32: 0x06,
32
+ CODE_BLOCK32: 0x08,
33
+ CODE_BLOCK64: 0x13,
34
+ CODE_STRING8: 0x09,
35
+ CODE_STRING32: 0x0a,
36
+ CODE_DOUBLE_BIG: 0x0b,
37
+ CODE_DOUBLE_LITTLE: 0x0c,
38
+ CODE_DOUBLE_ARRAY8_BIG: 0x0d,
39
+ CODE_DOUBLE_ARRAY8_LITTLE: 0x0e,
40
+ CODE_DOUBLE_ARRAY32_BIG: 0x0f,
41
+ CODE_DOUBLE_ARRAY32_LITTLE: 0x07,
42
+ CODE_CODEPOINTER: 0x10,
43
+ CODE_INFIXPOINTER: 0x11,
44
+ CODE_CUSTOM: 0x12,
45
+ CODE_CUSTOM_LEN: 0x18,
46
+ CODE_CUSTOM_FIXED: 0x19,
47
+ CODE_NULL: 0x1f,
48
+ };
49
+
50
+ //Provides: UInt8ArrayReader
51
+ //Requires: caml_string_of_uint8_array
52
+ class UInt8ArrayReader {
53
+ constructor(s, i) {
54
+ this.s = s;
55
+ this.i = i;
56
+ }
57
+
58
+ read8u() {
59
+ return this.s[this.i++];
60
+ }
61
+
62
+ read8s() {
63
+ return (this.s[this.i++] << 24) >> 24;
64
+ }
65
+
66
+ read16u() {
67
+ var s = this.s,
68
+ i = this.i;
69
+ this.i = i + 2;
70
+ return (s[i] << 8) | s[i + 1];
71
+ }
72
+
73
+ read16s() {
74
+ var s = this.s,
75
+ i = this.i;
76
+ this.i = i + 2;
77
+ return ((s[i] << 24) >> 16) | s[i + 1];
78
+ }
79
+
80
+ read32u() {
81
+ var s = this.s,
82
+ i = this.i;
83
+ this.i = i + 4;
84
+ return ((s[i] << 24) | (s[i + 1] << 16) | (s[i + 2] << 8) | s[i + 3]) >>> 0;
85
+ }
86
+
87
+ read32s() {
88
+ var s = this.s,
89
+ i = this.i;
90
+ this.i = i + 4;
91
+ return (s[i] << 24) | (s[i + 1] << 16) | (s[i + 2] << 8) | s[i + 3];
92
+ }
93
+
94
+ readstr(len) {
95
+ var i = this.i;
96
+ this.i = i + len;
97
+ return caml_string_of_uint8_array(this.s.subarray(i, i + len));
98
+ }
99
+
100
+ readuint8array(len) {
101
+ var i = this.i;
102
+ this.i = i + len;
103
+ return this.s.subarray(i, i + len);
104
+ }
105
+ }
106
+
107
+ //Provides: JsStringReader
108
+ //Requires: caml_string_of_jsbytes
109
+ class JsStringReader {
110
+ constructor(s, i) {
111
+ this.s = s;
112
+ this.i = i;
113
+ }
114
+
115
+ read8u() {
116
+ return this.s.charCodeAt(this.i++);
117
+ }
118
+
119
+ read8s() {
120
+ return (this.s.charCodeAt(this.i++) << 24) >> 24;
121
+ }
122
+
123
+ read16u() {
124
+ var s = this.s,
125
+ i = this.i;
126
+ this.i = i + 2;
127
+ return (s.charCodeAt(i) << 8) | s.charCodeAt(i + 1);
128
+ }
129
+
130
+ read16s() {
131
+ var s = this.s,
132
+ i = this.i;
133
+ this.i = i + 2;
134
+ return ((s.charCodeAt(i) << 24) >> 16) | s.charCodeAt(i + 1);
135
+ }
136
+
137
+ read32u() {
138
+ var s = this.s,
139
+ i = this.i;
140
+ this.i = i + 4;
141
+ return (
142
+ ((s.charCodeAt(i) << 24) |
143
+ (s.charCodeAt(i + 1) << 16) |
144
+ (s.charCodeAt(i + 2) << 8) |
145
+ s.charCodeAt(i + 3)) >>>
146
+ 0
147
+ );
148
+ }
149
+
150
+ read32s() {
151
+ var s = this.s,
152
+ i = this.i;
153
+ this.i = i + 4;
154
+ return (
155
+ (s.charCodeAt(i) << 24) |
156
+ (s.charCodeAt(i + 1) << 16) |
157
+ (s.charCodeAt(i + 2) << 8) |
158
+ s.charCodeAt(i + 3)
159
+ );
160
+ }
161
+
162
+ readstr(len) {
163
+ var i = this.i;
164
+ this.i = i + len;
165
+ return caml_string_of_jsbytes(this.s.slice(i, i + len));
166
+ }
167
+
168
+ readuint8array(len) {
169
+ var b = new Uint8Array(len);
170
+ var s = this.s;
171
+ var i = this.i;
172
+ for (var j = 0; j < len; j++) {
173
+ b[j] = s.charCodeAt(i + j);
174
+ }
175
+ this.i = i + len;
176
+ return b;
177
+ }
178
+ }
179
+
180
+ //Provides: caml_float_of_bytes
181
+ //Requires: caml_int64_float_of_bits, caml_int64_of_bytes
182
+ function caml_float_of_bytes(a) {
183
+ return caml_int64_float_of_bits(caml_int64_of_bytes(a));
184
+ }
185
+
186
+ //Provides: caml_input_value_from_bytes mutable
187
+ //Requires: JsStringReader, UInt8ArrayReader
188
+ //Requires: caml_input_value_from_reader
189
+ //Requires: caml_ml_bytes_content
190
+ function caml_input_value_from_bytes(s, ofs) {
191
+ var c = caml_ml_bytes_content(s);
192
+ var ofs = typeof ofs === "number" ? ofs : ofs[0];
193
+ var reader =
194
+ c instanceof Uint8Array
195
+ ? new UInt8ArrayReader(c, ofs)
196
+ : new JsStringReader(c, ofs);
197
+ return caml_input_value_from_reader(reader);
198
+ }
199
+
200
+ //Provides: caml_int64_unmarshal
201
+ //Requires: caml_int64_of_bytes
202
+ function caml_int64_unmarshal(reader, size) {
203
+ var t = new Array(8);
204
+ for (var j = 0; j < 8; j++) t[j] = reader.read8u();
205
+ size[0] = 8;
206
+ return caml_int64_of_bytes(t);
207
+ }
208
+
209
+ //Provides: caml_int64_marshal
210
+ //Requires: caml_int64_to_bytes
211
+ function caml_int64_marshal(writer, v, sizes) {
212
+ var b = caml_int64_to_bytes(v);
213
+ for (var i = 0; i < 8; i++) writer.write(8, b[i]);
214
+ sizes[0] = 8;
215
+ sizes[1] = 8;
216
+ }
217
+
218
+ //Provides: caml_int32_unmarshal
219
+ function caml_int32_unmarshal(reader, size) {
220
+ size[0] = 4;
221
+ return reader.read32s();
222
+ }
223
+
224
+ //Provides: caml_nativeint_unmarshal
225
+ //Requires: caml_failwith
226
+ function caml_nativeint_unmarshal(reader, size) {
227
+ switch (reader.read8u()) {
228
+ case 1:
229
+ size[0] = 4;
230
+ return reader.read32s();
231
+ case 2:
232
+ caml_failwith("input_value: native integer value too large");
233
+ break;
234
+ default:
235
+ caml_failwith("input_value: ill-formed native integer");
236
+ }
237
+ }
238
+
239
+ //Provides: caml_custom_ops
240
+ //Requires: caml_int64_unmarshal, caml_int64_marshal, caml_int64_compare, caml_int64_hash
241
+ //Requires: caml_int32_unmarshal, caml_nativeint_unmarshal
242
+ //Requires: caml_ba_serialize, caml_ba_deserialize, caml_ba_compare, caml_ba_hash
243
+ var caml_custom_ops = {
244
+ _j: {
245
+ deserialize: caml_int64_unmarshal,
246
+ serialize: caml_int64_marshal,
247
+ fixed_length: 8,
248
+ compare: caml_int64_compare,
249
+ hash: caml_int64_hash,
250
+ },
251
+ _i: {
252
+ deserialize: caml_int32_unmarshal,
253
+ fixed_length: 4,
254
+ },
255
+ _n: {
256
+ deserialize: caml_nativeint_unmarshal,
257
+ fixed_length: 4,
258
+ },
259
+ _bigarray: {
260
+ deserialize: function (reader, sz) {
261
+ return caml_ba_deserialize(reader, sz, "_bigarray");
262
+ },
263
+ serialize: caml_ba_serialize,
264
+ compare: caml_ba_compare,
265
+ hash: caml_ba_hash,
266
+ },
267
+ _bigarr02: {
268
+ deserialize: function (reader, sz) {
269
+ return caml_ba_deserialize(reader, sz, "_bigarr02");
270
+ },
271
+ serialize: caml_ba_serialize,
272
+ compare: caml_ba_compare,
273
+ hash: caml_ba_hash,
274
+ },
275
+ };
276
+
277
+ //Provides: caml_input_value_from_reader mutable
278
+ //Requires: caml_failwith
279
+ //Requires: caml_float_of_bytes, caml_custom_ops
280
+ //Requires: UInt8ArrayReader
281
+ //Requires: caml_decompress_input
282
+ //Requires: caml_set_oo_id
283
+ function caml_input_value_from_reader(reader) {
284
+ function readvlq(overflow) {
285
+ var c = reader.read8u();
286
+ var n = c & 0x7f;
287
+ while ((c & 0x80) !== 0) {
288
+ c = reader.read8u();
289
+ var n7 = n << 7;
290
+ if (n !== n7 >> 7) overflow[0] = true;
291
+ n = n7 | (c & 0x7f);
292
+ }
293
+ return n;
294
+ }
295
+ var old_pos = reader.i;
296
+ var magic = reader.read32u();
297
+ switch (magic) {
298
+ case 0x8495a6be /* Intext_magic_number_small */:
299
+ var header_len = 20;
300
+ var compressed = 0;
301
+ var data_len = reader.read32u();
302
+ var uncompressed_data_len = data_len;
303
+ var num_objects = reader.read32u();
304
+ var _size_32 = reader.read32u();
305
+ var _size_64 = reader.read32u();
306
+ break;
307
+ case 0x8495a6bd /* Intext_magic_number_compressed */:
308
+ var header_len = reader.read8u() & 0x3f;
309
+ var compressed = 1;
310
+ var overflow = [false];
311
+ var data_len = readvlq(overflow);
312
+ var uncompressed_data_len = readvlq(overflow);
313
+ var num_objects = readvlq(overflow);
314
+ var _size_32 = readvlq(overflow);
315
+ var _size_64 = readvlq(overflow);
316
+ if (overflow[0]) {
317
+ caml_failwith(
318
+ "caml_input_value_from_reader: object too large to be read back on this platform",
319
+ );
320
+ }
321
+ break;
322
+ case 0x8495a6bf /* Intext_magic_number_big */:
323
+ caml_failwith(
324
+ "caml_input_value_from_reader: object too large to be read back on a 32-bit platform",
325
+ );
326
+ break;
327
+ default:
328
+ caml_failwith("caml_input_value_from_reader: bad object");
329
+ break;
330
+ }
331
+ if (header_len !== reader.i - old_pos) {
332
+ caml_failwith("caml_input_value_from_reader: invalid header");
333
+ }
334
+ var stack = [];
335
+ var objects = [];
336
+ var intern_obj_table = num_objects > 0 ? [] : null;
337
+ var obj_counter = 0;
338
+ function intern_rec(reader) {
339
+ var code = reader.read8u();
340
+ if (code >= 0x40 /*cst.PREFIX_SMALL_INT*/) {
341
+ if (code >= 0x80 /*cst.PREFIX_SMALL_BLOCK*/) {
342
+ var tag = code & 0xf;
343
+ var size = (code >> 4) & 0x7;
344
+ var v = [tag];
345
+ if (size === 0) return v;
346
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
347
+ if (tag === 248) objects.push(v);
348
+ stack.push(v, size);
349
+ return v;
350
+ } else return code & 0x3f;
351
+ } else {
352
+ if (code >= 0x20 /*cst.PREFIX_SMALL_STRING */) {
353
+ var len = code & 0x1f;
354
+ var v = reader.readstr(len);
355
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
356
+ return v;
357
+ } else {
358
+ switch (code) {
359
+ case 0x00: //cst.CODE_INT8:
360
+ return reader.read8s();
361
+ case 0x01: //cst.CODE_INT16:
362
+ return reader.read16s();
363
+ case 0x02: //cst.CODE_INT32:
364
+ return reader.read32s();
365
+ case 0x03: //cst.CODE_INT64:
366
+ caml_failwith("input_value: integer too large");
367
+ break;
368
+ case 0x04: //cst.CODE_SHARED8:
369
+ var offset = reader.read8u();
370
+ if (compressed === 0) offset = obj_counter - offset;
371
+ return intern_obj_table[offset];
372
+ case 0x05: //cst.CODE_SHARED16:
373
+ var offset = reader.read16u();
374
+ if (compressed === 0) offset = obj_counter - offset;
375
+ return intern_obj_table[offset];
376
+ case 0x06: //cst.CODE_SHARED32:
377
+ var offset = reader.read32u();
378
+ if (compressed === 0) offset = obj_counter - offset;
379
+ return intern_obj_table[offset];
380
+ case 0x08: //cst.CODE_BLOCK32:
381
+ var header = reader.read32u();
382
+ var tag = header & 0xff;
383
+ // unsigned: bit 31 of the header is set for sizes >= 2^21
384
+ var size = header >>> 10;
385
+ var v = [tag];
386
+ if (size === 0) return v;
387
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
388
+ if (tag === 248) objects.push(v);
389
+ stack.push(v, size);
390
+ return v;
391
+ case 0x13: //cst.CODE_BLOCK64:
392
+ caml_failwith("input_value: data block too large");
393
+ break;
394
+ case 0x09: //cst.CODE_STRING8:
395
+ var len = reader.read8u();
396
+ var v = reader.readstr(len);
397
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
398
+ return v;
399
+ case 0x0a: //cst.CODE_STRING32:
400
+ var len = reader.read32u();
401
+ var v = reader.readstr(len);
402
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
403
+ return v;
404
+ case 0x0c: //cst.CODE_DOUBLE_LITTLE:
405
+ var t = new Array(8);
406
+ for (var i = 0; i < 8; i++) t[7 - i] = reader.read8u();
407
+ var v = caml_float_of_bytes(t);
408
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
409
+ return v;
410
+ case 0x0b: //cst.CODE_DOUBLE_BIG:
411
+ var t = new Array(8);
412
+ for (var i = 0; i < 8; i++) t[i] = reader.read8u();
413
+ var v = caml_float_of_bytes(t);
414
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
415
+ return v;
416
+ case 0x0e: //cst.CODE_DOUBLE_ARRAY8_LITTLE:
417
+ var len = reader.read8u();
418
+ var v = new Array(len + 1);
419
+ v[0] = 254;
420
+ var t = new Array(8);
421
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
422
+ for (var i = 1; i <= len; i++) {
423
+ for (var j = 0; j < 8; j++) t[7 - j] = reader.read8u();
424
+ v[i] = caml_float_of_bytes(t);
425
+ }
426
+ return v;
427
+ case 0x0d: //cst.CODE_DOUBLE_ARRAY8_BIG:
428
+ var len = reader.read8u();
429
+ var v = new Array(len + 1);
430
+ v[0] = 254;
431
+ var t = new Array(8);
432
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
433
+ for (var i = 1; i <= len; i++) {
434
+ for (var j = 0; j < 8; j++) t[j] = reader.read8u();
435
+ v[i] = caml_float_of_bytes(t);
436
+ }
437
+ return v;
438
+ case 0x07: //cst.CODE_DOUBLE_ARRAY32_LITTLE:
439
+ var len = reader.read32u();
440
+ var v = new Array(len + 1);
441
+ v[0] = 254;
442
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
443
+ var t = new Array(8);
444
+ for (var i = 1; i <= len; i++) {
445
+ for (var j = 0; j < 8; j++) t[7 - j] = reader.read8u();
446
+ v[i] = caml_float_of_bytes(t);
447
+ }
448
+ return v;
449
+ case 0x0f: //cst.CODE_DOUBLE_ARRAY32_BIG:
450
+ var len = reader.read32u();
451
+ var v = new Array(len + 1);
452
+ v[0] = 254;
453
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
454
+ var t = new Array(8);
455
+ for (var i = 1; i <= len; i++) {
456
+ for (var j = 0; j < 8; j++) t[j] = reader.read8u();
457
+ v[i] = caml_float_of_bytes(t);
458
+ }
459
+ return v;
460
+ case 0x10: //cst.CODE_CODEPOINTER:
461
+ case 0x11: //cst.CODE_INFIXPOINTER:
462
+ caml_failwith("input_value: code pointer");
463
+ break;
464
+ case 0x12: //cst.CODE_CUSTOM:
465
+ case 0x18: //cst.CODE_CUSTOM_LEN:
466
+ case 0x19: //cst.CODE_CUSTOM_FIXED:
467
+ var c,
468
+ s = "";
469
+ while ((c = reader.read8u()) !== 0) s += String.fromCharCode(c);
470
+ var ops = caml_custom_ops[s];
471
+ var expected_size;
472
+ if (!ops)
473
+ caml_failwith("input_value: unknown custom block identifier");
474
+ switch (code) {
475
+ case 0x12: // cst.CODE_CUSTOM (deprecated)
476
+ break;
477
+ case 0x19: // cst.CODE_CUSTOM_FIXED
478
+ if (!ops.fixed_length)
479
+ caml_failwith(
480
+ "input_value: expected a fixed-size custom block",
481
+ );
482
+ expected_size = ops.fixed_length;
483
+ break;
484
+ case 0x18: // cst.CODE_CUSTOM_LEN
485
+ expected_size = reader.read32u();
486
+ // Skip size64
487
+ reader.read32s();
488
+ reader.read32s();
489
+ break;
490
+ }
491
+ var size = [0];
492
+ var v = ops.deserialize(reader, size);
493
+ if (expected_size !== undefined) {
494
+ if (expected_size !== size[0])
495
+ caml_failwith(
496
+ "input_value: incorrect length of serialized custom block",
497
+ );
498
+ }
499
+ if (intern_obj_table) intern_obj_table[obj_counter++] = v;
500
+ return v;
501
+ case 0x1f: //cst.CODE_NULL:
502
+ return null;
503
+ default:
504
+ caml_failwith("input_value: ill-formed message");
505
+ }
506
+ }
507
+ }
508
+ }
509
+ if (compressed) {
510
+ if (caml_decompress_input) {
511
+ var data = reader.readuint8array(data_len);
512
+ var res = new Uint8Array(uncompressed_data_len);
513
+ var res = caml_decompress_input(data, res);
514
+ var reader = new UInt8ArrayReader(res, 0);
515
+ } else {
516
+ caml_failwith("input_value: compressed object, cannot decompress");
517
+ }
518
+ }
519
+ var res = intern_rec(reader);
520
+ while (stack.length > 0) {
521
+ var size = stack.pop();
522
+ var v = stack.pop();
523
+ var d = v.length;
524
+ if (d < size) stack.push(v, size);
525
+ v[d] = intern_rec(reader);
526
+ }
527
+ while (objects.length > 0) {
528
+ var x = objects.pop();
529
+ if (x[2] >= 0) caml_set_oo_id(x);
530
+ }
531
+ return res;
532
+ }
533
+
534
+ //Provides: caml_marshal_header_size
535
+ //Version: < 5.1.0
536
+ var caml_marshal_header_size = 20;
537
+
538
+ //Provides: caml_marshal_header_size
539
+ //Version: >= 5.1.0
540
+ var caml_marshal_header_size = 16;
541
+
542
+ //Provides: caml_marshal_data_size mutable
543
+ //Requires: caml_failwith, caml_bytes_unsafe_get
544
+ //Requires: caml_uint8_array_of_bytes
545
+ //Requires: UInt8ArrayReader
546
+ //Requires: caml_marshal_header_size
547
+ function caml_marshal_data_size(s, ofs) {
548
+ var r = new UInt8ArrayReader(caml_uint8_array_of_bytes(s), ofs);
549
+ function readvlq(overflow) {
550
+ var c = r.read8u();
551
+ var n = c & 0x7f;
552
+ while ((c & 0x80) !== 0) {
553
+ c = r.read8u();
554
+ var n7 = n << 7;
555
+ if (n !== n7 >> 7) overflow[0] = true;
556
+ n = n7 | (c & 0x7f);
557
+ }
558
+ return n;
559
+ }
560
+
561
+ switch (r.read32u()) {
562
+ case 0x8495a6be /* Intext_magic_number_small */:
563
+ var header_len = 20;
564
+ var data_len = r.read32u();
565
+ break;
566
+ case 0x8495a6bd /* Intext_magic_number_compressed */:
567
+ var header_len = r.read8u() & 0x3f;
568
+ var overflow = [false];
569
+ var data_len = readvlq(overflow);
570
+ if (overflow[0]) {
571
+ caml_failwith(
572
+ "Marshal.data_size: object too large to be read back on this platform",
573
+ );
574
+ }
575
+ break;
576
+ case 0x8495a6bf /* Intext_magic_number_big */:
577
+ caml_failwith(
578
+ "Marshal.data_size: object too large to be read back on a 32-bit platform",
579
+ );
580
+ break;
581
+ default:
582
+ caml_failwith("Marshal.data_size: bad object");
583
+ break;
584
+ }
585
+ return header_len - caml_marshal_header_size + data_len;
586
+ }
587
+
588
+ //Provides: MlObjectTable
589
+ class MlObjectTable {
590
+ constructor() {
591
+ this.objs = [];
592
+ this.lookup = new globalThis.Map();
593
+ }
594
+
595
+ store(v) {
596
+ this.lookup.set(v, this.objs.length);
597
+ this.objs.push(v);
598
+ }
599
+
600
+ recall(v) {
601
+ var i = this.lookup.get(v);
602
+ return i === undefined
603
+ ? undefined
604
+ : this.objs.length - i; /* index is relative */
605
+ }
606
+ }
607
+
608
+ //Provides: caml_output_val
609
+ //Requires: caml_int64_to_bytes, caml_failwith
610
+ //Requires: caml_int64_bits_of_float
611
+ //Requires: caml_is_ml_bytes, caml_ml_bytes_length, caml_bytes_unsafe_get
612
+ //Requires: caml_is_ml_string, caml_ml_string_length, caml_string_unsafe_get
613
+ //Requires: MlObjectTable, caml_list_to_js_array, caml_custom_ops
614
+ //Requires: caml_invalid_argument,caml_string_of_jsbytes, caml_is_continuation_tag
615
+ var caml_output_val = (function () {
616
+ class Writer {
617
+ constructor() {
618
+ this.chunk = [];
619
+ this.chunk_idx = 20;
620
+ this.block_len = 0;
621
+ this.obj_counter = 0;
622
+ this.size_32 = 0;
623
+ this.size_64 = 0;
624
+ }
625
+
626
+ write(size, value) {
627
+ for (var i = size - 8; i >= 0; i -= 8)
628
+ this.chunk[this.chunk_idx++] = (value >> i) & 0xff;
629
+ }
630
+
631
+ write_at(pos, size, value) {
632
+ for (var i = size - 8; i >= 0; i -= 8)
633
+ this.chunk[pos++] = (value >> i) & 0xff;
634
+ }
635
+
636
+ write_code(size, code, value) {
637
+ this.chunk[this.chunk_idx++] = code;
638
+ for (var i = size - 8; i >= 0; i -= 8)
639
+ this.chunk[this.chunk_idx++] = (value >> i) & 0xff;
640
+ }
641
+
642
+ write_shared(offset) {
643
+ if (offset < 1 << 8)
644
+ this.write_code(8, 0x04 /*cst.CODE_SHARED8*/, offset);
645
+ else if (offset < 1 << 16)
646
+ this.write_code(16, 0x05 /*cst.CODE_SHARED16*/, offset);
647
+ else this.write_code(32, 0x06 /*cst.CODE_SHARED32*/, offset);
648
+ }
649
+
650
+ pos() {
651
+ return this.chunk_idx;
652
+ }
653
+
654
+ finalize() {
655
+ this.block_len = this.chunk_idx - 20;
656
+ this.chunk_idx = 0;
657
+ this.write(32, 0x8495a6be);
658
+ this.write(32, this.block_len);
659
+ this.write(32, this.obj_counter);
660
+ this.write(32, this.size_32);
661
+ this.write(32, this.size_64);
662
+ return this.chunk;
663
+ }
664
+ }
665
+ return function (v, flags) {
666
+ flags = caml_list_to_js_array(flags);
667
+
668
+ var no_sharing = flags.indexOf(0 /*Marshal.No_sharing*/) !== -1,
669
+ closures = flags.indexOf(1 /*Marshal.Closures*/) !== -1;
670
+ /* Marshal.Compat_32 is redundant since integers are 32-bit anyway */
671
+
672
+ if (closures)
673
+ console.warn(
674
+ "in caml_output_val: flag Marshal.Closures is not supported.",
675
+ );
676
+
677
+ var writer = new Writer();
678
+ var stack = [];
679
+ var intern_obj_table = no_sharing ? null : new MlObjectTable();
680
+
681
+ function memo(v) {
682
+ if (no_sharing) return false;
683
+ var existing_offset = intern_obj_table.recall(v);
684
+ if (existing_offset) {
685
+ writer.write_shared(existing_offset);
686
+ return true;
687
+ } else {
688
+ intern_obj_table.store(v);
689
+ return false;
690
+ }
691
+ }
692
+
693
+ function extern_rec(v) {
694
+ if (v === null) {
695
+ writer.write(8, 0x1f /*cst.CODE_NULL*/);
696
+ } else if (v.caml_custom) {
697
+ if (memo(v)) return;
698
+ var name = v.caml_custom;
699
+ var ops = caml_custom_ops[name];
700
+ var sz_32_64 = [0, 0];
701
+ if (!ops.serialize)
702
+ caml_invalid_argument("output_value: abstract value (Custom)");
703
+ if (ops.fixed_length === undefined) {
704
+ writer.write(8, 0x18 /*cst.CODE_CUSTOM_LEN*/);
705
+ for (var i = 0; i < name.length; i++)
706
+ writer.write(8, name.charCodeAt(i));
707
+ writer.write(8, 0);
708
+ var header_pos = writer.pos();
709
+ for (var i = 0; i < 12; i++) {
710
+ writer.write(8, 0);
711
+ }
712
+ ops.serialize(writer, v, sz_32_64);
713
+ writer.write_at(header_pos, 32, sz_32_64[0]);
714
+ writer.write_at(header_pos + 4, 32, 0); // zero
715
+ writer.write_at(header_pos + 8, 32, sz_32_64[1]);
716
+ } else {
717
+ writer.write(8, 0x19 /*cst.CODE_CUSTOM_FIXED*/);
718
+ for (var i = 0; i < name.length; i++)
719
+ writer.write(8, name.charCodeAt(i));
720
+ writer.write(8, 0);
721
+ ops.serialize(writer, v, sz_32_64);
722
+ if (ops.fixed_length !== sz_32_64[0])
723
+ caml_failwith(
724
+ "output_value: incorrect fixed sizes specified by " + name,
725
+ );
726
+ }
727
+ writer.size_32 += 2 + ((sz_32_64[0] + 3) >> 2);
728
+ writer.size_64 += 2 + ((sz_32_64[1] + 7) >> 3);
729
+ } else if (Array.isArray(v) && v[0] === 254) {
730
+ // float array (Double_array_tag): emit a CODE_DOUBLE_ARRAY
731
+ // block (raw doubles) like the native runtime, so other
732
+ // runtimes can read it
733
+ if (memo(v)) return;
734
+ var nfloats = v.length - 1;
735
+ if (nfloats < 0x100)
736
+ writer.write_code(8, 0x0e /*cst.CODE_DOUBLE_ARRAY8_LITTLE*/, nfloats);
737
+ else
738
+ writer.write_code(
739
+ 32,
740
+ 0x07 /*cst.CODE_DOUBLE_ARRAY32_LITTLE*/,
741
+ nfloats,
742
+ );
743
+ for (var i = 1; i <= nfloats; i++) {
744
+ var t = caml_int64_to_bytes(caml_int64_bits_of_float(v[i]));
745
+ for (var j = 0; j < 8; j++) writer.write(8, t[7 - j]);
746
+ }
747
+ writer.size_32 += 1 + nfloats * 2;
748
+ writer.size_64 += 1 + nfloats;
749
+ } else if (Array.isArray(v) && v[0] === (v[0] | 0)) {
750
+ if (v[0] === 251) {
751
+ caml_failwith("output_value: abstract value (Abstract)");
752
+ }
753
+ if (caml_is_continuation_tag(v[0]))
754
+ caml_invalid_argument("output_value: continuation value");
755
+ if (v.length > 1 && memo(v)) return;
756
+ if (v[0] < 16 && v.length - 1 < 8)
757
+ writer.write(
758
+ 8,
759
+ 0x80 /*cst.PREFIX_SMALL_BLOCK*/ + v[0] + ((v.length - 1) << 4),
760
+ );
761
+ else {
762
+ if (v.length - 1 >= 0x400000 /* 2^22 */)
763
+ caml_failwith(
764
+ "output_value: array cannot be read back on 32-bit platform",
765
+ );
766
+ writer.write_code(
767
+ 32,
768
+ 0x08 /*cst.CODE_BLOCK32*/,
769
+ ((v.length - 1) << 10) | v[0],
770
+ );
771
+ }
772
+ writer.size_32 += v.length;
773
+ writer.size_64 += v.length;
774
+ if (v.length > 1) stack.push(v, 1);
775
+ } else if (caml_is_ml_bytes(v)) {
776
+ if (!caml_is_ml_bytes(caml_string_of_jsbytes(""))) {
777
+ caml_failwith(
778
+ "output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]",
779
+ );
780
+ }
781
+ if (memo(v)) return;
782
+ var len = caml_ml_bytes_length(v);
783
+ if (len < 0x20) writer.write(8, 0x20 /*cst.PREFIX_SMALL_STRING*/ + len);
784
+ else if (len < 0x100)
785
+ writer.write_code(8, 0x09 /*cst.CODE_STRING8*/, len);
786
+ else writer.write_code(32, 0x0a /*cst.CODE_STRING32*/, len);
787
+ for (var i = 0; i < len; i++)
788
+ writer.write(8, caml_bytes_unsafe_get(v, i));
789
+ writer.size_32 += 1 + (((len + 4) / 4) | 0);
790
+ writer.size_64 += 1 + (((len + 8) / 8) | 0);
791
+ } else if (caml_is_ml_string(v)) {
792
+ if (memo(v)) return;
793
+ var len = caml_ml_string_length(v);
794
+ if (len < 0x20) writer.write(8, 0x20 /*cst.PREFIX_SMALL_STRING*/ + len);
795
+ else if (len < 0x100)
796
+ writer.write_code(8, 0x09 /*cst.CODE_STRING8*/, len);
797
+ else writer.write_code(32, 0x0a /*cst.CODE_STRING32*/, len);
798
+ for (var i = 0; i < len; i++)
799
+ writer.write(8, caml_string_unsafe_get(v, i));
800
+ writer.size_32 += 1 + (((len + 4) / 4) | 0);
801
+ writer.size_64 += 1 + (((len + 8) / 8) | 0);
802
+ } else {
803
+ if (v !== (v | 0)) {
804
+ var type_of_v = typeof v;
805
+ if (type_of_v !== "number")
806
+ caml_failwith("output_value: abstract value (" + type_of_v + ")");
807
+ // If a float happens to be an integer it is serialized as an integer
808
+ // (Js_of_ocaml cannot tell whether the type of an integer number is
809
+ // float or integer.) This can result in unexpected crashes when
810
+ // unmarshalling using the standard runtime.
811
+ if (memo(v)) return;
812
+ var t = caml_int64_to_bytes(caml_int64_bits_of_float(v));
813
+ writer.write(8, 0x0c /*cst.CODE_DOUBLE_LITTLE*/);
814
+ for (var i = 0; i < 8; i++) {
815
+ writer.write(8, t[7 - i]);
816
+ }
817
+ writer.size_32 += 3;
818
+ writer.size_64 += 2;
819
+ } else if (v >= 0 && v < 0x40) {
820
+ writer.write(8, 0x40 /*cst.PREFIX_SMALL_INT*/ + v);
821
+ } else {
822
+ if (v >= -(1 << 7) && v < 1 << 7)
823
+ writer.write_code(8, 0x00 /*cst.CODE_INT8*/, v);
824
+ else if (v >= -(1 << 15) && v < 1 << 15)
825
+ writer.write_code(16, 0x01 /*cst.CODE_INT16*/, v);
826
+ else writer.write_code(32, 0x02 /*cst.CODE_INT32*/, v);
827
+ }
828
+ }
829
+ }
830
+ extern_rec(v);
831
+ while (stack.length > 0) {
832
+ var i = stack.pop();
833
+ var v = stack.pop();
834
+ if (i + 1 < v.length) stack.push(v, i + 1);
835
+ extern_rec(v[i]);
836
+ }
837
+ if (intern_obj_table) writer.obj_counter = intern_obj_table.objs.length;
838
+ writer.finalize();
839
+ return new Uint8Array(writer.chunk);
840
+ };
841
+ })();
842
+
843
+ //Provides: caml_output_value_to_string mutable
844
+ //Requires: caml_output_val, caml_string_of_uint8_array
845
+ function caml_output_value_to_string(v, flags) {
846
+ return caml_string_of_uint8_array(caml_output_val(v, flags));
847
+ }
848
+
849
+ //Provides: caml_output_value_to_bytes mutable
850
+ //Requires: caml_output_val, caml_bytes_of_uint8_array
851
+ function caml_output_value_to_bytes(v, flags) {
852
+ return caml_bytes_of_uint8_array(caml_output_val(v, flags));
853
+ }
854
+
855
+ //Provides: caml_output_value_to_buffer
856
+ //Requires: caml_output_val, caml_failwith, caml_blit_bytes, caml_bytes_of_uint8_array
857
+ function caml_output_value_to_buffer(s, ofs, len, v, flags) {
858
+ var t = caml_output_val(v, flags);
859
+ if (t.length > len) caml_failwith("Marshal.to_buffer: buffer overflow");
860
+ caml_blit_bytes(caml_bytes_of_uint8_array(t), 0, s, ofs, t.length);
861
+ // Return the number of bytes written, like the native runtime.
862
+ return t.length;
863
+ }