Skip to content

Commit

Permalink
[vm/ffi] Pointer.asExternalTypedData to extension method
Browse files Browse the repository at this point in the history
Issue: #38610

Change-Id: Ib07f50b23e3be2bce2d7b973c0f0196884397952
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121384
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
  • Loading branch information
dcharkes authored and commit-bot@chromium.org committed Oct 14, 2019
1 parent 545a06b commit 91c6dc1
Show file tree
Hide file tree
Showing 8 changed files with 352 additions and 85 deletions.
85 changes: 63 additions & 22 deletions runtime/tools/ffi/sdk_lib_ffi_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@ import 'package:args/args.dart';
// Configuration.
//

const Map<String, String> nativeToDartType = {
"Int8": "int",
"Int16": "int",
"Int32": "int",
"Int64": "int",
"Uint8": "int",
"Uint16": "int",
"Uint32": "int",
"Uint64": "int",
"IntPtr": "int",
"Float": "double",
"Double": "double",
};
const configuration = [
Config("Int8", "int", "Int8List", 1),
Config("Int16", "int", "Int16List", 2),
Config("Int32", "int", "Int32List", 4),
Config("Int64", "int", "Int64List", 8),
Config("Uint8", "int", "Uint8List", 1),
Config("Uint16", "int", "Uint16List", 2),
Config("Uint32", "int", "Uint32List", 4),
Config("Uint64", "int", "Uint64List", 8),
Config("IntPtr", "int", kDoNotEmit, kIntPtrElementSize),
Config("Float", "double", "Float32List", 4),
Config("Double", "double", "Float64List", 8),
];

//
// Generator.
Expand All @@ -41,13 +41,11 @@ main(List<String> arguments) {
generate(path, "ffi_patch.g.dart", generatePatchExtension);
}

