@@ -679,72 +679,81 @@ Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id,
679
679
#define READ_TYPED_DATA (type, ctype ) \
680
680
{ \
681
681
READ_TYPED_DATA_HEADER (type); \
682
- if (len > 0 ) { \
683
- ctype* p = reinterpret_cast <ctype*>(object->value .as_typed_data .values ); \
684
- for (intptr_t i = 0 ; i < len; i++) { \
685
- p[i] = Read<ctype>(); \
686
- } \
687
- } \
682
+ uint8_t * p = \
683
+ reinterpret_cast <uint8_t *>(object->value .as_typed_data .values ); \
684
+ ReadBytes (p, len * sizeof (ctype)); \
685
+ return object; \
686
+ }
687
+
688
+ #define READ_EXTERNAL_TYPED_DATA (type, ctype ) \
689
+ { \
690
+ READ_TYPED_DATA_HEADER (type); \
691
+ uint8_t * p = \
692
+ reinterpret_cast <uint8_t *>(object->value .as_typed_data .values ); \
693
+ void * data = ReadRawPointerValue (); \
694
+ void * peer = ReadRawPointerValue (); \
695
+ Dart_WeakPersistentHandleFinalizer callback = \
696
+ reinterpret_cast <Dart_WeakPersistentHandleFinalizer>( \
697
+ ReadRawPointerValue ()); \
698
+ memmove (p, data, len * sizeof (ctype)); \
699
+ callback (NULL , NULL , peer); \
688
700
return object; \
689
701
}
690
702
691
703
case kTypedDataInt8ArrayCid :
692
- case kExternalTypedDataInt8ArrayCid : {
693
- READ_TYPED_DATA_HEADER (Int8);
694
- if (len > 0 ) {
695
- uint8_t * p =
696
- reinterpret_cast <uint8_t *>(object->value .as_typed_data .values );
697
- ReadBytes (p, len);
698
- }
699
- return object;
700
- }
704
+ READ_TYPED_DATA (Int8, int8_t );
705
+ case kExternalTypedDataInt8ArrayCid :
706
+ READ_EXTERNAL_TYPED_DATA (Int8, int8_t );
701
707
702
708
case kTypedDataUint8ArrayCid :
703
- case kExternalTypedDataUint8ArrayCid : {
704
- READ_TYPED_DATA_HEADER (Uint8);
705
- if (len > 0 ) {
706
- uint8_t * p =
707
- reinterpret_cast <uint8_t *>(object->value .as_typed_data .values );
708
- ReadBytes (p, len);
709
- }
710
- return object;
711
- }
709
+ READ_TYPED_DATA (Uint8, uint8_t );
710
+ case kExternalTypedDataUint8ArrayCid :
711
+ READ_EXTERNAL_TYPED_DATA (Uint8, uint8_t );
712
712
713
713
case kTypedDataUint8ClampedArrayCid :
714
- case kExternalTypedDataUint8ClampedArrayCid :
715
714
READ_TYPED_DATA (Uint8Clamped, uint8_t );
715
+ case kExternalTypedDataUint8ClampedArrayCid :
716
+ READ_EXTERNAL_TYPED_DATA (Uint8Clamped, uint8_t );
716
717
717
718
case kTypedDataInt16ArrayCid :
718
- case kExternalTypedDataInt16ArrayCid :
719
719
READ_TYPED_DATA (Int16, int16_t );
720
+ case kExternalTypedDataInt16ArrayCid :
721
+ READ_EXTERNAL_TYPED_DATA (Int16, int16_t );
720
722
721
723
case kTypedDataUint16ArrayCid :
722
- case kExternalTypedDataUint16ArrayCid :
723
724
READ_TYPED_DATA (Uint16, uint16_t );
725
+ case kExternalTypedDataUint16ArrayCid :
726
+ READ_EXTERNAL_TYPED_DATA (Uint16, uint16_t );
724
727
725
728
case kTypedDataInt32ArrayCid :
726
- case kExternalTypedDataInt32ArrayCid :
727
729
READ_TYPED_DATA (Int32, int32_t );
730
+ case kExternalTypedDataInt32ArrayCid :
731
+ READ_EXTERNAL_TYPED_DATA (Int32, int32_t );
728
732
729
733
case kTypedDataUint32ArrayCid :
730
- case kExternalTypedDataUint32ArrayCid :
731
734
READ_TYPED_DATA (Uint32, uint32_t );
735
+ case kExternalTypedDataUint32ArrayCid :
736
+ READ_EXTERNAL_TYPED_DATA (Uint32, uint32_t );
732
737
733
738
case kTypedDataInt64ArrayCid :
734
- case kExternalTypedDataInt64ArrayCid :
735
739
READ_TYPED_DATA (Int64, int64_t );
740
+ case kExternalTypedDataInt64ArrayCid :
741
+ READ_EXTERNAL_TYPED_DATA (Int64, int64_t );
736
742
737
743
case kTypedDataUint64ArrayCid :
738
- case kExternalTypedDataUint64ArrayCid :
739
744
READ_TYPED_DATA (Uint64, uint64_t );
745
+ case kExternalTypedDataUint64ArrayCid :
746
+ READ_EXTERNAL_TYPED_DATA (Uint64, uint64_t );
740
747
741
748
case kTypedDataFloat32ArrayCid :
742
- case kExternalTypedDataFloat32ArrayCid :
743
749
READ_TYPED_DATA (Float32 , float );
750
+ case kExternalTypedDataFloat32ArrayCid :
751
+ READ_EXTERNAL_TYPED_DATA (Float32 , float );
744
752
745
753
case kTypedDataFloat64ArrayCid :
746
- case kExternalTypedDataFloat64ArrayCid :
747
754
READ_TYPED_DATA (Float64 , double );
755
+ case kExternalTypedDataFloat64ArrayCid :
756
+ READ_EXTERNAL_TYPED_DATA (Float64 , double );
748
757
749
758
case kGrowableObjectArrayCid : {
750
759
// A GrowableObjectArray is serialized as its type arguments and
@@ -1187,17 +1196,12 @@ bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
1187
1196
case kTypedDataInt8ArrayCid :
1188
1197
case kTypedDataUint8ArrayCid : {
1189
1198
uint8_t * bytes = object->value .as_typed_data .values ;
1190
- for (intptr_t i = 0 ; i < len; i++) {
1191
- Write<uint8_t >(bytes[i]);
1192
- }
1199
+ WriteBytes (bytes, len);
1193
1200
break ;
1194
1201
}
1195
1202
case kTypedDataUint32ArrayCid : {
1196
- uint32_t * words =
1197
- reinterpret_cast <uint32_t *>(object->value .as_typed_data .values );
1198
- for (intptr_t i = 0 ; i < len; i++) {
1199
- Write<uint32_t >(words[i]);
1200
- }
1203
+ uint8_t * bytes = object->value .as_typed_data .values ;
1204
+ WriteBytes (bytes, len * sizeof (uint32_t ));
1201
1205
break ;
1202
1206
}
1203
1207
default :
@@ -1226,9 +1230,9 @@ bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
1226
1230
Dart_WeakPersistentHandleFinalizer callback =
1227
1231
object->value .as_external_typed_data .callback ;
1228
1232
WriteSmi (length);
1229
- WriteRawPointerValue (reinterpret_cast <intptr_t >(data));
1230
- WriteRawPointerValue (reinterpret_cast < intptr_t >( peer) );
1231
- WriteRawPointerValue (reinterpret_cast <intptr_t >(callback));
1233
+ WriteRawPointerValue (reinterpret_cast <void * >(data));
1234
+ WriteRawPointerValue (peer);
1235
+ WriteRawPointerValue (reinterpret_cast <void * >(callback));
1232
1236
break ;
1233
1237
}
1234
1238
case Dart_CObject_kSendPort: {
0 commit comments