Skip to content

Commit

Permalink
[vm/ffi] Fix DynamicLibrary extension name
Browse files Browse the repository at this point in the history
And add changelog entry.

Follow up of: https://dart-review.googlesource.com/c/sdk/+/135463

Closes: #35903
Closes: #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 <[email protected]>
Reviewed-by: Martin Kustermann <[email protected]>
  • Loading branch information
dcharkes authored and [email protected] committed Feb 17, 2020
1 parent 595038d commit 3c9f52a
Show file tree
Hide file tree
Showing 8 changed files with 19 additions and 9 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions pkg/analyzer/lib/src/generated/ffi_verifier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/vm/lib/transformations/ffi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
2 changes: 1 addition & 1 deletion sdk/lib/_internal/vm/lib/ffi_dynamic_library_patch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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) =>
Expand Down
2 changes: 1 addition & 1 deletion sdk/lib/ffi/dynamic_library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) =>
Expand Down
2 changes: 1 addition & 1 deletion sdk_nnbd/lib/ffi/dynamic_library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 3c9f52a

Please sign in to comment.