@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,317 @@
1
+ /***********************************************************************/
2
+ /* */
3
+ /* Objective Caml */
4
+ /* */
5
+ /* Xavier Leroy, projet Cristal, INRIA Rocquencourt */
6
+ /* */
7
+ /* Copyright 1996 Institut National de Recherche en Informatique et */
8
+ /* en Automatique. All rights reserved. This file is distributed */
9
+ /* under the terms of the GNU Lesser General Public License, with */
10
+ /* the special exception on linking described in file ../LICENSE. */
11
+ /* */
12
+ /***********************************************************************/
13
+
14
+ /* $Id: parsing.c 8983 2008-08-06 09:38:25Z xleroy $ */
15
+
16
+ /* The PDA automaton for parsers generated by camlyacc */
17
+
18
+ /* The pushdown automata */
19
+
20
+ //Provides: caml_parser_trace
21
+ var caml_parser_trace = 0;
22
+
23
+ //Provides: caml_parse_engine
24
+ //Requires: caml_lex_array, caml_parser_trace,caml_jsstring_of_string
25
+ //Requires: caml_ml_output, caml_ml_string_length, caml_string_of_jsbytes
26
+ //Requires: caml_jsbytes_of_string, MlBytes
27
+ //Requires: caml_ml_std_channel_id
28
+ function caml_parse_engine(tables, env, cmd, arg) {
29
+ var ERRCODE = 256;
30
+
31
+ //var START = 0;
32
+ //var TOKEN_READ = 1;
33
+ //var STACKS_GROWN_1 = 2;
34
+ //var STACKS_GROWN_2 = 3;
35
+ //var SEMANTIC_ACTION_COMPUTED = 4;
36
+ //var ERROR_DETECTED = 5;
37
+ var loop = 6;
38
+ var testshift = 7;
39
+ var shift = 8;
40
+ var shift_recover = 9;
41
+ var reduce = 10;
42
+
43
+ var READ_TOKEN = 0;
44
+ var RAISE_PARSE_ERROR = 1;
45
+ var GROW_STACKS_1 = 2;
46
+ var GROW_STACKS_2 = 3;
47
+ var COMPUTE_SEMANTIC_ACTION = 4;
48
+ var CALL_ERROR_FUNCTION = 5;
49
+
50
+ var env_s_stack = 1;
51
+ var env_v_stack = 2;
52
+ var env_symb_start_stack = 3;
53
+ var env_symb_end_stack = 4;
54
+ var env_stacksize = 5;
55
+ var env_stackbase = 6;
56
+ var env_curr_char = 7;
57
+ var env_lval = 8;
58
+ var env_symb_start = 9;
59
+ var env_symb_end = 10;
60
+ var env_asp = 11;
61
+ var env_rule_len = 12;
62
+ var env_rule_number = 13;
63
+ var env_sp = 14;
64
+ var env_state = 15;
65
+ var env_errflag = 16;
66
+
67
+ // var _tbl_actions = 1;
68
+ var tbl_transl_const = 2;
69
+ var tbl_transl_block = 3;
70
+ var tbl_lhs = 4;
71
+ var tbl_len = 5;
72
+ var tbl_defred = 6;
73
+ var tbl_dgoto = 7;
74
+ var tbl_sindex = 8;
75
+ var tbl_rindex = 9;
76
+ var tbl_gindex = 10;
77
+ var tbl_tablesize = 11;
78
+ var tbl_table = 12;
79
+ var tbl_check = 13;
80
+ // var _tbl_error_function = 14;
81
+ var tbl_names_const = 15;
82
+ var tbl_names_block = 16;
83
+
84
+ function log(x) {
85
+ var s = caml_string_of_jsbytes(x + "\n");
86
+ caml_ml_output(caml_ml_std_channel_id[2], s, 0, caml_ml_string_length(s));
87
+ }
88
+
89
+ function token_name(names, number) {
90
+ var str = caml_jsstring_of_string(names);
91
+ if (str[0] === "\x00") return "<unknown token>";
92
+ return str.split("\x00")[number];
93
+ }
94
+
95
+ function print_token(state, tok) {
96
+ var token, kind;
97
+ if (Array.isArray(tok)) {
98
+ token = token_name(tables[tbl_names_block], tok[0]);
99
+ if (typeof tok[1] === "number") kind = "" + tok[1];
100
+ else if (typeof tok[1] === "string") kind = tok[1];
101
+ else if (tok[1] instanceof MlBytes) kind = caml_jsbytes_of_string(tok[1]);
102
+ else kind = "_";
103
+ log("State " + state + ": read token " + token + "(" + kind + ")");
104
+ } else {
105
+ token = token_name(tables[tbl_names_const], tok);
106
+ log("State " + state + ": read token " + token);
107
+ }
108
+ }
109
+
110
+ if (!tables.dgoto) {
111
+ tables.defred = caml_lex_array(tables[tbl_defred]);
112
+ tables.sindex = caml_lex_array(tables[tbl_sindex]);
113
+ tables.check = caml_lex_array(tables[tbl_check]);
114
+ tables.rindex = caml_lex_array(tables[tbl_rindex]);
115
+ tables.table = caml_lex_array(tables[tbl_table]);
116
+ tables.len = caml_lex_array(tables[tbl_len]);
117
+ tables.lhs = caml_lex_array(tables[tbl_lhs]);
118
+ tables.gindex = caml_lex_array(tables[tbl_gindex]);
119
+ tables.dgoto = caml_lex_array(tables[tbl_dgoto]);
120
+ }
121
+
122
+ var res = 0,
123
+ n,
124
+ n1,
125
+ n2,
126
+ state1;
127
+
128
+ // RESTORE
129
+ var sp = env[env_sp];
130
+ var state = env[env_state];
131
+ var errflag = env[env_errflag];
132
+
133
+ the_loop: for (;;) {
134
+ switch (cmd) {
135
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
136
+ case 0: //START:
137
+ state = 0;
138
+ errflag = 0;
139
+ // falls through
140
+
141
+ case 6: //loop:
142
+ n = tables.defred[state];
143
+ if (n !== 0) {
144
+ cmd = reduce;
145
+ continue the_loop;
146
+ }
147
+ if (env[env_curr_char] >= 0) {
148
+ cmd = testshift;
149
+ continue the_loop;
150
+ }
151
+ res = READ_TOKEN;
152
+ break the_loop;
153
+ /* The ML code calls the lexer and updates */
154
+ /* symb_start and symb_end */
155
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
156
+ case 1: //TOKEN_READ:
157
+ if (Array.isArray(arg)) {
158
+ env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1];
159
+ env[env_lval] = arg[1];
160
+ } else {
161
+ env[env_curr_char] = tables[tbl_transl_const][arg + 1];
162
+ env[env_lval] = 0;
163
+ }
164
+ if (caml_parser_trace) print_token(state, arg);
165
+ // falls through
166
+
167
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
168
+ case 7: //testshift:
169
+ n1 = tables.sindex[state];
170
+ n2 = n1 + env[env_curr_char];
171
+ if (
172
+ n1 !== 0 &&
173
+ n2 >= 0 &&
174
+ n2 <= tables[tbl_tablesize] &&
175
+ tables.check[n2] === env[env_curr_char]
176
+ ) {
177
+ cmd = shift;
178
+ continue the_loop;
179
+ }
180
+ n1 = tables.rindex[state];
181
+ n2 = n1 + env[env_curr_char];
182
+ if (
183
+ n1 !== 0 &&
184
+ n2 >= 0 &&
185
+ n2 <= tables[tbl_tablesize] &&
186
+ tables.check[n2] === env[env_curr_char]
187
+ ) {
188
+ n = tables.table[n2];
189
+ cmd = reduce;
190
+ continue the_loop;
191
+ }
192
+ if (errflag <= 0) {
193
+ res = CALL_ERROR_FUNCTION;
194
+ break the_loop;
195
+ }
196
+ // falls through
197
+ /* The ML code calls the error function */
198
+ case 5: //ERROR_DETECTED:
199
+ if (errflag < 3) {
200
+ errflag = 3;
201
+ for (;;) {
202
+ state1 = env[env_s_stack][sp + 1];
203
+ n1 = tables.sindex[state1];
204
+ n2 = n1 + ERRCODE;
205
+ if (
206
+ n1 !== 0 &&
207
+ n2 >= 0 &&
208
+ n2 <= tables[tbl_tablesize] &&
209
+ tables.check[n2] === ERRCODE
210
+ ) {
211
+ if (caml_parser_trace) log("Recovering in state " + state1);
212
+ cmd = shift_recover;
213
+ continue the_loop;
214
+ } else {
215
+ if (caml_parser_trace) log("Discarding state " + state1);
216
+ if (sp <= env[env_stackbase]) {
217
+ if (caml_parser_trace) log("No more states to discard");
218
+ return RAISE_PARSE_ERROR;
219
+ }
220
+ /* The ML code raises Parse_error */
221
+ sp--;
222
+ }
223
+ }
224
+ } else {
225
+ if (env[env_curr_char] === 0)
226
+ return RAISE_PARSE_ERROR; /* The ML code raises Parse_error */
227
+ if (caml_parser_trace) log("Discarding last token read");
228
+ env[env_curr_char] = -1;
229
+ cmd = loop;
230
+ continue the_loop;
231
+ }
232
+ // Unreachable
233
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
234
+ case 8: //shift:
235
+ env[env_curr_char] = -1;
236
+ if (errflag > 0) errflag--;
237
+ // falls through
238
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
239
+ case 9: //shift_recover:
240
+ if (caml_parser_trace)
241
+ log("State " + state + ": shift to state " + tables.table[n2]);
242
+ state = tables.table[n2];
243
+ sp++;
244
+ if (sp >= env[env_stacksize]) {
245
+ res = GROW_STACKS_1;
246
+ break the_loop;
247
+ }
248
+ // falls through
249
+ /* The ML code resizes the stacks */
250
+ case 2: //STACKS_GROWN_1:
251
+ env[env_s_stack][sp + 1] = state;
252
+ env[env_v_stack][sp + 1] = env[env_lval];
253
+ env[env_symb_start_stack][sp + 1] = env[env_symb_start];
254
+ env[env_symb_end_stack][sp + 1] = env[env_symb_end];
255
+ cmd = loop;
256
+ continue the_loop;
257
+
258
+ // biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
259
+ case 10: //reduce:
260
+ if (caml_parser_trace) log("State " + state + ": reduce by rule " + n);
261
+ var m = tables.len[n];
262
+ env[env_asp] = sp;
263
+ env[env_rule_number] = n;
264
+ env[env_rule_len] = m;
265
+ sp = sp - m + 1;
266
+ m = tables.lhs[n];
267
+ state1 = env[env_s_stack][sp];
268
+ n1 = tables.gindex[m];
269
+ n2 = n1 + state1;
270
+ if (
271
+ n1 !== 0 &&
272
+ n2 >= 0 &&
273
+ n2 <= tables[tbl_tablesize] &&
274
+ tables.check[n2] === state1
275
+ )
276
+ state = tables.table[n2];
277
+ else state = tables.dgoto[m];
278
+ if (sp >= env[env_stacksize]) {
279
+ res = GROW_STACKS_2;
280
+ break the_loop;
281
+ }
282
+ // falls through
283
+ /* The ML code resizes the stacks */
284
+ case 3: //STACKS_GROWN_2:
285
+ res = COMPUTE_SEMANTIC_ACTION;
286
+ break the_loop;
287
+ /* The ML code calls the semantic action */
288
+ case 4: //SEMANTIC_ACTION_COMPUTED:
289
+ env[env_s_stack][sp + 1] = state;
290
+ env[env_v_stack][sp + 1] = arg;
291
+ var asp = env[env_asp];
292
+ env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
293
+ if (sp > asp) {
294
+ /* This is an epsilon production. Take symb_start equal to symb_end. */
295
+ env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1];
296
+ }
297
+ cmd = loop;
298
+ continue the_loop;
299
+ /* Should not happen */
300
+ default:
301
+ return RAISE_PARSE_ERROR;
302
+ }
303
+ }
304
+ // SAVE
305
+ env[env_sp] = sp;
306
+ env[env_state] = state;
307
+ env[env_errflag] = errflag;
308
+ return res;
309
+ }
310
+
311
+ //Provides: caml_set_parser_trace
312
+ //Requires: caml_parser_trace
313
+ function caml_set_parser_trace(bool) {
314
+ var oldflag = caml_parser_trace;
315
+ caml_parser_trace = bool;
316
+ return oldflag;
317
+ }
@@ -0,0 +1,84 @@
1
+ //Provides: caml_lxm_M
2
+ //Requires: caml_int64_of_string
3
+ //Requires: caml_string_of_jsstring
4
+ //Version: >= 5
5
+ var caml_lxm_M = caml_int64_of_string(
6
+ caml_string_of_jsstring("0xd1342543de82ef95"),
7
+ );
8
+
9
+ //Provides: caml_lxm_daba
10
+ //Requires: caml_int64_of_string
11
+ //Requires: caml_string_of_jsstring
12
+ //Version: >= 5
13
+ var caml_lxm_daba = caml_int64_of_string(
14
+ caml_string_of_jsstring("0xdaba0b6eb09322e3"),
15
+ );
16
+
17
+ //Provides: caml_lxm_next mutable
18
+ //Requires: caml_int64_shift_left
19
+ //Requires: caml_int64_shift_right_unsigned
20
+ //Requires: caml_int64_or
21
+ //Requires: caml_int64_xor
22
+ //Requires: caml_int64_add
23
+ //Requires: caml_int64_mul
24
+ //Requires: caml_ba_get_1
25
+ //Requires: caml_ba_set_1
26
+ //Requires: caml_lxm_M
27
+ //Requires: caml_lxm_daba
28
+ //Version: >= 5
29
+ function caml_lxm_next(v) {
30
+ function shift_l(x, k) {
31
+ return caml_int64_shift_left(x, k);
32
+ }
33
+ function shift_r(x, k) {
34
+ return caml_int64_shift_right_unsigned(x, k);
35
+ }
36
+ function or(a, b) {
37
+ return caml_int64_or(a, b);
38
+ }
39
+ function xor(a, b) {
40
+ return caml_int64_xor(a, b);
41
+ }
42
+ function add(a, b) {
43
+ return caml_int64_add(a, b);
44
+ }
45
+ function mul(a, b) {
46
+ return caml_int64_mul(a, b);
47
+ }
48
+ function rotl(x, k) {
49
+ return or(shift_l(x, k), shift_r(x, 64 - k));
50
+ }
51
+ function get(a, i) {
52
+ return caml_ba_get_1(a, i);
53
+ }
54
+ function set(a, i, x) {
55
+ return caml_ba_set_1(a, i, x);
56
+ }
57
+ var M = caml_lxm_M;
58
+ var daba = caml_lxm_daba;
59
+ var z, q0, q1;
60
+ var st = v;
61
+ var a = get(st, 0);
62
+ var s = get(st, 1);
63
+ var x0 = get(st, 2);
64
+ var x1 = get(st, 3);
65
+ /* Combining operation */
66
+ z = add(s, x0);
67
+ /* Mixing function */
68
+ z = mul(xor(z, shift_r(z, 32)), daba);
69
+ z = mul(xor(z, shift_r(z, 32)), daba);
70
+ z = xor(z, shift_r(z, 32));
71
+ /* LCG update */
72
+ set(st, 1, add(mul(s, M), a));
73
+ /* XBG update */
74
+ var q0 = x0;
75
+ var q1 = x1;
76
+ q1 = xor(q1, q0);
77
+ q0 = rotl(q0, 24);
78
+ q0 = xor(xor(q0, q1), shift_l(q1, 16));
79
+ q1 = rotl(q1, 37);
80
+ set(st, 2, q0);
81
+ set(st, 3, q1);
82
+ /* Return result */
83
+ return z;
84
+ }
@@ -0,0 +1,45 @@
1
+ // Js_of_ocaml runtime support
2
+ // http://www.ocsigen.org/js_of_ocaml/
3
+ //
4
+ // This program is free software; you can redistribute it and/or modify
5
+ // it under the terms of the GNU Lesser General Public License as published by
6
+ // the Free Software Foundation, with linking exception;
7
+ // either version 2.1 of the License, or (at your option) any later version.
8
+ //
9
+ // This program is distributed in the hope that it will be useful,
10
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ // GNU Lesser General Public License for more details.
13
+ //
14
+ // You should have received a copy of the GNU Lesser General Public License
15
+ // along with this program; if not, write to the Free Software
16
+ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
+
18
+ // Helpers for the [Js_of_ocaml.Promise] binding.
19
+ //
20
+ // The JS Promise constructor automatically follows any thenable returned
21
+ // from a handler or passed to [Promise.resolve]. To preserve type safety
22
+ // for ['a Promise.t Promise.t] we wrap thenable values in a dedicated
23
+ // container before resolving and unwrap them on the way back. Non-thenable
24
+ // values pass through untouched, which avoids per-call allocation in the
25
+ // common case and lets foreign promises (handed in via [Promise.of_any])
26
+ // flow through transparently.
27
+
28
+ //Provides: caml_jsoo_promise_wrapper
29
+ function caml_jsoo_promise_wrapper(x) {
30
+ this.wrapped = x;
31
+ }
32
+
33
+ //Provides: caml_jsoo_promise_wrap
34
+ //Requires: caml_jsoo_promise_wrapper
35
+ function caml_jsoo_promise_wrap(x) {
36
+ return x != null && typeof x.then === "function"
37
+ ? new caml_jsoo_promise_wrapper(x)
38
+ : x;
39
+ }
40
+
41
+ //Provides: caml_jsoo_promise_unwrap
42
+ //Requires: caml_jsoo_promise_wrapper
43
+ function caml_jsoo_promise_unwrap(x) {
44
+ return x instanceof caml_jsoo_promise_wrapper ? x.wrapped : x;
45
+ }