From 3c9f52a4999e2df23260a68a433ad960da58d944 Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Mon, 17 Feb 2020 14:55:25 +0000 Subject: [PATCH] [vm/ffi] Fix DynamicLibrary extension name And add changelog entry. Follow up of: https://dart-review.googlesource.com/c/sdk/+/135463 Closes: https://github.com/dart-lang/sdk/issues/35903 Closes: https://github.com/dart-lang/sdk/issues/40636 Change-Id: I877f735c54e466031715c775d37544617402f9ff Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-kernel-nnbd-linux-release-x64-try,analyzer-linux-release-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/136124 Commit-Queue: Daco Harkes Reviewed-by: Martin Kustermann --- CHANGELOG.md | 9 +++++++++ pkg/analyzer/lib/src/generated/ffi_verifier.dart | 5 +++-- pkg/analyzer/lib/src/test_utilities/mock_sdk.dart | 2 +- pkg/vm/lib/transformations/ffi.dart | 4 ++-- sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart | 2 +- sdk/lib/ffi/dynamic_library.dart | 2 +- .../lib/_internal/vm/lib/ffi_dynamic_library_patch.dart | 2 +- sdk_nnbd/lib/ffi/dynamic_library.dart | 2 +- 8 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 016fae9ae5e9..62aeeed8278f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,15 @@ case of `name` instead of converting them to lowercase. * `Dart_IsNonNullableType` * `Dart_IsNullableType` +### Foreign Function Interface (`dart:ffi`) + +* **Breaking Change**: `Pointer.asFunction` and `DynamicLibrary.lookupFunction` + changed to extension methods. Invoking them dynamically previously already + threw an Exception, so runtime behavior stays the same. However, the + extension methods are only visible if `dart:ffi` is imported directly. So + this breaks code where `dart:ffi` is not directly imported. Fix: add an + import of `dart:ffi`. + ### Tools #### Dart Dev Compiler (DDC) diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart index 86bf650a2e49..5217e36c327b 100644 --- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart +++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart @@ -158,9 +158,10 @@ class FfiVerifier extends RecursiveAstVisitor { } /// Return `true` if the given [element] represents the extension - /// `LibraryExtension`. + /// `DynamicLibraryExtension`. bool _isDynamicLibraryExtension(Element element) => - element.name == 'LibraryExtension' && element.library.name == 'dart.ffi'; + element.name == 'DynamicLibraryExtension' && + element.library.name == 'dart.ffi'; /// Returns `true` iff [nativeType] is a `ffi.NativeFunction` type. bool _isNativeFunctionInterfaceType(DartType nativeType) { diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart index e853ea616abb..c1c120bd6b87 100644 --- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart +++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart @@ -544,7 +544,7 @@ extension NativeFunctionPointer class Struct extends NativeType {} abstract class DynamicLibrary {} -extension LibraryExtension on DynamicLibrary { +extension DynamicLibraryExtension on DynamicLibrary { external F lookupFunction( String symbolName); } diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart index dcc9c5fa71b8..9875288b3e91 100644 --- a/pkg/vm/lib/transformations/ffi.dart +++ b/pkg/vm/lib/transformations/ffi.dart @@ -238,8 +238,8 @@ class FfiTransformer extends Transformer { index.getMember('dart:ffi', 'NativeFunctionPointer', 'asFunction'), asFunctionInternal = index.getTopLevelMember('dart:ffi', '_asFunctionInternal'), - lookupFunctionMethod = - index.getMember('dart:ffi', 'LibraryExtension', 'lookupFunction'), + lookupFunctionMethod = index.getMember( + 'dart:ffi', 'DynamicLibraryExtension', 'lookupFunction'), fromFunctionMethod = index.getMember('dart:ffi', 'Pointer', 'fromFunction'), libraryLookupMethod = diff --git a/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart b/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart index f6af77194bf3..0d47898e9526 100644 --- a/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart +++ b/sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart @@ -51,7 +51,7 @@ class DynamicLibrary { Pointer get handle => Pointer.fromAddress(getHandle()); } -extension LibraryExtension on DynamicLibrary { +extension DynamicLibraryExtension on DynamicLibrary { @patch DS lookupFunction( String symbolName) => diff --git a/sdk/lib/ffi/dynamic_library.dart b/sdk/lib/ffi/dynamic_library.dart index bb513adb153f..8cc5789618e2 100644 --- a/sdk/lib/ffi/dynamic_library.dart +++ b/sdk/lib/ffi/dynamic_library.dart @@ -41,7 +41,7 @@ class DynamicLibrary { } /// Methods which cannot be invoked dynamically. -extension LibraryExtension on DynamicLibrary { +extension DynamicLibraryExtension on DynamicLibrary { /// Helper that combines lookup and cast to a Dart function. external F lookupFunction( String symbolName); diff --git a/sdk_nnbd/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart index c3543b8f7d24..303c5a4d3856 100644 --- a/sdk_nnbd/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart +++ b/sdk_nnbd/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart @@ -50,7 +50,7 @@ class DynamicLibrary { Pointer get handle => Pointer.fromAddress(getHandle()); } -extension LibraryExtension on DynamicLibrary { +extension DynamicLibraryExtension on DynamicLibrary { @patch DS lookupFunction( String symbolName) => diff --git a/sdk_nnbd/lib/ffi/dynamic_library.dart b/sdk_nnbd/lib/ffi/dynamic_library.dart index 4dbd47faa648..d11c945cb726 100644 --- a/sdk_nnbd/lib/ffi/dynamic_library.dart +++ b/sdk_nnbd/lib/ffi/dynamic_library.dart @@ -39,7 +39,7 @@ class DynamicLibrary { } /// Methods which cannot be invoked dynamically. -extension LibraryExtension on DynamicLibrary { +extension DynamicLibraryExtension on DynamicLibrary { /// Helper that combines lookup and cast to a Dart function. external F lookupFunction( String symbolName);