mirror of
https://github.com/NixOS/nix.git
synced 2025-11-15 15:02:42 +01:00
Garbage-collect paths
This commit is contained in:
parent
2995f9c48f
commit
6d118419f2
8 changed files with 14 additions and 44 deletions
|
|
@ -24,19 +24,6 @@ namespace nix {
|
|||
SymbolTable symbols;
|
||||
|
||||
|
||||
unsigned long stringBytes = 0;
|
||||
|
||||
// FIXME
|
||||
static char * dupString(const char * s)
|
||||
{
|
||||
char * t;
|
||||
stringBytes += strlen(s) + 1;
|
||||
t = strdup(s);
|
||||
if (!t) throw std::bad_alloc();
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
static void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v)
|
||||
{
|
||||
checkInterrupt();
|
||||
|
|
@ -67,7 +54,7 @@ static void printValue(std::ostream & str, std::set<const Value *> & active, con
|
|||
str << "\"";
|
||||
break;
|
||||
case tPath:
|
||||
str << v.path; // !!! escaping?
|
||||
str << v.path->s; // !!! escaping?
|
||||
break;
|
||||
case tNull:
|
||||
str << "null";
|
||||
|
|
@ -500,12 +487,6 @@ Value & mkString(Value & v, const string & s, const PathSet & context)
|
|||
}
|
||||
|
||||
|
||||
void mkPath(Value & v, const char * s)
|
||||
{
|
||||
mkPathNoCopy(v, dupString(s));
|
||||
}
|
||||
|
||||
|
||||
inline Value * EvalState::lookupVar(Env * env, const ExprVar & var, bool noEval)
|
||||
{
|
||||
for (size_t l = var.level; l; --l, env = env->up) ;
|
||||
|
|
@ -1492,7 +1473,7 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context,
|
|||
}
|
||||
|
||||
if (v.type == tPath) {
|
||||
Path path(canonPath(v.path));
|
||||
Path path(canonPath(v.path->s));
|
||||
return copyToStore ? copyPathToStore(context, path) : path;
|
||||
}
|
||||
|
||||
|
|
@ -1603,7 +1584,7 @@ bool EvalState::eqValues(Value & v1, Value & v2)
|
|||
return v1.boolean == v2.boolean;
|
||||
|
||||
case tPath:
|
||||
return strcmp(v1.path, v2.path) == 0;
|
||||
return strcmp(v1.path->s, v2.path->s) == 0;
|
||||
|
||||
case tNull:
|
||||
return true;
|
||||
|
|
@ -1719,7 +1700,6 @@ void EvalState::printStats()
|
|||
topObj.attr("nrLookups", nrLookups);
|
||||
topObj.attr("nrPrimOpCalls", nrPrimOpCalls);
|
||||
topObj.attr("nrFunctionCalls", nrFunctionCalls);
|
||||
topObj.attr("stringBytes", stringBytes);
|
||||
|
||||
if (countCalls) {
|
||||
{
|
||||
|
|
@ -1770,12 +1750,6 @@ size_t valueSize(Value & v)
|
|||
{
|
||||
std::set<const void *> seen;
|
||||
|
||||
auto doString = [&](const char * s) -> size_t {
|
||||
if (seen.find(s) != seen.end()) return 0;
|
||||
seen.insert(s);
|
||||
return strlen(s) + 1;
|
||||
};
|
||||
|
||||
std::function<size_t(Value & v)> doValue;
|
||||
std::function<size_t(Env & v)> doEnv;
|
||||
|
||||
|
|
@ -1790,7 +1764,7 @@ size_t valueSize(Value & v)
|
|||
sz += v.string.s->words() * WORD_SIZE;
|
||||
break;
|
||||
case tPath:
|
||||
sz += doString(v.path);
|
||||
sz += v.path->words() * WORD_SIZE;
|
||||
break;
|
||||
case tAttrs:
|
||||
if (seen.find(v.attrs) == seen.end()) {
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ void GC::gc()
|
|||
}
|
||||
|
||||
case tPath:
|
||||
// FIXME
|
||||
push(((Value *) obj)->path);
|
||||
break;
|
||||
|
||||
case tAttrs:
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ void ExprString::show(std::ostream & str) const
|
|||
|
||||
void ExprPath::show(std::ostream & str) const
|
||||
{
|
||||
str << s;
|
||||
str << v->path->s;
|
||||
}
|
||||
|
||||
void ExprVar::show(std::ostream & str) const
|
||||
|
|
|
|||
|
|
@ -134,11 +134,10 @@ struct ExprIndStr : Expr
|
|||
|
||||
struct ExprPath : Expr
|
||||
{
|
||||
string s;
|
||||
Ptr<Value> v;
|
||||
ExprPath(const string & s) : s(s) {
|
||||
ExprPath(const string & s) {
|
||||
v = gc.alloc<Value>(Value::words());
|
||||
mkPathNoCopy(v, this->s.c_str());
|
||||
mkPath(v, s);
|
||||
};
|
||||
COMMON_METHODS
|
||||
Ptr<Value> maybeThunk(EvalState & state, Env & env) override;
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@ struct CompareValues
|
|||
case tFloat:
|
||||
return v1->fpoint < v2->fpoint;
|
||||
case tPath:
|
||||
return strcmp(v1->path, v2->path) < 0;
|
||||
return strcmp(v1->path->s, v2->path->s) < 0;
|
||||
default:
|
||||
throw EvalError(format("cannot compare %1% with %2%") % showType(*v1) % showType(*v2));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ void printValueAsJSON(EvalState & state, bool strict,
|
|||
break;
|
||||
|
||||
case tPath:
|
||||
out.write(state.copyPathToStore(context, v.path));
|
||||
out.write(state.copyPathToStore(context, v.path->s));
|
||||
break;
|
||||
|
||||
case tNull:
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ static void printValueAsXML(EvalState & state, bool strict, bool location,
|
|||
break;
|
||||
|
||||
case tPath:
|
||||
doc.writeEmptyElement("path", singletonAttrs("value", v.path));
|
||||
doc.writeEmptyElement("path", singletonAttrs("value", v.path->s));
|
||||
break;
|
||||
|
||||
case tNull:
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ struct Value : Object
|
|||
Context * context;
|
||||
} string;
|
||||
const char * staticString;
|
||||
const char * path;
|
||||
String * path;
|
||||
Bindings * attrs;
|
||||
PtrList<Value> * bigList;
|
||||
Value * smallList[2];
|
||||
|
|
@ -288,16 +288,13 @@ static inline void mkString(Value & v, const Symbol & s)
|
|||
}
|
||||
|
||||
|
||||
static inline void mkPathNoCopy(Value & v, const char * s)
|
||||
static inline void mkPath(Value & v, const std::string & s)
|
||||
{
|
||||
v.path = String::alloc(s.c_str());
|
||||
v.type = tPath;
|
||||
v.path = s;
|
||||
}
|
||||
|
||||
|
||||
void mkPath(Value & v, const char * s);
|
||||
|
||||
|
||||
/* Compute the size in bytes of the given value, including all values
|
||||
and environments reachable from it. Static expressions (Exprs) are
|
||||
not included. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue