Hash :
b8d546b2
Author :
Date :
2024-10-30T15:40:58
Fix immutable string concats with ints
`BuildConcatenatedImmutableString("a", 10, "b")`
would construct "a\nb" because the implementation lacked int overloads
and ints would be promoted to chars implicitly.
Fix by implementing simpler way to calculate digits for numbers
and then add useful overloads. Remove
ImmutableStringBuilder::appendDecimal() since the code is already
expecting << for all other types, and the bug was due to this
expectation.
Bug: angleproject:376417347
Change-Id: Iea5e14a6e2fede068b704754b9203db794dd5bf0
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5972641
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Kimmo Kinnunen <kkinnunen@apple.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
//
// Copyright 2018 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ImmutableStringBuilder.cpp: Stringstream-like utility for building pool allocated strings where
// the maximum length is known in advance.
//
#include "compiler/translator/ImmutableStringBuilder.h"
#include <inttypes.h>
#include <stdio.h>
namespace sh
{
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(const ImmutableString &str)
{
ASSERT(mData != nullptr);
ASSERT(mPos + str.length() <= mMaxLength);
memcpy(mData + mPos, str.data(), str.length());
mPos += str.length();
return *this;
}
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(char c)
{
ASSERT(mData != nullptr);
ASSERT(mPos + 1 <= mMaxLength);
mData[mPos++] = c;
return *this;
}
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(uint64_t v)
{
// + 1 is because snprintf writes at most bufsz - 1 and then \0.
// Our bufsz is mMaxLength + 1.
int numChars = snprintf(mData + mPos, mMaxLength - mPos + 1, "%" PRIu64, v);
ASSERT(numChars >= 0);
ASSERT(mPos + numChars <= mMaxLength);
mPos += numChars;
return *this;
}
ImmutableStringBuilder &ImmutableStringBuilder::operator<<(int64_t v)
{
// + 1 is because snprintf writes at most bufsz - 1 and then \0.
// Our bufsz is mMaxLength + 1.
int numChars = snprintf(mData + mPos, mMaxLength - mPos + 1, "%" PRId64, v);
ASSERT(numChars >= 0);
ASSERT(mPos + numChars <= mMaxLength);
mPos += numChars;
return *this;
}
ImmutableStringBuilder::operator ImmutableString()
{
mData[mPos] = '\0';
ImmutableString str(mData, mPos);
#if defined(ANGLE_ENABLE_ASSERTS)
// Make sure that nothing is added to the string after it is finalized.
mData = nullptr;
#endif
return str;
}
} // namespace sh