summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2019-08-14 12:06:43 +0200
committerRich Trott <rtrott@gmail.com>2019-08-16 15:49:51 -0700
commit841df6a9b68f431129343c49fc9bb6ed4d83f89b (patch)
tree148d93b3b762e1074392a247d99c74311e4858e2
parent18405e66d28383ebe930a0dcf1a1a6104d60d79d (diff)
downloadandroid-node-v8-841df6a9b68f431129343c49fc9bb6ed4d83f89b.tar.gz
android-node-v8-841df6a9b68f431129343c49fc9bb6ed4d83f89b.tar.bz2
android-node-v8-841df6a9b68f431129343c49fc9bb6ed4d83f89b.zip
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>
-rw-r--r--src/node_union_bytes.h23
1 files changed, 8 insertions, 15 deletions
diff --git a/src/node_union_bytes.h b/src/node_union_bytes.h
index 996d9880a4..d296e67f00 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_;
};