Merge pull request #6861 from edolstra/fix-count-calls

Fix NIX_COUNT_CALLS=1
This commit is contained in:
Eelco Dolstra 2022-08-03 18:26:01 +02:00 committed by GitHub
commit 075bf6e556
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 26 deletions

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\"");
} }