dart-sdk/sdk/lib
Daco Harkes 8de00e2137 [vm] Introduce pragma vm:deeply-immutable
This CL introduces a way to mark all instances of a class as deeply
immutable.

In order to statically verify that all instances of a deeply immutable
class are immutable, a deeply immutable classes must have the following
properties:

1. All instance fields must
   1. have a deeply immutable type,
   2. be final, and
   3. be non-late.
2. The class must be `final` or `sealed`. This ensures no
   non-deeply-immutable subtypes are added by external code.
3. All subtypes must be deeply immutable. This ensures 1.1 can be
   trusted.
4. The super type must be deeply immutable (except for Object).

Note that instances of some classes in the VM are deeply immutable
while their class cannot be marked immutable.

* SendPort, Capability, RegExp, and StackTrace are not `final` and
  can be implemented by external code.
* UnmodifiableTypedDataViews do not have a public type. (It was
  recently deprecated.)

See runtime/docs/deeply_immutable.md for more details.

Use case:

This enables attaching a `Dart_FinalizableHandle` to a deeply immutable
object and the deeply immutable object with other isolates in the same
isolate group.

(Note that `NativeFinalizer`s live in an isolate, and not an isolate
group. So this should currently _not_ be used with `NativeFinalizer`s.
See https://github.com/dart-lang/sdk/issues/55062 for making a
`NativeFinalizer.shared(` that would live in an isolate group instead
of in an isolate.)

Implementation details:

Before this CL, the `ImmutableBit` in the object header was only ever
set to true for predefined class ids (and for const objects). After
this CL, the bit can also be set to true for non const instances of
user-defined classes. The object allocation and initialization code has
been changed to deal with this new case. The immutability of a class is
saved in the class state bits. On object allocation and initialization
the immutability bit is read from the class for non-predefined class
ids.

TEST=runtime/tests/vm/dart/isolates/fast_object_copy2_test.dart
TEST=runtime/vm/isolate_reload_test.cc
TEST=tests/lib/isolate/deeply_immutable_*

Bug: https://github.com/dart-lang/sdk/issues/55120
Bug: https://github.com/dart-lang/sdk/issues/54885
Change-Id: Ib97fe589cb4f81673cb928c93e3093838d82132d
Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-precomp-linux-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try
Cq-Include-Trybots: dart-internal/g3.dart-internal.try:g3-cbuild-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/354902
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2024-03-07 18:33:58 +00:00
..
_http [dart:developer][VM/Service] Add APIs to dart:developer for recording HTTP profiling information, and for later retrieving that information 2024-02-15 18:56:08 +00:00
_internal [vm] Introduce pragma vm:deeply-immutable 2024-03-07 18:33:58 +00:00
_macros Macro. Support for TypeAliasDeclaration. 2024-02-23 19:55:10 +00:00
_wasm [dart2wasm] Refactor and optimize dart2wasm hash map/set types 2024-03-05 16:00:39 +00:00
async Expand docs around error zones 2024-02-29 01:49:08 +00:00
cli [vm] Remove dart:cli from dartdoc 2024-02-29 13:57:27 +00:00
collection [collection] Update example code in dartdoc 2023-12-28 23:37:27 +00:00
convert Remove Utf8Decoder._convertIntercepted hook 2023-11-23 12:25:26 +00:00
core Make all platforms return null from Error.stackTrace until thrown. 2024-02-27 23:01:06 +00:00
developer [dart:developer][VM/Service] Add APIs to dart:developer for recording HTTP profiling information, and for later retrieving that information 2024-02-15 18:56:08 +00:00
ffi [vm/ffi] Unify TypedDataBase wrappers 2024-02-09 21:27:29 +00:00
html [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
indexed_db [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
internal [sdk/lib] Update SystemHash.smear for improved parameters 2024-02-15 15:06:58 +00:00
io Fix typo 2024-03-02 03:48:55 +00:00
isolate Refer to unnamed constructors in doc comments with '.new' 2023-10-17 14:42:38 +00:00
js Update JSExport docs to refer to createJSInteropWrapper 2024-02-14 00:36:25 +00:00
js_interop [dart:js_interop] Fix comparison operator return types 2024-03-04 21:10:02 +00:00
js_interop_unsafe [dart:js_interop/_unsafe] Clean up API docs 2024-02-29 04:15:49 +00:00
js_util [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
math [sdk/math] Mark Point, Rectangle, and MutableRectangle as legacy 2024-02-14 18:35:17 +00:00
mirrors [vm] Add minimal support for mirrors of extension type members 2023-12-07 21:48:50 +00:00
svg [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
typed_data Reapply "[typed_data] Deprecate unmodifiable views" 2024-02-06 23:30:49 +00:00
vmservice [vm] Pass offset and script uri for expression compilation 2023-10-12 10:22:38 +00:00
web_audio [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
web_gl [sdk/js_interop] Clean up and add a few minimal API docs 2024-02-12 14:44:54 +00:00
web_sql [docs] update dart:html template files 2024-01-12 18:17:13 +00:00
libraries.json [dart2wasm] Refactor and optimize dart2wasm hash map/set types 2024-03-05 16:00:39 +00:00
libraries.yaml [dart2wasm] Refactor and optimize dart2wasm hash map/set types 2024-03-05 16:00:39 +00:00
PRESUBMIT.py [build] Python 3.12 compatibility. 2023-12-12 18:19:35 +00:00
vmservice_libraries.json [Core Libraries] Eliminate the fork in the core libraries. 2020-06-16 23:37:36 +00:00
vmservice_libraries.yaml update the tooling to generate libraries.json from libraries.yaml 2021-07-27 23:02:50 +00:00