diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2019-08-14 13:06:43 +0300 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-08-17 01:49:51 +0300 |
commit | 841df6a9b68f431129343c49fc9bb6ed4d83f89b (patch) | |
tree | 148d93b3b762e1074392a247d99c74311e4858e2 /src/node_union_bytes.h | |
parent | 18405e66d28383ebe930a0dcf1a1a6104d60d79d (diff) |
src: simplify UnionBytes
Before this commit it was using a tagged union to store the one-byte and
two-byte pointers.
From a `sizeof(UnionBytes)` perspective that makes no difference - there
is a hole between the tag and the union - and it makes the code just a
little harder to reason about, IMO.
PR-URL: https://github.com/nodejs/node/pull/29116
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/node_union_bytes.h')
-rw-r--r-- | src/node_union_bytes.h | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/src/node_union_bytes.h b/src/node_union_bytes.h index 996d9880a48..d296e67f005 100644 --- a/src/node_union_bytes.h +++ b/src/node_union_bytes.h @@ -59,47 +59,40 @@ class NonOwningExternalTwoByteResource class UnionBytes { public: UnionBytes(const uint16_t* data, size_t length) - : is_one_byte_(false), two_bytes_(data), length_(length) {} + : one_bytes_(nullptr), two_bytes_(data), length_(length) {} UnionBytes(const uint8_t* data, size_t length) - : is_one_byte_(true), one_bytes_(data), length_(length) {} + : one_bytes_(data), two_bytes_(nullptr), length_(length) {} UnionBytes(const UnionBytes&) = default; UnionBytes& operator=(const UnionBytes&) = default; UnionBytes(UnionBytes&&) = default; UnionBytes& operator=(UnionBytes&&) = default; - bool is_one_byte() const { return is_one_byte_; } + bool is_one_byte() const { return one_bytes_ != nullptr; } const uint16_t* two_bytes_data() const { - CHECK(!is_one_byte_); CHECK_NOT_NULL(two_bytes_); return two_bytes_; } const uint8_t* one_bytes_data() const { - CHECK(is_one_byte_); CHECK_NOT_NULL(one_bytes_); return one_bytes_; } v8::Local<v8::String> ToStringChecked(v8::Isolate* isolate) const { - if (is_one_byte_) { - CHECK_NOT_NULL(one_bytes_); + if (is_one_byte()) { NonOwningExternalOneByteResource* source = - new NonOwningExternalOneByteResource(one_bytes_, length_); + new NonOwningExternalOneByteResource(one_bytes_data(), length_); return v8::String::NewExternalOneByte(isolate, source).ToLocalChecked(); } else { - CHECK_NOT_NULL(two_bytes_); NonOwningExternalTwoByteResource* source = - new NonOwningExternalTwoByteResource(two_bytes_, length_); + new NonOwningExternalTwoByteResource(two_bytes_data(), length_); return v8::String::NewExternalTwoByte(isolate, source).ToLocalChecked(); } } size_t length() { return length_; } private: - bool is_one_byte_; - union { - const uint8_t* one_bytes_; - const uint16_t* two_bytes_; - }; + const uint8_t* one_bytes_; + const uint16_t* two_bytes_; size_t length_; }; |