diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2016-09-28 19:03:26 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2016-09-28 19:06:25 +0100 |
| commit | e701254b02944ecbf228e0c81ef77da86453d260 (patch) | |
| tree | a6378a24bfcd29447b375ecdc428e6a984e21ae7 /src/string.cc | |
| parent | 1b9eb2c6ba6da849480c299d06abb9bdd9f87786 (diff) | |
Fix String::Data::reserve on big endian platforms, and document String::Data
reserve was not ensuring the capacity would be pair, which is needed
on big endian machines, as we use its least significant bit to flag
short string optimizations. On little endian the bit we use is the
8th most significant (the least significant bit of the last byte),
so we were not hitting any problems.
Fixes #828
Diffstat (limited to 'src/string.cc')
| -rw-r--r-- | src/string.cc | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/string.cc b/src/string.cc index edfd4cf6..d7522bd8 100644 --- a/src/string.cc +++ b/src/string.cc @@ -17,6 +17,7 @@ String::Data::Data(const char* data, size_t size, size_t capacity) if (capacity & 1) ++capacity; + kak_assert(capacity < Long::max_capacity); l.ptr = Alloc{}.allocate(capacity+1); l.size = size; l.capacity = capacity; @@ -71,6 +72,10 @@ void String::Data::reserve(size_t new_capacity) if (is_long()) new_capacity = std::max(l.capacity * 2, new_capacity); + if (new_capacity & 1) + ++new_capacity; + + kak_assert(new_capacity < Long::max_capacity); char* new_ptr = Alloc{}.allocate(new_capacity+1); if (copy) { |
