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)
{
clearValue();
internalType = tPath;
_path.accessor = &path.accessor;
_path.path = makeImmutableString(path.path);
mkPath(&path.accessor, makeImmutableString(path.path));
}

View file

@ -50,16 +50,16 @@ struct Env
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::string printValue(const EvalState & state, const Value & v);
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. */
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
{
str << s;
str << path;
}
void ExprVar::show(const SymbolTable & symbols, std::ostream & str) const

View file

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

View file

@ -263,6 +263,14 @@ public:
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()
{
clearValue();