[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 <sstrickl@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov
2025-07-28 07:58:10 -07:00
committed by Commit Queue
parent 63082bebbb
commit c7bf13176f
+13 -3
View File
@@ -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!;