Remove non-method mkString()

This commit is contained in:
Eelco Dolstra 2022-01-04 18:24:42 +01:00
parent 6d9a6d2cc3
commit cc08364315
11 changed files with 44 additions and 66 deletions

View file

@ -79,7 +79,7 @@ Bindings * MixEvalArgs::getAutoArgs(EvalState & state)
if (i.second[0] == 'E') if (i.second[0] == 'E')
state.mkThunk_(*v, state.parseExprFromString(string(i.second, 1), absPath("."))); state.mkThunk_(*v, state.parseExprFromString(string(i.second, 1), absPath(".")));
else else
mkString(*v, string(i.second, 1)); v->mkString(((std::string_view) i.second).substr(1));
res.insert(state.symbols.create(i.first), v); res.insert(state.symbols.create(i.first), v);
} }
return res.finish(); return res.finish();

View file

@ -766,25 +766,12 @@ LocalNoInline(void addErrorTrace(Error & e, const Pos & pos, const char * s, con
} }
void mkString(Value & v, const char * s)
{
v.mkString(dupString(s));
}
void Value::mkString(std::string_view s) void Value::mkString(std::string_view s)
{ {
mkString(dupStringWithLen(s.data(), s.size())); mkString(dupStringWithLen(s.data(), s.size()));
} }
Value & mkString(Value & v, std::string_view s, const PathSet & context)
{
v.mkString(s, context);
return v;
}
void Value::mkString(std::string_view s, const PathSet & context) void Value::mkString(std::string_view s, const PathSet & context)
{ {
mkString(s); mkString(s);

View file

@ -44,8 +44,6 @@ struct Env
}; };
Value & mkString(Value & v, std::string_view s, const PathSet & context = PathSet());
void copyContext(const Value & v, PathSet & context); void copyContext(const Value & v, PathSet & context);

View file

