From 56614c75e4a187c34706af718d9d8d69685c41b2 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 18 Jul 2020 04:44:23 +0100 Subject: refactor(3p/nix/libexpr): Store nix::Env values in a std::vector This has several advantages: * we can ensure that the vector is traced by the GC * we don't need to unsafely allocate memory to make an Env Note that there was previously a check about the size of the environment, but it's unclear why this was the case (git history yielded nothing interesting) and it seems to have no effect. Change-Id: I4998b879a728a6fb68e1bd187c521e2304e5047e Reviewed-on: https://cl.tvl.fyi/c/depot/+/1265 Tested-by: BuildkiteCI Reviewed-by: isomer Reviewed-by: Kane York Reviewed-by: glittershark --- third_party/nix/src/libexpr/eval.cc | 8 +------- third_party/nix/src/libexpr/eval.hh | 12 ++++++++++-- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'third_party') diff --git a/third_party/nix/src/libexpr/eval.cc b/third_party/nix/src/libexpr/eval.cc index 0f3b7fabe029..16e6907214c9 100644 --- a/third_party/nix/src/libexpr/eval.cc +++ b/third_party/nix/src/libexpr/eval.cc @@ -338,8 +338,6 @@ EvalState::EvalState(const Strings& _searchPath, const ref& store) assert(gcInitialised); - static_assert(sizeof(Env) <= 16, "environment must be <= 16 bytes"); - /* Initialise the Nix expression search path. */ if (!evalSettings.pureEval) { Strings paths = parseNixPath(getEnv("NIX_PATH", "")); @@ -637,13 +635,9 @@ Env& EvalState::allocEnv(size_t size) { nrEnvs++; nrValuesInEnvs += size; - Env* env = (Env*)allocBytes(sizeof(Env) + size * sizeof(Value*)); - env->size = (decltype(Env::size))size; + Env* env = new Env(size); env->type = Env::Plain; - /* We assume that env->values has been cleared by the allocator; maybeThunk() - * and lookupVar fromWith expect this. */ - return *env; } diff --git a/third_party/nix/src/libexpr/eval.hh b/third_party/nix/src/libexpr/eval.hh index 11cc295b230d..3da0961b6f4a 100644 --- a/third_party/nix/src/libexpr/eval.hh +++ b/third_party/nix/src/libexpr/eval.hh @@ -3,6 +3,10 @@ #include #include #include +#include + +#include +#include #include "libexpr/attr-set.hh" #include "libexpr/nixexpr.hh" @@ -28,12 +32,16 @@ struct PrimOp { : fun(fun), arity(arity), name(name) {} }; -struct Env { +struct Env : public gc { + Env(unsigned short size) : size(size) { + values = std::vector>(size); + } + Env* up; unsigned short size; // used by ‘valueSize’ unsigned short prevWith : 14; // nr of levels up to next `with' environment enum { Plain = 0, HasWithExpr, HasWithAttrs } type : 2; - Value* values[0]; + std::vector> values; }; Value& mkString(Value& v, const std::string& s, -- cgit 1.4.1