mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 14:59:41 +00:00
[vm] Class modifiers for NativeFieldWrapper
subtypes
Split off https://dart-review.googlesource.com/c/sdk/+/291761. Landing separately, so that the breaking change itself is a smaller CL. TEST=ci build (see touched _test files) bug: https://github.com/dart-lang/sdk/issues/51896 Change-Id: Ic8d218845ccb6a277689e911b2c34c44639e13cf Cq-Include-Trybots: luci.dart.try:flutter-linux-try,vm-aot-linux-debug-x64c-try,vm-ffi-android-debug-arm-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/292000 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Daco Harkes <dacoharkes@google.com>
This commit is contained in:
parent
452dcdf517
commit
3de5d25429
|
@ -50,14 +50,14 @@ doThings() {
|
|||
await assertErrorsInCode(r'''
|
||||
import 'dart:ffi';
|
||||
|
||||
class NativeFieldWrapperClass1 {}
|
||||
base class NativeFieldWrapperClass1 {}
|
||||
|
||||
class A extends NativeFieldWrapperClass1 {
|
||||
base class A extends NativeFieldWrapperClass1 {
|
||||
@FfiNative<Handle Function(Pointer<Void>)>('foo', isLeaf:true)
|
||||
external Object get foo;
|
||||
}
|
||||
''', [
|
||||
error(FfiCode.LEAF_CALL_MUST_NOT_RETURN_HANDLE, 100, 89),
|
||||
error(FfiCode.LEAF_CALL_MUST_NOT_RETURN_HANDLE, 110, 89),
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,9 +21,9 @@ class FfiNativeTest extends PubPackageResolutionTest {
|
|||
await assertErrorsInCode(r'''
|
||||
import 'dart:ffi';
|
||||
|
||||
class NativeFieldWrapperClass1 {}
|
||||
base class NativeFieldWrapperClass1 {}
|
||||
|
||||
class Paragraph extends NativeFieldWrapperClass1 {
|
||||
base class Paragraph extends NativeFieldWrapperClass1 {
|
||||
@FfiNative<Double Function(Pointer<Void>)>('Paragraph::ideographicBaseline', isLeaf: true)
|
||||
external double get ideographicBaseline;
|
||||
|
||||
|
@ -190,9 +190,9 @@ class NativeTest extends PubPackageResolutionTest {
|
|||
await assertNoErrorsInCode(r'''
|
||||
import 'dart:ffi';
|
||||
|
||||
class NativeFieldWrapperClass1 {}
|
||||
base class NativeFieldWrapperClass1 {}
|
||||
|
||||
class Paragraph extends NativeFieldWrapperClass1 {
|
||||
base class Paragraph extends NativeFieldWrapperClass1 {
|
||||
@Native<Double Function(Pointer<Void>)>(isLeaf: true)
|
||||
external double get ideographicBaseline;
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ import 'dart:typed_data';
|
|||
|
||||
import 'package:expect/expect.dart';
|
||||
|
||||
class ClassWithNativeFields extends NativeFieldWrapperClass1 {
|
||||
base class ClassWithNativeFields extends NativeFieldWrapperClass1 {
|
||||
void m() {}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ class Bar {
|
|||
Foo foo = Foo();
|
||||
}
|
||||
|
||||
class NativeClass extends NativeFieldWrapperClass1 {}
|
||||
base class NativeClass extends NativeFieldWrapperClass1 {}
|
||||
|
||||
class Baz {
|
||||
@pragma('vm:entry-point') // prevent tree-shaking of the field.
|
||||
|
|
|
@ -26,7 +26,7 @@ spawnWorker(worker, data) async {
|
|||
return await completer.future;
|
||||
}
|
||||
|
||||
class NativeWrapperClass extends NativeFieldWrapperClass1 {}
|
||||
base class NativeWrapperClass extends NativeFieldWrapperClass1 {}
|
||||
|
||||
verifyCantSendNative() async {
|
||||
final receivePort = ReceivePort();
|
||||
|
|
|
@ -168,7 +168,7 @@ BENCHMARK(UseDartApi) {
|
|||
const char* kScriptChars = R"(
|
||||
import 'dart:nativewrappers';
|
||||
|
||||
class Class extends NativeFieldWrapperClass1 {
|
||||
base class Class extends NativeFieldWrapperClass1 {
|
||||
@pragma("vm:external-name", "init")
|
||||
external void init();
|
||||
@pragma("vm:external-name", "method")
|
||||
|
|
|
@ -4601,7 +4601,7 @@ void FUNCTION_NAME(ExampleResource_Dispose)(Dart_NativeArguments native_args) {
|
|||
TEST_CASE(DartAPI_WeakPersistentHandleUpdateSize) {
|
||||
const char* kScriptChars = R"(
|
||||
import "dart:nativewrappers";
|
||||
class ExampleResource extends NativeFieldWrapperClass1 {
|
||||
base class ExampleResource extends NativeFieldWrapperClass1 {
|
||||
ExampleResource() { _allocate(); }
|
||||
@pragma("vm:external-name", "ExampleResource_Allocate")
|
||||
external void _allocate();
|
||||
|
@ -4660,7 +4660,7 @@ TEST_CASE(DartAPI_NativeFieldAccess) {
|
|||
const char* kScriptChars = R"(
|
||||
import 'dart:ffi';
|
||||
import 'dart:nativewrappers';
|
||||
class SecretKeeper extends NativeFieldWrapperClass1 {
|
||||
base class SecretKeeper extends NativeFieldWrapperClass1 {
|
||||
SecretKeeper(int secret) { _keepSecret(secret); }
|
||||
@pragma("vm:external-name", "SecretKeeper_KeepSecret")
|
||||
external void _keepSecret(int secret);
|
||||
|
@ -4694,7 +4694,7 @@ TEST_CASE(DartAPI_NativeFieldAccess_Throws) {
|
|||
const char* kScriptChars = R"(
|
||||
import 'dart:ffi';
|
||||
import 'dart:nativewrappers';
|
||||
class ForgetfulSecretKeeper extends NativeFieldWrapperClass1 {
|
||||
base class ForgetfulSecretKeeper extends NativeFieldWrapperClass1 {
|
||||
ForgetfulSecretKeeper(int secret) { /* Forget to init. native field. */ }
|
||||
}
|
||||
// Argument auto-conversion will wrap `o` in `_getNativeField()`.
|
||||
|
@ -5699,7 +5699,8 @@ TEST_CASE(DartAPI_InjectNativeFields3) {
|
|||
auto kScriptChars = Utils::CStringUniquePtr(
|
||||
OS::SCreate(nullptr,
|
||||
"import 'dart:nativewrappers';"
|
||||
"class NativeFields extends NativeFieldWrapperClass2 {\n"
|
||||
"final class NativeFields "
|
||||
"extends NativeFieldWrapperClass2 {\n"
|
||||
" NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
|
||||
" int fld1;\n"
|
||||
" final int fld2;\n"
|
||||
|
@ -5843,7 +5844,7 @@ TEST_CASE(DartAPI_TestNativeFieldsAccess) {
|
|||
OS::SCreate(
|
||||
nullptr, R"(
|
||||
import 'dart:nativewrappers';
|
||||
class NativeFields extends NativeFieldWrapperClass2 {
|
||||
base class NativeFields extends NativeFieldWrapperClass2 {
|
||||
NativeFields(int i, int j) : fld1 = i, fld2 = j {}
|
||||
int fld1;
|
||||
final int fld2;
|
||||
|
@ -5883,11 +5884,11 @@ TEST_CASE(DartAPI_TestNativeFieldsAccess) {
|
|||
TEST_CASE(DartAPI_InjectNativeFieldsSuperClass) {
|
||||
const char* kScriptChars =
|
||||
"import 'dart:nativewrappers';"
|
||||
"class NativeFieldsSuper extends NativeFieldWrapperClass1 {\n"
|
||||
"base class NativeFieldsSuper extends NativeFieldWrapperClass1 {\n"
|
||||
" NativeFieldsSuper() : fld1 = 42 {}\n"
|
||||
" int fld1;\n"
|
||||
"}\n"
|
||||
"class NativeFields extends NativeFieldsSuper {\n"
|
||||
"base class NativeFields extends NativeFieldsSuper {\n"
|
||||
" fld() => fld1;\n"
|
||||
"}\n"
|
||||
"int testMain() {\n"
|
||||
|
@ -5990,7 +5991,8 @@ TEST_CASE(DartAPI_ImplicitNativeFieldAccess) {
|
|||
auto kScriptChars = Utils::CStringUniquePtr(
|
||||
OS::SCreate(nullptr,
|
||||
"import 'dart:nativewrappers';"
|
||||
"class NativeFields extends NativeFieldWrapperClass4 {\n"
|
||||
"final class NativeFields extends "
|
||||
"NativeFieldWrapperClass4 {\n"
|
||||
" NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
|
||||
" int%s fld0;\n"
|
||||
" int fld1;\n"
|
||||
|
@ -7424,7 +7426,7 @@ static Dart_NativeFunction native_args_lookup(Dart_Handle name,
|
|||
TEST_CASE(DartAPI_GetNativeArguments) {
|
||||
const char* kScriptChars = R"(
|
||||
import 'dart:nativewrappers';
|
||||
class MyObject extends NativeFieldWrapperClass2 {
|
||||
base class MyObject extends NativeFieldWrapperClass2 {
|
||||
@pragma("vm:external-name", "NativeArgument_Create")
|
||||
external static MyObject createObject();
|
||||
@pragma("vm:external-name", "NativeArgument_Access")
|
||||
|
|
|
@ -49,7 +49,7 @@ class _AsyncDirectoryListerOps {
|
|||
new _AsyncDirectoryListerOpsImpl(pointer);
|
||||
}
|
||||
|
||||
class _AsyncDirectoryListerOpsImpl extends NativeFieldWrapperClass1
|
||||
base class _AsyncDirectoryListerOpsImpl extends NativeFieldWrapperClass1
|
||||
implements _AsyncDirectoryListerOps {
|
||||
_AsyncDirectoryListerOpsImpl._();
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ class _RandomAccessFileOps {
|
|||
}
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
class _RandomAccessFileOpsImpl extends NativeFieldWrapperClass1
|
||||
base class _RandomAccessFileOpsImpl extends NativeFieldWrapperClass1
|
||||
implements _RandomAccessFileOps {
|
||||
_RandomAccessFileOpsImpl._();
|
||||
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
|
||||
part of "common_patch.dart";
|
||||
|
||||
class _FilterImpl extends NativeFieldWrapperClass1 implements RawZLibFilter {
|
||||
base class _FilterImpl extends NativeFieldWrapperClass1
|
||||
implements RawZLibFilter {
|
||||
@pragma("vm:external-name", "Filter_Process")
|
||||
external void process(List<int> data, int start, int end);
|
||||
|
||||
|
@ -12,7 +13,7 @@ class _FilterImpl extends NativeFieldWrapperClass1 implements RawZLibFilter {
|
|||
external List<int>? processed({bool flush = true, bool end = false});
|
||||
}
|
||||
|
||||
class _ZLibInflateFilter extends _FilterImpl {
|
||||
base class _ZLibInflateFilter extends _FilterImpl {
|
||||
_ZLibInflateFilter(int windowBits, List<int>? dictionary, bool raw) {
|
||||
_init(windowBits, dictionary, raw);
|
||||
}
|
||||
|
@ -20,7 +21,7 @@ class _ZLibInflateFilter extends _FilterImpl {
|
|||
external void _init(int windowBits, List<int>? dictionary, bool raw);
|
||||
}
|
||||
|
||||
class _ZLibDeflateFilter extends _FilterImpl {
|
||||
base class _ZLibDeflateFilter extends _FilterImpl {
|
||||
_ZLibDeflateFilter(bool gzip, int level, int windowBits, int memLevel,
|
||||
int strategy, List<int>? dictionary, bool raw) {
|
||||
_init(gzip, level, windowBits, memLevel, strategy, dictionary, raw);
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
part of 'common_patch.dart';
|
||||
|
||||
@pragma("vm:entry-point")
|
||||
class _NamespaceImpl extends NativeFieldWrapperClass1 implements _Namespace {
|
||||
base class _NamespaceImpl extends NativeFieldWrapperClass1
|
||||
implements _Namespace {
|
||||
_NamespaceImpl._();
|
||||
|
||||
@pragma("vm:external-name", "Namespace_Create")
|
||||
|
|
|
@ -213,9 +213,9 @@ class _ProcessStartStatus {
|
|||
|
||||
// The NativeFieldWrapperClass1 can not be used with a mixin, due to missing
|
||||
// implicit constructor.
|
||||
class _ProcessImplNativeWrapper extends NativeFieldWrapperClass1 {}
|
||||
base class _ProcessImplNativeWrapper extends NativeFieldWrapperClass1 {}
|
||||
|
||||
class _ProcessImpl extends _ProcessImplNativeWrapper implements _Process {
|
||||
base class _ProcessImpl extends _ProcessImplNativeWrapper implements _Process {
|
||||
static bool connectedResourceHandler = false;
|
||||
|
||||
_ProcessImpl(
|
||||
|
|
|
@ -60,7 +60,7 @@ class _SecureSocket extends _Socket implements SecureSocket {
|
|||
* native code can access the same data.
|
||||
*/
|
||||
@pragma("vm:entry-point")
|
||||
class _SecureFilterImpl extends NativeFieldWrapperClass1
|
||||
base class _SecureFilterImpl extends NativeFieldWrapperClass1
|
||||
implements _SecureFilter {
|
||||
// Performance is improved if a full buffer of plaintext fits
|
||||
// in the encrypted buffer, when encrypted.
|
||||
|
@ -208,7 +208,7 @@ class SecurityContext {
|
|||
static bool get alpnSupported => true;
|
||||
}
|
||||
|
||||
class _SecurityContext extends NativeFieldWrapperClass1
|
||||
base class _SecurityContext extends NativeFieldWrapperClass1
|
||||
implements SecurityContext {
|
||||
bool _allowLegacyUnsafeRenegotiation = false;
|
||||
|
||||
|
@ -284,7 +284,7 @@ class _SecurityContext extends NativeFieldWrapperClass1
|
|||
* _X509CertificateImpl wraps an X509 certificate object held by the BoringSSL
|
||||
* library. It exposes the fields of the certificate object.
|
||||
*/
|
||||
class _X509CertificateImpl extends NativeFieldWrapperClass1
|
||||
base class _X509CertificateImpl extends NativeFieldWrapperClass1
|
||||
implements X509Certificate {
|
||||
// The native field must be set manually on a new object, in native code.
|
||||
// This is done by WrappedX509Certificate in security_context.cc.
|
||||
|
|
|
@ -370,14 +370,15 @@ class _NetworkInterface implements NetworkInterface {
|
|||
|
||||
// The NativeFieldWrapperClass1 cannot be used with a mixin, due to missing
|
||||
// implicit constructor.
|
||||
class _NativeSocketNativeWrapper extends NativeFieldWrapperClass1 {}
|
||||
base class _NativeSocketNativeWrapper extends NativeFieldWrapperClass1 {}
|
||||
|
||||
/// Returns error code that corresponds to EINPROGRESS OS error.
|
||||
@pragma("vm:external-name", "OSError_inProgressErrorCode")
|
||||
external int get _inProgressErrorCode;
|
||||
|
||||
// The _NativeSocket class encapsulates an OS socket.
|
||||
class _NativeSocket extends _NativeSocketNativeWrapper with _ServiceObject {
|
||||
base class _NativeSocket extends _NativeSocketNativeWrapper
|
||||
with _ServiceObject {
|
||||
// Bit flags used when communicating between the eventhandler and
|
||||
// dart code. The EVENT flags are used to indicate events of
|
||||
// interest when sending a message from dart code to the
|
||||
|
|
|
@ -45,10 +45,12 @@ class _RawSynchronousSocket implements RawSynchronousSocket {
|
|||
|
||||
// The NativeFieldWrapperClass1 can not be used with a mixin, due to missing
|
||||
// implicit constructor.
|
||||
class _NativeSynchronousSocketNativeWrapper extends NativeFieldWrapperClass1 {}
|
||||
base class _NativeSynchronousSocketNativeWrapper
|
||||
extends NativeFieldWrapperClass1 {}
|
||||
|
||||
// The _NativeSynchronousSocket class encapsulates a synchronous OS socket.
|
||||
class _NativeSynchronousSocket extends _NativeSynchronousSocketNativeWrapper {
|
||||
base class _NativeSynchronousSocket
|
||||
extends _NativeSynchronousSocketNativeWrapper {
|
||||
// Socket close state.
|
||||
bool isClosed = false;
|
||||
bool isClosedRead = false;
|
||||
|
|
|
@ -16,7 +16,7 @@ class Classy {
|
|||
external void goodHasReceiverHandle(int v);
|
||||
}
|
||||
|
||||
class NativeClassy extends NativeFieldWrapperClass1 {
|
||||
base class NativeClassy extends NativeFieldWrapperClass1 {
|
||||
@FfiNative<IntPtr Function(IntPtr)>('ReturnIntPtr')
|
||||
external static int returnIntPtrStatic(int x);
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ class Classy {
|
|||
|
||||
// For automatic transform of NativeFieldWrapperClass1 to Pointer.
|
||||
|
||||
class ClassWithNativeField extends NativeFieldWrapperClass1 {
|
||||
base class ClassWithNativeField extends NativeFieldWrapperClass1 {
|
||||
ClassWithNativeField(int value) {
|
||||
setNativeInstanceField(this, 0, value);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ int setState(int value) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
class StateSetter extends NativeFieldWrapperClass1 {
|
||||
base class StateSetter extends NativeFieldWrapperClass1 {
|
||||
StateSetter(int value) {
|
||||
setNativeInstanceField(this, 0, 0);
|
||||
state = value;
|
||||
|
|
|
@ -33,7 +33,7 @@ class Classy {
|
|||
external void badHasReceiverPointer(int v); //# 04: compile-time error
|
||||
}
|
||||
|
||||
class NativeClassy extends NativeFieldWrapperClass1 {
|
||||
base class NativeClassy extends NativeFieldWrapperClass1 {
|
||||
// Error: Missing receiver in FfiNative annotation.
|
||||
@FfiNative<Void Function(IntPtr)>('doesntmatter') //# 05: compile-time error
|
||||
external void badMissingReceiver(int v); //# 05: compile-time error
|
||||
|
|
|
@ -13,7 +13,7 @@ echo(msg) {
|
|||
reply.send('echoing ${data(1)}}');
|
||||
}
|
||||
|
||||
class Test extends NativeFieldWrapperClass2 {
|
||||
base class Test extends NativeFieldWrapperClass2 {
|
||||
Test(this.i, this.j);
|
||||
int i, j;
|
||||
}
|
||||
|
|
|
@ -93,7 +93,7 @@ external int incrementSize(int a);
|
|||
@Native<WChar Function(WChar)>()
|
||||
external int incrementWchar(int a);
|
||||
|
||||
final class MyStruct extends Struct implements NativeFieldWrapperClass1 {
|
||||
final class MyStruct extends Struct {
|
||||
@Double()
|
||||
external double x;
|
||||
|
||||
|
|
Loading…
Reference in a new issue