diff options
Diffstat (limited to 'src/libexpr/eval-cache.cc')
-rw-r--r-- | src/libexpr/eval-cache.cc | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/src/libexpr/eval-cache.cc b/src/libexpr/eval-cache.cc index a1cb162ee..ed9af78b3 100644 --- a/src/libexpr/eval-cache.cc +++ b/src/libexpr/eval-cache.cc @@ -554,14 +554,22 @@ std::string AttrCursor::getString() debug("using cached string attribute '%s'", getAttrPathStr()); return s->first; } else - throw TypeError("'%s' is not a string", getAttrPathStr()); + { + auto e = TypeError("'%s' is not a string", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } } } auto & v = forceValue(); if (v.type() != nString && v.type() != nPath) - throw TypeError("'%s' is not a string but %s", getAttrPathStr(), showType(v.type())); + { + auto e = TypeError("'%s' is not a string but %s", getAttrPathStr(), showType(v.type())); + root->state.debugLastTrace(e); + throw e; + } return v.type() == nString ? v.string.s : v.path; } @@ -585,7 +593,11 @@ string_t AttrCursor::getStringWithContext() return *s; } } else - throw TypeError("'%s' is not a string", getAttrPathStr()); + { + auto e = TypeError("'%s' is not a string", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } } } @@ -596,7 +608,12 @@ string_t AttrCursor::getStringWithContext() else if (v.type() == nPath) return {v.path, {}}; else - throw TypeError("'%s' is not a string but %s", getAttrPathStr(), showType(v.type())); + { + auto e = TypeError("'%s' is not a string but %s", getAttrPathStr(), showType(v.type())); + root->state.debugLastTrace(e); + throw e; + return {v.path, {}}; // should never execute + } } bool AttrCursor::getBool() @@ -609,14 +626,22 @@ bool AttrCursor::getBool() debug("using cached Boolean attribute '%s'", getAttrPathStr()); return *b; } else - throw TypeError("'%s' is not a Boolean", getAttrPathStr()); + { + auto e = TypeError("'%s' is not a Boolean", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } } } auto & v = forceValue(); if (v.type() != nBool) - throw TypeError("'%s' is not a Boolean", getAttrPathStr()); + { + auto e = TypeError("'%s' is not a Boolean", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } return v.boolean; } @@ -663,14 +688,22 @@ std::vector<Symbol> AttrCursor::getAttrs() debug("using cached attrset attribute '%s'", getAttrPathStr()); return *attrs; } else - throw TypeError("'%s' is not an attribute set", getAttrPathStr()); + { + auto e = TypeError("'%s' is not an attribute set", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } } } auto & v = forceValue(); if (v.type() != nAttrs) - throw TypeError("'%s' is not an attribute set", getAttrPathStr()); + { + auto e = TypeError("'%s' is not an attribute set", getAttrPathStr()); + root->state.debugLastTrace(e); + throw e; + } std::vector<Symbol> attrs; for (auto & attr : *getValue().attrs) |