Conversation
because of multi-value support.
this avoids much useless tuple boxing and reboxing.
with a bidirectional data flow, somehow, and a dedicate data type.
since `wasm` doesn’t support multi-value stack types yet.
because we need to include multi-value support. I tried to get rid of the wasm reference interpreter dependency alltogether, given that we really only needs the AST (we already have a copy of the serialization module), and it would be nice to have a single `Source` module, for example, but we are using a lot of stuff from `Wasm.Lib`, e.g. for value types. Once multi-value support is officially supported by the `wasm` library I am happy to undo these changes and start using the official version again.
by cherry-picking the changes to `ast.ml` and `encode.ml` from https://github.com/WebAssembly/multi-value into our code copy.
which leads to nicer code. This needs multi-value support in the Wasm AST.
this means that the compiler produces much less boxing of integers (naturals, booleans) immediately followed by such boxing.
to make the Wasm validator happy. E.g. even if two branches of an `IfE` end with a `return`, the wasm validator needs to be told that the code after the `IfE` is unreachable.
it can change the behaviour. Instead, just unbox in `Bittagged.if_unboxed` if not asked for, and leave it to the user. Actually makes the code a tad easier to understand.
and always create new named locals when needed
by adding an appropriate combinator to the `InstrList` module, and setting it at crucial positions in `Compile`. Makes the code in `compile.ml` actually nicer (no `G.i_` / `G.i` any more), and should produce a much more detailed and comprehensive source map than before. In that sense, a little Christmas present for @paulyoung.
and do not pass boolean values through `box`/`unbox`. This is in preparation of using proper WebAssembly types for the various number types.
Not that this is very useful, but it was a good oportunity to add more needed structure to the compiler, e.g. operator overloading (for example, booleans are still 32 bit). This now traps upon `0-1:Nat`.
otherwise `(0:Int) - (1:Nat) == (-1:Int)` traps erronously.
to avoid a bit of boxing/unboxing. This also resolves the overloading of `.` (objects vs. actors) in the desguarer. This code is currently incomplete for type constructors, as we don't have a consenv around there.
to properly recognize objects that are instances of classes
the type infernce code knows the precise type that it has determined is compatible with a given operation (`t` in `typing`). But previously, this was not stored anywhere, and interpreter and compiler had to make educated guesses based on the type annotation of the arguments and/or the return values. This is brittle, due to subtyping, and led to bugs. Therefore, we not simply store the type within the constructor. This fixes #122.
thanks to https://github.com/dfinity-lab/dev/pull/408 But in order to keep the test suite useful, `run.sh` now automatically appends print("Top-level code done.\n") to all test cases (in `--dfinity` mode). This way, a trap in the top-level code will be observable in the `.dvm-run.ok` file It does not help with, say ignore(async {assert False}); so tests that want to check the absence of traps need to somehow make that visible.
also catch out-of-bounds error in the interpreter and treat them as traps.
This reverts commit a6a8008.
|
A bunch of stuff accumulated here on this branch over christmas and early January. Most of it is purely internal to the compiler, but not all, so I would appreciate a second pair of eyes that glances the changes over? |
|
Sorry, I just saw this. I'll take a look tomorrow - I'm actually forked off this branch for the IR type checker (claudio/check-ir) so am keen to get it in ;-> |
| | S.OptE e -> I.OptE (exp ce e) | ||
| | S.ObjE (s, i, es) -> obj ce at s None i es | ||
| | S.DotE (e, n) -> | ||
| begin match Type.as_immut (Type.promote ce (e.Source.note.S.note_typ)) with |
There was a problem hiding this comment.
I don't think the environment ce used here will be correct since it isn't constructed from the initial environment and all intervening type declarations. I guess you can either try to reconstruct the environment accurately, or generalize S.DotE to contain the information you need as a result of typechecking. The latter would be easiest...
There was a problem hiding this comment.
It is the ce that comes out of typechecking the whole module that we are compiling right now, see compile_with in pipeline.ml … so it should contain at least the top-level constructors.
I don’t know if it would work with locally defined type constructors: Do they escape to the top-level
There was a problem hiding this comment.
No, they shouldn't. I beleive its a constructor environment (as it should be) not a global store.
I'll do the fix as part of the check-ir branch.
| let prog = tailcall_optimization true prog name in | ||
| let prog = Desugar.prog prog in | ||
| let prelude = Desugar.prog prelude in | ||
| let scope' = Typing.adjoin_scope initial_stat_env scope in |
There was a problem hiding this comment.
The use of scope' to desugar prog seems dubious since scope is the environment resulting from prog, note the environment in which prog is checked. Or am I missing something? Regardless, I think just annotating S.DotE in the checked would avoid the need to pass an environment to Desugar.prog.
There was a problem hiding this comment.
Ah, see above. But yeah, an annotation would be great. Can you do that? Should I wait with master for this, or is this corner-case enough to still land this in master (I guess it is not a regression…)
crusso
left a comment
There was a problem hiding this comment.
LGTM except for the issue with the constructor environment used for desugaring (see comments).
|
Adding comments is great! |
## Changelog for motoko-base: Branch: next-moc Commits: [caffeinelabs/motoko-base@d1d0e694...b0381a88](caffeinelabs/motoko-base@d1d0e69...b0381a8) * [`0631fe40`](caffeinelabs/motoko-base@0631fe4) Prepares open sourcing ([dfinity-lab/motoko-base#79](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/79)) * [`c1c116aa`](caffeinelabs/motoko-base@c1c116a) Sets up unit tests to use the `matchers` library ([dfinity-lab/motoko-base#106](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/106)) * [`8d074912`](caffeinelabs/motoko-base@8d07491) make conversions public; fix doc ([dfinity-lab/motoko-base#113](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/113)) * [`e78f49a4`](caffeinelabs/motoko-base@e78f49a) Public release: Remove old subdir of examples ([dfinity-lab/motoko-base#114](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/114)) * [`2c9d8286`](caffeinelabs/motoko-base@2c9d828) Small fix for open source ([dfinity-lab/motoko-base#115](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/115)) * [`0ca6c694`](caffeinelabs/motoko-base@0ca6c69) Adds filterMap for arrays ([dfinity-lab/motoko-base#101](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/101)) * [`754eb858`](caffeinelabs/motoko-base@754eb85) Readme: Fix vessel instructions ([dfinity-lab/motoko-base#116](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/116)) * [`ed4fcfb4`](caffeinelabs/motoko-base@ed4fcfb) adds note about requiring `vessel` to run the tests ([dfinity-lab/motoko-base#118](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/118)) * [`d04a0e21`](caffeinelabs/motoko-base@d04a0e2) Cleans up a few comments in List ([dfinity-lab/motoko-base#119](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/119)) * [`fd81ac57`](caffeinelabs/motoko-base@fd81ac5) Adds some documentation to the `HashMap` class. ([dfinity-lab/motoko-base#121](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/121)) * [`d0354489`](caffeinelabs/motoko-base@d035448) Remove WordN.toInt ([dfinity-lab/motoko-base#125](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/125))
## Changelog for motoko-base: Branch: next-moc Commits: [caffeinelabs/motoko-base@d1d0e694...b0381a88](caffeinelabs/motoko-base@d1d0e69...b0381a8) * [`0631fe40`](caffeinelabs/motoko-base@0631fe4) Prepares open sourcing ([dfinity-lab/motoko-base#79](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/79)) * [`c1c116aa`](caffeinelabs/motoko-base@c1c116a) Sets up unit tests to use the `matchers` library ([dfinity-lab/motoko-base#106](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/106)) * [`8d074912`](caffeinelabs/motoko-base@8d07491) make conversions public; fix doc ([dfinity-lab/motoko-base#113](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/113)) * [`e78f49a4`](caffeinelabs/motoko-base@e78f49a) Public release: Remove old subdir of examples ([dfinity-lab/motoko-base#114](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/114)) * [`2c9d8286`](caffeinelabs/motoko-base@2c9d828) Small fix for open source ([dfinity-lab/motoko-base#115](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/115)) * [`0ca6c694`](caffeinelabs/motoko-base@0ca6c69) Adds filterMap for arrays ([dfinity-lab/motoko-base#101](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/101)) * [`754eb858`](caffeinelabs/motoko-base@754eb85) Readme: Fix vessel instructions ([dfinity-lab/motoko-base#116](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/116)) * [`ed4fcfb4`](caffeinelabs/motoko-base@ed4fcfb) adds note about requiring `vessel` to run the tests ([dfinity-lab/motoko-base#118](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/118)) * [`d04a0e21`](caffeinelabs/motoko-base@d04a0e2) Cleans up a few comments in List ([dfinity-lab/motoko-base#119](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/119)) * [`fd81ac57`](caffeinelabs/motoko-base@fd81ac5) Adds some documentation to the `HashMap` class. ([dfinity-lab/motoko-base#121](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/121)) * [`d0354489`](caffeinelabs/motoko-base@d035448) Remove WordN.toInt ([dfinity-lab/motoko-base#125](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/motoko-base/issues/125))
## Changelog for ic-ref: Branch: release-0.8 Commits: [dfinity-lab/ic-ref@0990d033...c47126c8](https://github.com/dfinity-lab/ic-ref/compare/0990d033452af92cbea2e60c44c301aa551d7b0e...c47126c8cff6aa039f70148c92f31eaad574c5f4) * [`d16c8d15`](https://github.com/dfinity-lab/ic-ref/commit/d16c8d1567e3a2961e01f34e29e1c0ca97c1727d) Pass sectanchors to asciidoc * [`c47126c8`](https://github.com/dfinity-lab/ic-ref/commit/c47126c8cff6aa039f70148c92f31eaad574c5f4) Do not copy libs to the $out of the ic-ref derivation ([dfinity-lab/ic-ref#118](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/ic-ref/issues/118))
## Changelog for ic-ref: Branch: release-0.8 Commits: [dfinity-lab/ic-ref@0990d033...c47126c8](https://github.com/dfinity-lab/ic-ref/compare/0990d033452af92cbea2e60c44c301aa551d7b0e...c47126c8cff6aa039f70148c92f31eaad574c5f4) * [`d16c8d15`](https://github.com/dfinity-lab/ic-ref/commit/d16c8d1567e3a2961e01f34e29e1c0ca97c1727d) Pass sectanchors to asciidoc * [`c47126c8`](https://github.com/dfinity-lab/ic-ref/commit/c47126c8cff6aa039f70148c92f31eaad574c5f4) Do not copy libs to the $out of the ic-ref derivation ([dfinity-lab/ic-ref#118](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity-lab/ic-ref/issues/118))
## Changelog for candid: Branch: Commits: [dfinity/candid@a1dcbad4...3e3ad95a](dfinity/candid@a1dcbad...3e3ad95) * [`119703ba`](dfinity/candid@119703b) [Spec] Relax LEB128 decoding ([dfinity/candid#79](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/79)) * [`10f08432`](dfinity/candid@10f0843) Update prim.test.did * [`b2524816`](dfinity/candid@b252481) parser for test suite ([dfinity/candid#78](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/78)) * [`71bf6e76`](dfinity/candid@71bf6e7) release 0.5.2 ([dfinity/candid#80](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/80)) * [`b9f387e3`](dfinity/candid@b9f387e) test suite for JS ([dfinity/candid#81](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/81)) * [`9e5dc775`](dfinity/candid@9e5dc77) Release ([dfinity/candid#82](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/82)) * [`1df9d2d7`](dfinity/candid@1df9d2d) more candid test data ([dfinity/candid#83](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/83)) * [`9e4156d9`](dfinity/candid@9e4156d) fix newtype ([dfinity/candid#85](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/85)) * [`6880a430`](dfinity/candid@6880a43) display for types ([dfinity/candid#86](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/86)) * [`04b1b068`](dfinity/candid@04b1b06) release ([dfinity/candid#87](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/87)) * [`117c6436`](dfinity/candid@117c643) Refactor Lexer ([dfinity/candid#89](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/89)) * [`0a5789f9`](dfinity/candid@0a5789f) fix value pretty printer ([dfinity/candid#92](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/92)) * [`9f35a5aa`](dfinity/candid@9f35a5a) refactor error ([dfinity/candid#94](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/94)) * [`2e742927`](dfinity/candid@2e74292) Parse annvals in textual format ([dfinity/candid#93](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/93)) * [`0a144c79`](dfinity/candid@0a144c7) use principal from ic-types ([dfinity/candid#84](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/84)) * [`01412b14`](dfinity/candid@01412b1) release ([dfinity/candid#95](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/95)) * [`f540df54`](dfinity/candid@f540df5) release ([dfinity/candid#98](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/98)) * [`798675d8`](dfinity/candid@798675d) Add generic functions to encode/decode around a tuple ([dfinity/candid#99](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/99)) * [`0d26e568`](dfinity/candid@0d26e56) release ([dfinity/candid#100](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/100)) * [`191b6f1f`](dfinity/candid@191b6f1) Reset record_nesting_depth after each value ([dfinity/candid#101](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/101)) * [`8e7be65d`](dfinity/candid@8e7be65) fix record ([dfinity/candid#103](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/103)) * [`159533b2`](dfinity/candid@159533b) Update construct.test.did * [`a6ea0991`](dfinity/candid@a6ea099) add service initialization parameters ([dfinity/candid#88](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/88)) * [`3a1f56fa`](dfinity/candid@3a1f56f) refactor: sort dependencies and add traits for error types ([dfinity/candid#105](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/105)) * [`89df78ee`](dfinity/candid@89df78e) support service constructor ([dfinity/candid#106](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/106)) * [`738d5ed4`](dfinity/candid@738d5ed) fix for actor class codegen ([dfinity/candid#107](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/107)) * [`97ba7a0f`](dfinity/candid@97ba7a0) export init args in js ([dfinity/candid#108](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/108)) * [`d4e00adc`](dfinity/candid@d4e00ad) fix js init export ([dfinity/candid#109](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/109)) * [`c1662abe`](dfinity/candid@c1662ab) [spec] Reverse subtyping ([dfinity/candid#110](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/110)) * [`713595be`](dfinity/candid@713595b) The “reverse variant extension rule” is redundand ([dfinity/candid#113](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/113)) * [`79d49a01`](dfinity/candid@79d49a0) Spec: Opt decoding also from non-opt values ([dfinity/candid#114](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/114)) * [`2cfc0ecf`](dfinity/candid@2cfc0ec) improve pretty printing for values ([dfinity/candid#116](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/116)) * [`8fafe345`](dfinity/candid@8fafe34) Un-rename Soundness document ([dfinity/candid#115](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/115)) * [`8e6fc502`](dfinity/candid@8e6fc50) Bump spec version ([dfinity/candid#112](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/112)) * [`7cedebcb`](dfinity/candid@7cedebc) fix clippy ([dfinity/candid#117](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/117)) * [`a732a639`](dfinity/candid@a732a63) Candid UI Canister ([dfinity/candid#111](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/111)) * [`d97b271c`](dfinity/candid@d97b271) disable pretty printing for large vectors ([dfinity/candid#118](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/118)) * [`aceb7f92`](dfinity/candid@aceb7f9) derive candid type for functions ([dfinity/candid#119](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/119)) * [`c3dc0ad7`](dfinity/candid@c3dc0ad) rename derived code for CDK ([dfinity/candid#120](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/120)) * [`d1f8de7d`](dfinity/candid@d1f8de7) release ([dfinity/candid#121](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/121)) * [`3e3ad95a`](dfinity/candid@3e3ad95) remove multi-line string in test suites ([dfinity/candid#125](http://r.duckduckgo.com/l/?uddg=https://github.com/dfinity/candid/issues/125))
And no re-boxing around
let (x,y) = foo()and similar constructors. Parked has a PR until #115 has been merged.