summaryrefslogtreecommitdiff
path: root/src/string.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-09-28 19:03:26 +0100
committerMaxime Coste <frrrwww@gmail.com>2016-09-28 19:06:25 +0100
commite701254b02944ecbf228e0c81ef77da86453d260 (patch)
treea6378a24bfcd29447b375ecdc428e6a984e21ae7 /src/string.cc
parent1b9eb2c6ba6da849480c299d06abb9bdd9f87786 (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.cc5
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)
{