mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-15 02:36:16 +02:00
cont. cleanup: remove superfluous std::string copies
This commit is contained in:
parent
4c0c8e5428
commit
caf3b55891
6 changed files with 21 additions and 17 deletions
|
@ -40,6 +40,13 @@ namespace nix {
|
||||||
* Miscellaneous
|
* Miscellaneous
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
|
|
||||||
|
static inline Value * mkString(EvalState & state, const std::csub_match & match)
|
||||||
|
{
|
||||||
|
Value * v = state.allocValue();
|
||||||
|
v->mkString({match.first, match.second});
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
StringMap EvalState::realiseContext(const NixStringContext & context, StorePathSet * maybePathsOut, bool isIFD)
|
StringMap EvalState::realiseContext(const NixStringContext & context, StorePathSet * maybePathsOut, bool isIFD)
|
||||||
{
|
{
|
||||||
std::vector<DerivedPath::Built> drvs;
|
std::vector<DerivedPath::Built> drvs;
|
||||||
|
@ -4268,7 +4275,7 @@ void prim_match(EvalState & state, const PosIdx pos, Value * * args, Value & v)
|
||||||
if (!match[i + 1].matched)
|
if (!match[i + 1].matched)
|
||||||
v2 = &state.vNull;
|
v2 = &state.vNull;
|
||||||
else
|
else
|
||||||
(v2 = state.allocValue())->mkString(match[i + 1].str());
|
v2 = mkString(state, match[i + 1]);
|
||||||
v.mkList(list);
|
v.mkList(list);
|
||||||
|
|
||||||
} catch (std::regex_error & e) {
|
} catch (std::regex_error & e) {
|
||||||
|
@ -4352,7 +4359,7 @@ void prim_split(EvalState & state, const PosIdx pos, Value * * args, Value & v)
|
||||||
auto match = *i;
|
auto match = *i;
|
||||||
|
|
||||||
// Add a string for non-matched characters.
|
// Add a string for non-matched characters.
|
||||||
(list[idx++] = state.allocValue())->mkString(match.prefix().str());
|
list[idx++] = mkString(state, match.prefix());
|
||||||
|
|
||||||
// Add a list for matched substrings.
|
// Add a list for matched substrings.
|
||||||
const size_t slen = match.size() - 1;
|
const size_t slen = match.size() - 1;
|
||||||
|
@ -4363,14 +4370,14 @@ void prim_split(EvalState & state, const PosIdx pos, Value * * args, Value & v)
|
||||||
if (!match[si + 1].matched)
|
if (!match[si + 1].matched)
|
||||||
v2 = &state.vNull;
|
v2 = &state.vNull;
|
||||||
else
|
else
|
||||||
(v2 = state.allocValue())->mkString(match[si + 1].str());
|
v2 = mkString(state, match[si + 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
(list[idx++] = state.allocValue())->mkList(list2);
|
(list[idx++] = state.allocValue())->mkList(list2);
|
||||||
|
|
||||||
// Add a string for non-matched suffix characters.
|
// Add a string for non-matched suffix characters.
|
||||||
if (idx == 2 * len)
|
if (idx == 2 * len)
|
||||||
(list[idx++] = state.allocValue())->mkString(match.suffix().str());
|
list[idx++] = mkString(state, match.suffix());
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(idx == 2 * len + 1);
|
assert(idx == 2 * len + 1);
|
||||||
|
|
|
@ -90,11 +90,11 @@ struct TunnelLogger : public Logger
|
||||||
{
|
{
|
||||||
if (ei.level > verbosity) return;
|
if (ei.level > verbosity) return;
|
||||||
|
|
||||||
std::stringstream oss;
|
std::ostringstream oss;
|
||||||
showErrorInfo(oss, ei, false);
|
showErrorInfo(oss, ei, false);
|
||||||
|
|
||||||
StringSink buf;
|
StringSink buf;
|
||||||
buf << STDERR_NEXT << oss.str();
|
buf << STDERR_NEXT << oss.view();
|
||||||
enqueueMsg(buf.s);
|
enqueueMsg(buf.s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,16 +30,15 @@ std::optional<OutputsSpec> OutputsSpec::parseOpt(std::string_view s)
|
||||||
{
|
{
|
||||||
static std::regex regex(std::string { outputSpecRegexStr });
|
static std::regex regex(std::string { outputSpecRegexStr });
|
||||||
|
|
||||||
std::smatch match;
|
std::cmatch match;
|
||||||
std::string s2 { s }; // until some improves std::regex
|
if (!std::regex_match(s.cbegin(), s.cend(), match, regex))
|
||||||
if (!std::regex_match(s2, match, regex))
|
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
|
||||||
if (match[1].matched)
|
if (match[1].matched)
|
||||||
return { OutputsSpec::All {} };
|
return { OutputsSpec::All {} };
|
||||||
|
|
||||||
if (match[2].matched)
|
if (match[2].matched)
|
||||||
return OutputsSpec::Names { tokenizeString<StringSet>(match[2].str(), ",") };
|
return OutputsSpec::Names { tokenizeString<StringSet>({match[2].first, match[2].second}, ",") };
|
||||||
|
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,7 +293,7 @@ void RootArgs::parseCmdline(const Strings & _cmdline, bool allowShebang)
|
||||||
// We match one space after `nix` so that we preserve indentation.
|
// We match one space after `nix` so that we preserve indentation.
|
||||||
// No space is necessary for an empty line. An empty line has basically no effect.
|
// No space is necessary for an empty line. An empty line has basically no effect.
|
||||||
if (std::regex_match(line, match, std::regex("^#!\\s*nix(:? |$)(.*)$")))
|
if (std::regex_match(line, match, std::regex("^#!\\s*nix(:? |$)(.*)$")))
|
||||||
shebangContent += match[2].str() + "\n";
|
shebangContent += std::string_view{match[2].first, match[2].second} + "\n";
|
||||||
}
|
}
|
||||||
for (const auto & word : parseShebangContent(shebangContent)) {
|
for (const auto & word : parseShebangContent(shebangContent)) {
|
||||||
cmdline.push_back(word);
|
cmdline.push_back(word);
|
||||||
|
|
|
@ -36,7 +36,7 @@ extern char * * environ __attribute__((weak));
|
||||||
/* Recreate the effect of the perl shellwords function, breaking up a
|
/* Recreate the effect of the perl shellwords function, breaking up a
|
||||||
* string into arguments like a shell word, including escapes
|
* string into arguments like a shell word, including escapes
|
||||||
*/
|
*/
|
||||||
static std::vector<std::string> shellwords(const std::string & s)
|
static std::vector<std::string> shellwords(std::string_view s)
|
||||||
{
|
{
|
||||||
std::regex whitespace("^\\s+");
|
std::regex whitespace("^\\s+");
|
||||||
auto begin = s.cbegin();
|
auto begin = s.cbegin();
|
||||||
|
@ -51,7 +51,7 @@ static std::vector<std::string> shellwords(const std::string & s)
|
||||||
auto it = begin;
|
auto it = begin;
|
||||||
for (; it != s.cend(); ++it) {
|
for (; it != s.cend(); ++it) {
|
||||||
if (st == sBegin) {
|
if (st == sBegin) {
|
||||||
std::smatch match;
|
std::cmatch match;
|
||||||
if (regex_search(it, s.cend(), match, whitespace)) {
|
if (regex_search(it, s.cend(), match, whitespace)) {
|
||||||
cur.append(begin, it);
|
cur.append(begin, it);
|
||||||
res.push_back(cur);
|
res.push_back(cur);
|
||||||
|
@ -173,7 +173,7 @@ static void main_nix_build(int argc, char * * argv)
|
||||||
line = chomp(line);
|
line = chomp(line);
|
||||||
std::smatch match;
|
std::smatch match;
|
||||||
if (std::regex_match(line, match, std::regex("^#!\\s*nix-shell\\s+(.*)$")))
|
if (std::regex_match(line, match, std::regex("^#!\\s*nix-shell\\s+(.*)$")))
|
||||||
for (const auto & word : shellwords(match[1].str()))
|
for (const auto & word : shellwords({match[1].first, match[1].second}))
|
||||||
args.push_back(word);
|
args.push_back(word);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,9 +111,7 @@ bool createUserEnv(EvalState & state, PackageInfos & elems,
|
||||||
auto manifestFile = ({
|
auto manifestFile = ({
|
||||||
std::ostringstream str;
|
std::ostringstream str;
|
||||||
printAmbiguous(manifest, state.symbols, str, nullptr, std::numeric_limits<int>::max());
|
printAmbiguous(manifest, state.symbols, str, nullptr, std::numeric_limits<int>::max());
|
||||||
// TODO with C++20 we can use str.view() instead and avoid copy.
|
StringSource source { str.view() };
|
||||||
std::string str2 = str.str();
|
|
||||||
StringSource source { str2 };
|
|
||||||
state.store->addToStoreFromDump(
|
state.store->addToStoreFromDump(
|
||||||
source, "env-manifest.nix", FileSerialisationMethod::Flat, ContentAddressMethod::Raw::Text, HashAlgorithm::SHA256, references);
|
source, "env-manifest.nix", FileSerialisationMethod::Flat, ContentAddressMethod::Raw::Text, HashAlgorithm::SHA256, references);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue