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.
This commit is contained in:
Robert Hensing 2022-02-27 12:50:18 +01:00
parent bbf55383e7
commit da260f579d

View file

@ -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; char * t;
if (size == 0)
return "";
#if HAVE_BOEHMGC #if HAVE_BOEHMGC
t = GC_STRNDUP(s, size); t = GC_STRNDUP(s, size);
#else #else
@ -75,6 +81,10 @@ static char * dupStringWithLen(const char * s, size_t size)
return t; return t;
} }
static inline const char * makeImmutableString(std::string_view s) {
return makeImmutableStringWithLen(s.data(), s.size());
}
RootValue allocRootValue(Value * v) 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) void Value::mkString(std::string_view s)
{ {
if (s.size() == 0) { mkString(makeImmutableString(s));
// s.data() may not be valid and we don't need to allocate.
mkString("");
}
else {
mkString(dupStringWithLen(s.data(), s.size()));
}
} }
@ -842,14 +846,7 @@ void Value::mkStringMove(const char * s, const PathSet & context)
void Value::mkPath(std::string_view s) void Value::mkPath(std::string_view s)
{ {
if (s.size() == 0) { mkPath(makeImmutableString(s));
// Pathological, but better than crashing in dupStringWithLen, as
// s.data() may be null.
mkPath("");
}
else {
mkPath(dupStringWithLen(s.data(), s.size()));
}
} }