| commit | eb938ee4bbca62b27e13859d17b8c0f29c12c9bd | [log] [tgz] | 
|---|---|---|
| author | Konstantin Shcheglov <scheglov@google.com> | Tue Sep 23 17:09:57 2025 -0700 | 
| committer | Commit Queue <dart-scoped@luci-project-accounts.iam.gserviceaccount.com> | Tue Sep 23 17:09:57 2025 -0700 | 
| tree | 014c3625eaa16604ebab056216e9088bb12a6aa8 | |
| parent | 1891d44809bba06420e862f19129607cde436e5a [diff] | 
Fine. Integrate string table support into binary I/O
Fine-grained manifests previously wrote strings as raw UTF-8, which
increased bytes on the wire and added CPU overhead. This change
integrates string tables into the core BinaryWriter/BinaryReader so
manifests (and other formats) can use string references instead of
duplicated UTF-8 payloads.
What changed
- BinaryWriter
  - Add a shared StringIndexer and expose:
    - writeStringReference / writeStringList /
      writeOptionalStringReference
    - writeStringTableAtEnd() to emit the table and a trailing u32
      offset.
  - Add clone() that shares the StringIndexer with child writers for
    lazy/layered sections.
- BinaryReader
  - Add initializeStringTableAtOffset(offset) (rename from
    createStringTable).
  - Add initializeStringTableFromEnd(), the counterpart to
    writeStringTableAtEnd(), which reads the trailing u32 to find the
    table.
- Bundle writer/reader
  - Switch to writer string-table APIs and use
    initializeStringTableAtOffset() when reading.
  - ResolutionSink now extends BinaryWriter (removes the custom
    _SummaryDataWriter) and AstBinaryWriter delegates string writes to
    the sink.
  - Replace ad-hoc “_writeStringReference/_writeStringList” helpers
    with BinaryWriter methods; move small helpers to extensions.
- Data format
  - Bump AnalysisDriver.DATA_VERSION to 560 to invalidate old caches.
Why
- Reduces duplicate string storage across manifests and resolution
  chunks.
- Lowers serialization cost by replacing repeated UTF-8 blobs with
  compact integer references.
- Unifies string handling across summaries and manifests, simplifying
  future readers/writers.
Trade-offs
- Writers must finalize output correctly (emit the table before
  takeBytes when using the “table at end” mode); misuse will break the
  format.
- Sharing one StringIndexer across cloned writers slightly increases
  table size when many unique strings are produced, but the dedup win
  typically dominates.
Compatibility
- Existing bundle format continues to store four trailing u32 offsets
  (base/resolved/libraries/references/stringTable). The new “table at
  end” read path is added for formats that adopt it; bundle reading
  remains compatible by using the explicit offsets.
Change-Id: I3648a59eeb6af453f2744415c13f864e9b49a167
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/450972
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Dart is:
Approachable: Develop with a strongly typed programming language that is consistent, concise, and offers modern language features like null safety and patterns.
Portable: Compile to ARM, x64, or RISC-V machine code for mobile, desktop, and backend. Compile to JavaScript or WebAssembly for the web.
Productive: Make changes iteratively: use hot reload to see the result instantly in your running app. Diagnose app issues using DevTools.
Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:
Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.
Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).
Dart is free and open source.
See LICENSE and PATENT_GRANT.
Visit dart.dev to learn more about the language, tools, and to find codelabs.
Browse pub.dev for more packages and libraries contributed by the community and the Dart team.
Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).
If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.
There are more documents in our repo at docs.
The easiest way to contribute to Dart is to file issues.
You can also contribute patches, as described in Contributing.
Future plans for Dart are included in the combined Dart and Flutter roadmap on the Flutter wiki.