1111
1212namespace node {
1313
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-
5614// Similar to a v8::String, but it's independent from Isolates
5715// and can be materialized in Isolates as external Strings
58- // via ToStringChecked. The data pointers are owned by the caller.
16+ // via ToStringChecked.
5917class UnionBytes {
6018 public:
6119 UnionBytes (const uint16_t * data, size_t length)
6220 : one_bytes_(nullptr ), two_bytes_(data), length_(length) {}
6321 UnionBytes (const uint8_t * data, size_t length)
6422 : 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+ }
6528
6629 UnionBytes (const UnionBytes&) = default;
6730 UnionBytes& operator =(const UnionBytes&) = default;
@@ -77,23 +40,14 @@ class UnionBytes {
7740 CHECK_NOT_NULL (one_bytes_);
7841 return one_bytes_;
7942 }
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_; }
9245
9346 private:
9447 const uint8_t * one_bytes_;
9548 const uint16_t * two_bytes_;
9649 size_t length_;
50+ std::shared_ptr<void > owning_ptr_;
9751};
9852
9953} // namespace node
0 commit comments