2cd468874f
Because config.h can #define things like _FILE_OFFSET_BITS=64 and not every compilation unit includes config.h, we currently compile half of Nix with _FILE_OFFSET_BITS=64 and other half with _FILE_OFFSET_BITS unset. This causes major havoc with the Settings class on e.g. 32-bit ARM, where different compilation units disagree with the struct layout. E.g.: diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc @@ -166,6 +166,8 @@ void Settings::update() _get(useSubstitutes, "build-use-substitutes"); + fprintf(stderr, "at Settings::update(): &useSubstitutes = %p\n", &nix::settings.useSubstitutes); _get(buildUsersGroup, "build-users-group"); diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -138,6 +138,8 @@ void RemoteStore::initConnection(Connection & conn) void RemoteStore::setOptions(Connection & conn) { + fprintf(stderr, "at RemoteStore::setOptions(): &useSubstitutes = %p\n", &nix::settings.useSubstitutes); conn.to << wopSetOptions Gave me: at Settings::update(): &useSubstitutes = 0xb6e5c5cb at RemoteStore::setOptions(): &useSubstitutes = 0xb6e5c5c7 That was not a fun one to debug!
80 lines
1.5 KiB
C++
80 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <map>
|
|
#include <unordered_set>
|
|
|
|
#include "types.hh"
|
|
|
|
namespace nix {
|
|
|
|
/* Symbol table used by the parser and evaluator to represent and look
|
|
up identifiers and attributes efficiently. SymbolTable::create()
|
|
converts a string into a symbol. Symbols have the property that
|
|
they can be compared efficiently (using a pointer equality test),
|
|
because the symbol table stores only one copy of each string. */
|
|
|
|
class Symbol
|
|
{
|
|
private:
|
|
const string * s; // pointer into SymbolTable
|
|
Symbol(const string * s) : s(s) { };
|
|
friend class SymbolTable;
|
|
|
|
public:
|
|
Symbol() : s(0) { };
|
|
|
|
bool operator == (const Symbol & s2) const
|
|
{
|
|
return s == s2.s;
|
|
}
|
|
|
|
bool operator != (const Symbol & s2) const
|
|
{
|
|
return s != s2.s;
|
|
}
|
|
|
|
bool operator < (const Symbol & s2) const
|
|
{
|
|
return s < s2.s;
|
|
}
|
|
|
|
operator const string & () const
|
|
{
|
|
return *s;
|
|
}
|
|
|
|
bool set() const
|
|
{
|
|
return s;
|
|
}
|
|
|
|
bool empty() const
|
|
{
|
|
return s->empty();
|
|
}
|
|
|
|
friend std::ostream & operator << (std::ostream & str, const Symbol & sym);
|
|
};
|
|
|
|
class SymbolTable
|
|
{
|
|
private:
|
|
typedef std::unordered_set<string> Symbols;
|
|
Symbols symbols;
|
|
|
|
public:
|
|
Symbol create(const string & s)
|
|
{
|
|
std::pair<Symbols::iterator, bool> res = symbols.insert(s);
|
|
return Symbol(&*res.first);
|
|
}
|
|
|
|
unsigned int size() const
|
|
{
|
|
return symbols.size();
|
|
}
|
|
|
|
size_t totalSize() const;
|
|
};
|
|
|
|
}
|