@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.
- package/LICENSE +220 -0
- package/README.md +165 -2
- package/THIRD-PARTY-NOTICES.md +52 -0
- package/assets/compiler/compile_stdout.browser.js +27856 -0
- package/assets/compiler/jsoo.js +12631 -0
- package/assets/compiler/package.json +3 -0
- package/assets/compiler/runtime/bigarray.js +1072 -0
- package/assets/compiler/runtime/bigstring.js +137 -0
- package/assets/compiler/runtime/domain.js +393 -0
- package/assets/compiler/runtime/dynlink.js +91 -0
- package/assets/compiler/runtime/float32.js +486 -0
- package/assets/compiler/runtime/fs.js +416 -0
- package/assets/compiler/runtime/fs_fake.js +600 -0
- package/assets/compiler/runtime/fs_node.js +609 -0
- package/assets/compiler/runtime/fs_quickjs.js +532 -0
- package/assets/compiler/runtime/gc.js +201 -0
- package/assets/compiler/runtime/graphics.js +1053 -0
- package/assets/compiler/runtime/ieee_754.js +621 -0
- package/assets/compiler/runtime/int64.js +516 -0
- package/assets/compiler/runtime/io.js +739 -0
- package/assets/compiler/runtime/jslib.js +553 -0
- package/assets/compiler/runtime/jslib_js_of_ocaml.js +81 -0
- package/assets/compiler/runtime/lexing.js +240 -0
- package/assets/compiler/runtime/manifest.txt +31 -0
- package/assets/compiler/runtime/marshal.js +863 -0
- package/assets/compiler/runtime/md5.js +236 -0
- package/assets/compiler/runtime/mlBytes.js +1007 -0
- package/assets/compiler/runtime/nat.js +469 -0
- package/assets/compiler/runtime/parsing.js +317 -0
- package/assets/compiler/runtime/prng.js +84 -0
- package/assets/compiler/runtime/promise.js +45 -0
- package/assets/compiler/runtime/runtime.js +16688 -0
- package/assets/compiler/runtime/runtime_events.js +90 -0
- package/assets/compiler/runtime/stdlib.js +363 -0
- package/assets/compiler/runtime/sync.js +35 -0
- package/assets/compiler/runtime/toplevel.js +150 -0
- package/assets/compiler/runtime/unix.js +914 -0
- package/assets/compiler/runtime/weak.js +247 -0
- package/assets/compiler/stdlib.js +254 -0
- package/assets/compiler/worker.js +46 -0
- package/assets/interpreter/libs/greet.cma +0 -0
- package/assets/interpreter/libs/greet.cmi +0 -0
- package/assets/interpreter/libs/manifest.txt +1 -0
- package/assets/interpreter/package.json +3 -0
- package/assets/interpreter/stdlib/camlinternalFormat.cmi +0 -0
- package/assets/interpreter/stdlib/camlinternalFormatBasics.cmi +0 -0
- package/assets/interpreter/stdlib/camlinternalLazy.cmi +0 -0
- package/assets/interpreter/stdlib/camlinternalMod.cmi +0 -0
- package/assets/interpreter/stdlib/camlinternalOO.cmi +0 -0
- package/assets/interpreter/stdlib/std_exit.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Arg.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Array.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__ArrayLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Atomic.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Bigarray.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Bool.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Buffer.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Bytes.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__BytesLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Callback.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Char.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Complex.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Condition.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Digest.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Domain.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Dynarray.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Effect.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Either.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Ephemeron.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Filename.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Float.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Format.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Fun.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Gc.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Hashtbl.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Iarray.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__In_channel.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Int.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Int32.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Int64.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Lazy.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Lexing.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__List.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__ListLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Map.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Marshal.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__MoreLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Mutex.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Nativeint.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Obj.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Oo.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Option.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Out_channel.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Pair.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Parsing.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Pqueue.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Printexc.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Printf.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Queue.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Random.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Repr.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Result.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Scanf.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Semaphore.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Seq.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Set.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Stack.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__StdLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__String.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__StringLabels.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Sys.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Type.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Uchar.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Unit.cmi +0 -0
- package/assets/interpreter/stdlib/stdlib__Weak.cmi +0 -0
- package/assets/interpreter/stdlib/topdirs.cmi +0 -0
- package/assets/interpreter/stdlib/units.txt +75 -0
- package/assets/interpreter/stdlib/unix.cmi +0 -0
- package/assets/interpreter/stdlib/unixLabels.cmi +0 -0
- package/assets/interpreter/worker-entry.js +39 -0
- package/assets/interpreter/worker.js +42356 -0
- package/bin/copy-assets.mjs +75 -0
- package/package.json +41 -4
- package/src/compiler/compile.js +170 -0
- package/src/compiler/index.js +46 -0
- package/src/compiler/worker.js +46 -0
- package/src/index.js +12 -0
- package/src/interpreter/api.js +182 -0
- package/src/interpreter/index.js +5 -0
|
@@ -0,0 +1,1072 @@
|
|
|
1
|
+
// Js_of_ocaml runtime support
|
|
2
|
+
// http://www.ocsigen.org/js_of_ocaml/
|
|
3
|
+
// Copyright (C) 2014 Jérôme Vouillon, Hugo Heuzard, Andy Ray
|
|
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
|
+
// Bigarray.
|
|
21
|
+
//
|
|
22
|
+
// - all bigarray types including Int64 and Complex.
|
|
23
|
+
// - fortran + c layouts
|
|
24
|
+
// - sub/slice/reshape
|
|
25
|
+
// - retain fast path for 1d array access
|
|
26
|
+
|
|
27
|
+
//Provides: caml_ba_init const
|
|
28
|
+
function caml_ba_init() {
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//Provides: caml_ba_get_size
|
|
33
|
+
//Requires: caml_invalid_argument
|
|
34
|
+
function caml_ba_get_size(dims) {
|
|
35
|
+
var n_dims = dims.length;
|
|
36
|
+
var size = 1;
|
|
37
|
+
for (var i = 0; i < n_dims; i++) {
|
|
38
|
+
if (dims[i] < 0)
|
|
39
|
+
caml_invalid_argument("Bigarray.create: negative dimension");
|
|
40
|
+
size = size * dims[i];
|
|
41
|
+
}
|
|
42
|
+
return size;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//Provides: caml_double_of_float16 pure
|
|
46
|
+
var caml_double_of_float16 = (function () {
|
|
47
|
+
var pow = Math.pow;
|
|
48
|
+
|
|
49
|
+
var EXP_MASK16 = 31; // 2 ** 5 - 1
|
|
50
|
+
var SIGNIFICAND_MASK16 = 1023; // 2 ** 10 - 1
|
|
51
|
+
var MIN_SUBNORMAL16 = pow(2, -24); // 2 ** -10 * 2 ** -14
|
|
52
|
+
var SIGNIFICAND_DENOM16 = 0.0009765625; // 2 ** -10
|
|
53
|
+
|
|
54
|
+
return function (bytes) {
|
|
55
|
+
var sign = bytes >>> 15;
|
|
56
|
+
var exponent = (bytes >>> 10) & EXP_MASK16;
|
|
57
|
+
var significand = bytes & SIGNIFICAND_MASK16;
|
|
58
|
+
if (exponent === EXP_MASK16)
|
|
59
|
+
return significand === 0
|
|
60
|
+
? sign === 0
|
|
61
|
+
? Number.POSITIVE_INFINITY
|
|
62
|
+
: Number.NEGATIVE_INFINITY
|
|
63
|
+
: Number.NaN;
|
|
64
|
+
if (exponent === 0)
|
|
65
|
+
return significand * (sign === 0 ? MIN_SUBNORMAL16 : -MIN_SUBNORMAL16);
|
|
66
|
+
var r =
|
|
67
|
+
pow(2, exponent - 15) *
|
|
68
|
+
(sign === 0
|
|
69
|
+
? 1 + significand * SIGNIFICAND_DENOM16
|
|
70
|
+
: -1 - significand * SIGNIFICAND_DENOM16);
|
|
71
|
+
return r;
|
|
72
|
+
};
|
|
73
|
+
})();
|
|
74
|
+
|
|
75
|
+
//Provides: caml_float16_of_double pure
|
|
76
|
+
var caml_float16_of_double = (function () {
|
|
77
|
+
// Faithful port of the native runtime's float_to_half_fast3_rtne
|
|
78
|
+
// (caml_float_to_float16 in runtime/bigarray.c). The double is first
|
|
79
|
+
// rounded to a float32 (the `(float) x` cast native performs), then to a
|
|
80
|
+
// float16, each step round-to-nearest-ties-to-even. Rounding the double
|
|
81
|
+
// straight onto the float16 grid would double-round differently from
|
|
82
|
+
// native and the wasm runtime on tie cases (e.g. 65519.99999958789 must
|
|
83
|
+
// give 0x7c00, not 0x7bff).
|
|
84
|
+
const buffer = new ArrayBuffer(4);
|
|
85
|
+
const f32 = new Float32Array(buffer);
|
|
86
|
+
const u32 = new Uint32Array(buffer);
|
|
87
|
+
return function (f) {
|
|
88
|
+
f32[0] = f; // round to float32
|
|
89
|
+
let x = u32[0] >>> 0;
|
|
90
|
+
const sign = x & 0x80000000;
|
|
91
|
+
x = (x ^ sign) >>> 0;
|
|
92
|
+
let o;
|
|
93
|
+
if (x >= 0x47800000) {
|
|
94
|
+
// |x| >= 2^16: infinity, or NaN if the float32 was a NaN
|
|
95
|
+
o = x > 0x7f800000 ? 0x7e00 : 0x7c00;
|
|
96
|
+
} else if (x < 0x38800000) {
|
|
97
|
+
// |x| < 2^-14: subnormal, rounded via the magic-number add
|
|
98
|
+
u32[0] = x;
|
|
99
|
+
f32[0] = f32[0] + 0.5;
|
|
100
|
+
o = (u32[0] - 0x3f000000) >>> 0;
|
|
101
|
+
} else {
|
|
102
|
+
// normal: round-to-nearest-even over the 13 dropped mantissa bits
|
|
103
|
+
o = (x + 0xc8000fff + ((x >>> 13) & 1)) >>> 13;
|
|
104
|
+
}
|
|
105
|
+
return (o | (sign >>> 16)) & 0xffff;
|
|
106
|
+
};
|
|
107
|
+
})();
|
|
108
|
+
|
|
109
|
+
//Provides: caml_ba_get_size_per_element
|
|
110
|
+
function caml_ba_get_size_per_element(kind) {
|
|
111
|
+
switch (kind) {
|
|
112
|
+
case 7:
|
|
113
|
+
case 10:
|
|
114
|
+
case 11:
|
|
115
|
+
return 2;
|
|
116
|
+
default:
|
|
117
|
+
return 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
//Provides: caml_ba_create_buffer
|
|
122
|
+
//Requires: caml_ba_get_size_per_element
|
|
123
|
+
//Requires: caml_invalid_argument
|
|
124
|
+
function caml_ba_create_buffer(kind, size) {
|
|
125
|
+
var view;
|
|
126
|
+
switch (kind) {
|
|
127
|
+
case 0:
|
|
128
|
+
view = Float32Array;
|
|
129
|
+
break;
|
|
130
|
+
case 1:
|
|
131
|
+
view = Float64Array;
|
|
132
|
+
break;
|
|
133
|
+
case 2:
|
|
134
|
+
view = Int8Array;
|
|
135
|
+
break;
|
|
136
|
+
case 3:
|
|
137
|
+
view = Uint8Array;
|
|
138
|
+
break;
|
|
139
|
+
case 4:
|
|
140
|
+
view = Int16Array;
|
|
141
|
+
break;
|
|
142
|
+
case 5:
|
|
143
|
+
view = Uint16Array;
|
|
144
|
+
break;
|
|
145
|
+
case 6:
|
|
146
|
+
view = Int32Array;
|
|
147
|
+
break;
|
|
148
|
+
case 7:
|
|
149
|
+
view = Int32Array;
|
|
150
|
+
break;
|
|
151
|
+
case 8:
|
|
152
|
+
view = Int32Array;
|
|
153
|
+
break;
|
|
154
|
+
case 9:
|
|
155
|
+
view = Int32Array;
|
|
156
|
+
break;
|
|
157
|
+
case 10:
|
|
158
|
+
view = Float32Array;
|
|
159
|
+
break;
|
|
160
|
+
case 11:
|
|
161
|
+
view = Float64Array;
|
|
162
|
+
break;
|
|
163
|
+
case 12:
|
|
164
|
+
view = Uint8Array;
|
|
165
|
+
break;
|
|
166
|
+
case 13:
|
|
167
|
+
view = Uint16Array;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
if (!view) caml_invalid_argument("Bigarray.create: unsupported kind");
|
|
171
|
+
var data = new view(size * caml_ba_get_size_per_element(kind));
|
|
172
|
+
return data;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
//Provides: caml_ba_custom_name
|
|
176
|
+
var caml_ba_custom_name = "_bigarr02";
|
|
177
|
+
|
|
178
|
+
//Provides: Ml_Bigarray
|
|
179
|
+
//Requires: caml_array_bound_error, caml_invalid_argument, caml_ba_custom_name
|
|
180
|
+
//Requires: caml_int64_create_lo_hi, caml_int64_hi32, caml_int64_lo32
|
|
181
|
+
//Requires: caml_float16_of_double, caml_double_of_float16
|
|
182
|
+
class Ml_Bigarray {
|
|
183
|
+
constructor(kind, layout, dims, buffer) {
|
|
184
|
+
this.kind = kind;
|
|
185
|
+
this.layout = layout;
|
|
186
|
+
this.dims = dims;
|
|
187
|
+
this.data = buffer;
|
|
188
|
+
this.caml_custom = caml_ba_custom_name;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
offset(arg) {
|
|
192
|
+
var ofs = 0;
|
|
193
|
+
if (typeof arg === "number") arg = [arg];
|
|
194
|
+
if (!Array.isArray(arg))
|
|
195
|
+
caml_invalid_argument("bigarray.js: invalid offset");
|
|
196
|
+
if (this.dims.length !== arg.length)
|
|
197
|
+
caml_invalid_argument("Bigarray.get/set: bad number of dimensions");
|
|
198
|
+
if (this.layout === 0 /* c_layout */) {
|
|
199
|
+
for (var i = 0; i < this.dims.length; i++) {
|
|
200
|
+
if (arg[i] < 0 || arg[i] >= this.dims[i]) caml_array_bound_error();
|
|
201
|
+
ofs = ofs * this.dims[i] + arg[i];
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
for (var i = this.dims.length - 1; i >= 0; i--) {
|
|
205
|
+
if (arg[i] < 1 || arg[i] > this.dims[i]) {
|
|
206
|
+
caml_array_bound_error();
|
|
207
|
+
}
|
|
208
|
+
ofs = ofs * this.dims[i] + (arg[i] - 1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return ofs;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
get(ofs) {
|
|
215
|
+
switch (this.kind) {
|
|
216
|
+
case 7:
|
|
217
|
+
// Int64
|
|
218
|
+
var l = this.data[ofs * 2 + 0];
|
|
219
|
+
var h = this.data[ofs * 2 + 1];
|
|
220
|
+
return caml_int64_create_lo_hi(l, h);
|
|
221
|
+
case 10:
|
|
222
|
+
case 11:
|
|
223
|
+
// Complex32, Complex64
|
|
224
|
+
var r = this.data[ofs * 2 + 0];
|
|
225
|
+
var i = this.data[ofs * 2 + 1];
|
|
226
|
+
return [254, r, i];
|
|
227
|
+
case 13:
|
|
228
|
+
return caml_double_of_float16(this.data[ofs]);
|
|
229
|
+
default:
|
|
230
|
+
return this.data[ofs];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
set(ofs, v) {
|
|
235
|
+
switch (this.kind) {
|
|
236
|
+
case 7:
|
|
237
|
+
// Int64
|
|
238
|
+
this.data[ofs * 2 + 0] = caml_int64_lo32(v);
|
|
239
|
+
this.data[ofs * 2 + 1] = caml_int64_hi32(v);
|
|
240
|
+
break;
|
|
241
|
+
case 10:
|
|
242
|
+
case 11:
|
|
243
|
+
// Complex32, Complex64
|
|
244
|
+
this.data[ofs * 2 + 0] = v[1];
|
|
245
|
+
this.data[ofs * 2 + 1] = v[2];
|
|
246
|
+
break;
|
|
247
|
+
case 13:
|
|
248
|
+
this.data[ofs] = caml_float16_of_double(v);
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
this.data[ofs] = v;
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
return 0;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
fill(v) {
|
|
258
|
+
switch (this.kind) {
|
|
259
|
+
case 7:
|
|
260
|
+
// Int64
|
|
261
|
+
var a = caml_int64_lo32(v);
|
|
262
|
+
var b = caml_int64_hi32(v);
|
|
263
|
+
if (a === b) {
|
|
264
|
+
this.data.fill(a);
|
|
265
|
+
} else {
|
|
266
|
+
for (var i = 0; i < this.data.length; i++) {
|
|
267
|
+
this.data[i] = i % 2 === 0 ? a : b;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
271
|
+
case 10:
|
|
272
|
+
case 11:
|
|
273
|
+
// Complex32, Complex64
|
|
274
|
+
var im = v[1];
|
|
275
|
+
var re = v[2];
|
|
276
|
+
if (im === re) {
|
|
277
|
+
this.data.fill(im);
|
|
278
|
+
} else {
|
|
279
|
+
for (var i = 0; i < this.data.length; i++) {
|
|
280
|
+
this.data[i] = i % 2 === 0 ? im : re;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
break;
|
|
284
|
+
case 13:
|
|
285
|
+
this.data.fill(caml_float16_of_double(v));
|
|
286
|
+
break;
|
|
287
|
+
default:
|
|
288
|
+
this.data.fill(v);
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
compare(b, total) {
|
|
294
|
+
if (this.layout !== b.layout || this.kind !== b.kind) {
|
|
295
|
+
var k1 = this.kind | (this.layout << 8);
|
|
296
|
+
var k2 = b.kind | (b.layout << 8);
|
|
297
|
+
return k2 - k1;
|
|
298
|
+
}
|
|
299
|
+
if (this.dims.length !== b.dims.length) {
|
|
300
|
+
return b.dims.length - this.dims.length;
|
|
301
|
+
}
|
|
302
|
+
for (var i = 0; i < this.dims.length; i++)
|
|
303
|
+
if (this.dims[i] !== b.dims[i]) return this.dims[i] < b.dims[i] ? -1 : 1;
|
|
304
|
+
switch (this.kind) {
|
|
305
|
+
case 0:
|
|
306
|
+
case 1:
|
|
307
|
+
case 10:
|
|
308
|
+
case 11:
|
|
309
|
+
// Floats
|
|
310
|
+
var x, y;
|
|
311
|
+
for (var i = 0; i < this.data.length; i++) {
|
|
312
|
+
x = this.data[i];
|
|
313
|
+
y = b.data[i];
|
|
314
|
+
if (x < y) return -1;
|
|
315
|
+
if (x > y) return 1;
|
|
316
|
+
if (x !== y) {
|
|
317
|
+
if (!total) return Number.NaN;
|
|
318
|
+
if (!Number.isNaN(x)) return 1;
|
|
319
|
+
if (!Number.isNaN(y)) return -1;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
break;
|
|
323
|
+
case 7:
|
|
324
|
+
// Int64
|
|
325
|
+
for (var i = 0; i < this.data.length; i += 2) {
|
|
326
|
+
// Check highest bits first
|
|
327
|
+
if (this.data[i + 1] < b.data[i + 1]) return -1;
|
|
328
|
+
if (this.data[i + 1] > b.data[i + 1]) return 1;
|
|
329
|
+
if (this.data[i] >>> 0 < b.data[i] >>> 0) return -1;
|
|
330
|
+
if (this.data[i] >>> 0 > b.data[i] >>> 0) return 1;
|
|
331
|
+
}
|
|
332
|
+
break;
|
|
333
|
+
case 13:
|
|
334
|
+
for (var i = 0; i < this.data.length; i++) {
|
|
335
|
+
var aa = caml_double_of_float16(this.data[i]);
|
|
336
|
+
var bb = caml_double_of_float16(b.data[i]);
|
|
337
|
+
if (aa < bb) return -1;
|
|
338
|
+
if (aa > bb) return 1;
|
|
339
|
+
if (aa !== bb) {
|
|
340
|
+
if (!total) return Number.NaN;
|
|
341
|
+
if (!Number.isNaN(aa)) return 1;
|
|
342
|
+
if (!Number.isNaN(bb)) return -1;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
case 2:
|
|
347
|
+
case 3:
|
|
348
|
+
case 4:
|
|
349
|
+
case 5:
|
|
350
|
+
case 6:
|
|
351
|
+
case 8:
|
|
352
|
+
case 9:
|
|
353
|
+
case 12:
|
|
354
|
+
for (var i = 0; i < this.data.length; i++) {
|
|
355
|
+
if (this.data[i] < b.data[i]) return -1;
|
|
356
|
+
if (this.data[i] > b.data[i]) return 1;
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
return 0;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
//Provides: Ml_Bigarray_c_1_1
|
|
365
|
+
//Requires: Ml_Bigarray, caml_array_bound_error, caml_invalid_argument
|
|
366
|
+
class Ml_Bigarray_c_1_1 extends Ml_Bigarray {
|
|
367
|
+
offset(arg) {
|
|
368
|
+
if (typeof arg !== "number") {
|
|
369
|
+
if (Array.isArray(arg) && arg.length === 1) arg = arg[0];
|
|
370
|
+
else caml_invalid_argument("Ml_Bigarray_c_1_1.offset");
|
|
371
|
+
}
|
|
372
|
+
if (arg < 0 || arg >= this.dims[0]) caml_array_bound_error();
|
|
373
|
+
return arg;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
get(ofs) {
|
|
377
|
+
return this.data[ofs];
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
set(ofs, v) {
|
|
381
|
+
this.data[ofs] = v;
|
|
382
|
+
return 0;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
fill(v) {
|
|
386
|
+
this.data.fill(v);
|
|
387
|
+
return 0;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
//Provides: caml_ba_compare
|
|
392
|
+
function caml_ba_compare(a, b, total) {
|
|
393
|
+
return a.compare(b, total);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
//Provides: caml_ba_create_unsafe
|
|
397
|
+
//Requires: Ml_Bigarray, Ml_Bigarray_c_1_1, caml_ba_get_size, caml_ba_get_size_per_element
|
|
398
|
+
//Requires: caml_invalid_argument
|
|
399
|
+
function caml_ba_create_unsafe(kind, layout, dims, data) {
|
|
400
|
+
var size_per_element = caml_ba_get_size_per_element(kind);
|
|
401
|
+
if (caml_ba_get_size(dims) * size_per_element !== data.length) {
|
|
402
|
+
caml_invalid_argument("length doesn't match dims");
|
|
403
|
+
}
|
|
404
|
+
if (
|
|
405
|
+
layout === 0 && // c_layout
|
|
406
|
+
dims.length === 1 && // Array1
|
|
407
|
+
size_per_element === 1 &&
|
|
408
|
+
kind !== 13 // float16
|
|
409
|
+
)
|
|
410
|
+
// 1-to-1 mapping
|
|
411
|
+
return new Ml_Bigarray_c_1_1(kind, layout, dims, data);
|
|
412
|
+
return new Ml_Bigarray(kind, layout, dims, data);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
//Provides: caml_ba_create
|
|
416
|
+
//Requires: caml_js_from_array
|
|
417
|
+
//Requires: caml_ba_get_size, caml_ba_create_unsafe
|
|
418
|
+
//Requires: caml_ba_create_buffer
|
|
419
|
+
function caml_ba_create(kind, layout, dims_ml) {
|
|
420
|
+
var dims = caml_js_from_array(dims_ml);
|
|
421
|
+
var data = caml_ba_create_buffer(kind, caml_ba_get_size(dims));
|
|
422
|
+
return caml_ba_create_unsafe(kind, layout, dims, data);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
//Provides: caml_ba_change_layout
|
|
426
|
+
//Requires: caml_ba_create_unsafe
|
|
427
|
+
function caml_ba_change_layout(ba, layout) {
|
|
428
|
+
if (ba.layout === layout) return ba;
|
|
429
|
+
var new_dims = [];
|
|
430
|
+
for (var i = 0; i < ba.dims.length; i++)
|
|
431
|
+
new_dims[i] = ba.dims[ba.dims.length - i - 1];
|
|
432
|
+
return caml_ba_create_unsafe(ba.kind, layout, new_dims, ba.data);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
//Provides: caml_ba_kind
|
|
436
|
+
function caml_ba_kind(ba) {
|
|
437
|
+
return ba.kind;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
//Provides: caml_ba_layout
|
|
441
|
+
function caml_ba_layout(ba) {
|
|
442
|
+
return ba.layout;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
//Provides: caml_ba_num_dims
|
|
446
|
+
function caml_ba_num_dims(ba) {
|
|
447
|
+
return ba.dims.length;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
//Provides: caml_ba_dim
|
|
451
|
+
//Requires: caml_invalid_argument
|
|
452
|
+
function caml_ba_dim(ba, i) {
|
|
453
|
+
if (i < 0 || i >= ba.dims.length) caml_invalid_argument("Bigarray.dim");
|
|
454
|
+
return ba.dims[i];
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
//Provides: caml_ba_dim_1
|
|
458
|
+
//Requires: caml_ba_dim
|
|
459
|
+
function caml_ba_dim_1(ba) {
|
|
460
|
+
return caml_ba_dim(ba, 0);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
//Provides: caml_ba_dim_2
|
|
464
|
+
//Requires: caml_ba_dim
|
|
465
|
+
function caml_ba_dim_2(ba) {
|
|
466
|
+
return caml_ba_dim(ba, 1);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
//Provides: caml_ba_dim_3
|
|
470
|
+
//Requires: caml_ba_dim
|
|
471
|
+
function caml_ba_dim_3(ba) {
|
|
472
|
+
return caml_ba_dim(ba, 2);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
//Provides: caml_ba_get_generic
|
|
476
|
+
//Requires: caml_js_from_array
|
|
477
|
+
function caml_ba_get_generic(ba, i) {
|
|
478
|
+
var ofs = ba.offset(caml_js_from_array(i));
|
|
479
|
+
return ba.get(ofs);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
//Provides: caml_ba_uint8_get16
|
|
483
|
+
//Requires: caml_array_bound_error
|
|
484
|
+
function caml_ba_uint8_get16(ba, i0) {
|
|
485
|
+
var ofs = ba.offset(i0);
|
|
486
|
+
if (ofs + 1 >= ba.data.length) caml_array_bound_error();
|
|
487
|
+
var b1 = ba.get(ofs);
|
|
488
|
+
var b2 = ba.get(ofs + 1);
|
|
489
|
+
return b1 | (b2 << 8);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
//Provides: caml_ba_uint8_get32
|
|
493
|
+
//Requires: caml_array_bound_error
|
|
494
|
+
function caml_ba_uint8_get32(ba, i0) {
|
|
495
|
+
var ofs = ba.offset(i0);
|
|
496
|
+
if (ofs + 3 >= ba.data.length) caml_array_bound_error();
|
|
497
|
+
var b1 = ba.get(ofs + 0);
|
|
498
|
+
var b2 = ba.get(ofs + 1);
|
|
499
|
+
var b3 = ba.get(ofs + 2);
|
|
500
|
+
var b4 = ba.get(ofs + 3);
|
|
501
|
+
return (b1 << 0) | (b2 << 8) | (b3 << 16) | (b4 << 24);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
//Provides: caml_ba_uint8_get64
|
|
505
|
+
//Requires: caml_array_bound_error, caml_int64_of_bytes
|
|
506
|
+
function caml_ba_uint8_get64(ba, i0) {
|
|
507
|
+
var ofs = ba.offset(i0);
|
|
508
|
+
if (ofs + 7 >= ba.data.length) caml_array_bound_error();
|
|
509
|
+
var b1 = ba.get(ofs + 0);
|
|
510
|
+
var b2 = ba.get(ofs + 1);
|
|
511
|
+
var b3 = ba.get(ofs + 2);
|
|
512
|
+
var b4 = ba.get(ofs + 3);
|
|
513
|
+
var b5 = ba.get(ofs + 4);
|
|
514
|
+
var b6 = ba.get(ofs + 5);
|
|
515
|
+
var b7 = ba.get(ofs + 6);
|
|
516
|
+
var b8 = ba.get(ofs + 7);
|
|
517
|
+
return caml_int64_of_bytes([b8, b7, b6, b5, b4, b3, b2, b1]);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
//Provides: caml_ba_get_1
|
|
521
|
+
//Alias: caml_ba_float32_get_1
|
|
522
|
+
function caml_ba_get_1(ba, i0) {
|
|
523
|
+
return ba.get(ba.offset(i0));
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
//Provides: caml_ba_get_2
|
|
527
|
+
//Alias: caml_ba_float32_get_2
|
|
528
|
+
function caml_ba_get_2(ba, i0, i1) {
|
|
529
|
+
return ba.get(ba.offset([i0, i1]));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
//Provides: caml_ba_get_3
|
|
533
|
+
//Alias: caml_ba_float32_get_3
|
|
534
|
+
function caml_ba_get_3(ba, i0, i1, i2) {
|
|
535
|
+
return ba.get(ba.offset([i0, i1, i2]));
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
//Provides: caml_ba_set_generic
|
|
539
|
+
//Requires: caml_js_from_array
|
|
540
|
+
function caml_ba_set_generic(ba, i, v) {
|
|
541
|
+
ba.set(ba.offset(caml_js_from_array(i)), v);
|
|
542
|
+
return 0;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
//Provides: caml_ba_uint8_set16
|
|
546
|
+
//Requires: caml_array_bound_error
|
|
547
|
+
function caml_ba_uint8_set16(ba, i0, v) {
|
|
548
|
+
var ofs = ba.offset(i0);
|
|
549
|
+
if (ofs + 1 >= ba.data.length) caml_array_bound_error();
|
|
550
|
+
ba.set(ofs + 0, v & 0xff);
|
|
551
|
+
ba.set(ofs + 1, (v >>> 8) & 0xff);
|
|
552
|
+
return 0;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
//Provides: caml_ba_uint8_set32
|
|
556
|
+
//Requires: caml_array_bound_error
|
|
557
|
+
function caml_ba_uint8_set32(ba, i0, v) {
|
|
558
|
+
var ofs = ba.offset(i0);
|
|
559
|
+
if (ofs + 3 >= ba.data.length) caml_array_bound_error();
|
|
560
|
+
ba.set(ofs + 0, v & 0xff);
|
|
561
|
+
ba.set(ofs + 1, (v >>> 8) & 0xff);
|
|
562
|
+
ba.set(ofs + 2, (v >>> 16) & 0xff);
|
|
563
|
+
ba.set(ofs + 3, (v >>> 24) & 0xff);
|
|
564
|
+
return 0;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
//Provides: caml_ba_uint8_set64
|
|
568
|
+
//Requires: caml_array_bound_error, caml_int64_to_bytes
|
|
569
|
+
function caml_ba_uint8_set64(ba, i0, v) {
|
|
570
|
+
var ofs = ba.offset(i0);
|
|
571
|
+
if (ofs + 7 >= ba.data.length) caml_array_bound_error();
|
|
572
|
+
var v = caml_int64_to_bytes(v);
|
|
573
|
+
for (var i = 0; i < 8; i++) ba.set(ofs + i, v[7 - i]);
|
|
574
|
+
return 0;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
//Provides: caml_ba_set_1
|
|
578
|
+
//Alias: caml_ba_float32_set_1
|
|
579
|
+
function caml_ba_set_1(ba, i0, v) {
|
|
580
|
+
ba.set(ba.offset(i0), v);
|
|
581
|
+
return 0;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
//Provides: caml_ba_set_2
|
|
585
|
+
//Alias: caml_ba_float32_set_2
|
|
586
|
+
function caml_ba_set_2(ba, i0, i1, v) {
|
|
587
|
+
ba.set(ba.offset([i0, i1]), v);
|
|
588
|
+
return 0;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
//Provides: caml_ba_set_3
|
|
592
|
+
//Alias: caml_ba_float32_set_3
|
|
593
|
+
function caml_ba_set_3(ba, i0, i1, i2, v) {
|
|
594
|
+
ba.set(ba.offset([i0, i1, i2]), v);
|
|
595
|
+
return 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
//Provides: caml_ba_fill
|
|
599
|
+
function caml_ba_fill(ba, v) {
|
|
600
|
+
ba.fill(v);
|
|
601
|
+
return 0;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
//Provides: caml_ba_blit
|
|
605
|
+
//Requires: caml_invalid_argument
|
|
606
|
+
function caml_ba_blit(src, dst) {
|
|
607
|
+
if (dst.dims.length !== src.dims.length)
|
|
608
|
+
caml_invalid_argument("Bigarray.blit: dimension mismatch");
|
|
609
|
+
for (var i = 0; i < dst.dims.length; i++)
|
|
610
|
+
if (dst.dims[i] !== src.dims[i])
|
|
611
|
+
caml_invalid_argument("Bigarray.blit: dimension mismatch");
|
|
612
|
+
dst.data.set(src.data);
|
|
613
|
+
return 0;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
//Provides: caml_ba_sub
|
|
617
|
+
//Requires: caml_invalid_argument, caml_ba_create_unsafe, caml_ba_get_size
|
|
618
|
+
//Requires: caml_ba_get_size_per_element
|
|
619
|
+
function caml_ba_sub(ba, ofs, len) {
|
|
620
|
+
var changed_dim;
|
|
621
|
+
var mul = 1;
|
|
622
|
+
if (ba.layout === 0) {
|
|
623
|
+
for (var i = 1; i < ba.dims.length; i++) mul = mul * ba.dims[i];
|
|
624
|
+
changed_dim = 0;
|
|
625
|
+
} else {
|
|
626
|
+
for (var i = 0; i < ba.dims.length - 1; i++) mul = mul * ba.dims[i];
|
|
627
|
+
changed_dim = ba.dims.length - 1;
|
|
628
|
+
ofs = ofs - 1;
|
|
629
|
+
}
|
|
630
|
+
if (ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim]) {
|
|
631
|
+
caml_invalid_argument("Bigarray.sub: bad sub-array");
|
|
632
|
+
}
|
|
633
|
+
var new_dims = [];
|
|
634
|
+
for (var i = 0; i < ba.dims.length; i++) new_dims[i] = ba.dims[i];
|
|
635
|
+
new_dims[changed_dim] = len;
|
|
636
|
+
mul *= caml_ba_get_size_per_element(ba.kind);
|
|
637
|
+
var new_data = ba.data.subarray(ofs * mul, (ofs + len) * mul);
|
|
638
|
+
return caml_ba_create_unsafe(ba.kind, ba.layout, new_dims, new_data);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
//Provides: caml_ba_slice
|
|
642
|
+
//Requires: caml_js_from_array, caml_ba_create_unsafe, caml_invalid_argument, caml_ba_get_size
|
|
643
|
+
//Requires: caml_ba_get_size_per_element
|
|
644
|
+
function caml_ba_slice(ba, vind) {
|
|
645
|
+
vind = caml_js_from_array(vind);
|
|
646
|
+
var num_inds = vind.length;
|
|
647
|
+
var index = [];
|
|
648
|
+
var sub_dims = [];
|
|
649
|
+
var ofs;
|
|
650
|
+
|
|
651
|
+
if (num_inds > ba.dims.length)
|
|
652
|
+
caml_invalid_argument("Bigarray.slice: too many indices");
|
|
653
|
+
|
|
654
|
+
// Compute offset and check bounds
|
|
655
|
+
if (ba.layout === 0) {
|
|
656
|
+
for (var i = 0; i < num_inds; i++) index[i] = vind[i];
|
|
657
|
+
for (; i < ba.dims.length; i++) index[i] = 0;
|
|
658
|
+
sub_dims = ba.dims.slice(num_inds);
|
|
659
|
+
} else {
|
|
660
|
+
for (var i = 0; i < num_inds; i++)
|
|
661
|
+
index[ba.dims.length - num_inds + i] = vind[i];
|
|
662
|
+
for (var i = 0; i < ba.dims.length - num_inds; i++) index[i] = 1;
|
|
663
|
+
sub_dims = ba.dims.slice(0, ba.dims.length - num_inds);
|
|
664
|
+
}
|
|
665
|
+
ofs = ba.offset(index);
|
|
666
|
+
var size = caml_ba_get_size(sub_dims);
|
|
667
|
+
var size_per_element = caml_ba_get_size_per_element(ba.kind);
|
|
668
|
+
var new_data = ba.data.subarray(
|
|
669
|
+
ofs * size_per_element,
|
|
670
|
+
(ofs + size) * size_per_element,
|
|
671
|
+
);
|
|
672
|
+
return caml_ba_create_unsafe(ba.kind, ba.layout, sub_dims, new_data);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
//Provides: caml_ba_reshape
|
|
676
|
+
//Requires: caml_js_from_array, caml_invalid_argument, caml_ba_create_unsafe, caml_ba_get_size
|
|
677
|
+
function caml_ba_reshape(ba, vind) {
|
|
678
|
+
vind = caml_js_from_array(vind);
|
|
679
|
+
var new_dim = [];
|
|
680
|
+
var num_dims = vind.length;
|
|
681
|
+
|
|
682
|
+
if (num_dims < 0 || num_dims > 16) {
|
|
683
|
+
caml_invalid_argument("Bigarray.reshape: bad number of dimensions");
|
|
684
|
+
}
|
|
685
|
+
var num_elts = 1;
|
|
686
|
+
for (var i = 0; i < num_dims; i++) {
|
|
687
|
+
new_dim[i] = vind[i];
|
|
688
|
+
if (new_dim[i] < 0)
|
|
689
|
+
caml_invalid_argument("Bigarray.reshape: negative dimension");
|
|
690
|
+
num_elts = num_elts * new_dim[i];
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
var size = caml_ba_get_size(ba.dims);
|
|
694
|
+
// Check that sizes agree
|
|
695
|
+
if (num_elts !== size)
|
|
696
|
+
caml_invalid_argument("Bigarray.reshape: size mismatch");
|
|
697
|
+
return caml_ba_create_unsafe(ba.kind, ba.layout, new_dim, ba.data);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
//Provides: caml_ba_serialize
|
|
701
|
+
//Requires: caml_int64_bits_of_float, caml_int64_to_bytes
|
|
702
|
+
//Requires: caml_int32_bits_of_float
|
|
703
|
+
//Requires: caml_float16_of_double
|
|
704
|
+
function caml_ba_serialize(writer, ba, sz) {
|
|
705
|
+
writer.write(32, ba.dims.length);
|
|
706
|
+
writer.write(32, ba.kind | (ba.layout << 8));
|
|
707
|
+
if (ba.caml_custom === "_bigarr02")
|
|
708
|
+
for (var i = 0; i < ba.dims.length; i++) {
|
|
709
|
+
if (ba.dims[i] < 0xffff) writer.write(16, ba.dims[i]);
|
|
710
|
+
else {
|
|
711
|
+
writer.write(16, 0xffff);
|
|
712
|
+
writer.write(32, 0);
|
|
713
|
+
writer.write(32, ba.dims[i]);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
else for (var i = 0; i < ba.dims.length; i++) writer.write(32, ba.dims[i]);
|
|
717
|
+
switch (ba.kind) {
|
|
718
|
+
case 2: //Int8Array
|
|
719
|
+
case 3: //Uint8Array
|
|
720
|
+
case 12: //Uint8Array
|
|
721
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
722
|
+
writer.write(8, ba.data[i]);
|
|
723
|
+
}
|
|
724
|
+
break;
|
|
725
|
+
case 4: // Int16Array
|
|
726
|
+
case 5: // Uint16Array
|
|
727
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
728
|
+
writer.write(16, ba.data[i]);
|
|
729
|
+
}
|
|
730
|
+
break;
|
|
731
|
+
case 6: // Int32Array (int32)
|
|
732
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
733
|
+
writer.write(32, ba.data[i]);
|
|
734
|
+
}
|
|
735
|
+
break;
|
|
736
|
+
case 8: // Int32Array (int)
|
|
737
|
+
case 9: // Int32Array (nativeint)
|
|
738
|
+
writer.write(8, 0);
|
|
739
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
740
|
+
writer.write(32, ba.data[i]);
|
|
741
|
+
}
|
|
742
|
+
break;
|
|
743
|
+
case 7: // Int32Array (int64)
|
|
744
|
+
for (var i = 0; i < ba.data.length / 2; i++) {
|
|
745
|
+
var b = caml_int64_to_bytes(ba.get(i));
|
|
746
|
+
for (var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
747
|
+
}
|
|
748
|
+
break;
|
|
749
|
+
case 1: // Float64Array
|
|
750
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
751
|
+
var b = caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i)));
|
|
752
|
+
for (var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
753
|
+
}
|
|
754
|
+
break;
|
|
755
|
+
case 13: // Float16Array
|
|
756
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
757
|
+
writer.write(16, ba.data[i]);
|
|
758
|
+
}
|
|
759
|
+
break;
|
|
760
|
+
case 0: // Float32Array
|
|
761
|
+
for (var i = 0; i < ba.data.length; i++) {
|
|
762
|
+
var b = caml_int32_bits_of_float(ba.get(i));
|
|
763
|
+
writer.write(32, b);
|
|
764
|
+
}
|
|
765
|
+
break;
|
|
766
|
+
case 10: // Float32Array (complex32)
|
|
767
|
+
for (var i = 0; i < ba.data.length / 2; i++) {
|
|
768
|
+
var j = ba.get(i);
|
|
769
|
+
writer.write(32, caml_int32_bits_of_float(j[1]));
|
|
770
|
+
writer.write(32, caml_int32_bits_of_float(j[2]));
|
|
771
|
+
}
|
|
772
|
+
break;
|
|
773
|
+
case 11: // Float64Array (complex64)
|
|
774
|
+
for (var i = 0; i < ba.data.length / 2; i++) {
|
|
775
|
+
var complex = ba.get(i);
|
|
776
|
+
var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[1]));
|
|
777
|
+
for (var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
778
|
+
var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[2]));
|
|
779
|
+
for (var j = 0; j < 8; j++) writer.write(8, b[j]);
|
|
780
|
+
}
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
sz[0] = (4 + ba.dims.length) * 4;
|
|
784
|
+
sz[1] = (4 + ba.dims.length) * 8;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
//Provides: caml_ba_deserialize
|
|
788
|
+
//Requires: caml_ba_create_unsafe, caml_failwith
|
|
789
|
+
//Requires: caml_ba_get_size
|
|
790
|
+
//Requires: caml_int64_of_bytes, caml_int64_float_of_bits
|
|
791
|
+
//Requires: caml_int32_float_of_bits
|
|
792
|
+
//Requires: caml_ba_create_buffer
|
|
793
|
+
//Requires: caml_double_of_float16
|
|
794
|
+
function caml_ba_deserialize(reader, sz, name) {
|
|
795
|
+
var num_dims = reader.read32s();
|
|
796
|
+
if (num_dims < 0 || num_dims > 16)
|
|
797
|
+
caml_failwith("input_value: wrong number of bigarray dimensions");
|
|
798
|
+
var tag = reader.read32s();
|
|
799
|
+
var kind = tag & 0xff;
|
|
800
|
+
var layout = (tag >> 8) & 1;
|
|
801
|
+
var dims = [];
|
|
802
|
+
if (name === "_bigarr02")
|
|
803
|
+
for (var i = 0; i < num_dims; i++) {
|
|
804
|
+
var size_dim = reader.read16u();
|
|
805
|
+
if (size_dim === 0xffff) {
|
|
806
|
+
var size_dim_hi = reader.read32u();
|
|
807
|
+
var size_dim_lo = reader.read32u();
|
|
808
|
+
if (size_dim_hi !== 0)
|
|
809
|
+
caml_failwith("input_value: bigarray dimension overflow in 32bit");
|
|
810
|
+
size_dim = size_dim_lo;
|
|
811
|
+
}
|
|
812
|
+
dims.push(size_dim);
|
|
813
|
+
}
|
|
814
|
+
else for (var i = 0; i < num_dims; i++) dims.push(reader.read32u());
|
|
815
|
+
var size = caml_ba_get_size(dims);
|
|
816
|
+
var data = caml_ba_create_buffer(kind, size);
|
|
817
|
+
var ba = caml_ba_create_unsafe(kind, layout, dims, data);
|
|
818
|
+
switch (kind) {
|
|
819
|
+
case 2: //Int8Array
|
|
820
|
+
for (var i = 0; i < size; i++) {
|
|
821
|
+
data[i] = reader.read8s();
|
|
822
|
+
}
|
|
823
|
+
break;
|
|
824
|
+
case 3: //Uint8Array
|
|
825
|
+
case 12: //Uint8Array
|
|
826
|
+
for (var i = 0; i < size; i++) {
|
|
827
|
+
data[i] = reader.read8u();
|
|
828
|
+
}
|
|
829
|
+
break;
|
|
830
|
+
case 4: // Int16Array
|
|
831
|
+
for (var i = 0; i < size; i++) {
|
|
832
|
+
data[i] = reader.read16s();
|
|
833
|
+
}
|
|
834
|
+
break;
|
|
835
|
+
case 5: // Uint16Array
|
|
836
|
+
for (var i = 0; i < size; i++) {
|
|
837
|
+
data[i] = reader.read16u();
|
|
838
|
+
}
|
|
839
|
+
break;
|
|
840
|
+
case 6: // Int32Array (int32)
|
|
841
|
+
for (var i = 0; i < size; i++) {
|
|
842
|
+
data[i] = reader.read32s();
|
|
843
|
+
}
|
|
844
|
+
break;
|
|
845
|
+
case 8: // Int32Array (int)
|
|
846
|
+
case 9: // Int32Array (nativeint)
|
|
847
|
+
var sixty = reader.read8u();
|
|
848
|
+
if (sixty)
|
|
849
|
+
caml_failwith(
|
|
850
|
+
"input_value: cannot read bigarray with 64-bit OCaml ints",
|
|
851
|
+
);
|
|
852
|
+
for (var i = 0; i < size; i++) {
|
|
853
|
+
data[i] = reader.read32s();
|
|
854
|
+
}
|
|
855
|
+
break;
|
|
856
|
+
case 7: // (int64)
|
|
857
|
+
var t = new Array(8);
|
|
858
|
+
for (var i = 0; i < size; i++) {
|
|
859
|
+
for (var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
860
|
+
var int64 = caml_int64_of_bytes(t);
|
|
861
|
+
ba.set(i, int64);
|
|
862
|
+
}
|
|
863
|
+
break;
|
|
864
|
+
case 1: // Float64Array
|
|
865
|
+
var t = new Array(8);
|
|
866
|
+
for (var i = 0; i < size; i++) {
|
|
867
|
+
for (var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
868
|
+
var f = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
869
|
+
ba.set(i, f);
|
|
870
|
+
}
|
|
871
|
+
break;
|
|
872
|
+
case 13: // Float16Array
|
|
873
|
+
for (var i = 0; i < size; i++) {
|
|
874
|
+
data[i] = reader.read16u();
|
|
875
|
+
}
|
|
876
|
+
break;
|
|
877
|
+
case 0: // Float32Array
|
|
878
|
+
for (var i = 0; i < size; i++) {
|
|
879
|
+
var f = caml_int32_float_of_bits(reader.read32s());
|
|
880
|
+
ba.set(i, f);
|
|
881
|
+
}
|
|
882
|
+
break;
|
|
883
|
+
case 10: // Float32Array (complex32)
|
|
884
|
+
for (var i = 0; i < size; i++) {
|
|
885
|
+
var re = caml_int32_float_of_bits(reader.read32s());
|
|
886
|
+
var im = caml_int32_float_of_bits(reader.read32s());
|
|
887
|
+
ba.set(i, [254, re, im]);
|
|
888
|
+
}
|
|
889
|
+
break;
|
|
890
|
+
case 11: // Float64Array (complex64)
|
|
891
|
+
var t = new Array(8);
|
|
892
|
+
for (var i = 0; i < size; i++) {
|
|
893
|
+
for (var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
894
|
+
var re = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
895
|
+
for (var j = 0; j < 8; j++) t[j] = reader.read8u();
|
|
896
|
+
var im = caml_int64_float_of_bits(caml_int64_of_bytes(t));
|
|
897
|
+
ba.set(i, [254, re, im]);
|
|
898
|
+
}
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
sz[0] = (4 + num_dims) * 4;
|
|
902
|
+
return caml_ba_create_unsafe(kind, layout, dims, data);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
//Provides: caml_ba_create_from
|
|
906
|
+
//Requires: caml_ba_create_unsafe, caml_invalid_argument, caml_ba_get_size_per_element
|
|
907
|
+
//Deprecated: Use [caml_ba_create_unsafe] instead
|
|
908
|
+
function caml_ba_create_from(data1, data2, _jstyp, kind, layout, dims) {
|
|
909
|
+
if (data2 || caml_ba_get_size_per_element(kind) === 2) {
|
|
910
|
+
caml_invalid_argument(
|
|
911
|
+
"caml_ba_create_from: use return caml_ba_create_unsafe",
|
|
912
|
+
);
|
|
913
|
+
}
|
|
914
|
+
return caml_ba_create_unsafe(kind, layout, dims, data1);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
//Provides: caml_ba_hash const
|
|
918
|
+
//Requires: caml_ba_get_size, caml_hash_mix_int, caml_hash_mix_float
|
|
919
|
+
//Requires: caml_double_of_float16, caml_hash_mix_float16, caml_hash_mix_float32
|
|
920
|
+
function caml_ba_hash(ba) {
|
|
921
|
+
var num_elts = caml_ba_get_size(ba.dims);
|
|
922
|
+
var h = 0;
|
|
923
|
+
switch (ba.kind) {
|
|
924
|
+
case 2: //Int8Array
|
|
925
|
+
case 3: //Uint8Array
|
|
926
|
+
case 12: //Uint8Array
|
|
927
|
+
if (num_elts > 256) num_elts = 256;
|
|
928
|
+
var w = 0,
|
|
929
|
+
i = 0;
|
|
930
|
+
for (i = 0; i + 4 <= num_elts; i += 4) {
|
|
931
|
+
w =
|
|
932
|
+
(ba.data[i + 0] & 0xff) |
|
|
933
|
+
((ba.data[i + 1] & 0xff) << 8) |
|
|
934
|
+
((ba.data[i + 2] & 0xff) << 16) |
|
|
935
|
+
(ba.data[i + 3] << 24);
|
|
936
|
+
h = caml_hash_mix_int(h, w);
|
|
937
|
+
}
|
|
938
|
+
w = 0;
|
|
939
|
+
switch (num_elts & 3) {
|
|
940
|
+
// biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
|
|
941
|
+
case 3:
|
|
942
|
+
w = (ba.data[i + 2] & 0xff) << 16;
|
|
943
|
+
// falls through
|
|
944
|
+
// biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
|
|
945
|
+
case 2:
|
|
946
|
+
w |= (ba.data[i + 1] & 0xff) << 8;
|
|
947
|
+
// falls through
|
|
948
|
+
case 1:
|
|
949
|
+
w |= ba.data[i + 0] & 0xff;
|
|
950
|
+
h = caml_hash_mix_int(h, w);
|
|
951
|
+
}
|
|
952
|
+
break;
|
|
953
|
+
case 4: // Int16Array
|
|
954
|
+
case 5: // Uint16Array
|
|
955
|
+
if (num_elts > 128) num_elts = 128;
|
|
956
|
+
var w = 0,
|
|
957
|
+
i = 0;
|
|
958
|
+
for (i = 0; i + 2 <= num_elts; i += 2) {
|
|
959
|
+
w = (ba.data[i + 0] & 0xffff) | (ba.data[i + 1] << 16);
|
|
960
|
+
h = caml_hash_mix_int(h, w);
|
|
961
|
+
}
|
|
962
|
+
if ((num_elts & 1) !== 0) h = caml_hash_mix_int(h, ba.data[i] & 0xffff);
|
|
963
|
+
break;
|
|
964
|
+
case 6: // Int32Array (int32)
|
|
965
|
+
if (num_elts > 64) num_elts = 64;
|
|
966
|
+
for (var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]);
|
|
967
|
+
break;
|
|
968
|
+
case 8: // Int32Array (int)
|
|
969
|
+
case 9: // Int32Array (nativeint)
|
|
970
|
+
if (num_elts > 64) num_elts = 64;
|
|
971
|
+
for (var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]);
|
|
972
|
+
break;
|
|
973
|
+
case 7: // Int32Array (int64)
|
|
974
|
+
if (num_elts > 32) num_elts = 32;
|
|
975
|
+
num_elts *= 2;
|
|
976
|
+
for (var i = 0; i < num_elts; i++) {
|
|
977
|
+
h = caml_hash_mix_int(h, ba.data[i]);
|
|
978
|
+
}
|
|
979
|
+
break;
|
|
980
|
+
// biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
|
|
981
|
+
case 10: // Float32Array (complex32)
|
|
982
|
+
num_elts *= 2;
|
|
983
|
+
// falls through
|
|
984
|
+
case 0: // Float32Array
|
|
985
|
+
if (num_elts > 64) num_elts = 64;
|
|
986
|
+
for (var i = 0; i < num_elts; i++)
|
|
987
|
+
h = caml_hash_mix_float32(h, ba.data[i]);
|
|
988
|
+
break;
|
|
989
|
+
// biome-ignore lint/suspicious/noFallthroughSwitchClause: falls through
|
|
990
|
+
case 11: // Float64Array (complex64)
|
|
991
|
+
num_elts *= 2;
|
|
992
|
+
// falls through
|
|
993
|
+
case 1: // Float64Array
|
|
994
|
+
if (num_elts > 32) num_elts = 32;
|
|
995
|
+
for (var i = 0; i < num_elts; i++) h = caml_hash_mix_float(h, ba.data[i]);
|
|
996
|
+
break;
|
|
997
|
+
case 13:
|
|
998
|
+
if (num_elts > 128) num_elts = 128;
|
|
999
|
+
for (var i = 0; i < num_elts; i++) {
|
|
1000
|
+
h = caml_hash_mix_float16(h, ba.data[i]);
|
|
1001
|
+
}
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
return h;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
//Provides: caml_hash_mix_float16
|
|
1008
|
+
//Requires: caml_hash_mix_int
|
|
1009
|
+
function caml_hash_mix_float16(hash, d) {
|
|
1010
|
+
/* Normalize NaNs */
|
|
1011
|
+
if ((d & 0x7c00) === 0x7c00 && (d & 0x03ff) !== 0) {
|
|
1012
|
+
d = 0x7c01;
|
|
1013
|
+
} else if (d === 0x8000) {
|
|
1014
|
+
/* Normalize -0 into +0 */
|
|
1015
|
+
d = 0;
|
|
1016
|
+
}
|
|
1017
|
+
return caml_hash_mix_int(hash, d);
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
//Provides: caml_hash_mix_float32
|
|
1021
|
+
//Requires: caml_int32_bits_of_float
|
|
1022
|
+
//Requires: caml_hash_mix_int
|
|
1023
|
+
function caml_hash_mix_float32(hash, v) {
|
|
1024
|
+
var i = caml_int32_bits_of_float(v);
|
|
1025
|
+
/* Normalize NaNs */
|
|
1026
|
+
if ((i & 0x7f800000) === 0x7f800000 && (i & 0x7fffff) !== 0) {
|
|
1027
|
+
i = 0x7f800001;
|
|
1028
|
+
} else if (i === (0x80000000 | 0)) {
|
|
1029
|
+
/* Normalize -0 into +0 */
|
|
1030
|
+
// This code path is not used by caml_hash because 0 and -0 look
|
|
1031
|
+
// like integers
|
|
1032
|
+
i = 0;
|
|
1033
|
+
}
|
|
1034
|
+
hash = caml_hash_mix_int(hash, i);
|
|
1035
|
+
return hash;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
//Provides: caml_ba_to_typed_array mutable
|
|
1039
|
+
function caml_ba_to_typed_array(ba) {
|
|
1040
|
+
return ba.data;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
//Provides: caml_ba_kind_of_typed_array mutable
|
|
1044
|
+
//Requires: caml_invalid_argument
|
|
1045
|
+
function caml_ba_kind_of_typed_array(ta) {
|
|
1046
|
+
var kind;
|
|
1047
|
+
if (ta instanceof Float32Array) kind = 0;
|
|
1048
|
+
else if (ta instanceof Float64Array) kind = 1;
|
|
1049
|
+
else if (ta instanceof Int8Array) kind = 2;
|
|
1050
|
+
else if (ta instanceof Uint8Array) kind = 3;
|
|
1051
|
+
else if (ta instanceof Uint8ClampedArray) kind = 3;
|
|
1052
|
+
else if (ta instanceof Int16Array) kind = 4;
|
|
1053
|
+
else if (ta instanceof Uint16Array) kind = 5;
|
|
1054
|
+
else if (ta instanceof Int32Array) kind = 6;
|
|
1055
|
+
else if (ta instanceof Uint32Array) kind = 6;
|
|
1056
|
+
else caml_invalid_argument("caml_ba_kind_of_typed_array: unsupported kind");
|
|
1057
|
+
return kind;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
//Provides: caml_ba_from_typed_array mutable
|
|
1061
|
+
//Requires: caml_ba_kind_of_typed_array
|
|
1062
|
+
//Requires: caml_ba_create_unsafe
|
|
1063
|
+
function caml_ba_from_typed_array(ta) {
|
|
1064
|
+
var kind = caml_ba_kind_of_typed_array(ta);
|
|
1065
|
+
var ta =
|
|
1066
|
+
/* Needed to avoid unsigned setters overflowing
|
|
1067
|
+
the range of OCaml [int32] values. */
|
|
1068
|
+
ta instanceof Uint32Array
|
|
1069
|
+
? new Int32Array(ta.buffer, ta.byteOffset, ta.length)
|
|
1070
|
+
: ta;
|
|
1071
|
+
return caml_ba_create_unsafe(kind, 0, [ta.length], ta);
|
|
1072
|
+
}
|