aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2022-02-27 12:50:18 +0100
committerRobert Hensing <robert@roberthensing.nl>2022-03-07 16:09:12 +0100
commitda260f579d5f4a66d6d0d0e1297b69666d049d03 (patch)
tree55d383bae3f643638863963b6437e229728be652 /src/libexpr
parentbbf55383e7a9914cf79b8879e234f444cc774bfa (diff)
dupStringWithLen -> makeImmutableString
Refactor the `size == 0` logic into a new helper function that replaces dupStringWithLen. The name had to change, because unlike a `dup`-function, it does not always allocate a new string.
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc29
1 files changed, 13 insertions, 16 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 7f82aa5f4..5bf161cc0 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -63,9 +63,15 @@ static char * dupString(const char * s)
}
-static char * dupStringWithLen(const char * s, size_t size)
+// When there's no need to write to the string, we can optimize away empty
+// string allocations.
+// This function handles makeImmutableStringWithLen(null, 0) by returning the
+// empty string.
+static const char * makeImmutableStringWithLen(const char * s, size_t size)
{
char * t;
+ if (size == 0)
+ return "";
#if HAVE_BOEHMGC
t = GC_STRNDUP(s, size);
#else
@@ -75,6 +81,10 @@ static char * dupStringWithLen(const char * s, size_t size)
return t;
}
+static inline const char * makeImmutableString(std::string_view s) {
+ return makeImmutableStringWithLen(s.data(), s.size());
+}
+
RootValue allocRootValue(Value * v)
{
@@ -805,13 +815,7 @@ LocalNoInline(void addErrorTrace(Error & e, const Pos & pos, const char * s, con
void Value::mkString(std::string_view s)
{
- if (s.size() == 0) {
- // s.data() may not be valid and we don't need to allocate.
- mkString("");
- }
- else {
- mkString(dupStringWithLen(s.data(), s.size()));
- }
+ mkString(makeImmutableString(s));
}
@@ -842,14 +846,7 @@ void Value::mkStringMove(const char * s, const PathSet & context)
void Value::mkPath(std::string_view s)
{
- if (s.size() == 0) {
- // Pathological, but better than crashing in dupStringWithLen, as
- // s.data() may be null.
- mkPath("");
- }
- else {
- mkPath(dupStringWithLen(s.data(), s.size()));
- }
+ mkPath(makeImmutableString(s));
}