Index: runtime/bin/file.cc |
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc |
index f04a36796801de3ff497124e4797299c2b3d3ac7..2b1151a360b845e902f68d30b4bb2a4d232e9c92 100644 |
--- a/runtime/bin/file.cc |
+++ b/runtime/bin/file.cc |
@@ -911,7 +911,7 @@ static CObject* FileReadRequest(const CObjectArray& request) { |
if (!file->IsClosed()) { |
int64_t length = CObjectInt32OrInt64ToInt64(request[2]); |
Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
- uint8_t* data = io_buffer->value.as_external_byte_array.data; |
+ uint8_t* data = io_buffer->value.as_external_typed_data.data; |
int64_t bytes_read = file->Read(data, length); |
if (bytes_read >= 0) { |
CObjectExternalUint8Array* external_array = |
@@ -942,7 +942,7 @@ static CObject* FileReadListRequest(const CObjectArray& request) { |
if (!file->IsClosed()) { |
int64_t length = CObjectInt32OrInt64ToInt64(request[2]); |
Dart_CObject* io_buffer = CObject::NewIOBuffer(length); |
- uint8_t* data = io_buffer->value.as_external_byte_array.data; |
+ uint8_t* data = io_buffer->value.as_external_typed_data.data; |
int64_t bytes_read = file->Read(data, length); |
if (bytes_read >= 0) { |
CObjectExternalUint8Array* external_array = |
@@ -965,10 +965,26 @@ static CObject* FileReadListRequest(const CObjectArray& request) { |
} |
+static int SizeInBytes(Dart_CObject::TypedDataType type) { |
+ switch (type) { |
+ case Dart_CObject::kInt8Array: |
+ case Dart_CObject::kUint8Array: |
+ return 1; |
+ case Dart_CObject::kInt16Array: |
+ case Dart_CObject::kUint16Array: |
+ return 2; |
+ default: |
+ break; |
+ } |
+ UNREACHABLE(); |
+ return -1; |
+} |
+ |
+ |
static CObject* FileWriteListRequest(const CObjectArray& request) { |
if (request.Length() == 5 && |
request[1]->IsIntptr() && |
- (request[2]->IsUint8Array() || request[2]->IsArray()) && |
+ (request[2]->IsTypedData() || request[2]->IsArray()) && |
request[3]->IsInt32OrInt64() && |
request[4]->IsInt32OrInt64()) { |
File* file = CObjectToFilePointer(request[1]); |
@@ -977,9 +993,11 @@ static CObject* FileWriteListRequest(const CObjectArray& request) { |
int64_t offset = CObjectInt32OrInt64ToInt64(request[3]); |
int64_t length = CObjectInt32OrInt64ToInt64(request[4]); |
uint8_t* buffer_start; |
- if (request[2]->IsUint8Array()) { |
- CObjectUint8Array byte_array(request[2]); |
- buffer_start = byte_array.Buffer() + offset; |
+ if (request[2]->IsTypedData()) { |
+ CObjectTypedData typed_data(request[2]); |
+ offset = offset * SizeInBytes(typed_data.Type()); |
+ length = length * SizeInBytes(typed_data.Type()); |
+ buffer_start = typed_data.Buffer() + offset; |
} else { |
CObjectArray array(request[2]); |
buffer_start = new uint8_t[length]; |
@@ -997,7 +1015,7 @@ static CObject* FileWriteListRequest(const CObjectArray& request) { |
} |
int64_t bytes_written = |
file->Write(reinterpret_cast<void*>(buffer_start), length); |
- if (!request[2]->IsUint8Array()) { |
+ if (!request[2]->IsTypedData()) { |
delete[] buffer_start; |
} |
if (bytes_written >= 0) { |