@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,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
+ };
@@ -0,0 +1 @@
1
+ greet greet.cma greet.cmi
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -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
@@ -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.']);