Flutter Engine
Loading...
Searching...
No Matches
dart_byte_data.cc
Go to the documentation of this file.
1
// Copyright 2013 The Flutter Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#include "
tonic/typed_data/dart_byte_data.h
"
6
7
#include <cstring>
8
9
#include "
tonic/logging/dart_error.h
"
10
11
namespace
tonic
{
12
13
namespace
{
14
15
void
FreeFinalizer(
void
* isolate_callback_data,
void
* peer) {
16
free(peer);
17
}
18
19
}
// anonymous namespace
20
21
// For large objects it is more efficient to use an external typed data object
22
// with a buffer allocated outside the Dart heap.
23
const
size_t
DartByteData::kExternalSizeThreshold
= 1000;
24
25
Dart_Handle
DartByteData::Create
(
const
void
*
data
,
size_t
length
) {
26
if
(
length
<
kExternalSizeThreshold
) {
27
auto
handle =
DartByteData
{
data
,
length
}.
dart_handle
();
28
// The destructor should release the typed data.
29
return
handle;
30
}
else
{
31
void
* buf = ::malloc(
length
);
32
TONIC_DCHECK
(buf);
33
::memcpy(buf,
data
,
length
);
34
return
Dart_NewExternalTypedDataWithFinalizer(
35
Dart_TypedData_kByteData, buf,
length
, buf,
length
, FreeFinalizer);
36
}
37
}
38
39
DartByteData::DartByteData
()
40
: data_(nullptr), length_in_bytes_(0), dart_handle_(nullptr) {}
41
42
DartByteData::DartByteData
(
const
void
*
data
,
size_t
length
)
43
: data_(nullptr),
44
length_in_bytes_(0),
45
dart_handle_(Dart_NewTypedData(Dart_TypedData_kByteData,
length
)) {
46
if
(!Dart_IsError(dart_handle_)) {
47
Dart_TypedData_Type
type
;
48
auto
acquire_result = Dart_TypedDataAcquireData(dart_handle_, &
type
, &data_,
49
&length_in_bytes_);
50
51
if
(!Dart_IsError(acquire_result)) {
52
::memcpy(data_,
data
, length_in_bytes_);
53
}
54
}
55
}
56
57
DartByteData::DartByteData
(Dart_Handle list)
58
: data_(nullptr), length_in_bytes_(0), dart_handle_(list) {
59
if
(Dart_IsNull(list))
60
return
;
61
62
Dart_TypedData_Type
type
;
63
Dart_TypedDataAcquireData(list, &
type
, &data_, &length_in_bytes_);
64
TONIC_DCHECK
(!
CheckAndHandleError
(list));
65
if
(
type
!= Dart_TypedData_kByteData)
66
Dart_ThrowException(
ToDart
(
"Non-genuine ByteData passed to engine."
));
67
}
68
69
DartByteData::DartByteData
(
DartByteData
&& other)
70
: data_(other.data_),
71
length_in_bytes_(other.length_in_bytes_),
72
dart_handle_(other.dart_handle_) {
73
other.data_ =
nullptr
;
74
other.dart_handle_ =
nullptr
;
75
}
76
77
DartByteData::~DartByteData
() {
78
Release
();
79
}
80
81
std::vector<char>
DartByteData::Copy
()
const
{
82
const
char
* ptr =
static_cast<
const
char
*
>
(data_);
83
return
std::vector<char>(ptr, ptr + length_in_bytes_);
84
}
85
86
void
DartByteData::Release
()
const
{
87
if
(data_) {
88
Dart_TypedDataReleaseData(dart_handle_);
89
data_ =
nullptr
;
90
}
91
}
92
93
DartByteData
DartConverter<DartByteData>::FromArguments
(
94
Dart_NativeArguments
args
,
95
int
index,
96
Dart_Handle& exception) {
97
Dart_Handle
data
= Dart_GetNativeArgument(
args
, index);
98
TONIC_DCHECK
(!
CheckAndHandleError
(
data
));
99
return
DartByteData
(
data
);
100
}
101
102
void
DartConverter<DartByteData>::SetReturnValue
(Dart_NativeArguments
args
,
103
DartByteData
val) {
104
Dart_SetReturnValue(
args
, val.
dart_handle
());
105
}
106
107
}
// namespace tonic
type
GLenum type
Definition
blit_command_gles.cc:153
tonic::DartByteData
Definition
dart_byte_data.h:15
tonic::DartByteData::DartByteData
DartByteData()
Definition
dart_byte_data.cc:39
tonic::DartByteData::dart_handle
Dart_Handle dart_handle() const
Definition
dart_byte_data.h:28
tonic::DartByteData::kExternalSizeThreshold
static const size_t kExternalSizeThreshold
Definition
dart_byte_data.h:17
tonic::DartByteData::Create
static Dart_Handle Create(const void *data, size_t length)
Definition
dart_byte_data.cc:25
tonic::DartByteData::Release
void Release() const
Definition
dart_byte_data.cc:86
tonic::DartByteData::data
const void * data() const
Definition
dart_byte_data.h:25
tonic::DartByteData::Copy
std::vector< char > Copy() const
Definition
dart_byte_data.cc:81
tonic::DartByteData::~DartByteData
~DartByteData()
Definition
dart_byte_data.cc:77
dart_byte_data.h
dart_error.h
args
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
Definition
fl_event_channel.h:89
length
size_t length
Definition
key_event_handler.cc:41
tonic
Definition
image_filter.h:15
tonic::ToDart
Dart_Handle ToDart(const T &object)
Definition
dart_converter.h:579
tonic::CheckAndHandleError
bool CheckAndHandleError(Dart_Handle handle)
Definition
dart_error.cc:33
tonic::DartConverter
Definition
dart_converter.h:21
data
std::shared_ptr< const fml::Mapping > data
Definition
texture_gles.cc:68
TONIC_DCHECK
#define TONIC_DCHECK
Definition
macros.h:32
third_party
tonic
typed_data
dart_byte_data.cc
Generated on Thu Nov 6 2025 16:11:30 for Flutter Engine by
1.9.8