@ -682,7 +682,7 @@ void callFlake(EvalState & state,
auto vTmp1 = state.allocValue(); auto vTmp1 = state.allocValue();
auto vTmp2 = state.allocValue(); auto vTmp2 = state.allocValue();
mkString(*vLocks, lockedFlake.lockFile.to_string()); vLocks->mkString(lockedFlake.lockFile.to_string());
emitTreeAttrs( emitTreeAttrs(
state, state,
@ -692,7 +692,7 @@ void callFlake(EvalState & state,
false, false,
lockedFlake.flake.forceDirty); lockedFlake.flake.forceDirty);
mkString(*vRootSubdir, lockedFlake.flake.lockedRef.subdir); vRootSubdir->mkString(lockedFlake.flake.lockedRef.subdir);
if (!state.vCallFlake) { if (!state.vCallFlake) {
state.vCallFlake = allocRootValue(state.allocValue()); state.vCallFlake = allocRootValue(state.allocValue());

View file

@ -113,8 +113,11 @@ public:
bool string(string_t & val) bool string(string_t & val)
{ {
return handle_value<void(Value&, const char*)>(mkString, val.c_str()); rs->value(state).mkString(val);
rs->add();
return true;
} }
#if NLOHMANN_JSON_VERSION_MAJOR >= 3 && NLOHMANN_JSON_VERSION_MINOR >= 8 #if NLOHMANN_JSON_VERSION_MAJOR >= 3 && NLOHMANN_JSON_VERSION_MINOR >= 8
bool binary(binary_t&) bool binary(binary_t&)
{ {

View file

@ -1285,7 +1285,7 @@ static RegisterPrimOp primop_derivationStrict(RegisterPrimOp::Info {
out. */ out. */
static void prim_placeholder(EvalState & state, const Pos & pos, Value * * args, Value & v) static void prim_placeholder(EvalState & state, const Pos & pos, Value * * args, Value & v)
{ {
mkString(v, hashPlaceholder(state.forceStringNoCtx(*args[0], pos))); v.mkString(hashPlaceholder(state.forceStringNoCtx(*args[0], pos)));
} }
static RegisterPrimOp primop_placeholder({ static RegisterPrimOp primop_placeholder({
@ -1310,7 +1310,7 @@ static void prim_toPath(EvalState & state, const Pos & pos, Value * * args, Valu
{ {
PathSet context; PathSet context;
Path path = state.coerceToPath(pos, *args[0], context); Path path = state.coerceToPath(pos, *args[0], context);
mkString(v, canonPath(path), context); v.mkString(canonPath(path), context);
} }
static RegisterPrimOp primop_toPath({ static RegisterPrimOp primop_toPath({
@ -1354,7 +1354,7 @@ static void prim_storePath(EvalState & state, const Pos & pos, Value * * args, V
if (!settings.readOnlyMode) if (!settings.readOnlyMode)
state.store->ensurePath(path2); state.store->ensurePath(path2);
context.insert(state.store->printStorePath(path2)); context.insert(state.store->printStorePath(path2));
mkString(v, path, context); v.mkString(path, context);
} }
static RegisterPrimOp primop_storePath({ static RegisterPrimOp primop_storePath({
@ -1420,7 +1420,7 @@ static RegisterPrimOp primop_pathExists({
static void prim_baseNameOf(EvalState & state, const Pos & pos, Value * * args, Value & v) static void prim_baseNameOf(EvalState & state, const Pos & pos, Value * * args, Value & v)
{ {
PathSet context; PathSet context;
mkString(v, baseNameOf(state.coerceToString(pos, *args[0], context, false, false)), context); v.mkString(baseNameOf(state.coerceToString(pos, *args[0], context, false, false)), context);
} }
static RegisterPrimOp primop_baseNameOf({ static RegisterPrimOp primop_baseNameOf({
@ -1441,7 +1441,7 @@ static void prim_dirOf(EvalState & state, const Pos & pos, Value * * args, Value
{ {
PathSet context; PathSet context;
Path dir = dirOf(state.coerceToString(pos, *args[0], context, false, false)); Path dir = dirOf(state.coerceToString(pos, *args[0], context, false, false));
if (args[0]->type() == nPath) mkPath(v, dir.c_str()); else mkString(v, dir, context); if (args[0]->type() == nPath) mkPath(v, dir.c_str()); else v.mkString(dir, context);
} }
static RegisterPrimOp primop_dirOf({ static RegisterPrimOp primop_dirOf({
@ -1470,7 +1470,7 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va
string s = readFile(path); string s = readFile(path);
if (s.find((char) 0) != string::npos) if (s.find((char) 0) != string::npos)
throw Error("the contents of the file '%1%' cannot be represented as a Nix string", path); throw Error("the contents of the file '%1%' cannot be represented as a Nix string", path);
mkString(v, s.c_str()); v.mkString(s);
} }
static RegisterPrimOp primop_readFile({ static RegisterPrimOp primop_readFile({
@ -1549,7 +1549,7 @@ static void prim_hashFile(EvalState & state, const Pos & pos, Value * * args, Va
throw EvalError("cannot read '%s' since path '%s' is not valid, at %s", path, e.path, pos); throw EvalError("cannot read '%s' since path '%s' is not valid, at %s", path, e.path, pos);
} }
mkString(v, hashFile(*ht, path).to_string(Base16, false)); v.mkString(hashFile(*ht, path).to_string(Base16, false));
} }
static RegisterPrimOp primop_hashFile({ static RegisterPrimOp primop_hashFile({
@ -1626,7 +1626,7 @@ static void prim_toXML(EvalState & state, const Pos & pos, Value * * args, Value
std::ostringstream out; std::ostringstream out;
PathSet context; PathSet context;
printValueAsXML(state, true, false, *args[0], out, context, pos); printValueAsXML(state, true, false, *args[0], out, context, pos);
mkString(v, out.str(), context); v.mkString(out.str(), context);
} }
static RegisterPrimOp primop_toXML({ static RegisterPrimOp primop_toXML({
@ -1734,7 +1734,7 @@ static void prim_toJSON(EvalState & state, const Pos & pos, Value * * args, Valu
std::ostringstream out; std::ostringstream out;
PathSet context; PathSet context;
printValueAsJSON(state, true, *args[0], pos, out, context); printValueAsJSON(state, true, *args[0], pos, out, context);
mkString(v, out.str(), context); v.mkString(out.str(), context);
} }
static RegisterPrimOp primop_toJSON({ static RegisterPrimOp primop_toJSON({
@ -1808,7 +1808,7 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu
result, since `storePath' itself has references to the paths result, since `storePath' itself has references to the paths
used in args[1]. */ used in args[1]. */
mkString(v, storePath, {storePath}); v.mkString(storePath, {storePath});
} }
static RegisterPrimOp primop_toFile({ static RegisterPrimOp primop_toFile({
@ -1925,10 +1925,10 @@ static void addPath(
/* Call the filter function. The first argument is the path, /* Call the filter function. The first argument is the path,
the second is a string indicating the type of the file. */ the second is a string indicating the type of the file. */
Value arg1; Value arg1;
mkString(arg1, path); arg1.mkString(path);
Value arg2; Value arg2;
mkString(arg2, arg2.mkString(
S_ISREG(st.st_mode) ? "regular" : S_ISREG(st.st_mode) ? "regular" :
S_ISDIR(st.st_mode) ? "directory" : S_ISDIR(st.st_mode) ? "directory" :
S_ISLNK(st.st_mode) ? "symlink" : S_ISLNK(st.st_mode) ? "symlink" :
@ -1955,7 +1955,7 @@ static void addPath(
} else } else
dstPath = state.store->printStorePath(*expectedStorePath); dstPath = state.store->printStorePath(*expectedStorePath);
mkString(v, dstPath, {dstPath}); v.mkString(dstPath, {dstPath});
state.allowPath(dstPath); state.allowPath(dstPath);
@ -3303,7 +3303,7 @@ static void prim_toString(EvalState & state, const Pos & pos, Value * * args, Va
{ {
PathSet context; PathSet context;
string s = state.coerceToString(pos, *args[0], context, true, false); string s = state.coerceToString(pos, *args[0], context, true, false);
mkString(v, s, context); v.mkString(s, context);
} }
static RegisterPrimOp primop_toString({ static RegisterPrimOp primop_toString({
@ -3347,7 +3347,7 @@ static void prim_substring(EvalState & state, const Pos & pos, Value * * args, V
.errPos = pos .errPos = pos
}); });
mkString(v, (unsigned int) start >= s.size() ? "" : string(s, start, len), context); v.mkString((unsigned int) start >= s.size() ? "" : string(s, start, len), context);
} }
static RegisterPrimOp primop_substring({ static RegisterPrimOp primop_substring({
@ -3401,7 +3401,7 @@ static void prim_hashString(EvalState & state, const Pos & pos, Value * * args,
PathSet context; // discarded PathSet context; // discarded
string s = state.forceString(*args[1], context, pos); string s = state.forceString(*args[1], context, pos);
mkString(v, hashString(*ht, s).to_string(Base16, false)); v.mkString(hashString(*ht, s).to_string(Base16, false));
} }
static RegisterPrimOp primop_hashString({ static RegisterPrimOp primop_hashString({
@ -3451,7 +3451,7 @@ void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v)
if (!match[i+1].matched) if (!match[i+1].matched)
mkNull(*(v.listElems()[i] = state.allocValue())); mkNull(*(v.listElems()[i] = state.allocValue()));
else else
mkString(*(v.listElems()[i] = state.allocValue()), match[i + 1].str().c_str()); (v.listElems()[i] = state.allocValue())->mkString(match[i + 1].str());
} }
} catch (std::regex_error &e) { } catch (std::regex_error &e) {
@ -3526,7 +3526,6 @@ static void prim_split(EvalState & state, const Pos & pos, Value * * args, Value
const size_t len = std::distance(begin, end); const size_t len = std::distance(begin, end);
state.mkList(v, 2 * len + 1); state.mkList(v, 2 * len + 1);
size_t idx = 0; size_t idx = 0;
Value * elem;
if (len == 0) { if (len == 0) {
v.listElems()[idx++] = args[1]; v.listElems()[idx++] = args[1];
@ -3538,12 +3537,11 @@ static void prim_split(EvalState & state, const Pos & pos, Value * * args, Value
std::smatch match = *i; std::smatch match = *i;
// Add a string for non-matched characters. // Add a string for non-matched characters.
elem = v.listElems()[idx++] = state.allocValue(); (v.listElems()[idx++] = state.allocValue())->mkString(match.prefix().str());
mkString(*elem, match.prefix().str().c_str());
// 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;
elem = v.listElems()[idx++] = state.allocValue(); auto elem = v.listElems()[idx++] = state.allocValue();
// Start at 1, beacause the first match is the whole string. // Start at 1, beacause the first match is the whole string.
state.mkList(*elem, slen); state.mkList(*elem, slen);
@ -3551,15 +3549,14 @@ static void prim_split(EvalState & state, const Pos & pos, Value * * args, Value
if (!match[si + 1].matched) if (!match[si + 1].matched)
mkNull(*(elem->listElems()[si] = state.allocValue())); mkNull(*(elem->listElems()[si] = state.allocValue()));
else else
mkString(*(elem->listElems()[si] = state.allocValue()), match[si + 1].str().c_str()); (elem->listElems()[si] = state.allocValue())->mkString(match[si + 1].str());
} }
// Add a string for non-matched suffix characters. // Add a string for non-matched suffix characters.
if (idx == 2 * len) { if (idx == 2 * len)
elem = v.listElems()[idx++] = state.allocValue(); (v.listElems()[idx++] = state.allocValue())->mkString(match.suffix().str());
mkString(*elem, match.suffix().str().c_str());
}
} }
assert(idx == 2 * len + 1); assert(idx == 2 * len + 1);
} catch (std::regex_error &e) { } catch (std::regex_error &e) {
@ -3631,7 +3628,7 @@ static void prim_concatStringsSep(EvalState & state, const Pos & pos, Value * *
res += state.coerceToString(pos, *elem, context); res += state.coerceToString(pos, *elem, context);
} }
mkString(v, res, context); v.mkString(res, context);
} }
static RegisterPrimOp primop_concatStringsSep({ static RegisterPrimOp primop_concatStringsSep({
@ -3700,7 +3697,7 @@ static void prim_replaceStrings(EvalState & state, const Pos & pos, Value * * ar
} }
} }
mkString(v, res, context); v.mkString(res, context);
} }
static RegisterPrimOp primop_replaceStrings({ static RegisterPrimOp primop_replaceStrings({
@ -3781,11 +3778,8 @@ static void prim_splitVersion(EvalState & state, const Pos & pos, Value * * args
components.emplace_back(std::move(component)); components.emplace_back(std::move(component));
} }
state.mkList(v, components.size()); state.mkList(v, components.size());
unsigned int n = 0; for (const auto & [n, component] : enumerate(components))
for (auto & component : components) { (v.listElems()[n] = state.allocValue())->mkString(std::move(component));
auto listElem = v.listElems()[n++] = state.allocValue();
mkString(*listElem, std::move(component));
}
} }
static RegisterPrimOp primop_splitVersion({ static RegisterPrimOp primop_splitVersion({
@ -3851,14 +3845,14 @@ void EvalState::createBaseEnv()
mkInt(v, time(0)); mkInt(v, time(0));
addConstant("__currentTime", v); addConstant("__currentTime", v);
mkString(v, settings.thisSystem.get()); v.mkString(settings.thisSystem.get());
addConstant("__currentSystem", v); addConstant("__currentSystem", v);
} }
mkString(v, nixVersion); v.mkString(nixVersion);
addConstant("__nixVersion", v); addConstant("__nixVersion", v);
mkString(v, store->storeDir); v.mkString(store->storeDir);
addConstant("__storeDir", v); addConstant("__storeDir", v);
/* Language version. This should be increased every time a new /* Language version. This should be increased every time a new

View file

@ -7,8 +7,7 @@ namespace nix {
static void prim_unsafeDiscardStringContext(EvalState & state, const Pos & pos, Value * * args, Value & v) static void prim_unsafeDiscardStringContext(EvalState & state, const Pos & pos, Value * * args, Value & v)
{ {
PathSet context; PathSet context;
string s = state.coerceToString(pos, *args[0], context); v.mkString(state.coerceToString(pos, *args[0], context));
mkString(v, s, PathSet());
} }
static RegisterPrimOp primop_unsafeDiscardStringContext("__unsafeDiscardStringContext", 1, prim_unsafeDiscardStringContext); static RegisterPrimOp primop_unsafeDiscardStringContext("__unsafeDiscardStringContext", 1, prim_unsafeDiscardStringContext);
@ -39,7 +38,7 @@ static void prim_unsafeDiscardOutputDependency(EvalState & state, const Pos & po
for (auto & p : context) for (auto & p : context)
context2.insert(p.at(0) == '=' ? string(p, 1) : p); context2.insert(p.at(0) == '=' ? string(p, 1) : p);
mkString(v, s, context2); v.mkString(s, context2);
} }
static RegisterPrimOp primop_unsafeDiscardOutputDependency("__unsafeDiscardOutputDependency", 1, prim_unsafeDiscardOutputDependency); static RegisterPrimOp primop_unsafeDiscardOutputDependency("__unsafeDiscardOutputDependency", 1, prim_unsafeDiscardOutputDependency);
@ -186,7 +185,7 @@ static void prim_appendContext(EvalState & state, const Pos & pos, Value * * arg
} }
} }
mkString(v, orig, context); v.mkString(orig, context);
} }
static RegisterPrimOp primop_appendContext("__appendContext", 2, prim_appendContext); static RegisterPrimOp primop_appendContext("__appendContext", 2, prim_appendContext);

View file

@ -247,7 +247,7 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
state.allowPath(storePath); state.allowPath(storePath);
auto path = state.store->printStorePath(storePath); auto path = state.store->printStorePath(storePath);
mkString(v, path, PathSet({path})); v.mkString(path, PathSet({path}));
} }
static void prim_fetchurl(EvalState & state, const Pos & pos, Value * * args, Value & v) static void prim_fetchurl(EvalState & state, const Pos & pos, Value * * args, Value & v)

View file

@ -52,7 +52,7 @@ static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Va
mkFloat(v, toml::get<NixFloat>(t)); mkFloat(v, toml::get<NixFloat>(t));
break;; break;;
case toml::value_t::string: case toml::value_t::string:
mkString(v, toml::get<std::string>(t)); v.mkString(toml::get<std::string>(t));
break;; break;;
case toml::value_t::local_datetime: case toml::value_t::local_datetime:
case toml::value_t::offset_datetime: case toml::value_t::offset_datetime:

View file

@ -424,9 +424,6 @@ static inline void mkString(Value & v, const Symbol & s)
} }
void mkString(Value & v, const char * s);
void mkPath(Value & v, const char * s); void mkPath(Value & v, const char * s);

View file

@ -678,8 +678,8 @@ static void opUpgrade(Globals & globals, Strings opFlags, Strings opArgs)
static void setMetaFlag(EvalState & state, DrvInfo & drv, static void setMetaFlag(EvalState & state, DrvInfo & drv,
const string & name, const string & value) const string & name, const string & value)
{ {
Value * v = state.allocValue(); auto v = state.allocValue();
mkString(*v, value.c_str()); v->mkString(value);
drv.setMeta(name, v); drv.setMeta(name, v);
} }