about summary refs log blame commit diff
path: root/src/libexpr/eval.hh
blob: 11185159c1236d0272f6a80c5260805ff55f1cde (plain) (tree)
1
2
3
4
5
6
7
8
9
10




                

                   
                     

 
                                    
                                  
 
                 



                                                                      

 

                 
                         
                     
                      
                                                           

                   


                             
                
 


                                           


  



                                    





                                                                     


                                             
                                              



                                       

                      
#ifndef __EVAL_H
#define __EVAL_H

#include <map>

#include "aterm.hh"
#include "hash.hh"
#include "nixexpr.hh"


typedef map<Path, PathSet> DrvRoots;
typedef map<Path, Hash> DrvHashes;

struct EvalState;

/* Note: using a ATermVector is safe here, since when we call a primop
   we also have an ATermList on the stack. */
typedef Expr (* PrimOp) (EvalState &, const ATermVector & args);


struct EvalState 
{
    ATermMap normalForms;
    ATermMap primOps;
    DrvRoots drvRoots;
    DrvHashes drvHashes; /* normalised derivation hashes */
    Expr blackHole;

    unsigned int nrEvaluated;
    unsigned int nrCached;

    EvalState();

    void addPrimOps();
    void addPrimOp(const string & name,
        unsigned int arity, PrimOp primOp);
};


MakeError(EvalError, Error)
MakeError(AssertionError, EvalError)


/* Evaluate an expression to normal form. */
Expr evalExpr(EvalState & state, Expr e);

/* Evaluate an expression read from the given file to normal form. */
Expr evalFile(EvalState & state, const Path & path);

/* Specific results. */
string evalString(EvalState & state, Expr e);
Path evalPath(EvalState & state, Expr e);
ATermList evalList(EvalState & state, Expr e);

/* Print statistics. */
void printEvalStats(EvalState & state);


#endif /* !__EVAL_H */