Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit a5b196e

Browse files
committed
eliminated the copies when sending data to and from objc
1 parent 2d02b81 commit a5b196e

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

shell/platform/darwin/common/buffer_conversions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ namespace flutter {
1515

1616
fml::MallocMapping CopyNSDataToMapping(NSData* data);
1717

18-
NSData* CopyMappingToNSData(fml::MallocMapping buffer);
18+
NSData* ConvertMappingToNSData(fml::MallocMapping buffer);
1919

20-
std::unique_ptr<fml::Mapping> CopyNSDataToMappingPtr(NSData* data);
20+
std::unique_ptr<fml::Mapping> ConvertNSDataToMappingPtr(NSData* data);
2121

2222
NSData* CopyMappingPtrToNSData(std::unique_ptr<fml::Mapping> mapping);
2323

shell/platform/darwin/common/buffer_conversions.mm

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,38 @@
44

55
#import "flutter/shell/platform/darwin/common/buffer_conversions.h"
66

7+
#include "flutter/fml/platform/darwin/scoped_nsobject.h"
8+
79
namespace flutter {
10+
namespace {
11+
class NSDataMapping : public fml::Mapping {
12+
public:
13+
NSDataMapping(NSData* data) : data_([data retain]) {}
14+
15+
size_t GetSize() const override { return [data_.get() length]; }
16+
17+
const uint8_t* GetMapping() const override {
18+
return static_cast<const uint8_t*>([data_.get() bytes]);
19+
}
20+
21+
private:
22+
fml::scoped_nsobject<NSData> data_;
23+
FML_DISALLOW_COPY_AND_ASSIGN(NSDataMapping);
24+
};
25+
} // namespace
826

927
fml::MallocMapping CopyNSDataToMapping(NSData* data) {
1028
const uint8_t* bytes = static_cast<const uint8_t*>(data.bytes);
1129
return fml::MallocMapping::Copy(bytes, data.length);
1230
}
1331

14-
NSData* CopyMappingToNSData(fml::MallocMapping buffer) {
15-
return [NSData dataWithBytes:const_cast<uint8_t*>(buffer.GetMapping()) length:buffer.GetSize()];
32+
NSData* ConvertMappingToNSData(fml::MallocMapping buffer) {
33+
size_t size = buffer.GetSize();
34+
return [NSData dataWithBytesNoCopy:const_cast<uint8_t*>(buffer.Release()) length:size];
1635
}
1736

18-
std::unique_ptr<fml::Mapping> CopyNSDataToMappingPtr(NSData* data) {
19-
auto mapping = CopyNSDataToMapping(data);
20-
return std::make_unique<fml::MallocMapping>(std::move(mapping));
37+
std::unique_ptr<fml::Mapping> ConvertNSDataToMappingPtr(NSData* data) {
38+
return std::make_unique<NSDataMapping>(data);
2139
}
2240

2341
NSData* CopyMappingPtrToNSData(std::unique_ptr<fml::Mapping> mapping) {

shell/platform/darwin/ios/framework/Source/platform_message_router.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
FlutterBinaryMessageHandler handler = it->second;
2323
NSData* data = nil;
2424
if (message->hasData()) {
25-
data = CopyMappingToNSData(message->releaseData());
25+
data = ConvertMappingToNSData(message->releaseData());
2626
}
2727
handler(data, ^(NSData* reply) {
2828
if (completer) {
2929
if (reply) {
30-
completer->Complete(CopyNSDataToMappingPtr(reply));
30+
completer->Complete(ConvertNSDataToMappingPtr(reply));
3131
} else {
3232
completer->CompleteEmpty();
3333
}

0 commit comments

Comments
 (0)