mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
Revert "Reland "[vm/ffi] Disallow Pointer
s and structs in finalizers and expandos""
This reverts commit 3f0ad61daa
.
Reason for revert: Conflicts with https://dart-review.googlesource.com/c/sdk/+/194765
Original change's description:
> Reland "[vm/ffi] Disallow `Pointer`s and structs in finalizers and expandos"
>
> `Dart_NewWeakPersistentHandle` and `Dart_NewFinalizableHandle` in
> `dart_api.h` do no longer accept `Pointer`s and subtypes of `Struct`s
> as values passed in to the `object` parameter.
>
> Expandos no longer accept `Pointer`s and subtypes of `Struct`s
> as values passed in to the `object` parameter.
>
> Cleans up unused object_store->ffi_struct_class.
>
> Closes: https://github.com/dart-lang/sdk/issues/45071
> Breaking change: https://github.com/dart-lang/sdk/issues/45072
>
> TEST=vm/cc/DartAPI_FinalizableHandleErrors
> TEST=vm/cc/DartAPI_WeakPersistentHandleErrors
> TEST=tests/ffi(_2)/expando_test.dart
>
> Change-Id: I9af6d0173db60614091068c218391f73756c135f
> Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195061
> Reviewed-by: Martin Kustermann <kustermann@google.com>
> Commit-Queue: Daco Harkes <dacoharkes@google.com>
TBR=kustermann@google.com,dacoharkes@google.com
Change-Id: I90064b6b73155a43f37388f987c6b29f72ce9770
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/195076
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
This commit is contained in:
parent
f9536375e1
commit
c33dad37e5
|
@ -8,15 +8,6 @@
|
||||||
daylight saving changes that are not precisely one hour.
|
daylight saving changes that are not precisely one hour.
|
||||||
(No change on the Web which uses the JavaScript `Date` object.)
|
(No change on the Web which uses the JavaScript `Date` object.)
|
||||||
|
|
||||||
### Dart VM
|
|
||||||
|
|
||||||
* **Breaking Change** [#45071][]: `Dart_NewWeakPersistentHandle`'s and
|
|
||||||
`Dart_NewFinalizableHandle`'s `object` parameter no longer accepts
|
|
||||||
`Pointer`s and subtypes of `Struct`. Expandos no longer accept
|
|
||||||
`Pointer`s and subtypes of `Struct`s.
|
|
||||||
|
|
||||||
[#45071]: https://github.com/dart-lang/sdk/issues/45071
|
|
||||||
|
|
||||||
## 2.13.0
|
## 2.13.0
|
||||||
|
|
||||||
### Language
|
### Language
|
||||||
|
|
|
@ -834,9 +834,7 @@ class _FfiUseSiteTransformer extends FfiTransformer {
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nativeTypesClasses.contains(klass) &&
|
if (!nativeTypesClasses.contains(klass) && klass != arrayClass) {
|
||||||
klass != arrayClass &&
|
|
||||||
klass != arraySizeClass) {
|
|
||||||
for (final parent in nativeTypesClasses) {
|
for (final parent in nativeTypesClasses) {
|
||||||
if (hierarchy.isSubtypeOf(klass, parent)) {
|
if (hierarchy.isSubtypeOf(klass, parent)) {
|
||||||
return parent;
|
return parent;
|
||||||
|
|
|
@ -475,7 +475,7 @@ DART_EXPORT void Dart_DeletePersistentHandle(Dart_PersistentHandle object);
|
||||||
*
|
*
|
||||||
* Requires there to be a current isolate.
|
* Requires there to be a current isolate.
|
||||||
*
|
*
|
||||||
* \param object An object with identity.
|
* \param object An object.
|
||||||
* \param peer A pointer to a native object or NULL. This value is
|
* \param peer A pointer to a native object or NULL. This value is
|
||||||
* provided to callback when it is invoked.
|
* provided to callback when it is invoked.
|
||||||
* \param external_allocation_size The number of externally allocated
|
* \param external_allocation_size The number of externally allocated
|
||||||
|
@ -531,7 +531,7 @@ DART_EXPORT void Dart_UpdateExternalSize(Dart_WeakPersistentHandle object,
|
||||||
*
|
*
|
||||||
* Requires there to be a current isolate.
|
* Requires there to be a current isolate.
|
||||||
*
|
*
|
||||||
* \param object An object with identity.
|
* \param object An object.
|
||||||
* \param peer A pointer to a native object or NULL. This value is
|
* \param peer A pointer to a native object or NULL. This value is
|
||||||
* provided to callback when it is invoked.
|
* provided to callback when it is invoked.
|
||||||
* \param external_allocation_size The number of externally allocated
|
* \param external_allocation_size The number of externally allocated
|
||||||
|
|
|
@ -991,23 +991,6 @@ DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
|
||||||
obj1_ref->set_ptr(obj2_ref);
|
obj1_ref->set_ptr(obj2_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(https://dartbug.com/38491): Reject Unions here as well.
|
|
||||||
static bool IsFfiStruct(Thread* T, const Object& obj) {
|
|
||||||
if (obj.IsNull()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CFE guarantees we can only have direct subclasses of `Struct`
|
|
||||||
// (no implementations or indirect subclasses are allowed).
|
|
||||||
const auto& klass = Class::Handle(Z, obj.clazz());
|
|
||||||
const auto& super_klass = Class::Handle(Z, klass.SuperClass());
|
|
||||||
if (super_klass.Name() != Symbols::Struct().ptr()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const auto& library = Library::Handle(Z, super_klass.library());
|
|
||||||
return library.url() == Symbols::DartFfi().ptr();
|
|
||||||
}
|
|
||||||
|
|
||||||
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
||||||
Thread* thread,
|
Thread* thread,
|
||||||
const Object& ref,
|
const Object& ref,
|
||||||
|
@ -1017,13 +1000,6 @@ static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
||||||
if (!ref.ptr()->IsHeapObject()) {
|
if (!ref.ptr()->IsHeapObject()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ref.IsPointer()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (IsFfiStruct(thread, ref)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FinalizablePersistentHandle* finalizable_ref =
|
FinalizablePersistentHandle* finalizable_ref =
|
||||||
FinalizablePersistentHandle::New(thread->isolate_group(), ref, peer,
|
FinalizablePersistentHandle::New(thread->isolate_group(), ref, peer,
|
||||||
callback, external_allocation_size,
|
callback, external_allocation_size,
|
||||||
|
@ -1032,14 +1008,16 @@ static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
||||||
}
|
}
|
||||||
|
|
||||||
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
|
||||||
Thread* T,
|
Thread* thread,
|
||||||
Dart_Handle object,
|
Dart_Handle object,
|
||||||
void* peer,
|
void* peer,
|
||||||
intptr_t external_allocation_size,
|
intptr_t external_allocation_size,
|
||||||
Dart_HandleFinalizer callback) {
|
Dart_HandleFinalizer callback) {
|
||||||
const auto& ref = Object::Handle(Z, Api::UnwrapHandle(object));
|
REUSABLE_OBJECT_HANDLESCOPE(thread);
|
||||||
return AllocateWeakPersistentHandle(T, ref, peer, external_allocation_size,
|
Object& ref = thread->ObjectHandle();
|
||||||
callback);
|
ref = Api::UnwrapHandle(object);
|
||||||
|
return AllocateWeakPersistentHandle(thread, ref, peer,
|
||||||
|
external_allocation_size, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Dart_FinalizableHandle AllocateFinalizableHandle(
|
static Dart_FinalizableHandle AllocateFinalizableHandle(
|
||||||
|
@ -1051,12 +1029,6 @@ static Dart_FinalizableHandle AllocateFinalizableHandle(
|
||||||
if (!ref.ptr()->IsHeapObject()) {
|
if (!ref.ptr()->IsHeapObject()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (ref.IsPointer()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (IsFfiStruct(thread, ref)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FinalizablePersistentHandle* finalizable_ref =
|
FinalizablePersistentHandle* finalizable_ref =
|
||||||
FinalizablePersistentHandle::New(thread->isolate_group(), ref, peer,
|
FinalizablePersistentHandle::New(thread->isolate_group(), ref, peer,
|
||||||
|
@ -1066,13 +1038,15 @@ static Dart_FinalizableHandle AllocateFinalizableHandle(
|
||||||
}
|
}
|
||||||
|
|
||||||
static Dart_FinalizableHandle AllocateFinalizableHandle(
|
static Dart_FinalizableHandle AllocateFinalizableHandle(
|
||||||
Thread* T,
|
Thread* thread,
|
||||||
Dart_Handle object,
|
Dart_Handle object,
|
||||||
void* peer,
|
void* peer,
|
||||||
intptr_t external_allocation_size,
|
intptr_t external_allocation_size,
|
||||||
Dart_HandleFinalizer callback) {
|
Dart_HandleFinalizer callback) {
|
||||||
const auto& ref = Object::Handle(Z, Api::UnwrapHandle(object));
|
REUSABLE_OBJECT_HANDLESCOPE(thread);
|
||||||
return AllocateFinalizableHandle(T, ref, peer, external_allocation_size,
|
Object& ref = thread->ObjectHandle();
|
||||||
|
ref = Api::UnwrapHandle(object);
|
||||||
|
return AllocateFinalizableHandle(thread, ref, peer, external_allocation_size,
|
||||||
callback);
|
callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,13 +1055,15 @@ Dart_NewWeakPersistentHandle(Dart_Handle object,
|
||||||
void* peer,
|
void* peer,
|
||||||
intptr_t external_allocation_size,
|
intptr_t external_allocation_size,
|
||||||
Dart_HandleFinalizer callback) {
|
Dart_HandleFinalizer callback) {
|
||||||
DARTSCOPE(Thread::Current());
|
Thread* thread = Thread::Current();
|
||||||
|
CHECK_ISOLATE(thread->isolate());
|
||||||
if (callback == NULL) {
|
if (callback == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
TransitionNativeToVM transition(thread);
|
||||||
|
|
||||||
return AllocateWeakPersistentHandle(T, object, peer, external_allocation_size,
|
return AllocateWeakPersistentHandle(thread, object, peer,
|
||||||
callback);
|
external_allocation_size, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
DART_EXPORT Dart_FinalizableHandle
|
DART_EXPORT Dart_FinalizableHandle
|
||||||
|
@ -1095,13 +1071,14 @@ Dart_NewFinalizableHandle(Dart_Handle object,
|
||||||
void* peer,
|
void* peer,
|
||||||
intptr_t external_allocation_size,
|
intptr_t external_allocation_size,
|
||||||
Dart_HandleFinalizer callback) {
|
Dart_HandleFinalizer callback) {
|
||||||
DARTSCOPE(Thread::Current());
|
Thread* thread = Thread::Current();
|
||||||
|
CHECK_ISOLATE(thread->isolate());
|
||||||
if (callback == nullptr) {
|
if (callback == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
TransitionNativeToVM transition(thread);
|
||||||
return AllocateFinalizableHandle(T, object, peer, external_allocation_size,
|
return AllocateFinalizableHandle(thread, object, peer,
|
||||||
callback);
|
external_allocation_size, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
DART_EXPORT void Dart_UpdateExternalSize(Dart_WeakPersistentHandle object,
|
DART_EXPORT void Dart_UpdateExternalSize(Dart_WeakPersistentHandle object,
|
||||||
|
|
|
@ -3368,35 +3368,6 @@ TEST_CASE(DartAPI_WeakPersistentHandleErrors) {
|
||||||
Dart_NewWeakPersistentHandle(obj2, NULL, 0, NopCallback);
|
Dart_NewWeakPersistentHandle(obj2, NULL, 0, NopCallback);
|
||||||
EXPECT_EQ(ref2, static_cast<void*>(NULL));
|
EXPECT_EQ(ref2, static_cast<void*>(NULL));
|
||||||
|
|
||||||
// Pointer object.
|
|
||||||
Dart_Handle ffi_lib = Dart_LookupLibrary(NewString("dart:ffi"));
|
|
||||||
Dart_Handle pointer_type =
|
|
||||||
Dart_GetNonNullableType(ffi_lib, NewString("Pointer"), 0, NULL);
|
|
||||||
Dart_Handle obj3 = Dart_Allocate(pointer_type);
|
|
||||||
EXPECT_VALID(obj3);
|
|
||||||
Dart_WeakPersistentHandle ref3 =
|
|
||||||
Dart_NewWeakPersistentHandle(obj3, nullptr, 0, FinalizableHandleCallback);
|
|
||||||
EXPECT_EQ(ref3, static_cast<void*>(nullptr));
|
|
||||||
|
|
||||||
// Subtype of Struct object.
|
|
||||||
const char* kScriptChars = R"(
|
|
||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
class MyStruct extends Struct {
|
|
||||||
external Pointer notEmpty;
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
|
||||||
Dart_Handle my_struct_type =
|
|
||||||
Dart_GetNonNullableType(lib, NewString("MyStruct"), 0, NULL);
|
|
||||||
Dart_Handle obj4 = Dart_Allocate(my_struct_type);
|
|
||||||
EXPECT_VALID(obj4);
|
|
||||||
Dart_WeakPersistentHandle ref4 =
|
|
||||||
Dart_NewWeakPersistentHandle(obj4, nullptr, 0, FinalizableHandleCallback);
|
|
||||||
EXPECT_EQ(ref4, static_cast<void*>(nullptr));
|
|
||||||
|
|
||||||
// TODO(https://dartbug.com/38491): Reject Unions here as well.
|
|
||||||
|
|
||||||
Dart_ExitScope();
|
Dart_ExitScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3417,33 +3388,6 @@ TEST_CASE(DartAPI_FinalizableHandleErrors) {
|
||||||
Dart_NewFinalizableHandle(obj2, nullptr, 0, FinalizableHandleCallback);
|
Dart_NewFinalizableHandle(obj2, nullptr, 0, FinalizableHandleCallback);
|
||||||
EXPECT_EQ(ref2, static_cast<void*>(nullptr));
|
EXPECT_EQ(ref2, static_cast<void*>(nullptr));
|
||||||
|
|
||||||
// Pointer object.
|
|
||||||
Dart_Handle ffi_lib = Dart_LookupLibrary(NewString("dart:ffi"));
|
|
||||||
Dart_Handle pointer_type =
|
|
||||||
Dart_GetNonNullableType(ffi_lib, NewString("Pointer"), 0, NULL);
|
|
||||||
Dart_Handle obj3 = Dart_Allocate(pointer_type);
|
|
||||||
EXPECT_VALID(obj3);
|
|
||||||
Dart_FinalizableHandle ref3 =
|
|
||||||
Dart_NewFinalizableHandle(obj3, nullptr, 0, FinalizableHandleCallback);
|
|
||||||
EXPECT_EQ(ref3, static_cast<void*>(nullptr));
|
|
||||||
|
|
||||||
// Subtype of Struct object.
|
|
||||||
const char* kScriptChars = R"(
|
|
||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
class MyStruct extends Struct {
|
|
||||||
external Pointer notEmpty;
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
|
||||||
Dart_Handle my_struct_type =
|
|
||||||
Dart_GetNonNullableType(lib, NewString("MyStruct"), 0, NULL);
|
|
||||||
Dart_Handle obj4 = Dart_Allocate(my_struct_type);
|
|
||||||
EXPECT_VALID(obj4);
|
|
||||||
Dart_FinalizableHandle ref4 =
|
|
||||||
Dart_NewFinalizableHandle(obj4, nullptr, 0, FinalizableHandleCallback);
|
|
||||||
EXPECT_EQ(ref4, static_cast<void*>(nullptr));
|
|
||||||
|
|
||||||
Dart_ExitScope();
|
Dart_ExitScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1367,8 +1367,7 @@ void KernelLoader::LoadLibraryImportsAndExports(Library* library,
|
||||||
"runtime");
|
"runtime");
|
||||||
}
|
}
|
||||||
if (!Api::IsFfiEnabled() &&
|
if (!Api::IsFfiEnabled() &&
|
||||||
target_library.url() == Symbols::DartFfi().ptr() &&
|
target_library.url() == Symbols::DartFfi().ptr()) {
|
||||||
library->url() != Symbols::DartCore().ptr()) {
|
|
||||||
H.ReportError(
|
H.ReportError(
|
||||||
"import of dart:ffi is not supported in the current Dart runtime");
|
"import of dart:ffi is not supported in the current Dart runtime");
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,6 +236,7 @@ class ObjectPointerVisitor;
|
||||||
RW(GrowableObjectArray, ffi_callback_functions) \
|
RW(GrowableObjectArray, ffi_callback_functions) \
|
||||||
RW(Class, ffi_pointer_class) \
|
RW(Class, ffi_pointer_class) \
|
||||||
RW(Class, ffi_native_type_class) \
|
RW(Class, ffi_native_type_class) \
|
||||||
|
RW(Class, ffi_struct_class) \
|
||||||
RW(Object, ffi_as_function_internal) \
|
RW(Object, ffi_as_function_internal) \
|
||||||
// Please remember the last entry must be referred in the 'to' function below.
|
// Please remember the last entry must be referred in the 'to' function below.
|
||||||
|
|
||||||
|
|
|
@ -49,8 +49,6 @@ import "dart:collection"
|
||||||
|
|
||||||
import "dart:convert" show ascii, Encoding, json, latin1, utf8;
|
import "dart:convert" show ascii, Encoding, json, latin1, utf8;
|
||||||
|
|
||||||
import "dart:ffi" show Pointer, Struct;
|
|
||||||
|
|
||||||
import "dart:isolate" show Isolate;
|
import "dart:isolate" show Isolate;
|
||||||
|
|
||||||
import "dart:math" show Random;
|
import "dart:math" show Random;
|
||||||
|
|
|
@ -140,12 +140,9 @@ class Expando<T> {
|
||||||
if ((object == null) ||
|
if ((object == null) ||
|
||||||
(object is bool) ||
|
(object is bool) ||
|
||||||
(object is num) ||
|
(object is num) ||
|
||||||
(object is String) ||
|
(object is String)) {
|
||||||
(object is Pointer) ||
|
|
||||||
(object is Struct)) {
|
|
||||||
// TODO(https://dartbug.com/38491): Reject Unions here as well.
|
|
||||||
throw new ArgumentError.value(object,
|
throw new ArgumentError.value(object,
|
||||||
"Expandos are not allowed on strings, numbers, booleans, null, Pointers or Structs.");
|
"Expandos are not allowed on strings, numbers, booleans or null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,7 @@ part of dart.core;
|
||||||
|
|
||||||
/// An [Expando] allows adding new properties to objects.
|
/// An [Expando] allows adding new properties to objects.
|
||||||
///
|
///
|
||||||
/// Does not work on numbers, strings, booleans, `null`, `dart:ffi` pointers
|
/// Does not work on numbers, strings, booleans or `null`.
|
||||||
/// or `dart:ffi` structs.
|
|
||||||
///
|
///
|
||||||
/// An `Expando` does not hold on to the added property value after an object
|
/// An `Expando` does not hold on to the added property value after an object
|
||||||
/// becomes inaccessible.
|
/// becomes inaccessible.
|
||||||
|
@ -39,15 +38,13 @@ class Expando<T extends Object> {
|
||||||
/// object. If the object hasn't been expanded, the method returns
|
/// object. If the object hasn't been expanded, the method returns
|
||||||
/// `null`.
|
/// `null`.
|
||||||
///
|
///
|
||||||
/// The object must not be a number, a string, a boolean, `null`, a
|
/// The object must not be a number, a string or a boolean.
|
||||||
/// `dart:ffi` pointer, or a `dart:ffi` struct.
|
|
||||||
external T? operator [](Object object);
|
external T? operator [](Object object);
|
||||||
|
|
||||||
/// Sets the value of this [Expando]'s property on the given
|
/// Sets the value of this [Expando]'s property on the given
|
||||||
/// object. Properties can effectively be removed again by setting
|
/// object. Properties can effectively be removed again by setting
|
||||||
/// their value to `null`.
|
/// their value to `null`.
|
||||||
///
|
///
|
||||||
/// The object must not be a number, a string, a boolean, `null`, a
|
/// The object must not be a number, a string or a boolean.
|
||||||
/// `dart:ffi` pointer, or a `dart:ffi` struct.
|
|
||||||
external void operator []=(Object object, T? value);
|
external void operator []=(Object object, T? value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
// 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.
|
// BSD-style license that can be found in the LICENSE file.
|
||||||
//
|
|
||||||
// VMOptions=--enable-ffi=true
|
|
||||||
// VMOptions=--enable-ffi=false
|
|
||||||
|
|
||||||
import "package:expect/expect.dart";
|
import "package:expect/expect.dart";
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
// 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.
|
// BSD-style license that can be found in the LICENSE file.
|
||||||
//
|
|
||||||
// VMOptions=--enable-ffi=true
|
|
||||||
// VMOptions=--enable-ffi=false
|
|
||||||
|
|
||||||
import "package:expect/expect.dart";
|
import "package:expect/expect.dart";
|
||||||
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
// Copyright (c) 2021, 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.
|
|
||||||
//
|
|
||||||
// Dart test program for testing dart:ffi primitive data pointers.
|
|
||||||
//
|
|
||||||
// SharedObjects=ffi_test_functions
|
|
||||||
|
|
||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
import "package:expect/expect.dart";
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
testPointer();
|
|
||||||
testStruct();
|
|
||||||
}
|
|
||||||
|
|
||||||
Expando<int> expando = Expando('myExpando');
|
|
||||||
|
|
||||||
void testPointer() {
|
|
||||||
final pointer = Pointer<Int8>.fromAddress(0xdeadbeef);
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[pointer];
|
|
||||||
});
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[pointer] = 1234;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyStruct extends Struct {
|
|
||||||
external Pointer notEmpty;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testStruct() {
|
|
||||||
final pointer = Pointer<MyStruct>.fromAddress(0xdeadbeef);
|
|
||||||
final struct = pointer.ref;
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[struct];
|
|
||||||
});
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[struct] = 1234;
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
// Copyright (c) 2021, 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.
|
|
||||||
//
|
|
||||||
// Dart test program for testing dart:ffi primitive data pointers.
|
|
||||||
//
|
|
||||||
// SharedObjects=ffi_test_functions
|
|
||||||
|
|
||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
import "package:expect/expect.dart";
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
testPointer();
|
|
||||||
testStruct();
|
|
||||||
}
|
|
||||||
|
|
||||||
Expando<int> expando = Expando('myExpando');
|
|
||||||
|
|
||||||
void testPointer() {
|
|
||||||
final pointer = Pointer<Int8>.fromAddress(0xdeadbeef);
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[pointer];
|
|
||||||
});
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[pointer] = 1234;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyStruct extends Struct {
|
|
||||||
Pointer notEmpty;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testStruct() {
|
|
||||||
final pointer = Pointer<MyStruct>.fromAddress(0xdeadbeef);
|
|
||||||
final struct = pointer.ref;
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[struct];
|
|
||||||
});
|
|
||||||
Expect.throws(() {
|
|
||||||
expando[struct] = 1234;
|
|
||||||
});
|
|
||||||
}
|
|
Loading…
Reference in a new issue