mirror of
https://github.com/NixOS/nix
synced 2025-06-26 20:01:15 +02:00
* Inline some functions and get rid of the indirection through
EvalState::eval(). This gives a 12% speedup on ‘nix-instantiate /etc/nixos/nixos/ -A system --readonly-mode’ (from 1.01s to 0.89s).
This commit is contained in:
parent
2bda12ef3b
commit
f491ae97d4
7 changed files with 94 additions and 116 deletions
61
src/libexpr/eval-inline.hh
Normal file
61
src/libexpr/eval-inline.hh
Normal file
|
@ -0,0 +1,61 @@
|
|||
#ifndef __EVAL_INLINE_H
|
||||
#define __EVAL_INLINE_H
|
||||
|
||||
#include "eval.hh"
|
||||
|
||||
#define LocalNoInline(f) static f __attribute__((noinline)); f
|
||||
#define LocalNoInlineNoReturn(f) static f __attribute__((noinline, noreturn)); f
|
||||
|
||||
namespace nix {
|
||||
|
||||
|
||||
LocalNoInlineNoReturn(void throwEvalError(const char * s))
|
||||
{
|
||||
throw EvalError(s);
|
||||
}
|
||||
|
||||
LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s2))
|
||||
{
|
||||
throw TypeError(format(s) % s2);
|
||||
}
|
||||
|
||||
|
||||
void EvalState::forceValue(Value & v)
|
||||
{
|
||||
if (v.type == tThunk) {
|
||||
ValueType saved = v.type;
|
||||
try {
|
||||
v.type = tBlackhole;
|
||||
//checkInterrupt();
|
||||
v.thunk.expr->eval(*this, *v.thunk.env, v);
|
||||
} catch (Error & e) {
|
||||
v.type = saved;
|
||||
throw;
|
||||
}
|
||||
}
|
||||
else if (v.type == tApp)
|
||||
callFunction(*v.app.left, *v.app.right, v);
|
||||
else if (v.type == tBlackhole)
|
||||
throwEvalError("infinite recursion encountered");
|
||||
}
|
||||
|
||||
|
||||
inline void EvalState::forceAttrs(Value & v)
|
||||
{
|
||||
forceValue(v);
|
||||
if (v.type != tAttrs)
|
||||
throwTypeError("value is %1% while an attribute set was expected", showType(v));
|
||||
}
|
||||
|
||||
|
||||
inline void EvalState::forceList(Value & v)
|
||||
{
|
||||
forceValue(v);
|
||||
if (v.type != tList)
|
||||
throwTypeError("value is %1% while a list was expected", showType(v));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif /* !__EVAL_INLINE_H */
|
Loading…
Add table
Add a link
Reference in a new issue