forked from lix-project/lix
Fix NIX_COUNT_CALLS=1
Also, make the JSON writer support std::string_view. Fixes #6857.
This commit is contained in:
parent
7d1ccd9105
commit
ccbd906c86
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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\"");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue