@live-codes/ocaml 0.0.0-stage → 0.1.0

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 +170 -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,469 @@
1
+ //Provides: initialize_nat
2
+ //Requires: caml_custom_ops
3
+ //Requires: serialize_nat, deserialize_nat, caml_hash_nat
4
+ function initialize_nat() {
5
+ caml_custom_ops._nat = {
6
+ deserialize: deserialize_nat,
7
+ serialize: serialize_nat,
8
+ hash: caml_hash_nat,
9
+ };
10
+ }
11
+
12
+ //Provides: MlNat
13
+ class MlNat {
14
+ constructor(x) {
15
+ this.data = new Int32Array(x);
16
+ // For num < 1.5
17
+ // length_nat isn't external, so we have to make the Obj.size
18
+ // work out right.
19
+ // We add +2 to the array length:
20
+ // - +1 for the tag
21
+ // - +1 for the custom_ops slot
22
+ this.length = this.data.length + 2;
23
+ this.caml_custom = "_nat";
24
+ }
25
+ }
26
+
27
+ //Provides: caml_hash_nat
28
+ //Requires: caml_hash_mix_int, num_digits_nat
29
+ function caml_hash_nat(x) {
30
+ var len = num_digits_nat(x, 0, x.data.length);
31
+ var h = 0;
32
+ for (var i = 0; i < len; i++) {
33
+ h = caml_hash_mix_int(h, x.data[i]);
34
+ }
35
+ return h;
36
+ }
37
+
38
+ //Provides: length_nat
39
+ function length_nat(x) {
40
+ return x.data.length;
41
+ }
42
+
43
+ //Provides: nat_of_array
44
+ //Requires: MlNat
45
+ function nat_of_array(l) {
46
+ return new MlNat(l);
47
+ }
48
+
49
+ //Provides: create_nat
50
+ //Requires: MlNat
51
+ function create_nat(size) {
52
+ var arr = new MlNat(size);
53
+ for (var i = 0; i < size; i++) {
54
+ arr.data[i] = -1;
55
+ }
56
+ return arr;
57
+ }
58
+
59
+ //Provides: set_to_zero_nat
60
+ function set_to_zero_nat(nat, ofs, len) {
61
+ for (var i = 0; i < len; i++) {
62
+ nat.data[ofs + i] = 0;
63
+ }
64
+ return 0;
65
+ }
66
+
67
+ //Provides: blit_nat
68
+ function blit_nat(nat1, ofs1, nat2, ofs2, len) {
69
+ for (var i = 0; i < len; i++) {
70
+ nat1.data[ofs1 + i] = nat2.data[ofs2 + i];
71
+ }
72
+ return 0;
73
+ }
74
+
75
+ //Provides: set_digit_nat
76
+ function set_digit_nat(nat, ofs, digit) {
77
+ nat.data[ofs] = digit;
78
+ return 0;
79
+ }
80
+
81
+ //Provides: nth_digit_nat
82
+ function nth_digit_nat(nat, ofs) {
83
+ return nat.data[ofs];
84
+ }
85
+
86
+ //Provides: set_digit_nat_native
87
+ function set_digit_nat_native(nat, ofs, digit) {
88
+ nat.data[ofs] = digit;
89
+ return 0;
90
+ }
91
+
92
+ //Provides: nth_digit_nat_native
93
+ function nth_digit_nat_native(nat, ofs) {
94
+ return nat.data[ofs];
95
+ }
96
+
97
+ //Provides: num_digits_nat
98
+ function num_digits_nat(nat, ofs, len) {
99
+ for (var i = len - 1; i >= 0; i--) {
100
+ if (nat.data[ofs + i] !== 0) return i + 1;
101
+ }
102
+ return 1; // 0 counts as 1 digit
103
+ }
104
+
105
+ //Provides: num_leading_zero_bits_in_digit
106
+ function num_leading_zero_bits_in_digit(nat, ofs) {
107
+ var a = nat.data[ofs];
108
+ var b = 0;
109
+ if (a & 0xffff0000) {
110
+ b += 16;
111
+ a >>>= 16;
112
+ }
113
+ if (a & 0xff00) {
114
+ b += 8;
115
+ a >>>= 8;
116
+ }
117
+ if (a & 0xf0) {
118
+ b += 4;
119
+ a >>>= 4;
120
+ }
121
+ if (a & 12) {
122
+ b += 2;
123
+ a >>>= 2;
124
+ }
125
+ if (a & 2) {
126
+ b += 1;
127
+ a >>>= 1;
128
+ }
129
+ if (a & 1) {
130
+ b += 1;
131
+ }
132
+ return 32 - b;
133
+ }
134
+
135
+ //Provides: is_digit_int
136
+ function is_digit_int(nat, ofs) {
137
+ if (nat.data[ofs] >= 0) return 1;
138
+ return 0;
139
+ }
140
+
141
+ //Provides: is_digit_zero
142
+ function is_digit_zero(nat, ofs) {
143
+ if (nat.data[ofs] === 0) return 1;
144
+ return 0;
145
+ }
146
+
147
+ //Provides: is_digit_normalized
148
+ function is_digit_normalized(_nat, _ofs) {
149
+ return 1;
150
+ }
151
+
152
+ //Provides: is_digit_odd
153
+ function is_digit_odd(nat, ofs) {
154
+ if (nat.data[ofs] & 1) return 1;
155
+ return 0;
156
+ }
157
+
158
+ //Provides: incr_nat
159
+ function incr_nat(nat, ofs, len, carry_in) {
160
+ var carry = carry_in;
161
+ for (var i = 0; i < len; i++) {
162
+ var x = (nat.data[ofs + i] >>> 0) + carry;
163
+ nat.data[ofs + i] = x | 0;
164
+ if (x === x >>> 0) {
165
+ carry = 0;
166
+ break;
167
+ } else {
168
+ carry = 1;
169
+ }
170
+ }
171
+ return carry;
172
+ }
173
+
174
+ // len1 >= len2
175
+ //Provides: add_nat
176
+ //Requires: incr_nat
177
+ function add_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in) {
178
+ var carry = carry_in;
179
+ for (var i = 0; i < len2; i++) {
180
+ var x = (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry;
181
+ nat1.data[ofs1 + i] = x;
182
+ if (x === x >>> 0) {
183
+ carry = 0;
184
+ } else {
185
+ carry = 1;
186
+ }
187
+ }
188
+ return incr_nat(nat1, ofs1 + len2, len1 - len2, carry);
189
+ }
190
+
191
+ //Provides: complement_nat
192
+ function complement_nat(nat, ofs, len) {
193
+ for (var i = 0; i < len; i++) {
194
+ nat.data[ofs + i] = (-1 >>> 0) - (nat.data[ofs + i] >>> 0);
195
+ }
196
+ }
197
+
198
+ // ocaml flips carry_in
199
+ //Provides: decr_nat
200
+ function decr_nat(nat, ofs, len, carry_in) {
201
+ var borrow = carry_in === 1 ? 0 : 1;
202
+ for (var i = 0; i < len; i++) {
203
+ var x = (nat.data[ofs + i] >>> 0) - borrow;
204
+ nat.data[ofs + i] = x;
205
+ if (x >= 0) {
206
+ borrow = 0;
207
+ break;
208
+ } else {
209
+ borrow = 1;
210
+ }
211
+ }
212
+ return borrow === 1 ? 0 : 1;
213
+ }
214
+
215
+ // ocaml flips carry_in
216
+ // len1 >= len2
217
+ //Provides: sub_nat
218
+ //Requires: decr_nat
219
+ function sub_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in) {
220
+ var borrow = carry_in === 1 ? 0 : 1;
221
+ for (var i = 0; i < len2; i++) {
222
+ var x = (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow;
223
+ nat1.data[ofs1 + i] = x;
224
+ if (x >= 0) {
225
+ borrow = 0;
226
+ } else {
227
+ borrow = 1;
228
+ }
229
+ }
230
+ return decr_nat(nat1, ofs1 + len2, len1 - len2, borrow === 1 ? 0 : 1);
231
+ }
232
+
233
+ // nat1 += nat2 * nat3[ofs3]
234
+ // len1 >= len2
235
+ //Provides: mult_digit_nat
236
+ //Requires: add_nat, nat_of_array
237
+ function mult_digit_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3) {
238
+ var carry = 0;
239
+ var a = nat3.data[ofs3] >>> 0;
240
+ for (var i = 0; i < len2; i++) {
241
+ var x1 =
242
+ (nat1.data[ofs1 + i] >>> 0) +
243
+ (nat2.data[ofs2 + i] >>> 0) * (a & 0x0000ffff) +
244
+ carry;
245
+ var x2 = (nat2.data[ofs2 + i] >>> 0) * (a >>> 16);
246
+ carry = Math.floor(x2 / 65536);
247
+ var x3 = x1 + (x2 % 65536) * 65536;
248
+ nat1.data[ofs1 + i] = x3;
249
+ carry += Math.floor(x3 / 4294967296);
250
+ }
251
+
252
+ if (len2 < len1 && carry) {
253
+ return add_nat(
254
+ nat1,
255
+ ofs1 + len2,
256
+ len1 - len2,
257
+ nat_of_array([carry]),
258
+ 0,
259
+ 1,
260
+ 0,
261
+ );
262
+ } else {
263
+ return carry;
264
+ }
265
+ }
266
+
267
+ // nat1 += nat2 * nat3
268
+ // len1 >= len2 + len3.
269
+ //Provides: mult_nat
270
+ //Requires: mult_digit_nat
271
+ function mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3) {
272
+ var carry = 0;
273
+ for (var i = 0; i < len3; i++) {
274
+ carry += mult_digit_nat(
275
+ nat1,
276
+ ofs1 + i,
277
+ len1 - i,
278
+ nat2,
279
+ ofs2,
280
+ len2,
281
+ nat3,
282
+ ofs3 + i,
283
+ );
284
+ }
285
+ return carry;
286
+ }
287
+
288
+ // nat1 = 2 * nat1 + nat2 * nat2
289
+ // len1 >= 2 * len2
290
+ //Provides: square_nat
291
+ //Requires: mult_nat, add_nat
292
+ function square_nat(nat1, ofs1, len1, nat2, ofs2, len2) {
293
+ var carry = 0;
294
+ carry += add_nat(nat1, ofs1, len1, nat1, ofs1, len1, 0);
295
+ carry += mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat2, ofs2, len2);
296
+ return carry;
297
+ }
298
+
299
+ // 0 <= shift < 32
300
+ //Provides: shift_left_nat
301
+ function shift_left_nat(nat1, ofs1, len1, nat2, ofs2, nbits) {
302
+ if (nbits === 0) {
303
+ nat2.data[ofs2] = 0;
304
+ return 0;
305
+ }
306
+ var wrap = 0;
307
+ for (var i = 0; i < len1; i++) {
308
+ var a = nat1.data[ofs1 + i] >>> 0;
309
+ nat1.data[ofs1 + i] = (a << nbits) | wrap;
310
+ wrap = a >>> (32 - nbits);
311
+ }
312
+ nat2.data[ofs2] = wrap;
313
+ return 0;
314
+ }
315
+
316
+ // Assuming c > a, returns [quotient, remainder] of (a<<32 + b)/c
317
+ //Provides: div_helper
318
+ function div_helper(a, b, c) {
319
+ var x = a * 65536 + (b >>> 16);
320
+ var y = Math.floor(x / c) * 65536;
321
+ var z = (x % c) * 65536;
322
+ var w = z + (b & 0x0000ffff);
323
+ return [y + Math.floor(w / c), w % c];
324
+ }
325
+
326
+ // nat1[ofs1+len] < nat2[ofs2]
327
+ //Provides: div_digit_nat
328
+ //Requires: div_helper
329
+ function div_digit_nat(natq, ofsq, natr, ofsr, nat1, ofs1, len, nat2, ofs2) {
330
+ var rem = nat1.data[ofs1 + len - 1] >>> 0;
331
+ // natq[ofsq+len-1] is guaranteed to be zero (due to the MSD requirement),
332
+ // and should not be written to.
333
+ for (var i = len - 2; i >= 0; i--) {
334
+ var x = div_helper(rem, nat1.data[ofs1 + i] >>> 0, nat2.data[ofs2] >>> 0);
335
+ natq.data[ofsq + i] = x[0];
336
+ rem = x[1];
337
+ }
338
+ natr.data[ofsr] = rem;
339
+ return 0;
340
+ }
341
+
342
+ // nat1[nat2:] := nat1 / nat2
343
+ // nat1[:nat2] := nat1 % nat2
344
+ // len1 > len2, nat2[ofs2+len2-1] > nat1[ofs1+len1-1]
345
+ //Provides: div_nat
346
+ //Requires: div_digit_nat, div_helper, num_leading_zero_bits_in_digit, shift_left_nat, shift_right_nat, create_nat, set_to_zero_nat, mult_digit_nat, sub_nat, compare_nat, nat_of_array
347
+ function div_nat(nat1, ofs1, len1, nat2, ofs2, len2) {
348
+ if (len2 === 1) {
349
+ div_digit_nat(nat1, ofs1 + 1, nat1, ofs1, nat1, ofs1, len1, nat2, ofs2);
350
+ return 0;
351
+ }
352
+
353
+ var s = num_leading_zero_bits_in_digit(nat2, ofs2 + len2 - 1);
354
+ shift_left_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s);
355
+ shift_left_nat(nat1, ofs1, len1, nat_of_array([0]), 0, s);
356
+
357
+ var d = (nat2.data[ofs2 + len2 - 1] >>> 0) + 1;
358
+ var a = create_nat(len2 + 1);
359
+ for (var i = len1 - 1; i >= len2; i--) {
360
+ // Decent lower bound on quo
361
+ var quo =
362
+ d === 4294967296
363
+ ? nat1.data[ofs1 + i] >>> 0
364
+ : div_helper(
365
+ nat1.data[ofs1 + i] >>> 0,
366
+ nat1.data[ofs1 + i - 1] >>> 0,
367
+ d,
368
+ )[0];
369
+ set_to_zero_nat(a, 0, len2 + 1);
370
+ mult_digit_nat(a, 0, len2 + 1, nat2, ofs2, len2, nat_of_array([quo]), 0);
371
+ sub_nat(nat1, ofs1 + i - len2, len2 + 1, a, 0, len2 + 1, 1);
372
+
373
+ while (
374
+ nat1.data[ofs1 + i] !== 0 ||
375
+ compare_nat(nat1, ofs1 + i - len2, len2, nat2, ofs2, len2) >= 0
376
+ ) {
377
+ quo = quo + 1;
378
+ sub_nat(nat1, ofs1 + i - len2, len2 + 1, nat2, ofs2, len2, 1);
379
+ }
380
+
381
+ nat1.data[ofs1 + i] = quo;
382
+ }
383
+
384
+ shift_right_nat(nat1, ofs1, len2, nat_of_array([0]), 0, s); // shift remainder
385
+ shift_right_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); // restore
386
+ return 0;
387
+ }
388
+
389
+ // 0 <= shift < 32
390
+ //Provides: shift_right_nat
391
+ function shift_right_nat(nat1, ofs1, len1, nat2, ofs2, nbits) {
392
+ if (nbits === 0) {
393
+ nat2.data[ofs2] = 0;
394
+ return 0;
395
+ }
396
+ var wrap = 0;
397
+ for (var i = len1 - 1; i >= 0; i--) {
398
+ var a = nat1.data[ofs1 + i] >>> 0;
399
+ nat1.data[ofs1 + i] = (a >>> nbits) | wrap;
400
+ wrap = a << (32 - nbits);
401
+ }
402
+ nat2.data[ofs2] = wrap;
403
+ return 0;
404
+ }
405
+
406
+ //Provides: compare_digits_nat
407
+ function compare_digits_nat(nat1, ofs1, nat2, ofs2) {
408
+ if (nat1.data[ofs1] > nat2.data[ofs2]) return 1;
409
+ if (nat1.data[ofs1] < nat2.data[ofs2]) return -1;
410
+ return 0;
411
+ }
412
+
413
+ //Provides: compare_nat
414
+ //Requires: num_digits_nat
415
+ function compare_nat(nat1, ofs1, len1, nat2, ofs2, len2) {
416
+ var a = num_digits_nat(nat1, ofs1, len1);
417
+ var b = num_digits_nat(nat2, ofs2, len2);
418
+ if (a > b) return 1;
419
+ if (a < b) return -1;
420
+ // iterate over the common significant length, not len1: the digits
421
+ // above it are zero, and reading them would go outside nat2's
422
+ // subrange when len1 !== len2
423
+ for (var i = a - 1; i >= 0; i--) {
424
+ if (nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0) return 1;
425
+ if (nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0) return -1;
426
+ }
427
+ return 0;
428
+ }
429
+
430
+ //Provides: land_digit_nat
431
+ function land_digit_nat(nat1, ofs1, nat2, ofs2) {
432
+ nat1.data[ofs1] &= nat2.data[ofs2];
433
+ return 0;
434
+ }
435
+
436
+ //Provides: lor_digit_nat
437
+ function lor_digit_nat(nat1, ofs1, nat2, ofs2) {
438
+ nat1.data[ofs1] |= nat2.data[ofs2];
439
+ return 0;
440
+ }
441
+
442
+ //Provides: lxor_digit_nat
443
+ function lxor_digit_nat(nat1, ofs1, nat2, ofs2) {
444
+ nat1.data[ofs1] ^= nat2.data[ofs2];
445
+ return 0;
446
+ }
447
+
448
+ //Provides: serialize_nat
449
+ function serialize_nat(writer, nat, sz) {
450
+ var len = nat.data.length;
451
+ writer.write(32, len);
452
+ for (var i = 0; i < len; i++) {
453
+ writer.write(32, nat.data[i]);
454
+ }
455
+ sz[0] = len * 4;
456
+ sz[1] = len * 8;
457
+ }
458
+
459
+ //Provides: deserialize_nat
460
+ //Requires: MlNat
461
+ function deserialize_nat(reader, sz) {
462
+ var len = reader.read32s();
463
+ var nat = new MlNat(len);
464
+ for (var i = 0; i < len; i++) {
465
+ nat.data[i] = reader.read32s();
466
+ }
467
+ sz[0] = len * 4;
468
+ return nat;
469
+ }