[dart2bytecode] Generate instance field initializers for hot reload

Hot reload needs to run instance field initializers for all newly
added fields except fields initialized with null.

TEST=ci (vm/cc/IsolateReload_RunNewFieldInitializers)

Change-Id: I3ead726aa12b9d6c5aa515c7297deca0ddd9eb9f
Cq-Include-Trybots: luci.dart.try:vm-aot-dyn-linux-debug-x64-try,vm-aot-dyn-linux-product-x64-try,vm-dyn-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/441861
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Alexander Markov
2025-07-22 16:08:20 -07:00
committed by Commit Queue
parent 575566dafa
commit 87beee922a
+13 -2
View File
@@ -3372,8 +3372,14 @@ class BytecodeGenerator extends RecursiveVisitor {
}
bool _hasNonTrivialInitializer(Field field) {
if (field.initializer == null) return false;
return !_isTrivialInitializer(field.initializer);
final initializer = field.initializer;
if (initializer == null) return false;
if (options.emitInstanceFieldInitializers && !field.isStatic) {
// Hot reload needs initializers for all instance fields
// except fields initialized with null.
return !_isNullInitializer(initializer);
}
return !_isTrivialInitializer(initializer);
}
bool _isTrivialInitializer(Expression? initializer) {
@@ -3392,6 +3398,11 @@ class BytecodeGenerator extends RecursiveVisitor {
return false;
}
bool _isNullInitializer(Expression? initializer) =>
initializer is NullLiteral ||
(initializer is ConstantExpression &&
initializer.constant is NullConstant);
@override
void visitStaticGet(StaticGet node) {
final target = node.target;