@@ -991,23 +991,6 @@ DART_EXPORT void Dart_SetPersistentHandle(Dart_PersistentHandle obj1,
991
991
obj1_ref->set_ptr (obj2_ref);
992
992
}
993
993
994
- // TODO(https://dartbug.com/38491): Reject Unions here as well.
995
- static bool IsFfiStruct (Thread* T, const Object& obj) {
996
- if (obj.IsNull ()) {
997
- return false ;
998
- }
999
-
1000
- // CFE guarantees we can only have direct subclasses of `Struct`
1001
- // (no implementations or indirect subclasses are allowed).
1002
- const auto & klass = Class::Handle (Z, obj.clazz ());
1003
- const auto & super_klass = Class::Handle (Z, klass.SuperClass ());
1004
- if (super_klass.Name () != Symbols::Struct ().ptr ()) {
1005
- return false ;
1006
- }
1007
- const auto & library = Library::Handle (Z, super_klass.library ());
1008
- return library.url () == Symbols::DartFfi ().ptr ();
1009
- }
1010
-
1011
994
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle (
1012
995
Thread* thread,
1013
996
const Object& ref,
@@ -1017,13 +1000,6 @@ static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
1017
1000
if (!ref.ptr ()->IsHeapObject ()) {
1018
1001
return NULL ;
1019
1002
}
1020
- if (ref.IsPointer ()) {
1021
- return NULL ;
1022
- }
1023
- if (IsFfiStruct (thread, ref)) {
1024
- return NULL ;
1025
- }
1026
-
1027
1003
FinalizablePersistentHandle* finalizable_ref =
1028
1004
FinalizablePersistentHandle::New (thread->isolate_group (), ref, peer,
1029
1005
callback, external_allocation_size,
@@ -1032,14 +1008,16 @@ static Dart_WeakPersistentHandle AllocateWeakPersistentHandle(
1032
1008
}
1033
1009
1034
1010
static Dart_WeakPersistentHandle AllocateWeakPersistentHandle (
1035
- Thread* T ,
1011
+ Thread* thread ,
1036
1012
Dart_Handle object,
1037
1013
void * peer,
1038
1014
intptr_t external_allocation_size,
1039
1015
Dart_HandleFinalizer callback) {
1040
- const auto & ref = Object::Handle (Z, Api::UnwrapHandle (object));
1041
- return AllocateWeakPersistentHandle (T, ref, peer, external_allocation_size,
1042
- callback);
1016
+ REUSABLE_OBJECT_HANDLESCOPE (thread);
1017
+ Object& ref = thread->ObjectHandle ();
1018
+ ref = Api::UnwrapHandle (object);
1019
+ return AllocateWeakPersistentHandle (thread, ref, peer,
1020
+ external_allocation_size, callback);
1043
1021
}
1044
1022
1045
1023
static Dart_FinalizableHandle AllocateFinalizableHandle (
@@ -1051,12 +1029,6 @@ static Dart_FinalizableHandle AllocateFinalizableHandle(
1051
1029
if (!ref.ptr ()->IsHeapObject ()) {
1052
1030
return NULL ;
1053
1031
}
1054
- if (ref.IsPointer ()) {
1055
- return NULL ;
1056
- }
1057
- if (IsFfiStruct (thread, ref)) {
1058
- return NULL ;
1059
- }
1060
1032
1061
1033
FinalizablePersistentHandle* finalizable_ref =
1062
1034
FinalizablePersistentHandle::New (thread->isolate_group (), ref, peer,
@@ -1066,13 +1038,15 @@ static Dart_FinalizableHandle AllocateFinalizableHandle(
1066
1038
}
1067
1039
1068
1040
static Dart_FinalizableHandle AllocateFinalizableHandle (
1069
- Thread* T ,
1041
+ Thread* thread ,
1070
1042
Dart_Handle object,
1071
1043
void * peer,
1072
1044
intptr_t external_allocation_size,
1073
1045
Dart_HandleFinalizer callback) {
1074
- const auto & ref = Object::Handle (Z, Api::UnwrapHandle (object));
1075
- return AllocateFinalizableHandle (T, ref, peer, external_allocation_size,
1046
+ REUSABLE_OBJECT_HANDLESCOPE (thread);
1047
+ Object& ref = thread->ObjectHandle ();
1048
+ ref = Api::UnwrapHandle (object);
1049
+ return AllocateFinalizableHandle (thread, ref, peer, external_allocation_size,
1076
1050
callback);
1077
1051
}
1078
1052
@@ -1081,27 +1055,30 @@ Dart_NewWeakPersistentHandle(Dart_Handle object,
1081
1055
void * peer,
1082
1056
intptr_t external_allocation_size,
1083
1057
Dart_HandleFinalizer callback) {
1084
- DARTSCOPE (Thread::Current ());
1058
+ Thread* thread = Thread::Current ();
1059
+ CHECK_ISOLATE (thread->isolate ());
1085
1060
if (callback == NULL ) {
1086
1061
return NULL ;
1087
1062
}
1063
+ TransitionNativeToVM transition (thread);
1088
1064
1089
- return AllocateWeakPersistentHandle (T , object, peer, external_allocation_size ,
1090
- callback);
1065
+ return AllocateWeakPersistentHandle (thread , object, peer,
1066
+ external_allocation_size, callback);
1091
1067
}
1092
1068
1093
1069
DART_EXPORT Dart_FinalizableHandle
1094
1070
Dart_NewFinalizableHandle (Dart_Handle object,
1095
1071
void * peer,
1096
1072
intptr_t external_allocation_size,
1097
1073
Dart_HandleFinalizer callback) {
1098
- DARTSCOPE (Thread::Current ());
1074
+ Thread* thread = Thread::Current ();
1075
+ CHECK_ISOLATE (thread->isolate ());
1099
1076
if (callback == nullptr ) {
1100
1077
return nullptr ;
1101
1078
}
1102
-
1103
- return AllocateFinalizableHandle (T , object, peer, external_allocation_size ,
1104
- callback);
1079
+ TransitionNativeToVM transition (thread);
1080
+ return AllocateFinalizableHandle (thread , object, peer,
1081
+ external_allocation_size, callback);
1105
1082
}
1106
1083
1107
1084
DART_EXPORT void Dart_UpdateExternalSize (Dart_WeakPersistentHandle object,
0 commit comments