Add utility method to create a DartByteData handle from an existing allocation.
\
Change-Id: I0a9d78b6a7fdae667a00d597d7701d3cc04e0c81
diff --git a/typed_data/dart_byte_data.cc b/typed_data/dart_byte_data.cc
index 81d3391..a3f3a52 100644
--- a/typed_data/dart_byte_data.cc
+++ b/typed_data/dart_byte_data.cc
@@ -8,9 +8,30 @@
namespace tonic {
+Dart_Handle DartByteData::Create(const void* data, size_t length) {
+ auto handle = DartByteData{data, length}.dart_handle();
+ // The destructor should release the typed data.
+ return handle;
+}
+
DartByteData::DartByteData()
: data_(nullptr), length_in_bytes_(0), dart_handle_(nullptr) {}
+DartByteData::DartByteData(const void* data, size_t length)
+ : data_(nullptr),
+ length_in_bytes_(0),
+ dart_handle_(Dart_NewTypedData(Dart_TypedData_kByteData, length)) {
+ if (!Dart_IsError(dart_handle_)) {
+ Dart_TypedData_Type type;
+ auto acquire_result = Dart_TypedDataAcquireData(dart_handle_, &type, &data_,
+ &length_in_bytes_);
+
+ if (!Dart_IsError(acquire_result)) {
+ ::memcpy(data_, data, length_in_bytes_);
+ }
+ }
+}
+
DartByteData::DartByteData(Dart_Handle list)
: data_(nullptr), length_in_bytes_(0), dart_handle_(list) {
if (Dart_IsNull(list))
diff --git a/typed_data/dart_byte_data.h b/typed_data/dart_byte_data.h
index a4c10bc..aa2deba 100644
--- a/typed_data/dart_byte_data.h
+++ b/typed_data/dart_byte_data.h
@@ -14,6 +14,8 @@
class DartByteData {
public:
+ static Dart_Handle Create(const void* data, size_t length);
+
explicit DartByteData(Dart_Handle list);
DartByteData(DartByteData&& other);
DartByteData();
@@ -35,6 +37,7 @@
Dart_Handle dart_handle_;
DartByteData(const DartByteData& other) = delete;
+ DartByteData(const void* data, size_t length);
};
template <>