Fix GC bug in ExprPath

This commit is contained in:
Eelco Dolstra 2022-05-12 20:37:18 +02:00
parent 9e05daaa9e
commit 9411299875
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 19 additions and 14 deletions

View file

@ -890,10 +890,7 @@ void Value::mkStringMove(const char * s, const PathSet & context)
void Value::mkPath(const SourcePath & path) void Value::mkPath(const SourcePath & path)
{ {
clearValue(); mkPath(&path.accessor, makeImmutableString(path.path));
internalType = tPath;
_path.accessor = &path.accessor;
_path.path = makeImmutableString(path.path);
} }

View file

@ -50,16 +50,16 @@ struct Env
void copyContext(const Value & v, PathSet & context); void copyContext(const Value & v, PathSet & context);
// FIXME: maybe change this to an std::variant<SourcePath, URL>.
typedef std::pair<std::string, std::string> SearchPathElem;
typedef std::list<SearchPathElem> SearchPath;
std::ostream & printValue(const EvalState & state, std::ostream & str, const Value & v); std::ostream & printValue(const EvalState & state, std::ostream & str, const Value & v);
std::string printValue(const EvalState & state, const Value & v); std::string printValue(const EvalState & state, const Value & v);
std::ostream & operator << (std::ostream & os, const ValueType t); std::ostream & operator << (std::ostream & os, const ValueType t);
// FIXME: maybe change this to an std::variant<SourcePath, URL>.
typedef std::pair<std::string, std::string> SearchPathElem;
typedef std::list<SearchPathElem> SearchPath;
/* Initialise the Boehm GC, if applicable. */ /* Initialise the Boehm GC, if applicable. */
void initGC(); void initGC();

View file

@ -73,7 +73,7 @@ void ExprString::show(const SymbolTable & symbols, std::ostream & str) const
void ExprPath::show(const SymbolTable & symbols, std::ostream & str) const void ExprPath::show(const SymbolTable & symbols, std::ostream & str) const
{ {
str << s; str << path;
} }
void ExprVar::show(const SymbolTable & symbols, std::ostream & str) const void ExprVar::show(const SymbolTable & symbols, std::ostream & str) const

View file

@ -183,12 +183,12 @@ struct ExprString : Expr
struct ExprPath : Expr struct ExprPath : Expr
{ {
std::string s; // FIXME: remove const SourcePath path;
Value v; Value v;
ExprPath(SourcePath && path) ExprPath(SourcePath && _path)
: s(path.path) : path(_path)
{ {
v.mkPath(std::move(path)); v.mkPath(&path.accessor, path.path.c_str());
} }
COMMON_METHODS COMMON_METHODS
Value * maybeThunk(EvalState & state, Env & env); Value * maybeThunk(EvalState & state, Env & env);

View file

@ -263,6 +263,14 @@ public:
void mkPath(const SourcePath & path); void mkPath(const SourcePath & path);
inline void mkPath(InputAccessor * accessor, const char * path)
{
clearValue();
internalType = tPath;
_path.accessor = accessor;
_path.path = path;
}
inline void mkNull() inline void mkNull()
{ {
clearValue(); clearValue();