74f2d4b1af
All callbacks flow via the single runtime entry, so we add a check there. TEST=tests/ffi/function_callbacks_leaf_test.dart (The transition verification in https://dart-review.googlesource.com/c/sdk/+/407021 doesn't catch the error. The callbacks already transitioned before reaching the generated code in that CL.) Closes: https://github.com/dart-lang/sdk/issues/60021 Change-Id: Ia6bf8af186c9c8c5a66cffa537d80421467330d4 Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-asan-linux-release-x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-msan-linux-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-aot-ubsan-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-arm64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-arm64-try,vm-fuchsia-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-arm64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-tsan-linux-release-arm64-try,vm-tsan-linux-release-x64-try,vm-ubsan-linux-release-arm64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/407023 Commit-Queue: Daco Harkes <dacoharkes@google.com> Reviewed-by: Liam Appelbe <liama@google.com> Reviewed-by: Slava Egorov <vegorov@google.com>
61 lines
1.7 KiB
Dart
61 lines
1.7 KiB
Dart
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'dart:ffi';
|
|
import 'dart:io';
|
|
|
|
import 'dylib_utils.dart';
|
|
|
|
final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions');
|
|
|
|
typedef SimpleAdditionType = Void Function(Int32, Int32);
|
|
|
|
void simpleAddition(int x, int y) {
|
|
print("simpleAddition($x, $y)");
|
|
}
|
|
|
|
void main(List<String> arguments) async {
|
|
if (arguments.isEmpty) {
|
|
for (int i in [1, 2, 3]) {
|
|
final result = Process.runSync(Platform.resolvedExecutable, [
|
|
Platform.script.toFilePath(),
|
|
'$i',
|
|
]);
|
|
if (result.exitCode == 0) {
|
|
throw 'Expected non-0 exit code: ${result.exitCode}';
|
|
}
|
|
if (!result.stderr.contains(
|
|
'Cannot invoke native callback from a leaf call.',
|
|
)) {
|
|
throw "Expected stderr to contain 'Cannot invoke native callback from a leaf call.': ${result.stderr}";
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
final Pointer<NativeFunction<SimpleAdditionType>> callbackPointer;
|
|
switch (arguments.single) {
|
|
case "1":
|
|
callbackPointer = Pointer.fromFunction<SimpleAdditionType>(
|
|
simpleAddition,
|
|
);
|
|
case "2":
|
|
callbackPointer =
|
|
NativeCallable<SimpleAdditionType>.isolateLocal(
|
|
simpleAddition,
|
|
).nativeFunction;
|
|
case "3":
|
|
callbackPointer =
|
|
NativeCallable<SimpleAdditionType>.listener(
|
|
simpleAddition,
|
|
).nativeFunction;
|
|
default:
|
|
throw "Unknown";
|
|
}
|
|
final function = callbackPointer.asFunction<void Function(int, int)>(
|
|
isLeaf: true,
|
|
);
|
|
function(3, 4);
|
|
print('We should have crashed by now.');
|
|
}
|