From f491ae97d472bfd6305a8f3e8c58fac1fdc443a4 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Sat, 4 Feb 2012 13:50:25 +0000 Subject: * 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). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libexpr/eval-inline.hh | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/libexpr/eval-inline.hh (limited to 'src/libexpr/eval-inline.hh') diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh new file mode 100644 index 000000000000..6026a7d11015 --- /dev/null +++ b/src/libexpr/eval-inline.hh @@ -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 */ -- cgit 1.4.1