Merge remote-tracking branch 'nixos/master'

This commit is contained in:
Max Headroom 2022-08-03 20:18:29 +02:00
commit 628ecf950a
7 changed files with 179 additions and 175 deletions

View file

@ -34,7 +34,7 @@
- [Building and Testing](expressions/simple-building-testing.md) - [Building and Testing](expressions/simple-building-testing.md)
- [Generic Builder Syntax](expressions/generic-builder.md) - [Generic Builder Syntax](expressions/generic-builder.md)
- [Nix Expression Language](expressions/expression-language.md) - [Nix Expression Language](expressions/expression-language.md)
- [Values](expressions/language-values.md) - [Data Types](expressions/language-values.md)
- [Language Constructs](expressions/language-constructs.md) - [Language Constructs](expressions/language-constructs.md)
- [Operators](expressions/language-operators.md) - [Operators](expressions/language-operators.md)
- [Derivations](expressions/derivations.md) - [Derivations](expressions/derivations.md)

View file

@ -12,14 +12,14 @@ machine is accessible via SSH and that it has Nix installed. You can
test whether connecting to the remote Nix instance works, e.g. test whether connecting to the remote Nix instance works, e.g.
```console ```console
$ nix ping-store --store ssh://mac $ nix store ping --store ssh://mac
``` ```
will try to connect to the machine named `mac`. It is possible to will try to connect to the machine named `mac`. It is possible to
specify an SSH identity file as part of the remote store URI, e.g. specify an SSH identity file as part of the remote store URI, e.g.
```console ```console
$ nix ping-store --store ssh://mac?ssh-key=/home/alice/my-key $ nix store ping --store ssh://mac?ssh-key=/home/alice/my-key
``` ```
Since builds should be non-interactive, the key should not have a Since builds should be non-interactive, the key should not have a

View file

@ -1,10 +1,10 @@
# Values # Data Types
## Simple Values ## Primitives
Nix has the following basic data types: - <a id="type-string" href="#type-string">String</a>
- *Strings* can be written in three ways. *Strings* can be written in three ways.
The most common way is to enclose the string between double quotes, The most common way is to enclose the string between double quotes,
e.g., `"foo bar"`. Strings can span multiple lines. The special e.g., `"foo bar"`. Strings can span multiple lines. The special
@ -112,14 +112,18 @@ Nix has the following basic data types:
`"http://example.org/foo.tar.bz2"` can also be written as `"http://example.org/foo.tar.bz2"` can also be written as
`http://example.org/foo.tar.bz2`. `http://example.org/foo.tar.bz2`.
- Numbers, which can be *integers* (like `123`) or *floating point* - <a id="type-number" href="#type-number">Number</a>
Numbers, which can be *integers* (like `123`) or *floating point*
(like `123.43` or `.27e13`). (like `123.43` or `.27e13`).
Numbers are type-compatible: pure integer operations will always Numbers are type-compatible: pure integer operations will always
return integers, whereas any operation involving at least one return integers, whereas any operation involving at least one
floating point number will have a floating point number as a result. floating point number will have a floating point number as a result.
- *Paths*, e.g., `/bin/sh` or `./builder.sh`. A path must contain at - <a id="type-path" href="#type-path">Path</a>
*Paths*, e.g., `/bin/sh` or `./builder.sh`. A path must contain at
least one slash to be recognised as such. For instance, `builder.sh` least one slash to be recognised as such. For instance, `builder.sh`
is not a path: it's parsed as an expression that selects the is not a path: it's parsed as an expression that selects the
attribute `sh` from the variable `builder`. If the file name is attribute `sh` from the variable `builder`. If the file name is
@ -146,11 +150,15 @@ Nix has the following basic data types:
recognized as a path. `a.${foo}/b.${bar}` is a syntactically valid division recognized as a path. `a.${foo}/b.${bar}` is a syntactically valid division
operation. `./a.${foo}/b.${bar}` is a path. operation. `./a.${foo}/b.${bar}` is a path.
- *Booleans* with values `true` and `false`. - <a id="type-boolean" href="#type-boolean">Boolean</a>
- The null value, denoted as `null`. *Booleans* with values `true` and `false`.
## Lists - <a id="type-null" href="#type-null">Null</a>
The null value, denoted as `null`.
## List
Lists are formed by enclosing a whitespace-separated list of values Lists are formed by enclosing a whitespace-separated list of values
between square brackets. For example, between square brackets. For example,
@ -172,9 +180,9 @@ function and the fifth being a set.
Note that lists are only lazy in values, and they are strict in length. Note that lists are only lazy in values, and they are strict in length.
## Attribute Sets ## Attribute Set
Attribute sets are collections of name-value-pairs (called *attributes*) enclosed in curly brackets (`{ }`). An attribute set is a collection of name-value-pairs (called *attributes*) enclosed in curly brackets (`{ }`).
Names and values are separated by an equal sign (`=`). Names and values are separated by an equal sign (`=`).
Each value is an arbitrary expression terminated by a semicolon (`;`). Each value is an arbitrary expression terminated by a semicolon (`;`).

View file

