2012-07-18 21:59:03 +03:00
|
|
|
|
#pragma once
|
2003-10-30 18:48:26 +02:00
|
|
|
|
|
2012-01-07 19:26:33 +02:00
|
|
|
|
#include "value.hh"
|
2003-11-18 14:06:07 +02:00
|
|
|
|
#include "nixexpr.hh"
|
2010-04-13 15:25:42 +03:00
|
|
|
|
#include "symbol-table.hh"
|
2010-10-04 13:51:16 +03:00
|
|
|
|
#include "hash.hh"
|
2003-10-30 18:48:26 +02:00
|
|
|
|
|
2010-10-04 20:55:38 +03:00
|
|
|
|
#include <map>
|
|
|
|
|
|
2010-10-22 16:39:15 +03:00
|
|
|
|
#if HAVE_BOEHMGC
|
2010-10-20 14:38:30 +03:00
|
|
|
|
#include <gc/gc_allocator.h>
|
2010-10-22 16:39:15 +03:00
|
|
|
|
#endif
|
2010-10-20 14:38:30 +03:00
|
|
|
|
|
2003-10-30 18:48:26 +02:00
|
|
|
|
|
2006-09-05 00:06:23 +03:00
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
class EvalState;
|
|
|
|
|
|
2010-10-24 03:41:29 +03:00
|
|
|
|
|
2014-09-19 17:49:41 +03:00
|
|
|
|
struct Attr
|
|
|
|
|
{
|
|
|
|
|
Symbol name;
|
|
|
|
|
Value * value;
|
|
|
|
|
Pos * pos;
|
|
|
|
|
Attr(Symbol name, Value * value, Pos * pos = &noPos)
|
|
|
|
|
: name(name), value(value), pos(pos) { };
|
|
|
|
|
Attr() : pos(&noPos) { };
|
|
|
|
|
bool operator < (const Attr & a) const
|
|
|
|
|
{
|
|
|
|
|
return name < a.name;
|
|
|
|
|
}
|
|
|
|
|
};
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
|
|
|
|
|
2014-09-19 17:49:41 +03:00
|
|
|
|
class Bindings
|
2010-10-24 03:41:29 +03:00
|
|
|
|
{
|
|
|
|
|
public:
|
2014-09-19 17:49:41 +03:00
|
|
|
|
typedef uint32_t size_t;
|
|
|
|
|
|
|
|
|
|
private:
|
2015-01-15 13:15:22 +02:00
|
|
|
|
size_t size_, capacity_;
|
2014-09-19 17:49:41 +03:00
|
|
|
|
Attr attrs[0];
|
|
|
|
|
|
2015-01-15 13:15:22 +02:00
|
|
|
|
Bindings(size_t capacity) : size_(0), capacity_(capacity) { }
|
2014-09-24 16:29:05 +03:00
|
|
|
|
Bindings(const Bindings & bindings) = delete;
|
2014-09-19 17:49:41 +03:00
|
|
|
|
|
|
|
|
|
public:
|
2014-09-24 16:29:05 +03:00
|
|
|
|
size_t size() const { return size_; }
|
2014-09-19 17:49:41 +03:00
|
|
|
|
|
2014-09-24 16:29:05 +03:00
|
|
|
|
bool empty() const { return !size_; }
|
2014-09-19 17:49:41 +03:00
|
|
|
|
|
|
|
|
|
typedef Attr * iterator;
|
|
|
|
|
|
|
|
|
|
void push_back(const Attr & attr)
|
|
|
|
|
{
|
2015-01-15 13:15:22 +02:00
|
|
|
|
assert(size_ < capacity_);
|
2014-09-19 17:49:41 +03:00
|
|
|
|
attrs[size_++] = attr;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-19 17:56:13 +03:00
|
|
|
|
iterator find(const Symbol & name)
|
|
|
|
|
{
|
|
|
|
|
Attr key(name, 0);
|
|
|
|
|
iterator i = std::lower_bound(begin(), end(), key);
|
|
|
|
|
if (i != end() && i->name == name) return i;
|
|
|
|
|
return end();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-19 17:49:41 +03:00
|
|
|
|
iterator begin() { return &attrs[0]; }
|
|
|
|
|
iterator end() { return &attrs[size_]; }
|
|
|
|
|
|
|
|
|
|
Attr & operator[](size_t pos)
|
|
|
|
|
{
|
|
|
|
|
return attrs[pos];
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-24 22:52:33 +03:00
|
|
|
|
void sort();
|
2014-09-19 17:49:41 +03:00
|
|
|
|
|
2015-01-15 13:15:22 +02:00
|
|
|
|
size_t capacity() { return capacity_; }
|
|
|
|
|
|
2014-09-19 17:49:41 +03:00
|
|
|
|
friend class EvalState;
|
2010-10-24 03:41:29 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2014-04-04 19:51:01 +03:00
|
|
|
|
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
|
2010-10-23 23:07:47 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct PrimOp
|
|
|
|
|
{
|
|
|
|
|
PrimOpFun fun;
|
|
|
|
|
unsigned int arity;
|
|
|
|
|
Symbol name;
|
|
|
|
|
PrimOp(PrimOpFun fun, unsigned int arity, Symbol name)
|
|
|
|
|
: fun(fun), arity(arity), name(name) { }
|
|
|
|
|
};
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
|
|
|
|
|
2010-04-14 17:42:32 +03:00
|
|
|
|
struct Env
|
|
|
|
|
{
|
|
|
|
|
Env * up;
|
2014-09-22 15:46:42 +03:00
|
|
|
|
unsigned short size; // used by ‘valueSize’
|
|
|
|
|
unsigned short prevWith:15; // nr of levels up to next `with' environment
|
|
|
|
|
unsigned short haveWithAttrs:1;
|
2010-10-22 18:51:52 +03:00
|
|
|
|
Value * values[0];
|
2010-04-14 17:42:32 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2010-03-31 01:39:48 +03:00
|
|
|
|
void mkString(Value & v, const string & s, const PathSet & context = PathSet());
|
2010-03-30 12:22:33 +03:00
|
|
|
|
|
2010-06-10 13:29:50 +03:00
|
|
|
|
void copyContext(const Value & v, PathSet & context);
|
|
|
|
|
|
2010-03-30 12:22:33 +03:00
|
|
|
|
|
2006-03-09 17:09:18 +02:00
|
|
|
|
/* Cache for calls to addToStore(); maps source paths to the store
|
|
|
|
|
paths. */
|
2006-09-05 00:06:23 +03:00
|
|
|
|
typedef std::map<Path, Path> SrcToStore;
|
2006-03-09 17:09:18 +02:00
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
2010-05-18 13:36:37 +03:00
|
|
|
|
std::ostream & operator << (std::ostream & str, const Value & v);
|
2004-02-04 18:03:29 +02:00
|
|
|
|
|
|
|
|
|
|
2014-05-26 18:02:22 +03:00
|
|
|
|
typedef list<std::pair<string, Path> > SearchPath;
|
|
|
|
|
|
|
|
|
|
|
2013-09-02 17:29:15 +03:00
|
|
|
|
class EvalState
|
2003-10-30 18:48:26 +02:00
|
|
|
|
{
|
2010-03-31 18:38:03 +03:00
|
|
|
|
public:
|
2010-04-13 15:25:42 +03:00
|
|
|
|
SymbolTable symbols;
|
|
|
|
|
|
2013-10-28 08:34:44 +02:00
|
|
|
|
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
|
2013-11-18 21:14:54 +02:00
|
|
|
|
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
|
2014-10-16 05:04:48 +03:00
|
|
|
|
sFile, sLine, sColumn, sFunctor;
|
2013-10-17 12:47:38 +03:00
|
|
|
|
Symbol sDerivationNix;
|
2010-04-13 15:25:42 +03:00
|
|
|
|
|
2012-10-03 22:09:18 +03:00
|
|
|
|
/* If set, force copying files to the Nix store even if they
|
|
|
|
|
already exist there. */
|
|
|
|
|
bool repair;
|
|
|
|
|
|
2015-02-23 15:41:53 +02:00
|
|
|
|
/* If set, don't allow access to files outside of the Nix search
|
|
|
|
|
path or to environment variables. */
|
|
|
|
|
bool restricted;
|
|
|
|
|
|
2010-03-31 18:38:03 +03:00
|
|
|
|
private:
|
2013-09-02 17:29:15 +03:00
|
|
|
|
SrcToStore srcToStore;
|
2003-10-30 18:48:26 +02:00
|
|
|
|
|
2011-08-06 22:45:43 +03:00
|
|
|
|
/* A cache from path names to values. */
|
|
|
|
|
#if HAVE_BOEHMGC
|
2014-08-21 01:05:17 +03:00
|
|
|
|
typedef std::map<Path, Value, std::less<Path>, traceable_allocator<std::pair<const Path, Value> > > FileEvalCache;
|
2011-08-06 22:45:43 +03:00
|
|
|
|
#else
|
|
|
|
|
typedef std::map<Path, Value> FileEvalCache;
|
|
|
|
|
#endif
|
|
|
|
|
FileEvalCache fileEvalCache;
|
|
|
|
|
|
2011-08-06 20:48:57 +03:00
|
|
|
|
SearchPath searchPath;
|
2011-08-06 19:05:24 +03:00
|
|
|
|
|
2010-03-30 18:18:20 +03:00
|
|
|
|
public:
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2014-05-26 17:50:36 +03:00
|
|
|
|
EvalState(const Strings & _searchPath);
|
2010-04-09 15:00:49 +03:00
|
|
|
|
~EvalState();
|
2004-02-04 18:03:29 +02:00
|
|
|
|
|
2014-02-26 16:21:56 +02:00
|
|
|
|
void addToSearchPath(const string & s, bool warn = false);
|
2011-08-06 19:05:24 +03:00
|
|
|
|
|
2015-02-23 15:41:53 +02:00
|
|
|
|
Path checkSourcePath(const Path & path);
|
|
|
|
|
|
2013-09-03 13:56:33 +03:00
|
|
|
|
/* Parse a Nix expression from the specified file. */
|
|
|
|
|
Expr * parseExprFromFile(const Path & path);
|
Add primop ‘scopedImport’
‘scopedImport’ works like ‘import’, except that it takes a set of
attributes to be added to the lexical scope of the expression,
essentially extending or overriding the builtin variables. For
instance, the expression
scopedImport { x = 1; } ./foo.nix
where foo.nix contains ‘x’, will evaluate to 1.
This has a few applications:
* It allows getting rid of function argument specifications in package
expressions. For instance, a package expression like:
{ stdenv, fetchurl, libfoo }:
stdenv.mkDerivation { ... buildInputs = [ libfoo ]; }
can now we written as just
stdenv.mkDerivation { ... buildInputs = [ libfoo ]; }
and imported in all-packages.nix as:
bar = scopedImport pkgs ./bar.nix;
So whereas we once had dependencies listed in three places
(buildInputs, the function, and the call site), they now only need
to appear in one place.
* It allows overriding builtin functions. For instance, to trace all
calls to ‘map’:
let
overrides = {
map = f: xs: builtins.trace "map called!" (map f xs);
# Ensure that our override gets propagated by calls to
# import/scopedImport.
import = fn: scopedImport overrides fn;
scopedImport = attrs: fn: scopedImport (overrides // attrs) fn;
# Also update ‘builtins’.
builtins = builtins // overrides;
};
in scopedImport overrides ./bla.nix
* Similarly, it allows extending the set of builtin functions. For
instance, during Nixpkgs/NixOS evaluation, the Nixpkgs library
functions could be added to the default scope.
There is a downside: calls to scopedImport are not memoized, unlike
import. So importing a file multiple times leads to multiple parsings
/ evaluations. It would be possible to construct the AST only once,
but that would require careful handling of variables/environments.
2014-05-26 14:46:11 +03:00
|
|
|
|
Expr * parseExprFromFile(const Path & path, StaticEnv & staticEnv);
|
2011-08-06 16:02:55 +03:00
|
|
|
|
|
|
|
|
|
/* Parse a Nix expression from the specified string. */
|
2013-09-02 19:34:04 +03:00
|
|
|
|
Expr * parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv);
|
2011-08-06 16:02:55 +03:00
|
|
|
|
Expr * parseExprFromString(const string & s, const Path & basePath);
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2010-03-30 12:22:33 +03:00
|
|
|
|
/* Evaluate an expression read from the given file to normal
|
|
|
|
|
form. */
|
|
|
|
|
void evalFile(const Path & path, Value & v);
|
|
|
|
|
|
2013-09-02 19:34:04 +03:00
|
|
|
|
void resetFileCache();
|
|
|
|
|
|
2011-08-06 19:05:24 +03:00
|
|
|
|
/* Look up a file in the search path. */
|
|
|
|
|
Path findFile(const string & path);
|
2015-01-07 14:43:55 +02:00
|
|
|
|
Path findFile(SearchPath & searchPath, const string & path, const Pos & pos = noPos);
|
2011-08-06 19:05:24 +03:00
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
/* Evaluate an expression to normal form, storing the result in
|
|
|
|
|
value `v'. */
|
2010-04-12 21:30:11 +03:00
|
|
|
|
void eval(Expr * e, Value & v);
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
|
|
|
|
/* Evaluation the expression, then verify that it has the expected
|
|
|
|
|
type. */
|
2012-02-04 15:50:25 +02:00
|
|
|
|
inline bool evalBool(Env & env, Expr * e);
|
2014-04-04 23:43:52 +03:00
|
|
|
|
inline bool evalBool(Env & env, Expr * e, const Pos & pos);
|
2012-02-04 15:50:25 +02:00
|
|
|
|
inline void evalAttrs(Env & env, Expr * e, Value & v);
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
|
|
|
|
/* If `v' is a thunk, enter it and overwrite `v' with the result
|
2010-03-30 16:47:59 +03:00
|
|
|
|
of the evaluation of the thunk. If `v' is a delayed function
|
|
|
|
|
application, call the function and overwrite `v' with the
|
|
|
|
|
result. Otherwise, this is a no-op. */
|
2012-02-04 15:50:25 +02:00
|
|
|
|
inline void forceValue(Value & v);
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
2010-04-07 16:55:46 +03:00
|
|
|
|
/* Force a value, then recursively force list elements and
|
|
|
|
|
attributes. */
|
2014-09-22 16:03:59 +03:00
|
|
|
|
void forceValueDeep(Value & v);
|
2010-04-07 16:55:46 +03:00
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
/* Force `v', and then verify that it has the expected type. */
|
2014-04-04 19:58:15 +03:00
|
|
|
|
NixInt forceInt(Value & v, const Pos & pos);
|
2010-03-31 18:38:03 +03:00
|
|
|
|
bool forceBool(Value & v);
|
2012-02-04 15:50:25 +02:00
|
|
|
|
inline void forceAttrs(Value & v);
|
2014-04-04 20:11:40 +03:00
|
|
|
|
inline void forceAttrs(Value & v, const Pos & pos);
|
2012-02-04 15:50:25 +02:00
|
|
|
|
inline void forceList(Value & v);
|
2014-04-04 20:05:36 +03:00
|
|
|
|
inline void forceList(Value & v, const Pos & pos);
|
|
|
|
|
void forceFunction(Value & v, const Pos & pos); // either lambda or primop
|
2014-04-04 22:14:11 +03:00
|
|
|
|
string forceString(Value & v, const Pos & pos = noPos);
|
2014-11-25 11:23:36 +02:00
|
|
|
|
string forceString(Value & v, PathSet & context, const Pos & pos = noPos);
|
2014-04-04 22:14:11 +03:00
|
|
|
|
string forceStringNoCtx(Value & v, const Pos & pos = noPos);
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
2010-04-07 16:55:46 +03:00
|
|
|
|
/* Return true iff the value `v' denotes a derivation (i.e. a
|
|
|
|
|
set with attribute `type = "derivation"'). */
|
|
|
|
|
bool isDerivation(Value & v);
|
|
|
|
|
|
2010-03-30 12:22:33 +03:00
|
|
|
|
/* String coercion. Converts strings, paths and derivations to a
|
|
|
|
|
string. If `coerceMore' is set, also converts nulls, integers,
|
|
|
|
|
booleans and lists to a string. If `copyToStore' is set,
|
2013-08-14 23:32:49 +03:00
|
|
|
|
referenced paths are copied to the Nix store as a side effect. */
|
2014-04-04 23:19:33 +03:00
|
|
|
|
string coerceToString(const Pos & pos, Value & v, PathSet & context,
|
2010-03-30 12:22:33 +03:00
|
|
|
|
bool coerceMore = false, bool copyToStore = true);
|
|
|
|
|
|
2013-11-19 01:03:11 +02:00
|
|
|
|
string copyPathToStore(PathSet & context, const Path & path);
|
|
|
|
|
|
2010-03-30 12:22:33 +03:00
|
|
|
|
/* Path coercion. Converts strings, paths and derivations to a
|
|
|
|
|
path. The result is guaranteed to be a canonicalised, absolute
|
|
|
|
|
path. Nothing is copied to the store. */
|
2014-04-04 23:19:33 +03:00
|
|
|
|
Path coerceToPath(const Pos & pos, Value & v, PathSet & context);
|
2010-03-30 12:22:33 +03:00
|
|
|
|
|
2013-09-02 19:34:04 +03:00
|
|
|
|
public:
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
|
|
|
|
/* The base environment, containing the builtin functions and
|
|
|
|
|
values. */
|
|
|
|
|
Env & baseEnv;
|
|
|
|
|
|
2010-04-15 01:59:39 +03:00
|
|
|
|
/* The same, but used during parsing to resolve variables. */
|
|
|
|
|
StaticEnv staticBaseEnv; // !!! should be private
|
|
|
|
|
|
|
|
|
|
private:
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2013-09-02 19:34:04 +03:00
|
|
|
|
unsigned int baseEnvDispl;
|
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
void createBaseEnv();
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2010-03-30 17:39:27 +03:00
|
|
|
|
void addConstant(const string & name, Value & v);
|
|
|
|
|
|
2004-08-04 13:59:20 +03:00
|
|
|
|
void addPrimOp(const string & name,
|
2010-10-23 23:07:47 +03:00
|
|
|
|
unsigned int arity, PrimOpFun primOp);
|
2010-03-29 17:37:56 +03:00
|
|
|
|
|
2013-09-03 16:45:32 +03:00
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
void getBuiltin(const string & name, Value & v);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
2013-10-08 15:24:53 +03:00
|
|
|
|
inline Value * lookupVar(Env * env, const ExprVar & var, bool noEval);
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2014-01-21 19:29:55 +02:00
|
|
|
|
friend struct ExprVar;
|
|
|
|
|
friend struct ExprAttrs;
|
|
|
|
|
friend struct ExprLet;
|
2010-04-13 15:25:42 +03:00
|
|
|
|
|
2013-09-02 19:34:04 +03:00
|
|
|
|
Expr * parse(const char * text, const Path & path,
|
|
|
|
|
const Path & basePath, StaticEnv & staticEnv);
|
2011-08-06 16:02:55 +03:00
|
|
|
|
|
2010-04-12 21:30:11 +03:00
|
|
|
|
public:
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
/* Do a deep equality test between two values. That is, list
|
|
|
|
|
elements and attributes are compared recursively. */
|
|
|
|
|
bool eqValues(Value & v1, Value & v2);
|
|
|
|
|
|
2014-04-04 18:53:52 +03:00
|
|
|
|
void callFunction(Value & fun, Value & arg, Value & v, const Pos & pos);
|
2014-04-04 19:51:01 +03:00
|
|
|
|
void callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos);
|
2010-04-07 16:55:46 +03:00
|
|
|
|
|
2010-04-07 18:47:06 +03:00
|
|
|
|
/* Automatically call a function for which each argument has a
|
|
|
|
|
default value or has a binding in the `args' map. */
|
2010-10-22 17:47:42 +03:00
|
|
|
|
void autoCallFunction(Bindings & args, Value & fun, Value & res);
|
2013-09-02 17:29:15 +03:00
|
|
|
|
|
2010-03-29 17:37:56 +03:00
|
|
|
|
/* Allocation primitives. */
|
2010-10-22 17:47:42 +03:00
|
|
|
|
Value * allocValue();
|
2010-04-14 17:42:32 +03:00
|
|
|
|
Env & allocEnv(unsigned int size);
|
2010-03-30 17:39:27 +03:00
|
|
|
|
|
2010-10-22 17:47:42 +03:00
|
|
|
|
Value * allocAttr(Value & vAttrs, const Symbol & name);
|
|
|
|
|
|
2014-09-19 17:49:41 +03:00
|
|
|
|
Bindings * allocBindings(Bindings::size_t capacity);
|
|
|
|
|
|
2010-03-30 17:39:27 +03:00
|
|
|
|
void mkList(Value & v, unsigned int length);
|
2010-10-24 23:09:37 +03:00
|
|
|
|
void mkAttrs(Value & v, unsigned int expected);
|
2010-04-12 21:30:11 +03:00
|
|
|
|
void mkThunk_(Value & v, Expr * expr);
|
2013-11-18 23:22:35 +02:00
|
|
|
|
void mkPos(Value & v, Pos * pos);
|
2010-10-24 17:20:02 +03:00
|
|
|
|
|
2014-04-04 23:43:52 +03:00
|
|
|
|
void concatLists(Value & v, unsigned int nrLists, Value * * lists, const Pos & pos);
|
2012-08-13 08:53:10 +03:00
|
|
|
|
|
2010-03-30 18:18:20 +03:00
|
|
|
|
/* Print statistics. */
|
|
|
|
|
void printStats();
|
2010-04-09 15:00:49 +03:00
|
|
|
|
|
|
|
|
|
private:
|
2012-08-13 06:41:48 +03:00
|
|
|
|
|
2010-04-09 15:00:49 +03:00
|
|
|
|
unsigned long nrEnvs;
|
2010-04-15 02:48:46 +03:00
|
|
|
|
unsigned long nrValuesInEnvs;
|
|
|
|
|
unsigned long nrValues;
|
2010-04-15 03:37:36 +03:00
|
|
|
|
unsigned long nrListElems;
|
2010-10-20 18:48:00 +03:00
|
|
|
|
unsigned long nrAttrsets;
|
2014-09-19 17:49:41 +03:00
|
|
|
|
unsigned long nrAttrsInAttrsets;
|
2010-10-20 18:48:00 +03:00
|
|
|
|
unsigned long nrOpUpdates;
|
|
|
|
|
unsigned long nrOpUpdateValuesCopied;
|
2012-08-13 06:41:48 +03:00
|
|
|
|
unsigned long nrListConcats;
|
|
|
|
|
unsigned long nrPrimOpCalls;
|
|
|
|
|
unsigned long nrFunctionCalls;
|
2012-08-13 06:29:28 +03:00
|
|
|
|
|
|
|
|
|
bool countCalls;
|
|
|
|
|
|
|
|
|
|
typedef std::map<Symbol, unsigned int> PrimOpCalls;
|
|
|
|
|
PrimOpCalls primOpCalls;
|
|
|
|
|
|
2013-08-02 21:29:23 +03:00
|
|
|
|
typedef std::map<ExprLambda *, unsigned int> FunctionCalls;
|
2012-08-13 06:29:28 +03:00
|
|
|
|
FunctionCalls functionCalls;
|
|
|
|
|
|
2013-11-07 19:04:36 +02:00
|
|
|
|
void incrFunctionCall(ExprLambda * fun);
|
|
|
|
|
|
2012-08-13 06:29:28 +03:00
|
|
|
|
typedef std::map<Pos, unsigned int> AttrSelects;
|
|
|
|
|
AttrSelects attrSelects;
|
|
|
|
|
|
2014-01-21 19:29:55 +02:00
|
|
|
|
friend struct ExprOpUpdate;
|
|
|
|
|
friend struct ExprOpConcatLists;
|
|
|
|
|
friend struct ExprSelect;
|
2014-04-04 19:51:01 +03:00
|
|
|
|
friend void prim_getAttr(EvalState & state, const Pos & pos, Value * * args, Value & v);
|
2003-10-30 18:48:26 +02:00
|
|
|
|
};
|
2010-04-07 16:55:46 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Return a string representing the type of the value `v'. */
|
2010-04-21 18:57:11 +03:00
|
|
|
|
string showType(const Value & v);
|
2003-10-30 18:48:26 +02:00
|
|
|
|
|
|
|
|
|
|
2013-09-03 13:56:33 +03:00
|
|
|
|
/* If `path' refers to a directory, then append "/default.nix". */
|
|
|
|
|
Path resolveExprPath(Path path);
|
|
|
|
|
|
2014-10-18 05:15:09 +03:00
|
|
|
|
struct InvalidPathError : EvalError
|
|
|
|
|
{
|
|
|
|
|
Path path;
|
|
|
|
|
InvalidPathError(const Path & path);
|
2014-10-20 19:15:50 +03:00
|
|
|
|
#ifdef EXCEPTION_NEEDS_THROW_SPEC
|
|
|
|
|
~InvalidPathError() throw () { };
|
|
|
|
|
#endif
|
2014-10-18 05:15:09 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Realise all paths in `context' */
|
|
|
|
|
void realiseContext(const PathSet & context);
|
2013-09-03 13:56:33 +03:00
|
|
|
|
|
2006-09-05 00:06:23 +03:00
|
|
|
|
}
|