• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #ifndef SRC_NODE_UNION_BYTES_H_
3 #define SRC_NODE_UNION_BYTES_H_
4 
5 #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
6 
7 // A union of const uint8_t* or const uint16_t* data that can be
8 // turned into external v8::String when given an isolate.
9 
10 #include "v8.h"
11 
12 namespace node {
13 
14 class NonOwningExternalOneByteResource
15     : public v8::String::ExternalOneByteStringResource {
16  public:
NonOwningExternalOneByteResource(const uint8_t * data,size_t length)17   explicit NonOwningExternalOneByteResource(const uint8_t* data, size_t length)
18       : data_(data), length_(length) {}
19   ~NonOwningExternalOneByteResource() override = default;
20 
data()21   const char* data() const override {
22     return reinterpret_cast<const char*>(data_);
23   }
length()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:
NonOwningExternalTwoByteResource(const uint16_t * data,size_t length)39   explicit NonOwningExternalTwoByteResource(const uint16_t* data, size_t length)
40       : data_(data), length_(length) {}
41   ~NonOwningExternalTwoByteResource() override = default;
42 
data()43   const uint16_t* data() const override { return data_; }
length()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 // Similar to a v8::String, but it's independent from Isolates
57 // and can be materialized in Isolates as external Strings
58 // via ToStringChecked. The data pointers are owned by the caller.
59 class UnionBytes {
60  public:
UnionBytes(const uint16_t * data,size_t length)61   UnionBytes(const uint16_t* data, size_t length)
62       : one_bytes_(nullptr), two_bytes_(data), length_(length) {}
UnionBytes(const uint8_t * data,size_t length)63   UnionBytes(const uint8_t* data, size_t length)
64       : one_bytes_(data), two_bytes_(nullptr), length_(length) {}
65 
66   UnionBytes(const UnionBytes&) = default;
67   UnionBytes& operator=(const UnionBytes&) = default;
68   UnionBytes(UnionBytes&&) = default;
69   UnionBytes& operator=(UnionBytes&&) = default;
70 
is_one_byte()71   bool is_one_byte() const { return one_bytes_ != nullptr; }
two_bytes_data()72   const uint16_t* two_bytes_data() const {
73     CHECK_NOT_NULL(two_bytes_);
74     return two_bytes_;
75   }
one_bytes_data()76   const uint8_t* one_bytes_data() const {
77     CHECK_NOT_NULL(one_bytes_);
78     return one_bytes_;
79   }
ToStringChecked(v8::Isolate * isolate)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   }
length()91   size_t length() { return length_; }
92 
93  private:
94   const uint8_t* one_bytes_;
95   const uint16_t* two_bytes_;
96   size_t length_;
97 };
98 
99 }  // namespace node
100 
101 #endif  // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
102 
103 #endif  // SRC_NODE_UNION_BYTES_H_
104