From 45a28ed36f769c1db57b805d95967a997ccab3e2 Mon Sep 17 00:00:00 2001 From: regnat Date: Thu, 3 Jun 2021 10:50:32 +0200 Subject: [PATCH] Extract a Value method to get the eval cache --- src/libexpr/eval.cc | 40 ++++++++++++++++++++++++-------------- src/libexpr/value-cache.hh | 2 +- src/libexpr/value.hh | 4 ++++ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index e94e64346..debdf4e42 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1,4 +1,5 @@ #include "eval.hh" +#include "value-cache.hh" #include "hash.hh" #include "util.hh" #include "store-api.hh" @@ -1190,23 +1191,22 @@ bool EvalState::getAttrField(Value & attrs, const std::vector & selector Pos * pos2 = 0; forceValue(attrs, pos); - if (attrs.type() == nAttrs) { - auto eval_cache = attrs.attrs->eval_cache; - auto [ cacheResult, resultingCursor ] = eval_cache.getValue(*this, selector, dest); - updateCacheStats(cacheResult); - switch (cacheResult.returnCode) { - case ValueCache::CacheHit: - if (cacheResult.lastQueriedSymbolIfMissing) - return false; - return true; - case ValueCache::CacheMiss: // FIXME: Handle properly - case ValueCache::Forward: // FIXME: Handle properly - case ValueCache::NoCacheKey: - case ValueCache::UnCacheable: - ; - } + auto eval_cache = attrs.getEvalCache(); + auto [ cacheResult, resultingCursor ] = eval_cache.getValue(*this, selector, dest); + updateCacheStats(cacheResult); + switch (cacheResult.returnCode) { + case ValueCache::CacheHit: + if (cacheResult.lastQueriedSymbolIfMissing) + return false; + return true; + case ValueCache::CacheMiss: // FIXME: Handle properly + case ValueCache::Forward: // FIXME: Handle properly + case ValueCache::NoCacheKey: + case ValueCache::UnCacheable: + ; } + Value * vAttrs = &attrs; try { for (auto & name : selector) { @@ -1802,6 +1802,16 @@ std::vector> Value::getContext() return res; } +ValueCache & Value::getEvalCache() +{ + if (internalType == tAttrs) { + return attrs->eval_cache; + } else { + return ValueCache::empty; + } +} + +ValueCache ValueCache::empty = ValueCache(nullptr); string EvalState::forceString(Value & v, PathSet & context, const Pos & pos) { diff --git a/src/libexpr/value-cache.hh b/src/libexpr/value-cache.hh index e36e03ad8..177f97ad2 100644 --- a/src/libexpr/value-cache.hh +++ b/src/libexpr/value-cache.hh @@ -13,7 +13,7 @@ public: ValueCache(tree_cache::Cursor::Ref rawCache) : rawCache(rawCache) {} - const static ValueCache empty; + static ValueCache empty; bool isEmpty () { return rawCache == nullptr; } diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh index a1f131f9e..740a19f0c 100644 --- a/src/libexpr/value.hh +++ b/src/libexpr/value.hh @@ -57,6 +57,8 @@ class EvalState; class XMLWriter; class JSONPlaceholder; +class ValueCache; + typedef int64_t NixInt; typedef double NixFloat; @@ -349,6 +351,8 @@ public: bool isTrivial() const; std::vector> getContext(); + + ValueCache & getEvalCache(); };