void generate(Uri path, String fileName,
Function(StringBuffer, String, String) generator) {
void generate(
Uri path, String fileName, Function(StringBuffer, Config) generator) {
final buffer = StringBuffer();
generateHeader(buffer);
nativeToDartType.forEach((String nativeType, String dartType) {
generator(buffer, nativeType, dartType);
});
configuration.forEach((Config c) => generator(buffer, c));
generateFooter(buffer);

final fullPath = path.resolve(fileName).path;
Expand All @@ -73,8 +71,12 @@ void generateHeader(StringBuffer buffer) {
buffer.write(header);
}

void generatePublicExtension(
StringBuffer buffer, String nativeType, String dartType) {
void generatePublicExtension(StringBuffer buffer, Config config) {
final nativeType = config.nativeType;
final dartType = config.dartType;
final typedListType = config.typedListType;
final elementSize = config.elementSize;

final storeTrunctateInt = """
/// Note that ints which do not fit in `$nativeType` are truncated.
""";
Expand All @@ -92,6 +94,19 @@ void generatePublicExtension(

final loadSignExtend = _isInt(nativeType) ? loadSignExtendInt : "";

final asTypedList = typedListType == kDoNotEmit
? ""
: """
/// Creates a typed list view backed by memory in the address space.
///
/// The returned view will allow access to the memory range from `address`
/// to `address + ${elementSize > 1 ? '$elementSize * ' : ''}length`.
///
/// The user has to ensure the memory range is accessible while using the
/// returned list.
external $typedListType asTypedList(int length);
""";

// TODO(dartdoc-bug): Use [] instead of ``, once issue
// https://github.com/dart-lang/dartdoc/issues/2039 is fixed.
buffer.write("""
Expand Down Expand Up @@ -124,13 +139,25 @@ $loadSignExtend ///
$storeTruncate ///
/// Note that `address` needs to be aligned to the size of `$nativeType`.
external void operator []=(int index, $dartType value);
$asTypedList
}
""");
}

void generatePatchExtension(
StringBuffer buffer, String nativeType, String dartType) {
void generatePatchExtension(StringBuffer buffer, Config config) {
final nativeType = config.nativeType;
final dartType = config.dartType;
final typedListType = config.typedListType;

final asTypedList = typedListType == kDoNotEmit
? ""
: """
@patch
$typedListType asTypedList(int elements) => _asExternalTypedData(this, elements);
""";

buffer.write("""
extension ${nativeType}Pointer on Pointer<$nativeType> {
@patch
Expand All @@ -144,6 +171,8 @@ extension ${nativeType}Pointer on Pointer<$nativeType> {
@patch
operator []=(int index, $dartType value) => _store$nativeType(this, index, value);
$asTypedList
}
""");
Expand Down Expand Up @@ -185,3 +214,15 @@ Uri dartfmtPath() {
// pinned fully supports extension methods.
return Uri.parse("dartfmt");
}

class Config {
final String nativeType;
final String dartType;
final String typedListType;
final int elementSize;
const Config(
this.nativeType, this.dartType, this.typedListType, this.elementSize);
}

const String kDoNotEmit = "donotemit";
const int kIntPtrElementSize = -1;
32 changes: 31 additions & 1 deletion sdk/lib/_internal/vm/lib/ffi_patch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
// All imports must be in all FFI patch files to not depend on the order
// the patches are applied.
import "dart:_internal" show patch;
import 'dart:typed_data' show TypedData;
import 'dart:typed_data';

const Map<Type, int> _knownSizes = {
Int8: 1,
Expand Down Expand Up @@ -268,6 +268,9 @@ extension Int8Pointer on Pointer<Int8> {

@patch
operator []=(int index, int value) => _storeInt8(this, index, value);

@patch
Int8List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Int16Pointer on Pointer<Int16> {
Expand All @@ -282,6 +285,9 @@ extension Int16Pointer on Pointer<Int16> {

@patch
operator []=(int index, int value) => _storeInt16(this, index, value);

@patch
Int16List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Int32Pointer on Pointer<Int32> {
Expand All @@ -296,6 +302,9 @@ extension Int32Pointer on Pointer<Int32> {

@patch
operator []=(int index, int value) => _storeInt32(this, index, value);

@patch
Int32List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Int64Pointer on Pointer<Int64> {
Expand All @@ -310,6 +319,9 @@ extension Int64Pointer on Pointer<Int64> {

@patch
operator []=(int index, int value) => _storeInt64(this, index, value);

@patch
Int64List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Uint8Pointer on Pointer<Uint8> {
Expand All @@ -324,6 +336,9 @@ extension Uint8Pointer on Pointer<Uint8> {

@patch
operator []=(int index, int value) => _storeUint8(this, index, value);

@patch
Uint8List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Uint16Pointer on Pointer<Uint16> {
Expand All @@ -338,6 +353,9 @@ extension Uint16Pointer on Pointer<Uint16> {

@patch
operator []=(int index, int value) => _storeUint16(this, index, value);

@patch
Uint16List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Uint32Pointer on Pointer<Uint32> {
Expand All @@ -352,6 +370,9 @@ extension Uint32Pointer on Pointer<Uint32> {

@patch
operator []=(int index, int value) => _storeUint32(this, index, value);

@patch
Uint32List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension Uint64Pointer on Pointer<Uint64> {
Expand All @@ -366,6 +387,9 @@ extension Uint64Pointer on Pointer<Uint64> {

@patch
operator []=(int index, int value) => _storeUint64(this, index, value);

@patch
Uint64List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension IntPtrPointer on Pointer<IntPtr> {
Expand Down Expand Up @@ -394,6 +418,9 @@ extension FloatPointer on Pointer<Float> {

@patch
operator []=(int index, double value) => _storeFloat(this, index, value);

@patch
Float32List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

extension DoublePointer on Pointer<Double> {
Expand All @@ -408,6 +435,9 @@ extension DoublePointer on Pointer<Double> {

@patch
operator []=(int index, double value) => _storeDouble(this, index, value);

@patch
Float64List asTypedList(int elements) => _asExternalTypedData(this, elements);
}

//
Expand Down
Loading

0 comments on commit 91c6dc1

Please sign in to comment.