@ -2501,18 +2501,18 @@ void EvalState::printStats()
} }
{ {
auto list = topObj.list("functions"); auto list = topObj.list("functions");
for (auto & i : functionCalls) { for (auto & [fun, count] : functionCalls) {
auto obj = list.object(); auto obj = list.object();
if (i.first->name) if (fun->name)
obj.attr("name", (const std::string &) i.first->name); obj.attr("name", (std::string_view) symbols[fun->name]);
else else
obj.attr("name", nullptr); obj.attr("name", nullptr);
if (auto pos = positions[i.first->pos]) { if (auto pos = positions[fun->pos]) {
obj.attr("file", (const std::string &) pos.file); obj.attr("file", (std::string_view) pos.file);
obj.attr("line", pos.line); obj.attr("line", pos.line);
obj.attr("column", pos.column); obj.attr("column", pos.column);
} }
obj.attr("count", i.second); obj.attr("count", count);
} }
} }
{ {

View file

@ -6,7 +6,8 @@
namespace nix { namespace nix {
void toJSON(std::ostream & str, const char * start, const char * end) template<>
void toJSON<std::string_view>(std::ostream & str, const std::string_view & s)
{ {
constexpr size_t BUF_SIZE = 4096; constexpr size_t BUF_SIZE = 4096;
char buf[BUF_SIZE + 7]; // BUF_SIZE + largest single sequence of puts char buf[BUF_SIZE + 7]; // BUF_SIZE + largest single sequence of puts
@ -21,7 +22,7 @@ void toJSON(std::ostream & str, const char * start, const char * end)
}; };
put('"'); put('"');
for (auto i = start; i != end; i++) { for (auto i = s.begin(); i != s.end(); i++) {
if (bufPos >= BUF_SIZE) flush(); if (bufPos >= BUF_SIZE) flush();
if (*i == '\"' || *i == '\\') { put('\\'); put(*i); } if (*i == '\"' || *i == '\\') { put('\\'); put(*i); }
else if (*i == '\n') { put('\\'); put('n'); } else if (*i == '\n') { put('\\'); put('n'); }
@ -44,7 +45,7 @@ void toJSON(std::ostream & str, const char * start, const char * end)
void toJSON(std::ostream & str, const char * s) void toJSON(std::ostream & str, const char * s)
{ {
if (!s) str << "null"; else toJSON(str, s, s + strlen(s)); if (!s) str << "null"; else toJSON(str, std::string_view(s));
} }
template<> void toJSON<int>(std::ostream & str, const int & n) { str << n; } template<> void toJSON<int>(std::ostream & str, const int & n) { str << n; }
@ -55,11 +56,7 @@ template<> void toJSON<long long>(std::ostream & str, const long long & n) { str
template<> void toJSON<unsigned long long>(std::ostream & str, const unsigned long long & n) { str << n; } template<> void toJSON<unsigned long long>(std::ostream & str, const unsigned long long & n) { str << n; }
template<> void toJSON<float>(std::ostream & str, const float & n) { str << n; } template<> void toJSON<float>(std::ostream & str, const float & n) { str << n; }
template<> void toJSON<double>(std::ostream & str, const double & n) { str << n; } template<> void toJSON<double>(std::ostream & str, const double & n) { str << n; }
template<> void toJSON<std::string>(std::ostream & str, const std::string & s) { toJSON(str, (std::string_view) s); }
template<> void toJSON<std::string>(std::ostream & str, const std::string & s)
{
toJSON(str, s.c_str(), s.c_str() + s.size());
}
template<> void toJSON<bool>(std::ostream & str, const bool & b) template<> void toJSON<bool>(std::ostream & str, const bool & b)
{ {
@ -154,7 +151,7 @@ JSONObject::~JSONObject()
} }
} }
void JSONObject::attr(const std::string & s) void JSONObject::attr(std::string_view s)
{ {
comma(); comma();
toJSON(state->str, s); toJSON(state->str, s);
@ -162,19 +159,19 @@ void JSONObject::attr(const std::string & s)
if (state->indent) state->str << ' '; if (state->indent) state->str << ' ';
} }
JSONList JSONObject::list(const std::string & name) JSONList JSONObject::list(std::string_view name)
{ {
attr(name); attr(name);
return JSONList(state); return JSONList(state);
} }
JSONObject JSONObject::object(const std::string & name) JSONObject JSONObject::object(std::string_view name)
{ {
attr(name); attr(name);
return JSONObject(state); return JSONObject(state);
} }
JSONPlaceholder JSONObject::placeholder(const std::string & name) JSONPlaceholder JSONObject::placeholder(std::string_view name)
{ {
attr(name); attr(name);
return JSONPlaceholder(state); return JSONPlaceholder(state);

View file

@ -6,7 +6,6 @@
namespace nix { namespace nix {
void toJSON(std::ostream & str, const char * start, const char * end);
void toJSON(std::ostream & str, const char * s); void toJSON(std::ostream & str, const char * s);
template<typename T> template<typename T>
@ -107,7 +106,7 @@ private:
open(); open();
} }
void attr(const std::string & s); void attr(std::string_view s);
public: public:
@ -128,18 +127,18 @@ public:
~JSONObject(); ~JSONObject();
template<typename T> template<typename T>
JSONObject & attr(const std::string & name, const T & v) JSONObject & attr(std::string_view name, const T & v)
{ {
attr(name); attr(name);
toJSON(state->str, v); toJSON(state->str, v);
return *this; return *this;
} }
JSONList list(const std::string & name); JSONList list(std::string_view name);
JSONObject object(const std::string & name); JSONObject object(std::string_view name);
JSONPlaceholder placeholder(const std::string & name); JSONPlaceholder placeholder(std::string_view name);
}; };
class JSONPlaceholder : JSONWriter class JSONPlaceholder : JSONWriter

View file

@ -102,8 +102,8 @@ namespace nix {
TEST(toJSON, substringEscape) { TEST(toJSON, substringEscape) {
std::stringstream out; std::stringstream out;
const char *s = "foo\t"; std::string_view s = "foo\t";
toJSON(out, s+3, s + strlen(s)); toJSON(out, s.substr(3));
ASSERT_EQ(out.str(), "\"\\t\""); ASSERT_EQ(out.str(), "\"\\t\"");
} }