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>
6 files changed
tree: 014c3625eaa16604ebab056216e9088bb12a6aa8
  1. .dart_tool/
  2. .github/
  3. benchmarks/
  4. build/
  5. docs/
  6. pkg/
  7. runtime/
  8. samples/
  9. sdk/
  10. tests/
  11. third_party/
  12. tools/
  13. utils/
  14. .clang-format
  15. .gitattributes
  16. .gitconfig
  17. .gitignore
  18. .gn
  19. .mailmap
  20. .style.yapf
  21. AUTHORS
  22. BUILD.gn
  23. CHANGELOG.md
  24. codereview.settings
  25. CONTRIBUTING.md
  26. DEPS
  27. LICENSE
  28. OWNERS
  29. PATENT_GRANT
  30. PRESUBMIT.py
  31. pubspec.yaml
  32. README.dart-sdk
  33. README.md
  34. sdk.code-workspace
  35. sdk_args.gni
  36. sdk_packages.yaml
  37. SECURITY.md
  38. WATCHLISTS
README.md

Dart

An approachable, portable, and productive language for high-quality apps on any platform

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 platforms illustration

License & patents

Dart is free and open source.

See LICENSE and PATENT_GRANT.

Using Dart

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).

Building Dart

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.

Contributing to Dart

The easiest way to contribute to Dart is to file issues.

You can also contribute patches, as described in Contributing.

Roadmap

Future plans for Dart are included in the combined Dart and Flutter roadmap on the Flutter wiki.