ea6fb0a16f
This seems to result in -0.6% compressed main module and a bit less in uncompressed mode. Sometimes we have many fields with lazy initializers of the same type. That led us to emit 1 nullable wasm global for each such field. For example all proto classes have a `static BuilderInfo i_` field. This has led to thousands of `(mut (ref null $BuilderInfo))` wasm globals. Now we use a wasm table for this, which is a O(1) in the binary as they all get `null` by default, saving us all these globals. The downside is that accesses have an extra instruction now, but overall this is a win. The CL also cleans up `globals.dart` by separating the concept of a wasm global and reading/writing to it from the concept of a Dart global - as Dart globals can now be backed by wasm globals or table slots. This CL uses the new capability made possible by the refactoring in [0] - namely to emit element sections which initialize wasm table slots with non-function expressions. [0] https://dart-review.googlesource.com/c/sdk/+/459440 Change-Id: Ie57206dff8c0a57a1df5e48c0808167f822bc4a2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/475800 Reviewed-by: Nate Biggs <natebiggs@google.com> Commit-Queue: Martin Kustermann <kustermann@google.com>