11
11
12
12
namespace node {
13
13
14
- class NonOwningExternalOneByteResource
15
- : public v8::String::ExternalOneByteStringResource {
16
- public:
17
- explicit NonOwningExternalOneByteResource (const uint8_t * data, size_t length)
18
- : data_(data), length_(length) {}
19
- ~NonOwningExternalOneByteResource () override = default ;
20
-
21
- const char * data () const override {
22
- return reinterpret_cast <const char *>(data_);
23
- }
24
- size_t length () const override { return length_; }
25
-
26
- NonOwningExternalOneByteResource (const NonOwningExternalOneByteResource&) =
27
- delete ;
28
- NonOwningExternalOneByteResource& operator =(
29
- const NonOwningExternalOneByteResource&) = delete ;
30
-
31
- private:
32
- const uint8_t * data_;
33
- size_t length_;
34
- };
35
-
36
- class NonOwningExternalTwoByteResource
37
- : public v8::String::ExternalStringResource {
38
- public:
39
- explicit NonOwningExternalTwoByteResource (const uint16_t * data, size_t length)
40
- : data_(data), length_(length) {}
41
- ~NonOwningExternalTwoByteResource () override = default ;
42
-
43
- const uint16_t * data () const override { return data_; }
44
- size_t length () const override { return length_; }
45
-
46
- NonOwningExternalTwoByteResource (const NonOwningExternalTwoByteResource&) =
47
- delete ;
48
- NonOwningExternalTwoByteResource& operator =(
49
- const NonOwningExternalTwoByteResource&) = delete ;
50
-
51
- private:
52
- const uint16_t * data_;
53
- size_t length_;
54
- };
55
-
56
14
// Similar to a v8::String, but it's independent from Isolates
57
15
// and can be materialized in Isolates as external Strings
58
- // via ToStringChecked. The data pointers are owned by the caller.
16
+ // via ToStringChecked.
59
17
class UnionBytes {
60
18
public:
61
19
UnionBytes (const uint16_t * data, size_t length)
62
20
: one_bytes_(nullptr ), two_bytes_(data), length_(length) {}
63
21
UnionBytes (const uint8_t * data, size_t length)
64
22
: one_bytes_(data), two_bytes_(nullptr ), length_(length) {}
23
+ template <typename T> // T = uint8_t or uint16_t
24
+ explicit UnionBytes (std::shared_ptr<std::vector</* const*/ T>> data)
25
+ : UnionBytes(data->data (), data->size()) {
26
+ owning_ptr_ = data;
27
+ }
65
28
66
29
UnionBytes (const UnionBytes&) = default;
67
30
UnionBytes& operator =(const UnionBytes&) = default;
@@ -77,23 +40,14 @@ class UnionBytes {
77
40
CHECK_NOT_NULL (one_bytes_);
78
41
return one_bytes_;
79
42
}
80
- v8::Local<v8::String> ToStringChecked (v8::Isolate* isolate) const {
81
- if (is_one_byte ()) {
82
- NonOwningExternalOneByteResource* source =
83
- new NonOwningExternalOneByteResource (one_bytes_data (), length_);
84
- return v8::String::NewExternalOneByte (isolate, source).ToLocalChecked ();
85
- } else {
86
- NonOwningExternalTwoByteResource* source =
87
- new NonOwningExternalTwoByteResource (two_bytes_data (), length_);
88
- return v8::String::NewExternalTwoByte (isolate, source).ToLocalChecked ();
89
- }
90
- }
91
- size_t length () { return length_; }
43
+ v8::Local<v8::String> ToStringChecked (v8::Isolate* isolate) const ;
44
+ size_t length () const { return length_; }
92
45
93
46
private:
94
47
const uint8_t * one_bytes_;
95
48
const uint16_t * two_bytes_;
96
49
size_t length_;
50
+ std::shared_ptr<void > owning_ptr_;
97
51
};
98
52
99
53
} // namespace node
0 commit comments