From 87beee922a3d5c4f6a9c12c8804347d6b4c44962 Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Tue, 22 Jul 2025 16:08:20 -0700 Subject: [PATCH] [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 Reviewed-by: Ryan Macnak --- pkg/dart2bytecode/lib/bytecode_generator.dart | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/dart2bytecode/lib/bytecode_generator.dart b/pkg/dart2bytecode/lib/bytecode_generator.dart index 4e70f04ad49..65779ea55c7 100644 --- a/pkg/dart2bytecode/lib/bytecode_generator.dart +++ b/pkg/dart2bytecode/lib/bytecode_generator.dart @@ -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;