// Copyright (c) 2019, 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. // 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; @patch int sizeOf() native "Ffi_sizeOf"; Pointer _allocate(int count) native "Ffi_allocate"; Pointer _fromAddress(int ptr) native "Ffi_fromAddress"; // The real implementation of this function (for interface calls) lives in // BuildFfiAsFunctionCall in the Kernel frontend. No calls can actually reach // this function. DS _asFunctionInternal( Pointer> ptr) native "Ffi_asFunctionInternal"; dynamic _asExternalTypedData(Pointer ptr, int count) native "Ffi_asExternalTypedData"; @patch @pragma("vm:entry-point") class Pointer { @patch factory Pointer.allocate({int count: 1}) => _allocate(count); @patch factory Pointer.fromAddress(int ptr) => _fromAddress(ptr); @patch static Pointer> fromFunction( @DartRepresentationOf("T") Function f, Object exceptionalReturn) native "Ffi_fromFunction"; // TODO(sjindel): When NNBD is available, we should change `value` to be // non-null. @patch void store(Object value) native "Ffi_store"; @patch R load() native "Ffi_load"; @patch int get address native "Ffi_address"; // Note this could also be implmented without an extra native as offsetBy // (elementSize()*index). This would be 2 native calls rather than one. What // would be better? @patch Pointer elementAt(int index) native "Ffi_elementAt"; // Note this could also be implmented without an extra native as // fromAddress(address). This would be 2 native calls rather than one. // What would be better? @patch Pointer offsetBy(int offsetInBytes) native "Ffi_offsetBy"; // Note this could also be implemented without an extra native as // fromAddress(address). This would be 2 native calls rather than one. // What would be better? @patch Pointer cast() native "Ffi_cast"; @patch R asFunction() { throw UnsupportedError("Pointer.asFunction cannot be called dynamically."); } @patch void free() native "Ffi_free"; @patch TypedData asExternalTypedData({int count: 1}) => _asExternalTypedData(this, count); } // Returns the ABI used for size and alignment calculations. // See pkg/vm/lib/transformations/ffi.dart. @pragma('vm:prefer-inline') int _abi() native "Recognized method: method is directly interpreted by the bytecode interpreter or IR graph is built in the flow graph builder.";