[L] Change in dart/sdk[main]: [vm/shared] Skip runtime deep-immutability check for statically known...

0 views
Skip to first unread message

Alexander Aprelev (Gerrit)

unread,
Jan 20, 2026, 11:08:09 PM (2 days ago) Jan 20
to Alexander Aprelev, Alexander Markov, Commit Queue, Jens Johansen, dart-vm-compil...@google.com, rev...@dartlang.org, vm-...@dartlang.org
Attention needed from Alexander Markov

Alexander Aprelev voted Commit-Queue+1

Commit-Queue+1
Open in Gerrit

Related details

Attention is currently required from:
  • Alexander Markov
Submit Requirements:
  • requirement is not satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement satisfiedCommit-Message-Has-TEST
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: sdk
Gerrit-Branch: main
Gerrit-Change-Id: I4116d5f51f3247d50d4e7fc0f87e04238a6e3151
Gerrit-Change-Number: 474563
Gerrit-PatchSet: 2
Gerrit-Owner: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Markov <alexm...@google.com>
Gerrit-CC: Jens Johansen <je...@google.com>
Gerrit-Attention: Alexander Markov <alexm...@google.com>
Gerrit-Comment-Date: Wed, 21 Jan 2026 04:08:06 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
unsatisfied_requirement
satisfied_requirement
open
diffy

Alexander Markov (Gerrit)

unread,
Jan 21, 2026, 2:46:27 PM (10 hours ago) Jan 21
to Alexander Aprelev, Alexander Markov, Commit Queue, Jens Johansen, dart-vm-compil...@google.com, rev...@dartlang.org, vm-...@dartlang.org
Attention needed from Alexander Aprelev

Alexander Markov added 7 comments

File pkg/kernel/lib/src/ast/members.dart
Line 146, Patchset 2 (Latest): bool get hasDeeplyImmutableType;
Alexander Markov . unresolved

It seems like this is only applied to fields, so why do we need this getter on members?

File pkg/vm/lib/modular/transformations/deeply_immutable.dart
Line 41, Patchset 2 (Latest): bool requiresRuntimeCheck;
Alexander Markov . unresolved

Nit: these fields can be `final`.

Line 43, Patchset 2 (Latest): _CheckResult({this.isImmutable = false, this.requiresRuntimeCheck = false}) {}
Alexander Markov . unresolved

Nit: this constructor can be `const`. Also, empty constructor body `{}` can be omitted (end with `;`).

Line 164, Patchset 2 (Latest): field.hasDeeplyImmutableType =
Alexander Markov . unresolved

It seems like we only set this flag on instance fields of deeply-immutable classes (due to L91 and L151). But VM expects it on other fields (e.g. static).

Also, the value of this flag is determined from VM-specific `vm:deeply-immutable` pragmas. It would be cleaner and less intrusive to represent this information as a pragma instead of a flag on a `Field` object. Pragma can be added using


```
field.addAnnotation(ConstantExpression(InstanceConstant(coreTypes.pragmaClass.reference, [], {
coreTypes.pragmaName.fieldReference: StringConstant(pragmaName),
coreTypes.pragmaOptions.fieldReference: NullConstant(),
})))
```
Line 185, Patchset 2 (Latest): requiresRuntimeCheck: false,
Alexander Markov . unresolved

Why runtime check is not need for arbitrary classes? Can we use type `Function` for a field?

File runtime/vm/compiler/backend/il_arm.cc
Line 2938, Patchset 2 (Latest): field().has_deeply_immutable_type();
Alexander Markov . unresolved

Did you mean `!field().has_deeply_immutable_type()`? Because slow path which uses extra temp register is generated only if field doesn't have immutable type.

(also on other architectures)

File runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
Line 446, Patchset 2 (Latest): final int baz;
Alexander Markov . unresolved

Could you add tests for shared static fields?

