From c7bf13176fd4ea5efe29dbc781a68e2e77779ca2 Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Mon, 28 Jul 2025 07:58:10 -0700 Subject: [PATCH] [vm,dyn_modules] Support reachabilityFence and _nativeEffect from dart:_internal in bytecode TEST=ci Change-Id: I68c7b74b6ccc75139b5690f3216c47ab843cc544 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/+/442245 Reviewed-by: Tess Strickland Commit-Queue: Alexander Markov --- pkg/dart2bytecode/lib/bytecode_generator.dart | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/dart2bytecode/lib/bytecode_generator.dart b/pkg/dart2bytecode/lib/bytecode_generator.dart index bfe504a6095..5c79d2ba179 100644 --- a/pkg/dart2bytecode/lib/bytecode_generator.dart +++ b/pkg/dart2bytecode/lib/bytecode_generator.dart @@ -969,6 +969,12 @@ class BytecodeGenerator extends RecursiveVisitor { late Procedure unsafeCast = libraryIndex.getTopLevelProcedure('dart:_internal', 'unsafeCast'); + late Procedure reachabilityFence = + libraryIndex.getTopLevelProcedure('dart:_internal', 'reachabilityFence'); + + late Procedure nativeEffect = + libraryIndex.getTopLevelProcedure('dart:_internal', '_nativeEffect'); + late Procedure iterableIterator = libraryIndex.getProcedure('dart:core', 'Iterable', 'get:iterator'); @@ -3454,12 +3460,16 @@ class BytecodeGenerator extends RecursiveVisitor { } Arguments args = node.arguments; final target = node.target; - if (target == unsafeCast) { - // The result of the unsafeCast() intrinsic method is its sole argument, - // without any additional checks or type casts. + // Handle built-in methods with special semantics. + if (target == unsafeCast || target == reachabilityFence) { + // Just evaluate argument. assert(args.named.isEmpty); _generateNode(args.positional.single); return; + } else if (target == nativeEffect) { + // Skip over AST of the argument, return null. + asm.emitPushNull(); + return; } if (target.isFactory) { final constructedClass = target.enclosingClass!;