[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 <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Daco Harkes 2020-02-17 14:55:25 +00:00 committed by commit-bot@chromium.org
parent 595038d19f
commit 3c9f52a499
8 changed files with 19 additions and 9 deletions

View file

@ -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)

View file

@ -158,9 +158,10 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
}
/// 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) {

View file

@ -544,7 +544,7 @@ extension NativeFunctionPointer<NF extends Function>
class Struct extends NativeType {}
abstract class DynamicLibrary {}
extension LibraryExtension on DynamicLibrary {
extension DynamicLibraryExtension on DynamicLibrary {
external F lookupFunction<T extends Function, F extends Function>(
String symbolName);
}

View file

@ -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 =

View file

@ -51,7 +51,7 @@ class DynamicLibrary {
Pointer<Void> get handle => Pointer.fromAddress(getHandle());
}
extension LibraryExtension on DynamicLibrary {
extension DynamicLibraryExtension on DynamicLibrary {
@patch
DS lookupFunction<NS extends Function, DS extends Function>(
String symbolName) =>

View file

@ -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<T extends Function, F extends Function>(
String symbolName);

View file

@ -50,7 +50,7 @@ class DynamicLibrary {
Pointer<Void> get handle => Pointer.fromAddress(getHandle());
}
extension LibraryExtension on DynamicLibrary {
extension DynamicLibraryExtension on DynamicLibrary {
@patch
DS lookupFunction<NS extends Function, DS extends Function>(
String symbolName) =>

View file

@ -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<T extends Function, F extends Function>(
String symbolName);