diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index 2450e80c2..3c7af067b 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -1,11 +1,7 @@ -#include -#include #include #include #include -#include #include -#include #if __APPLE__ #include #endif @@ -18,6 +14,7 @@ #include "build-result.hh" #include "store-api.hh" #include "derivations.hh" +#include "strings.hh" #include "local-store.hh" #include "legacy.hh" #include "experimental-features.hh" diff --git a/src/libcmd/editor-for.cc b/src/libcmd/editor-for.cc index 67653d9c9..868153e90 100644 --- a/src/libcmd/editor-for.cc +++ b/src/libcmd/editor-for.cc @@ -1,6 +1,7 @@ #include "editor-for.hh" #include "environment-variables.hh" #include "source-path.hh" +#include "strings.hh" namespace nix { diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 227cd254a..a87383f7f 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -19,6 +19,7 @@ #include "gc-small-vector.hh" #include "fetch-to-store.hh" #include "flake/flakeref.hh" +#include "exit.hh" #include #include diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index eab1f22ef..ba1e4a820 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -12,6 +12,7 @@ #include "experimental-features.hh" #include "search-path.hh" #include "repl-exit-status.hh" +#include "backed-string-view.hh" #include #include @@ -791,4 +792,4 @@ static constexpr std::string_view corepkgsPrefix{"/__corepkgs__/"}; } -#include "eval-inline.hh" +#include "eval-inline.hh" // IWYU pragma: keep diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index 52f254813..d16281c39 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -11,6 +11,7 @@ #include "eval-error.hh" #include "pos-idx.hh" #include "pos-table.hh" +#include "strings.hh" namespace nix { diff --git a/src/libfetchers/fetchers.hh b/src/libfetchers/fetchers.hh index 40f2b6294..f778908fb 100644 --- a/src/libfetchers/fetchers.hh +++ b/src/libfetchers/fetchers.hh @@ -7,6 +7,8 @@ #include "path.hh" #include "attrs.hh" #include "url.hh" +#include "ref.hh" +#include "strings.hh" #include diff --git a/src/libmain/progress-bar.cc b/src/libmain/progress-bar.cc index f0270df04..cdb15d8c7 100644 --- a/src/libmain/progress-bar.cc +++ b/src/libmain/progress-bar.cc @@ -1,8 +1,9 @@ #include "progress-bar.hh" +#include "file-system.hh" #include "sync.hh" -#include "store-api.hh" #include "names.hh" #include "terminal.hh" +#include "strings.hh" #include #include diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc index 018e34509..bc9548e09 100644 --- a/src/libmain/shared.cc +++ b/src/libmain/shared.cc @@ -6,6 +6,8 @@ #include "loggers.hh" #include "current-process.hh" #include "terminal.hh" +#include "strings.hh" +#include "exit.hh" #include #include diff --git a/src/libmain/shared.hh b/src/libmain/shared.hh index d7d872319..b41efe567 100644 --- a/src/libmain/shared.hh +++ b/src/libmain/shared.hh @@ -7,12 +7,10 @@ #include "path.hh" #include "derived-path.hh" #include "processes.hh" -#include "exit.hh" +#include "strings.hh" #include -#include - namespace nix { diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc index fc0569a66..d4197b3df 100644 --- a/src/libstore/binary-cache-store.cc +++ b/src/libstore/binary-cache-store.cc @@ -10,6 +10,7 @@ #include "nar-accessor.hh" #include "thread-pool.hh" #include "signals.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc index f2c8ccc5f..3ed3cb6bd 100644 --- a/src/libstore/build/derivation-goal.cc +++ b/src/libstore/build/derivation-goal.cc @@ -9,6 +9,7 @@ #include "logging-json.hh" #include "substitution-goal.hh" #include "drv-output-substitution-goal.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/build/entry-points.cc b/src/libstore/build/entry-points.cc index f52f2876f..1f85881fa 100644 --- a/src/libstore/build/entry-points.cc +++ b/src/libstore/build/entry-points.cc @@ -2,6 +2,7 @@ #include "substitution-goal.hh" #include "derivation-goal.hh" #include "local-store.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/build/hook-instance.cc b/src/libstore/build/hook-instance.cc index d5da80c74..f91a904cc 100644 --- a/src/libstore/build/hook-instance.cc +++ b/src/libstore/build/hook-instance.cc @@ -2,6 +2,7 @@ #include "file-system.hh" #include "globals.hh" #include "hook-instance.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc index 1571627d6..7553f1e79 100644 --- a/src/libstore/build/local-derivation-goal.cc +++ b/src/libstore/build/local-derivation-goal.cc @@ -1,15 +1,12 @@ #include "local-derivation-goal.hh" #include "indirect-root-store.hh" -#include "hook-instance.hh" #include "machines.hh" #include "store-api.hh" #include "worker.hh" #include "builtins.hh" #include "builtins/buildenv.hh" #include "path-references.hh" -#include "finally.hh" #include "archive.hh" -#include "compression.hh" #include "daemon.hh" #include "topo-sort.hh" #include "json-utils.hh" @@ -19,6 +16,7 @@ #include "child.hh" #include "unix-domain-socket.hh" #include "mount.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/builtins/buildenv.cc b/src/libstore/builtins/buildenv.cc index 61c729d27..9fe5f6660 100644 --- a/src/libstore/builtins/buildenv.cc +++ b/src/libstore/builtins/buildenv.cc @@ -1,4 +1,5 @@ #include "buildenv.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/builtins/fetchurl.cc b/src/libstore/builtins/fetchurl.cc index 4049d1c6c..062ecdc14 100644 --- a/src/libstore/builtins/fetchurl.cc +++ b/src/libstore/builtins/fetchurl.cc @@ -3,6 +3,7 @@ #include "store-api.hh" #include "archive.hh" #include "compression.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc index 6aa6d598d..dae311609 100644 --- a/src/libstore/content-address.cc +++ b/src/libstore/content-address.cc @@ -1,6 +1,7 @@ #include "args.hh" #include "content-address.hh" #include "split.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc index 5ac9cd2ef..a9239197b 100644 --- a/src/libstore/daemon.cc +++ b/src/libstore/daemon.cc @@ -2,7 +2,7 @@ #include "monitor-fd.hh" #include "worker-protocol.hh" #include "worker-protocol-impl.hh" -#include "build-result.hh" +#include "build-result.hh" // IWYU pragma: keep #include "store-api.hh" #include "store-cast.hh" #include "gc-store.hh" @@ -12,6 +12,7 @@ #include "finally.hh" #include "archive.hh" #include "derivations.hh" +#include "strings.hh" #include "args.hh" #include diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc index 7f41e6865..93baa9f20 100644 --- a/src/libstore/derivations.cc +++ b/src/libstore/derivations.cc @@ -3,11 +3,12 @@ #include "store-api.hh" #include "globals.hh" #include "types.hh" -#include "split.hh" #include "common-protocol.hh" #include "common-protocol-impl.hh" -#include "fs-accessor.hh" #include "json-utils.hh" +#include "strings.hh" +#include "backed-string-view.hh" + #include #include diff --git a/src/libstore/derived-path.hh b/src/libstore/derived-path.hh index c96e0df67..b75415aec 100644 --- a/src/libstore/derived-path.hh +++ b/src/libstore/derived-path.hh @@ -5,6 +5,7 @@ #include "path.hh" #include "outputs-spec.hh" #include "comparator.hh" +#include "ref.hh" #include diff --git a/src/libstore/filetransfer.cc b/src/libstore/filetransfer.cc index 11c8a755c..f3e8a5312 100644 --- a/src/libstore/filetransfer.cc +++ b/src/libstore/filetransfer.cc @@ -5,6 +5,7 @@ #include "s3.hh" #include "signals.hh" #include "compression.hh" +#include "strings.hh" #if ENABLE_S3 #include diff --git a/src/libstore/filetransfer.hh b/src/libstore/filetransfer.hh index b2ee66312..4352cb81b 100644 --- a/src/libstore/filetransfer.hh +++ b/src/libstore/filetransfer.hh @@ -2,6 +2,7 @@ ///@file #include "box_ptr.hh" +#include "ref.hh" #include "logging.hh" #include "serialise.hh" #include "types.hh" diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 7b4a12dc9..d5903d01e 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -5,6 +5,7 @@ #include "signals.hh" #include "finally.hh" #include "unix-domain-socket.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc index 9e2d65a1c..4433b411d 100644 --- a/src/libstore/legacy-ssh-store.cc +++ b/src/libstore/legacy-ssh-store.cc @@ -9,6 +9,7 @@ #include "path-with-outputs.hh" #include "ssh.hh" #include "ssh-store.hh" +#include "strings.hh" #include "derivations.hh" namespace nix { diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 4c8e2ea2f..49991e38a 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -10,6 +10,7 @@ #include "signals.hh" #include "finally.hh" #include "compression.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/lock.hh b/src/libstore/lock.hh index 1c268e1fb..ac5ff061b 100644 --- a/src/libstore/lock.hh +++ b/src/libstore/lock.hh @@ -1,11 +1,10 @@ #pragma once ///@file -#include "types.hh" - -#include +#include #include +#include namespace nix { diff --git a/src/libstore/machines.hh b/src/libstore/machines.hh index 8516409d4..56d9bed30 100644 --- a/src/libstore/machines.hh +++ b/src/libstore/machines.hh @@ -1,7 +1,9 @@ #pragma once ///@file -#include "types.hh" +#include "ref.hh" +#include +#include namespace nix { diff --git a/src/libstore/make-content-addressed.cc b/src/libstore/make-content-addressed.cc index abb6e9889..0c592ce22 100644 --- a/src/libstore/make-content-addressed.cc +++ b/src/libstore/make-content-addressed.cc @@ -1,5 +1,6 @@ #include "make-content-addressed.hh" #include "references.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index a63a28482..7ea7c189a 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -1,12 +1,12 @@ #include "derivations.hh" #include "parsed-derivations.hh" #include "globals.hh" -#include "local-store.hh" #include "store-api.hh" #include "thread-pool.hh" #include "topo-sort.hh" #include "closure.hh" #include "filetransfer.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/nar-accessor.hh b/src/libstore/nar-accessor.hh index 5e19bd3c7..4299daf1b 100644 --- a/src/libstore/nar-accessor.hh +++ b/src/libstore/nar-accessor.hh @@ -1,10 +1,12 @@ #pragma once ///@file +#include "fs-accessor.hh" +#include "ref.hh" + #include #include -#include "fs-accessor.hh" namespace nix { diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc index 5c0bb17b9..c83a8fbfb 100644 --- a/src/libstore/nar-info-disk-cache.cc +++ b/src/libstore/nar-info-disk-cache.cc @@ -4,6 +4,7 @@ #include "sqlite.hh" #include "globals.hh" #include "users.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/nar-info.cc b/src/libstore/nar-info.cc index e557b4677..0434873df 100644 --- a/src/libstore/nar-info.cc +++ b/src/libstore/nar-info.cc @@ -1,4 +1,4 @@ -#include "globals.hh" +#include "strings.hh" #include "nar-info.hh" #include "store-api.hh" diff --git a/src/libstore/optimise-store.cc b/src/libstore/optimise-store.cc index 9c871b78f..c60e5a85d 100644 --- a/src/libstore/optimise-store.cc +++ b/src/libstore/optimise-store.cc @@ -1,6 +1,7 @@ #include "local-store.hh" #include "globals.hh" #include "signals.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/parsed-derivations.cc b/src/libstore/parsed-derivations.cc index 992a79c6e..1b2ec914d 100644 --- a/src/libstore/parsed-derivations.cc +++ b/src/libstore/parsed-derivations.cc @@ -1,4 +1,5 @@ #include "parsed-derivations.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/path-info.cc b/src/libstore/path-info.cc index 4dc2823ce..54519a867 100644 --- a/src/libstore/path-info.cc +++ b/src/libstore/path-info.cc @@ -1,5 +1,6 @@ #include "path-info.hh" #include "store-api.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/path-with-outputs.cc b/src/libstore/path-with-outputs.cc index af6837370..c49531acb 100644 --- a/src/libstore/path-with-outputs.cc +++ b/src/libstore/path-with-outputs.cc @@ -1,7 +1,6 @@ #include "path-with-outputs.hh" #include "store-api.hh" - -#include +#include "strings.hh" namespace nix { diff --git a/src/libstore/platform/darwin.cc b/src/libstore/platform/darwin.cc index 078753bff..956fb1e9b 100644 --- a/src/libstore/platform/darwin.cc +++ b/src/libstore/platform/darwin.cc @@ -2,6 +2,7 @@ #include "signals.hh" #include "platform/darwin.hh" #include "regex.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/platform/linux.cc b/src/libstore/platform/linux.cc index f22fbe58f..486d71885 100644 --- a/src/libstore/platform/linux.cc +++ b/src/libstore/platform/linux.cc @@ -5,6 +5,7 @@ #include "signals.hh" #include "platform/linux.hh" #include "regex.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/profiles.cc b/src/libstore/profiles.cc index e8b88693d..d88a3b9fe 100644 --- a/src/libstore/profiles.cc +++ b/src/libstore/profiles.cc @@ -1,12 +1,11 @@ #include "profiles.hh" -#include "store-api.hh" #include "local-fs-store.hh" #include "users.hh" +#include "strings.hh" #include #include #include -#include #include diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 36223051b..1f94ca03f 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -15,6 +15,8 @@ #include "finally.hh" #include "logging.hh" #include "filetransfer.hh" +#include "strings.hh" + #include namespace nix { @@ -64,7 +66,7 @@ void RemoteStore::initConnection(Connection & conn) { /* Send the magic greeting, check for the reply. */ try { - conn.from.endOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)"; + conn.from.specialEndOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)"; conn.to << WORKER_MAGIC_1; conn.to.flush(); diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc index 921a2e556..b50084860 100644 --- a/src/libstore/s3-binary-cache-store.cc +++ b/src/libstore/s3-binary-cache-store.cc @@ -7,6 +7,7 @@ #include "globals.hh" #include "compression.hh" #include "filetransfer.hh" +#include "strings.hh" #include #include diff --git a/src/libstore/ssh-store.cc b/src/libstore/ssh-store.cc index 94c0b7237..fb60326c1 100644 --- a/src/libstore/ssh-store.cc +++ b/src/libstore/ssh-store.cc @@ -1,13 +1,11 @@ #include "ssh-store.hh" #include "store-api.hh" -#include "local-fs-store.hh" #include "remote-store.hh" #include "remote-store-connection.hh" -#include "remote-fs-accessor.hh" -#include "archive.hh" #include "worker-protocol.hh" #include "pool.hh" #include "ssh.hh" +#include "strings.hh" namespace nix { diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index f921956e8..cb0604233 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -5,10 +5,10 @@ #include "nar-info-disk-cache.hh" #include "thread-pool.hh" #include "url.hh" -#include "references.hh" #include "archive.hh" -#include "remote-store.hh" +#include "uds-remote-store.hh" #include "signals.hh" +#include "strings.hh" // FIXME this should not be here, see TODO below on // `addMultipleToStore`. #include "worker-protocol.hh" diff --git a/src/libutil/args.cc b/src/libutil/args.cc index 1342e7c6a..edcab23ac 100644 --- a/src/libutil/args.cc +++ b/src/libutil/args.cc @@ -1,10 +1,11 @@ #include "args.hh" #include "args/root.hh" #include "hash.hh" -#include "json-utils.hh" +#include "strings.hh" +#include "json-utils.hh" // IWYU pragma: keep (instances) #include "environment-variables.hh" -#include "experimental-features-json.hh" +#include "experimental-features-json.hh" // IWYU pragma: keep (instances) #include "logging.hh" #include diff --git a/src/libutil/args.hh b/src/libutil/args.hh index 5fdbaba7e..e2bac6415 100644 --- a/src/libutil/args.hh +++ b/src/libutil/args.hh @@ -3,6 +3,8 @@ #include "experimental-features.hh" #include "types.hh" +#include "ref.hh" + #include #include #include diff --git a/src/libutil/backed-string-view.hh b/src/libutil/backed-string-view.hh new file mode 100644 index 000000000..96136331c --- /dev/null +++ b/src/libutil/backed-string-view.hh @@ -0,0 +1,69 @@ +#pragma once +/// @file String view that can be either owned or borrowed. +#include +#include +#include + +/** + * This wants to be a little bit like rust's Cow type. + * Some parts of the evaluator benefit greatly from being able to reuse + * existing allocations for strings, but have to be able to also use + * newly allocated storage for values. + * + * We do not define implicit conversions, even with ref qualifiers, + * since those can easily become ambiguous to the reader and can degrade + * into copying behaviour we want to avoid. + */ +class BackedStringView { +private: + std::variant data; + + /** + * Needed to introduce a temporary since operator-> must return + * a pointer. Without this we'd need to store the view object + * even when we already own a string. + */ + class Ptr { + private: + std::string_view view; + public: + Ptr(std::string_view view): view(view) {} + const std::string_view * operator->() const { return &view; } + }; + +public: + BackedStringView(std::string && s): data(std::move(s)) {} + BackedStringView(std::string_view sv): data(sv) {} + template + BackedStringView(const char (& lit)[N]): data(std::string_view(lit)) {} + + BackedStringView(const BackedStringView &) = delete; + BackedStringView & operator=(const BackedStringView &) = delete; + + /** + * We only want move operations defined since the sole purpose of + * this type is to avoid copies. + */ + BackedStringView(BackedStringView && other) = default; + BackedStringView & operator=(BackedStringView && other) = default; + + bool isOwned() const + { + return std::holds_alternative(data); + } + + std::string toOwned() && + { + return isOwned() + ? std::move(std::get(data)) + : std::string(std::get(data)); + } + + std::string_view operator*() const + { + return isOwned() + ? std::get(data) + : std::get(data); + } + Ptr operator->() const { return Ptr(**this); } +}; diff --git a/src/libutil/error.cc b/src/libutil/error.cc index e5d6a9fa8..a7cbfbfd0 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -3,6 +3,7 @@ #include "logging.hh" #include "position.hh" #include "terminal.hh" +#include "strings.hh" #include #include diff --git a/src/libutil/file-system.cc b/src/libutil/file-system.cc index 631cf076b..1d266067e 100644 --- a/src/libutil/file-system.cc +++ b/src/libutil/file-system.cc @@ -10,6 +10,7 @@ #include "logging.hh" #include "serialise.hh" #include "signals.hh" +#include "strings.hh" #include "types.hh" #include "users.hh" diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc index f05d4aa98..d383e9802 100644 --- a/src/libutil/hash.cc +++ b/src/libutil/hash.cc @@ -10,6 +10,7 @@ #include "charptr-cast.hh" #include "logging.hh" #include "split.hh" +#include "strings.hh" #include #include diff --git a/src/libutil/meson.build b/src/libutil/meson.build index e7f986363..6566f7f46 100644 --- a/src/libutil/meson.build +++ b/src/libutil/meson.build @@ -53,6 +53,7 @@ libutil_headers = files( 'archive.hh', 'args/root.hh', 'args.hh', + 'backed-string-view.hh', 'box_ptr.hh', 'canon-path.hh', 'cgroup.hh', diff --git a/src/libutil/processes.cc b/src/libutil/processes.cc index 61e1ad556..eec592221 100644 --- a/src/libutil/processes.cc +++ b/src/libutil/processes.cc @@ -3,6 +3,7 @@ #include "finally.hh" #include "logging.hh" #include "processes.hh" +#include "strings.hh" #include "serialise.hh" #include "signals.hh" diff --git a/src/libutil/regex.cc b/src/libutil/regex.cc index a9e6c6bee..a12d13550 100644 --- a/src/libutil/regex.cc +++ b/src/libutil/regex.cc @@ -1,6 +1,9 @@ #include #include +// Declared as extern in precompiled-headers.hh +template class std::basic_regex; + namespace nix::regex { std::string quoteRegexChars(const std::string & raw) { diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc index 4eda1b7e7..f509fedff 100644 --- a/src/libutil/serialise.cc +++ b/src/libutil/serialise.cc @@ -9,6 +9,21 @@ namespace nix { +namespace { +/** + * Convert a little-endian integer to host order. + */ +template +T readLittleEndian(unsigned char * p) +{ + T x = 0; + for (size_t i = 0; i < sizeof(x); ++i, ++p) { + x |= ((T) *p) << (i * 8); + } + return x; +} +} + template T readNum(Source & source) { @@ -152,7 +167,7 @@ size_t FdSource::readUnbuffered(char * data, size_t len) n = ::read(fd, data, len); } while (n == -1 && errno == EINTR); if (n == -1) { _good = false; throw SysError("reading from file"); } - if (n == 0) { _good = false; throw EndOfFile(std::string(*endOfFileError)); } + if (n == 0) { _good = false; throw EndOfFile(endOfFileError()); } read += n; return n; } @@ -163,6 +178,11 @@ bool FdSource::good() return _good; } +std::string FdSource::endOfFileError() const +{ + return specialEndOfFileError.has_value() ? *specialEndOfFileError : "unexpected end-of-file"; +} + size_t StringSource::read(char * data, size_t len) { diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh index 9ad8018d0..612658b2d 100644 --- a/src/libutil/serialise.hh +++ b/src/libutil/serialise.hh @@ -1,12 +1,10 @@ #pragma once ///@file -#include #include #include "charptr-cast.hh" #include "generator.hh" -#include "strings.hh" #include "types.hh" #include "file-descriptor.hh" @@ -153,7 +151,10 @@ struct FdSource : BufferedSource { int fd; size_t read = 0; - BackedStringView endOfFileError{"unexpected end-of-file"}; + /** Defaults to "unexpected end-of-file" */ + std::optional specialEndOfFileError; + + std::string endOfFileError() const; FdSource() : fd(-1) { } FdSource(int fd) : fd(fd) { } diff --git a/src/libutil/source-path.cc b/src/libutil/source-path.cc index cfaac20c0..782005ef1 100644 --- a/src/libutil/source-path.cc +++ b/src/libutil/source-path.cc @@ -1,4 +1,5 @@ #include "source-path.hh" +#include "strings.hh" namespace nix { diff --git a/src/libutil/strings.hh b/src/libutil/strings.hh index 7330e2063..ebafab9ad 100644 --- a/src/libutil/strings.hh +++ b/src/libutil/strings.hh @@ -164,19 +164,6 @@ template std::optional string2Float(const std::string_view s); -/** - * Convert a little-endian integer to host order. - */ -template -T readLittleEndian(unsigned char * p) -{ - T x = 0; - for (size_t i = 0; i < sizeof(x); ++i, ++p) { - x |= ((T) *p) << (i * 8); - } - return x; -} - /** * Convert a string to lower case. */ diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 13cb062fb..66c41fe59 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -1,17 +1,15 @@ #pragma once ///@file -#include "ref.hh" - #include #include #include #include -#include +#include #include -#include #include #include +#include // IWYU pragma: keep (this is used literally everywhere) namespace nix { @@ -166,70 +164,4 @@ constexpr auto enumerate(T && iterable) template struct overloaded : Ts... { using Ts::operator()...; }; template overloaded(Ts...) -> overloaded; - - -/** - * This wants to be a little bit like rust's Cow type. - * Some parts of the evaluator benefit greatly from being able to reuse - * existing allocations for strings, but have to be able to also use - * newly allocated storage for values. - * - * We do not define implicit conversions, even with ref qualifiers, - * since those can easily become ambiguous to the reader and can degrade - * into copying behaviour we want to avoid. - */ -class BackedStringView { -private: - std::variant data; - - /** - * Needed to introduce a temporary since operator-> must return - * a pointer. Without this we'd need to store the view object - * even when we already own a string. - */ - class Ptr { - private: - std::string_view view; - public: - Ptr(std::string_view view): view(view) {} - const std::string_view * operator->() const { return &view; } - }; - -public: - BackedStringView(std::string && s): data(std::move(s)) {} - BackedStringView(std::string_view sv): data(sv) {} - template - BackedStringView(const char (& lit)[N]): data(std::string_view(lit)) {} - - BackedStringView(const BackedStringView &) = delete; - BackedStringView & operator=(const BackedStringView &) = delete; - - /** - * We only want move operations defined since the sole purpose of - * this type is to avoid copies. - */ - BackedStringView(BackedStringView && other) = default; - BackedStringView & operator=(BackedStringView && other) = default; - - bool isOwned() const - { - return std::holds_alternative(data); - } - - std::string toOwned() && - { - return isOwned() - ? std::move(std::get(data)) - : std::string(std::get(data)); - } - - std::string_view operator*() const - { - return isOwned() - ? std::get(data) - : std::get(data); - } - Ptr operator->() const { return Ptr(**this); } -}; - } diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 5762b0644..bc43aa7b1 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -1,6 +1,7 @@ #include "archive.hh" #include "derivations.hh" #include "dotgraph.hh" +#include "exit.hh" #include "globals.hh" #include "build-result.hh" #include "store-cast.hh" @@ -17,7 +18,6 @@ #include #include -#include #include #include diff --git a/src/nix/doctor.cc b/src/nix/doctor.cc index 4e1cfe8c0..17db3f764 100644 --- a/src/nix/doctor.cc +++ b/src/nix/doctor.cc @@ -7,6 +7,7 @@ #include "store-api.hh" #include "local-fs-store.hh" #include "worker-protocol.hh" +#include "exit.hh" using namespace nix; diff --git a/src/nix/verify.cc b/src/nix/verify.cc index 8783d4e04..d4ab352f4 100644 --- a/src/nix/verify.cc +++ b/src/nix/verify.cc @@ -1,10 +1,9 @@ #include "command.hh" #include "shared.hh" #include "store-api.hh" -#include "sync.hh" #include "thread-pool.hh" #include "signals.hh" -#include "references.hh" +#include "exit.hh" #include diff --git a/src/pch/precompiled-headers.hh b/src/pch/precompiled-headers.hh index f52f1cab8..c417d27db 100644 --- a/src/pch/precompiled-headers.hh +++ b/src/pch/precompiled-headers.hh @@ -58,3 +58,19 @@ #include #include + +// This stuff is here to force the compiler to actually apply the extern +// template directives in all compilation units. To borrow a term, under +// complex microarchitectural conditions, clang ignores the extern template +// declaration, as revealed in the profile. +// +// In most cases, extern template works fine in the header itself. We don't +// have any idea why this happens. + +// Here because of all the regexes everywhere (it is infeasible to block instantiation everywhere) +// For some reason this does not actually prevent the instantiation of +// regex::_M_compile, and the regex compiler (my interpretation of what this is +// supposed to do is make the template bits out-of-line), but it *does* prevent +// a bunch of codegen of regex stuff, which seems to save about 30s on-cpu. +// Instantiated in libutil/regex.cc. +extern template class std::basic_regex; diff --git a/tests/unit/libstore/derivation.cc b/tests/unit/libstore/derivation.cc index f6401a095..21e141693 100644 --- a/tests/unit/libstore/derivation.cc +++ b/tests/unit/libstore/derivation.cc @@ -1,8 +1,8 @@ #include #include -#include "experimental-features.hh" #include "derivations.hh" +#include "strings.hh" #include "tests/libstore.hh" #include "tests/characterization.hh" diff --git a/tests/unit/libstore/protocol.hh b/tests/unit/libstore/protocol.hh index 059b4d91c..8212959f0 100644 --- a/tests/unit/libstore/protocol.hh +++ b/tests/unit/libstore/protocol.hh @@ -1,6 +1,7 @@ #include #include +#include "strings.hh" #include "tests/libstore.hh" #include "tests/characterization.hh" diff --git a/tests/unit/libutil/references.cc b/tests/unit/libutil/references.cc index a914e6c70..ef7111e9c 100644 --- a/tests/unit/libutil/references.cc +++ b/tests/unit/libutil/references.cc @@ -1,4 +1,5 @@ #include "references.hh" +#include "strings.hh" #include namespace nix {