c2339ee782
Implements memory access through the `Pointer`, `Struct` and `Union` FFI types. `Pointer` supports `fromAddress`, `address`, `elementAt`, `cast`, `value`, `ref` (only getter), `[]`, `[]=` (not for structs and unions), `==` and `hashCode`. Structs and unions support getters and setters for their members. `Pointer`, `Struct` and `Union` are all represented as `i32`, both internally and in imports and exports. They currently don't have any boxed representation, which means they can't be nullable (a `Pointer` can still contain `nullptr` - the C null) and can't be assigned to supertypes (i.e. `Object`, `dynamic`, type variables), stored in containers nor passed as arguments or return values of local functions or function expressions. To pass an FFI value in these situations, box it manually by storing it in a field. For the FFI integer types, only the explicitly sized versions (e.g. `Int8`, `Uint32`) are supported. Whenever the feature is used, the module will import a memory by the name "ffi.memory", which will be accessed by the operations. This also adds an optional commandline argument to `run_wasm.js` to specify the module containing the FFI code. When such a module is specified, it will be instantiated first, and its exports will appear as imports to the Dart module under the "ffi" module name. Change-Id: Ie55b072056f972b42db6b75e0c676944bbe88c1a Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237686 Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Aske Simon Christensen <askesc@google.com>