@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,46 @@
|
|
|
1
|
+
// The compiler worker: one compiler per worker.
|
|
2
|
+
//
|
|
3
|
+
// A js_of_ocaml program runs its main on load and returns, so a worker cannot
|
|
4
|
+
// run two of them -- each compile needs a fresh one, created and terminated.
|
|
5
|
+
//
|
|
6
|
+
// Everything the compiler needs arrives through the virtual filesystem and the
|
|
7
|
+
// environment; its output is collected by overriding console, because with the
|
|
8
|
+
// browser filesystem fd 1 and fd 2 are wired to console.log and console.error
|
|
9
|
+
// (runtime/js/fs_fake.js). A worker has no other way in: the output never
|
|
10
|
+
// reaches a file the page can read.
|
|
11
|
+
self.onmessage = (event) => {
|
|
12
|
+
const { script, files, env, argv, fs = [] } = event.data;
|
|
13
|
+
const out = [];
|
|
14
|
+
const err = [];
|
|
15
|
+
const realLog = console.log;
|
|
16
|
+
const realError = console.error;
|
|
17
|
+
|
|
18
|
+
console.log = (...args) => out.push(args.join(' '));
|
|
19
|
+
console.error = (...args) => err.push(args.join(' '));
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
globalThis.jsoo_fs_tmp = files;
|
|
23
|
+
globalThis.jsoo_env = env;
|
|
24
|
+
// Browsers have no `process`; js_of_ocaml reads `process?.argv` for argv,
|
|
25
|
+
// so a fake one is enough. Note Sys.argv.(0) is argv[1].
|
|
26
|
+
globalThis.process = { argv };
|
|
27
|
+
// Filesystem artifacts first. Nothing has defined `jsoo_create_file` yet,
|
|
28
|
+
// so they queue their files on `jsoo_fs_tmp` -- and the program's runtime
|
|
29
|
+
// replays that queue at start-up. Loading them after the program would
|
|
30
|
+
// take the other branch and register the files directly, so the order is
|
|
31
|
+
// not load-bearing, but this is the cheaper one.
|
|
32
|
+
for (const url of fs) importScripts(url);
|
|
33
|
+
importScripts(script);
|
|
34
|
+
// The chunks go back as they arrived, not joined: the caller knows how to
|
|
35
|
+
// put them together, and joining here would lose the newlines between
|
|
36
|
+
// them. js_of_ocaml's stdout is line-buffered, so it hands over one call
|
|
37
|
+
// per line, and a program that arrives as a single line is a program
|
|
38
|
+
// swallowed by its own header comment.
|
|
39
|
+
self.postMessage({ out, err });
|
|
40
|
+
} catch (error) {
|
|
41
|
+
self.postMessage({ out, err: [...err, String((error && error.message) || error)] });
|
|
42
|
+
} finally {
|
|
43
|
+
console.log = realLog;
|
|
44
|
+
console.error = realError;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
greet greet.cma greet.cmi
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
camlinternalFormat.cmi
|
|
2
|
+
camlinternalFormatBasics.cmi
|
|
3
|
+
camlinternalLazy.cmi
|
|
4
|
+
camlinternalMod.cmi
|
|
5
|
+
camlinternalOO.cmi
|
|
6
|
+
std_exit.cmi
|
|
7
|
+
stdlib.cmi
|
|
8
|
+
stdlib__Arg.cmi
|
|
9
|
+
stdlib__Array.cmi
|
|
10
|
+
stdlib__ArrayLabels.cmi
|
|
11
|
+
stdlib__Atomic.cmi
|
|
12
|
+
stdlib__Bigarray.cmi
|
|
13
|
+
stdlib__Bool.cmi
|
|
14
|
+
stdlib__Buffer.cmi
|
|
15
|
+
stdlib__Bytes.cmi
|
|
16
|
+
stdlib__BytesLabels.cmi
|
|
17
|
+
stdlib__Callback.cmi
|
|
18
|
+
stdlib__Char.cmi
|
|
19
|
+
stdlib__Complex.cmi
|
|
20
|
+
stdlib__Condition.cmi
|
|
21
|
+
stdlib__Digest.cmi
|
|
22
|
+
stdlib__Domain.cmi
|
|
23
|
+
stdlib__Dynarray.cmi
|
|
24
|
+
stdlib__Effect.cmi
|
|
25
|
+
stdlib__Either.cmi
|
|
26
|
+
stdlib__Ephemeron.cmi
|
|
27
|
+
stdlib__Filename.cmi
|
|
28
|
+
stdlib__Float.cmi
|
|
29
|
+
stdlib__Format.cmi
|
|
30
|
+
stdlib__Fun.cmi
|
|
31
|
+
stdlib__Gc.cmi
|
|
32
|
+
stdlib__Hashtbl.cmi
|
|
33
|
+
stdlib__Iarray.cmi
|
|
34
|
+
stdlib__In_channel.cmi
|
|
35
|
+
stdlib__Int.cmi
|
|
36
|
+
stdlib__Int32.cmi
|
|
37
|
+
stdlib__Int64.cmi
|
|
38
|
+
stdlib__Lazy.cmi
|
|
39
|
+
stdlib__Lexing.cmi
|
|
40
|
+
stdlib__List.cmi
|
|
41
|
+
stdlib__ListLabels.cmi
|
|
42
|
+
stdlib__Map.cmi
|
|
43
|
+
stdlib__Marshal.cmi
|
|
44
|
+
stdlib__MoreLabels.cmi
|
|
45
|
+
stdlib__Mutex.cmi
|
|
46
|
+
stdlib__Nativeint.cmi
|
|
47
|
+
stdlib__Obj.cmi
|
|
48
|
+
stdlib__Oo.cmi
|
|
49
|
+
stdlib__Option.cmi
|
|
50
|
+
stdlib__Out_channel.cmi
|
|
51
|
+
stdlib__Pair.cmi
|
|
52
|
+
stdlib__Parsing.cmi
|
|
53
|
+
stdlib__Pqueue.cmi
|
|
54
|
+
stdlib__Printexc.cmi
|
|
55
|
+
stdlib__Printf.cmi
|
|
56
|
+
stdlib__Queue.cmi
|
|
57
|
+
stdlib__Random.cmi
|
|
58
|
+
stdlib__Repr.cmi
|
|
59
|
+
stdlib__Result.cmi
|
|
60
|
+
stdlib__Scanf.cmi
|
|
61
|
+
stdlib__Semaphore.cmi
|
|
62
|
+
stdlib__Seq.cmi
|
|
63
|
+
stdlib__Set.cmi
|
|
64
|
+
stdlib__Stack.cmi
|
|
65
|
+
stdlib__StdLabels.cmi
|
|
66
|
+
stdlib__String.cmi
|
|
67
|
+
stdlib__StringLabels.cmi
|
|
68
|
+
stdlib__Sys.cmi
|
|
69
|
+
stdlib__Type.cmi
|
|
70
|
+
stdlib__Uchar.cmi
|
|
71
|
+
stdlib__Unit.cmi
|
|
72
|
+
stdlib__Weak.cmi
|
|
73
|
+
topdirs.cmi
|
|
74
|
+
unix.cmi
|
|
75
|
+
unixLabels.cmi
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// A message-loop adapter around the runtime library.
|
|
2
|
+
//
|
|
3
|
+
// The runtime in worker.js is a *library*: it exposes `self.ocamlWasm` and does
|
|
4
|
+
// not touch `onmessage`, so a host that is already a worker (LiveCodes' compiler
|
|
5
|
+
// worker, for instance) can `importScripts('worker.js')` and call
|
|
6
|
+
// `self.ocamlWasm.run(...)` directly, keeping its own protocol.
|
|
7
|
+
//
|
|
8
|
+
// This file is the other case: standalone use, where nobody else owns the
|
|
9
|
+
// message loop, so something has to provide one. It is deliberately the only
|
|
10
|
+
// place the postMessage protocol exists.
|
|
11
|
+
|
|
12
|
+
importScripts('worker.js');
|
|
13
|
+
|
|
14
|
+
// The runtime cannot tell where it was loaded from once it is `importScripts`ed
|
|
15
|
+
// into a worker that lives elsewhere -- relative asset paths would resolve
|
|
16
|
+
// against the *host*. The adapter does know its own location, so it says.
|
|
17
|
+
self.ocamlWasm.setBaseUrl(new URL('./', self.location.href).href);
|
|
18
|
+
|
|
19
|
+
self.addEventListener('message', (event) => {
|
|
20
|
+
const result = self.ocamlWasm.run(event.data);
|
|
21
|
+
// The exit code travels as it is. `postMessage` clones null perfectly well,
|
|
22
|
+
// and stringifying it -- which this used to do -- turned "never ran" into the
|
|
23
|
+
// string "null", which the caller then compared against null, failed, and
|
|
24
|
+
// turned into NaN.
|
|
25
|
+
self.postMessage([
|
|
26
|
+
'result',
|
|
27
|
+
result.exitCode,
|
|
28
|
+
result.stdout,
|
|
29
|
+
result.stderr,
|
|
30
|
+
result.outcome,
|
|
31
|
+
result.output,
|
|
32
|
+
result.diagnostics,
|
|
33
|
+
]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// The page waits for this before enabling Run, so pay initialisation here
|
|
37
|
+
// rather than on the first run.
|
|
38
|
+
self.ocamlWasm.init();
|
|
39
|
+
self.postMessage(['ready', 'Toplevel ready.']);
|