Also, consider writing IL tests for AOT compiler (https://github.com/dart-lang/sdk/blob/main/runtime/docs/infra/il_tests.md).

Open in Gerrit

Related details

Attention is currently required from:
  • Alexander Aprelev
Submit Requirements:
  • requirement is not satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement satisfiedCommit-Message-Has-TEST
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: sdk
Gerrit-Branch: main
Gerrit-Change-Id: I4116d5f51f3247d50d4e7fc0f87e04238a6e3151
Gerrit-Change-Number: 474563
Gerrit-PatchSet: 2
Gerrit-Owner: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Markov <alexm...@google.com>
Gerrit-CC: Jens Johansen <je...@google.com>
Gerrit-Attention: Alexander Aprelev <a...@google.com>
Gerrit-Comment-Date: Wed, 21 Jan 2026 19:46:23 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
unsatisfied_requirement
satisfied_requirement
open
diffy

Alexander Aprelev (Gerrit)

unread,
Jan 21, 2026, 4:44:46 PM (8 hours ago) Jan 21
to Alexander Aprelev, Alexander Markov, Commit Queue, Jens Johansen, dart-vm-compil...@google.com, rev...@dartlang.org, vm-...@dartlang.org
Attention needed from Alexander Markov

Alexander Aprelev voted and added 8 comments

Votes added by Alexander Aprelev

Commit-Queue+1

8 comments

Patchset-level comments
File-level comment, Patchset 3 (Latest):
Alexander Aprelev . resolved

thanks Alex!

File pkg/kernel/lib/src/ast/members.dart
Line 146, Patchset 2: bool get hasDeeplyImmutableType;
Alexander Markov . resolved

It seems like this is only applied to fields, so why do we need this getter on members?

Alexander Aprelev

Done

File pkg/vm/lib/modular/transformations/deeply_immutable.dart
Line 41, Patchset 2: bool requiresRuntimeCheck;
Alexander Markov . resolved

Nit: these fields can be `final`.

Alexander Aprelev

Done

Line 43, Patchset 2: _CheckResult({this.isImmutable = false, this.requiresRuntimeCheck = false}) {}
Alexander Markov . resolved

Nit: this constructor can be `const`. Also, empty constructor body `{}` can be omitted (end with `;`).

Alexander Aprelev

Done

Line 164, Patchset 2: field.hasDeeplyImmutableType =
Alexander Markov . resolved

It seems like we only set this flag on instance fields of deeply-immutable classes (due to L91 and L151). But VM expects it on other fields (e.g. static).

Also, the value of this flag is determined from VM-specific `vm:deeply-immutable` pragmas. It would be cleaner and less intrusive to represent this information as a pragma instead of a flag on a `Field` object. Pragma can be added using


```
field.addAnnotation(ConstantExpression(InstanceConstant(coreTypes.pragmaClass.reference, [], {
coreTypes.pragmaName.fieldReference: StringConstant(pragmaName),
coreTypes.pragmaOptions.fieldReference: NullConstant(),
})))
```
Alexander Aprelev

Done

Line 185, Patchset 2: requiresRuntimeCheck: false,
Alexander Markov . resolved

Why runtime check is not need for arbitrary classes? Can we use type `Function` for a field?

Alexander Aprelev

Assumption here is that `isImmutable` is `true` only for statically proven classes.
Combination `(isImmutable: false, requiresRuntimeCheck: true)` doesn't make sense.

File runtime/vm/compiler/backend/il_arm.cc
Line 2938, Patchset 2: field().has_deeply_immutable_type();
Alexander Markov . resolved

Did you mean `!field().has_deeply_immutable_type()`? Because slow path which uses extra temp register is generated only if field doesn't have immutable type.

(also on other architectures)

Alexander Aprelev

Done

File runtime/vm/compiler/frontend/kernel_binary_flowgraph_test.cc
Line 446, Patchset 2: final int baz;
Alexander Markov . resolved

Could you add tests for shared static fields?

Also, consider writing IL tests for AOT compiler (https://github.com/dart-lang/sdk/blob/main/runtime/docs/infra/il_tests.md).

Alexander Aprelev

Added one, but it's broken since that infra uses checked-in sdk. So will stay broken until checked-in sdk is updated.

Open in Gerrit

Related details

Attention is currently required from:
  • Alexander Markov
Submit Requirements:
  • requirement satisfiedCode-Owners
  • requirement is not satisfiedCode-Review
  • requirement satisfiedCommit-Message-Has-TEST
  • requirement is not satisfiedReview-Enforcement
Inspect html for hidden footers to help with email filtering. To unsubscribe visit settings. DiffyGerrit
Gerrit-MessageType: comment
Gerrit-Project: sdk
Gerrit-Branch: main
Gerrit-Change-Id: I4116d5f51f3247d50d4e7fc0f87e04238a6e3151
Gerrit-Change-Number: 474563
Gerrit-PatchSet: 3
Gerrit-Owner: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Aprelev <a...@google.com>
Gerrit-Reviewer: Alexander Markov <alexm...@google.com>
Gerrit-CC: Jens Johansen <je...@google.com>
Gerrit-Attention: Alexander Markov <alexm...@google.com>
Gerrit-Comment-Date: Wed, 21 Jan 2026 21:44:43 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
Comment-In-Reply-To: Alexander Markov <alexm...@google.com>
satisfied_requirement
unsatisfied_requirement
open
diffy
Reply all
Reply to author
Forward
0 new messages