With Rust 2018 Edition, the `mod std` trick to alias `core` names to
`std` no longer works, so switch to just having the code use `core`
explicitly.
So instead, switch to just using `core::*` for things that in core.
This is more consistent with other Rust no_std code. And it allows
us to enable `no_std` mode unconditionally in the crates that support
it, which makes testing a little easier.
There actually three cases:
- For things in std and also in core, like `cmp`: Just use them via
`core::*`.
- For things in std and also in alloc, like `Vec`: Import alloc as std, as
use them from std. This allows them to work on both stable (which
doesn't provide alloc, but we don't support no_std mode anyway) and
nightly.
- For HashMap and similar which are not in core or alloc, import them in
the top-level lib.rs files from either std or the third-party hashmap_core
crate, and then have the code use super::hashmap_core.
Also, no_std support continues to be "best effort" at this time and not
something most people need to be testing.
Currently we don't actually sandbox the memory at all, so you can do evil things
like read and write the host's memory. We also don't support growing memory or
cranelift-compatible ABI that passes the memory offset as an argument.
We also always immediately allocate the buffer when encountering a memory section,
there is preliminary support for translating a buffer which can then have the real
offset replaced using relocations (and returning a different type when doing so)
but I haven't written the code that actually does relocation so it doesn't work yet.
These default to doing nothing, but implementations can override them to
preallocate buffers.
Also, reorder the functions in `ModuleEnvironment` to more closely
reflect the sequence from the WebAssembly module layout.
Remove some unneeded functions, and remove the `GlobalInit` special case
for data and elem initializer offsets; implementations that want that
information can provide it for themselves.