bazel syntax: avoid materializing Locations for iterator check

Mutable iterable values (such as lists) are temporarily rendered
shallowly immutable when one or more for-loops are actively iterating
over them. Prior to this change, the value's Mutability would maintain
a hash table mapping objects to a list of active for-loop locations.

This meant that every for-loop caused memory allocation, and required
a Location for the loop. In a future change, I plan to avoid
materializing Locations during parsing, which will allow us to improve
the fidelity of position information recorded in the syntax tree, and
also reduce the memory required by syntax trees. However, it does mean
that Locations will not be materialized except in case of error.

This change replaces the lists of locations in the hash table by a
counter. Also, it adds a method to the Freezable interface that
permits value classes to implement their own intrusive counter.
The two most important mutable iterable types, StarlarkList and Dict,
now do this.

The error message for mutation of an actively iterated value no
longer prints the location of the for-loop, but it is usually obvious
from the stack trace.

Also:
- delete MutabilityException; use a plain EvalException.
- EvalUtils.lock,unlock removed from public API.
- Mutability: encode isFrozen boolean using iterators==null.
- Mutability.checkMutable inlined. The inconsistency check is
  removed---it was recently unreachable by construction.
- MutabilityTest: delete tests of obsolete functions.
- Freezable.checkMutable() renamed to Starlark.checkMutable(Freezable).
  No need for it to be a mix-in any more.
- Report type of frozen mutable value in failed update exceptions.
PiperOrigin-RevId: 305732656
14 files changed
tree: 1e0c9974783b4060d18a3d92a8ab8801fa218eb2
  1. .bazelci/
  2. examples/
  3. scripts/
  4. site/
  5. src/
  6. third_party/
  7. tools/
  8. .bazelrc
  9. .gitattributes
  10. .gitignore
  11. AUTHORS
  12. BUILD
  13. CHANGELOG.md
  14. CODEOWNERS
  15. combine_distfiles.py
  16. combine_distfiles_to_tar.sh
  17. compile.sh
  18. CONTRIBUTING.md
  19. CONTRIBUTORS
  20. distdir.bzl
  21. ISSUE_TEMPLATE.md
  22. LICENSE
  23. README.md
  24. WORKSPACE
README.md

Bazel

{Fast, Correct} - Choose two

Build and test software of any size, quickly and reliably.

  • Speed up your builds and tests: Bazel rebuilds only what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.

  • One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.

  • Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.

  • Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.

Getting Started

Documentation

Contributing to Bazel

See CONTRIBUTING.md

Build status