Skip to content

Commit ddafb88

Browse files
rmacnak-googlecommit-bot@chromium.org
authored andcommitted
[vm, isolate] Send large TypedData as ExternalTypedData in isolate messages.
Bug: #31959 Change-Id: I7235d24e29b72bc9849d726b63f0d4c38633e803 Reviewed-on: https://dart-review.googlesource.com/37423 Reviewed-by: Siva Annamalai <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 85faacc commit ddafb88

File tree

4 files changed

+361
-168
lines changed

4 files changed

+361
-168
lines changed

runtime/vm/dart_api_message.cc

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -679,72 +679,81 @@ Dart_CObject* ApiMessageReader::ReadInternalVMObject(intptr_t class_id,
679679
#define READ_TYPED_DATA(type, ctype) \
680680
{ \
681681
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); \
688700
return object; \
689701
}
690702

691703
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);
701707

702708
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);
712712

713713
case kTypedDataUint8ClampedArrayCid:
714-
case kExternalTypedDataUint8ClampedArrayCid:
715714
READ_TYPED_DATA(Uint8Clamped, uint8_t);
715+
case kExternalTypedDataUint8ClampedArrayCid:
716+
READ_EXTERNAL_TYPED_DATA(Uint8Clamped, uint8_t);
716717

717718
case kTypedDataInt16ArrayCid:
718-
case kExternalTypedDataInt16ArrayCid:
719719
READ_TYPED_DATA(Int16, int16_t);
720+
case kExternalTypedDataInt16ArrayCid:
721+
READ_EXTERNAL_TYPED_DATA(Int16, int16_t);
720722

721723
case kTypedDataUint16ArrayCid:
722-
case kExternalTypedDataUint16ArrayCid:
723724
READ_TYPED_DATA(Uint16, uint16_t);
725+
case kExternalTypedDataUint16ArrayCid:
726+
READ_EXTERNAL_TYPED_DATA(Uint16, uint16_t);
724727

725728
case kTypedDataInt32ArrayCid:
726-
case kExternalTypedDataInt32ArrayCid:
727729
READ_TYPED_DATA(Int32, int32_t);
730+
case kExternalTypedDataInt32ArrayCid:
731+
READ_EXTERNAL_TYPED_DATA(Int32, int32_t);
728732

729733
case kTypedDataUint32ArrayCid:
730-
case kExternalTypedDataUint32ArrayCid:
731734
READ_TYPED_DATA(Uint32, uint32_t);
735+
case kExternalTypedDataUint32ArrayCid:
736+
READ_EXTERNAL_TYPED_DATA(Uint32, uint32_t);
732737

733738
case kTypedDataInt64ArrayCid:
734-
case kExternalTypedDataInt64ArrayCid:
735739
READ_TYPED_DATA(Int64, int64_t);
740+
case kExternalTypedDataInt64ArrayCid:
741+
READ_EXTERNAL_TYPED_DATA(Int64, int64_t);
736742

737743
case kTypedDataUint64ArrayCid:
738-
case kExternalTypedDataUint64ArrayCid:
739744
READ_TYPED_DATA(Uint64, uint64_t);
745+
case kExternalTypedDataUint64ArrayCid:
746+
READ_EXTERNAL_TYPED_DATA(Uint64, uint64_t);
740747

741748
case kTypedDataFloat32ArrayCid:
742-
case kExternalTypedDataFloat32ArrayCid:
743749
READ_TYPED_DATA(Float32, float);
750+
case kExternalTypedDataFloat32ArrayCid:
751+
READ_EXTERNAL_TYPED_DATA(Float32, float);
744752

745753
case kTypedDataFloat64ArrayCid:
746-
case kExternalTypedDataFloat64ArrayCid:
747754
READ_TYPED_DATA(Float64, double);
755+
case kExternalTypedDataFloat64ArrayCid:
756+
READ_EXTERNAL_TYPED_DATA(Float64, double);
748757

749758
case kGrowableObjectArrayCid: {
750759
// A GrowableObjectArray is serialized as its type arguments and
@@ -1187,17 +1196,12 @@ bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
11871196
case kTypedDataInt8ArrayCid:
11881197
case kTypedDataUint8ArrayCid: {
11891198
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);
11931200
break;
11941201
}
11951202
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));
12011205
break;
12021206
}
12031207
default:
@@ -1226,9 +1230,9 @@ bool ApiMessageWriter::WriteCObjectInlined(Dart_CObject* object,
12261230
Dart_WeakPersistentHandleFinalizer callback =
12271231
object->value.as_external_typed_data.callback;
12281232
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));
12321236
break;
12331237
}
12341238
case Dart_CObject_kSendPort: {

0 commit comments

Comments
 (0)