Runtime: more efficient (space-wise) marshalling.#814
Conversation
Modified caml_output_val to correctly reflects sharing. As a result, it avoids duplication and saves a lot of space.
|
Fixes #359 |
|
What about using a |
Or a regular |
|
Thanks a lot for this. Would you mind writing some tests ? There are plenty of examples in https://github.com/ocsigen/js_of_ocaml/blob/master/compiler/tests/. It would be nice to demonstrate that cyclic value can now be marshaled. |
|
Alas, I failed to build the latest version from source, due to It seemed to work fine in Travis, so I looked at the configuration file and was not sure how to proceed, does the script ( I am building on Mac with OCaml 4.07.1. |
|
Ok I ran (I think it caused it to upgrade |
|
The About the missing graphics lib, I think building the compiler and its (new) tests should be enough ( |
|
Added one test for shared data (DAG) and one for cycles (based on #359). I noticed that for the other tests in |
|
Tests look good as they are now. Maybe move them in their own file. |
|
Ok, suggestions on how to name it? I can't use |
Test sharing and cyclic data.
|
To follow on @vouillon remark. Could we you We should probably also check the flags in |
Good idea.
Can easily support |
Where available; fallback to list is used for pre-2015 envs.
| //Provides: MlObjectTable | ||
| var MlObjectTable; | ||
| if (typeof joo_global_object.WeakMap === 'undefined') { | ||
| MlObjectTable = function() { |
There was a problem hiding this comment.
In the current test setup this code is never tested because the condition is always false. 😞
Only Marshal.No_sharing makes sense in this context. Marshal.Closures cannot be supported currently. Marshal.Compat_32 is meaningless since all JavaScript integers are 32 bit.
|
Ok, flags are in. |
| function memo(v) { | ||
| var existing_offset = no_sharing ? undefined : intern_obj_table.recall(v); | ||
| if (existing_offset) { writer.write_shared(existing_offset); return existing_offset; } | ||
| else intern_obj_table.store(v); |
There was a problem hiding this comment.
do we need to call intern_obj_table.store when no_sharing is defined ?
There was a problem hiding this comment.
We still need to update the object counter.
I can do writer.obj_counter++ instead, and remove the assignment writer.obj_counter = intern_obj_table.length at the end of the function.
There was a problem hiding this comment.
obj_counter seems to only be used when sharing is enable.
https://github.com/ocaml/ocaml/blob/trunk/runtime/extern.c#L180
|
I took the liberty to push to your branch directly (hope you don't mind). |
|
Looking great. |
|
Thanks a lot ! |
…riving_json, js_of_ocaml-tyxml, js_of_ocaml-ppx, js_of_ocaml-lwt, js_of_ocaml-compiler and js_of_ocaml-toplevel (3.5.0) CHANGES: ## Features/Changes * Compiler: Improve testing of the compiler (Ty Overby) * Compiler: Add several macros for making the runtime easier to maintain (ocsigen/js_of_ocaml#771) (Ty Overby) * Compiler: Allow to emit one javascript per compilation unit (ocsigen/js_of_ocaml#783) * Compiler: refactoring (ocsigen/js_of_ocaml#781, ocsigen/js_of_ocaml#782, ocsigen/js_of_ocaml#787, ocsigen/js_of_ocaml#795, ocsigen/js_of_ocaml#802) * Compiler: more source map location for the javascript runtime (ocsigen/js_of_ocaml#795) * Compiler: tune variable naming (ocsigen/js_of_ocaml#838) * Compiler: Work around num lib incompatibility * Compiler: escape '</' in strings (ocsigen/js_of_ocaml#899) * Compiler: speedup toplevel creation * Runtime: support sharing when marshaling (ocsigen/js_of_ocaml#814) * Runtime: add caml_obj_with_tag * Runtime: support marshaling custom block * Runtime: complete rewrite of bigarray * Runtime: complete num implementation * Runtime: add caml_ba_hash * Runtime: rewrite polymorphic compare * Ppx: switch ppx rewriter to the OCaml 4.08 ast * Misc: Improve CI speed * Misc: remove ppx_deriving dependency * Misc: remove cppo dependency * Misc: remove ppx_tools_versioned dependency in ppx_deriving_json * Misc: support for ocaml 4.09 * Misc: switch to ocamlformat.0.12 * Misc: many more tests * Misc: new jsoo_fs tool to embed files in a jsoo pseudo fs. * Lib: Use expect tests * Lib: Add support for 'addEventListener' with options (ocsigen/js_of_ocaml#807) * Lib: Change api of [Lwt_js_events.async] (ocsigen/js_of_ocaml#862) * Lib: Change api of responseText in xmlhttprequest (ocsigen/js_of_ocaml#863) * Lib: add resizeObserver bindings * Lib: Added support for custom events (ocsigen/js_of_ocaml#877) * Lib: Added support for focus events (ocsigen/js_of_ocaml#885) * Lib: Added `passive` option support for `Lwt_js_events` module * Lib: Added bindings for pointer events (ocsigen/js_of_ocaml#894) ## Bug fixes * Compiler: don't generate source if no-source-map passed (ocsigen/js_of_ocaml#780) * Compiler: Fix compilation of [Array.set] to return [unit]/0 (ocsigen/js_of_ocaml#792) * Compiler: Fix assertion failure (ocsigen/js_of_ocaml#828) * Compiler: Fix compilation of exception handlers (ocsigen/js_of_ocaml#830) * Compiler: Fix static evaluation of caml_equal (ocsigen/js_of_ocaml#906) * Misc: Fix install on windows (ocsigen/js_of_ocaml#794) * Lib: Fix Dom_svg.createForeignObject (ocsigen/js_of_ocaml#756) * Runtime: Fix caml_obj_tag, causing miscompilation with lazy value (ocsigen/js_of_ocaml#772) * Runtime: Fix caml_ml_seek_out, caml_ml_pos_out (ocsigen/js_of_ocaml#779) (Shachar Itzhaky) * Runtime: caml_parse_sign_and_base to support unsigned syntax (ocsigen/js_of_ocaml#792) (Shachar Itzhaky) * Runtime: fix encoding when printing to stdout (ocsigen/js_of_ocaml#800) * Runtime: Handle browserfs in fs_node detection logic (ocsigen/js_of_ocaml#831) * Runtime: fix Obj.tag (ocsigen/js_of_ocaml#832) * Runtime: fix marshalling of custom blocks (ocsigen/js_of_ocaml#861) * Runtime: fix frexp * Runtime: fix float printing with "%f" and large floats
Modified caml_output_val to correctly reflects sharing.
As a result, it avoids duplication and saves a lot of space.
This has been thoroughly tested by compiling Coq
.vofiles, where it can reduce the file size by an order of magnitude, and produces roughly the same size as the nativecoqc.