From 9fe24c5a0d1e694c6338d584a101034cfbff10bf Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 7 Jan 2012 17:26:33 +0000 Subject: * Don't create thunks for simple constants (integers, strings, paths) and allocate them only once. * Move Value and related functions into value.hh. --- src/libexpr/eval.hh | 112 +--------------------------------------------------- 1 file changed, 1 insertion(+), 111 deletions(-) (limited to 'src/libexpr/eval.hh') diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 75438f5eba85..91004fe4ca39 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -1,6 +1,7 @@ #ifndef __EVAL_H #define __EVAL_H +#include "value.hh" #include "nixexpr.hh" #include "symbol-table.hh" #include "hash.hh" @@ -16,8 +17,6 @@ namespace nix { class EvalState; -struct Env; -struct Value; struct Attr; @@ -38,23 +37,6 @@ public: }; -typedef enum { - tInt = 1, - tBool, - tString, - tPath, - tNull, - tAttrs, - tList, - tThunk, - tApp, - tLambda, - tBlackhole, - tPrimOp, - tPrimOpApp, -} ValueType; - - typedef void (* PrimOpFun) (EvalState & state, Value * * args, Value & v); @@ -68,64 +50,6 @@ struct PrimOp }; -struct Value -{ - ValueType type; - union - { - int integer; - bool boolean; - - /* Strings in the evaluator carry a so-called `context' (the - ATermList) which is a list of strings representing store - paths. This is to allow users to write things like - - "--with-freetype2-library=" + freetype + "/lib" - - where `freetype' is a derivation (or a source to be copied - to the store). If we just concatenated the strings without - keeping track of the referenced store paths, then if the - string is used as a derivation attribute, the derivation - will not have the correct dependencies in its inputDrvs and - inputSrcs. - - The semantics of the context is as follows: when a string - with context C is used as a derivation attribute, then the - derivations in C will be added to the inputDrvs of the - derivation, and the other store paths in C will be added to - the inputSrcs of the derivations. - - For canonicity, the store paths should be in sorted order. */ - struct { - const char * s; - const char * * context; // must be in sorted order - } string; - - const char * path; - Bindings * attrs; - struct { - unsigned int length; - Value * * elems; - } list; - struct { - Env * env; - Expr * expr; - } thunk; - struct { - Value * left, * right; - } app; - struct { - Env * env; - ExprLambda * fun; - } lambda; - PrimOp * primOp; - struct { - Value * left, * right; - } primOpApp; - }; -}; - - struct Env { Env * up; @@ -149,41 +73,7 @@ struct Attr }; -/* After overwriting an app node, be sure to clear pointers in the - Value to ensure that the target isn't kept alive unnecessarily. */ -static inline void clearValue(Value & v) -{ - v.app.right = 0; -} - - -static inline void mkInt(Value & v, int n) -{ - clearValue(v); - v.type = tInt; - v.integer = n; -} - - -static inline void mkBool(Value & v, bool b) -{ - clearValue(v); - v.type = tBool; - v.boolean = b; -} - - -static inline void mkApp(Value & v, Value & left, Value & right) -{ - v.type = tApp; - v.app.left = &left; - v.app.right = &right; -} - - -void mkString(Value & v, const char * s); void mkString(Value & v, const string & s, const PathSet & context = PathSet()); -void mkPath(Value & v, const char * s); void copyContext(const Value & v, PathSet & context); -- cgit 1.4.1