| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent dd66c48 commit 19b5d07
7 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2,8 +2,8 @@ | |||
| 2 | 2 | ||
| 3 | 3 | namespace node { | |
| 4 | 4 | ||
| 5 | - std::string EscapeJsonChars(const std::string& str) { | ||
| 6 | - const std::string control_symbols[0x20] = { | ||
| 5 | + std::string EscapeJsonChars(std::string_view str) { | ||
| 6 | + static const std::string_view control_symbols[0x20] = { | ||
| 7 | 7 | "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", | |
| 8 | 8 | "\\u0006", "\\u0007", "\\b", "\\t", "\\n", "\\u000b", | |
| 9 | 9 | "\\f", "\\r", "\\u000e", "\\u000f", "\\u0010", "\\u0011", | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4,13 +4,21 @@ | |||
| 4 | 4 | #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS | |
| 5 | 5 | ||
| 6 | 6 | #include <iomanip> | |
| 7 | - #include <ostream> | ||
| 8 | 7 | #include <limits> | |
| 8 | + #include <ostream> | ||
| 9 | 9 | #include <string> | |
| 10 | + #include <string_view> | ||
| 10 | 11 | ||
| 11 | 12 | namespace node { | |
| 12 | 13 | ||
| 13 | - std::string EscapeJsonChars(const std::string& str); | ||
| 14 | + constexpr bool NeedsJsonEscape(std::string_view str) { | ||
| 15 | + for (const char c : str) { | ||
| 16 | + if (c == '\\' || c == '"' || c < 0x20) return true; | ||
| 17 | + } | ||
| 18 | + return false; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + std::string EscapeJsonChars(std::string_view str); | ||
| 14 | 22 | std::string Reindent(const std::string& str, int indentation); | |
| 15 | 23 | ||
| 16 | 24 | // JSON compiler definitions. | |
@@ -135,17 +143,20 @@ class JSONWriter { | |||
| 135 | 143 | } | |
| 136 | 144 | ||
| 137 | 145 | inline void write_value(Null null) { out_ << "null"; } | |
| 138 | - inline void write_value(const char* str) { write_string(str); } | ||
| 139 | - inline void write_value(const std::string& str) { write_string(str); } | ||
| 146 | + inline void write_value(std::string_view str) { write_string(str); } | ||
| 140 | 147 | ||
| 141 | 148 | inline void write_value(const ForeignJSON& json) { | |
| 142 | 149 | out_ << Reindent(json.as_string, indent_); | |
| 143 | 150 | } | |
| 144 | 151 | ||
| 145 | - inline void write_string(const std::string& str) { | ||
| 146 | - out_ << '"' << EscapeJsonChars(str) << '"'; | ||
| 152 | + inline void write_string(std::string_view str) { | ||
| 153 | + out_ << '"'; | ||
| 154 | + if (NeedsJsonEscape(str)) // only create temporary std::string if necessary | ||
| 155 | + out_ << EscapeJsonChars(str); | ||
| 156 | + else | ||
| 157 | + out_ << str; | ||
| 158 | + out_ << '"'; | ||
| 147 | 159 | } | |
| 148 | - inline void write_string(const char* str) { write_string(std::string(str)); } | ||
| 149 | 160 | ||
| 150 | 161 | enum JSONState { kObjectStart, kAfterValue }; | |
| 151 | 162 | std::ostream& out_; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -657,7 +657,7 @@ void napi_module_register_by_symbol(v8::Local<v8::Object> exports, | |||
| 657 | 657 | // a file system path. | |
| 658 | 658 | // TODO(gabrielschulhof): Pass the `filename` through unchanged if/when we | |
| 659 | 659 | // receive it as a URL already. | |
| 660 | - module_filename = node::url::FromFilePath(filename.ToString()); | ||
| 660 | + module_filename = node::url::FromFilePath(filename.ToStringView()); | ||
| 661 | 661 | } | |
| 662 | 662 | ||
| 663 | 663 | // Create a new napi_env for this specific module. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -420,8 +420,10 @@ static void ReportFatalException(Environment* env, | |||
| 420 | 420 | // Not an error object. Just print as-is. | |
| 421 | 421 | node::Utf8Value message(env->isolate(), error); | |
| 422 | 422 | ||
| 423 | - FPrintF(stderr, "%s\n", | ||
| 424 | - *message ? message.ToString() : "<toString() threw exception>"); | ||
| 423 | + FPrintF( | ||
| 424 | + stderr, | ||
| 425 | + "%s\n", | ||
| 426 | + *message ? message.ToStringView() : "<toString() threw exception>"); | ||
| 425 | 427 | } else { | |
| 426 | 428 | node::Utf8Value name_string(env->isolate(), name.ToLocalChecked()); | |
| 427 | 429 | node::Utf8Value message_string(env->isolate(), message.ToLocalChecked()); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -400,11 +400,10 @@ static void PrintJavaScriptErrorProperties(JSONWriter* writer, | |||
| 400 | 400 | !value->ToString(context).ToLocal(&value_string)) { | |
| 401 | 401 | continue; | |
| 402 | 402 | } | |
| 403 | - String::Utf8Value k(isolate, key); | ||
| 403 | + node::Utf8Value k(isolate, key); | ||
| 404 | 404 | if (!strcmp(*k, "stack") || !strcmp(*k, "message")) continue; | |
| 405 | - String::Utf8Value v(isolate, value_string); | ||
| 406 | - writer->json_keyvalue(std::string(*k, k.length()), | ||
| 407 | - std::string(*v, v.length())); | ||
| 405 | + node::Utf8Value v(isolate, value_string); | ||
| 406 | + writer->json_keyvalue(k.ToStringView(), v.ToStringView()); | ||
| 408 | 407 | } | |
| 409 | 408 | } | |
| 410 | 409 | writer->json_objectend(); // the end of 'errorProperties' | |
@@ -631,27 +630,26 @@ static void PrintResourceUsage(JSONWriter* writer) { | |||
| 631 | 630 | uint64_t free_memory = uv_get_free_memory(); | |
| 632 | 631 | uint64_t total_memory = uv_get_total_memory(); | |
| 633 | 632 | ||
| 634 | - writer->json_keyvalue("free_memory", std::to_string(free_memory)); | ||
| 635 | - writer->json_keyvalue("total_memory", std::to_string(total_memory)); | ||
| 633 | + writer->json_keyvalue("free_memory", free_memory); | ||
| 634 | + writer->json_keyvalue("total_memory", total_memory); | ||
| 636 | 635 | ||
| 637 | 636 | size_t rss; | |
| 638 | 637 | int err = uv_resident_set_memory(&rss); | |
| 639 | 638 | if (!err) { | |
| 640 | - writer->json_keyvalue("rss", std::to_string(rss)); | ||
| 639 | + writer->json_keyvalue("rss", rss); | ||
| 641 | 640 | } | |
| 642 | 641 | ||
| 643 | 642 | uint64_t constrained_memory = uv_get_constrained_memory(); | |
| 644 | 643 | if (constrained_memory) { | |
| 645 | - writer->json_keyvalue("constrained_memory", | ||
| 646 | - std::to_string(constrained_memory)); | ||
| 644 | + writer->json_keyvalue("constrained_memory", constrained_memory); | ||
| 647 | 645 | } | |
| 648 | 646 | ||
| 649 | 647 | // See GuessMemoryAvailableToTheProcess | |
| 650 | 648 | if (!err && constrained_memory && constrained_memory >= rss) { | |
| 651 | 649 | uint64_t available_memory = constrained_memory - rss; | |
| 652 | - writer->json_keyvalue("available_memory", std::to_string(available_memory)); | ||
| 650 | + writer->json_keyvalue("available_memory", available_memory); | ||
| 653 | 651 | } else { | |
| 654 | - writer->json_keyvalue("available_memory", std::to_string(free_memory)); | ||
| 652 | + writer->json_keyvalue("available_memory", free_memory); | ||
| 655 | 653 | } | |
| 656 | 654 | ||
| 657 | 655 | if (uv_getrusage(&rusage) == 0) { | |
@@ -668,7 +666,7 @@ static void PrintResourceUsage(JSONWriter* writer) { | |||
| 668 | 666 | writer->json_keyvalue("cpuConsumptionPercent", cpu_percentage); | |
| 669 | 667 | writer->json_keyvalue("userCpuConsumptionPercent", user_cpu_percentage); | |
| 670 | 668 | writer->json_keyvalue("kernelCpuConsumptionPercent", kernel_cpu_percentage); | |
| 671 | - writer->json_keyvalue("maxRss", std::to_string(rusage.ru_maxrss * 1024)); | ||
| 669 | + writer->json_keyvalue("maxRss", rusage.ru_maxrss * 1024); | ||
| 672 | 670 | writer->json_objectstart("pageFaults"); | |
| 673 | 671 | writer->json_keyvalue("IORequired", rusage.ru_majflt); | |
| 674 | 672 | writer->json_keyvalue("IONotRequired", rusage.ru_minflt); | |
@@ -795,13 +793,15 @@ static void PrintComponentVersions(JSONWriter* writer) { | |||
| 795 | 793 | writer->json_objectstart("componentVersions"); | |
| 796 | 794 | ||
| 797 | 795 | #define V(key) +1 | |
| 798 | - std::pair<std::string, std::string> versions_array[NODE_VERSIONS_KEYS(V)]; | ||
| 796 | + std::pair<std::string_view, std::string_view> | ||
| 797 | + versions_array[NODE_VERSIONS_KEYS(V)]; | ||
| 799 | 798 | #undef V | |
| 800 | 799 | auto* slot = &versions_array[0]; | |
| 801 | 800 | ||
| 802 | 801 | #define V(key) \ | |
| 803 | 802 | do { \ | |
| 804 | - *slot++ = std::make_pair(#key, per_process::metadata.versions.key); \ | ||
| 803 | + *slot++ = std::pair<std::string_view, std::string_view>( \ | ||
| 804 | + #key, per_process::metadata.versions.key); \ | ||
| 805 | 805 | } while (0); | |
| 806 | 806 | NODE_VERSIONS_KEYS(V) | |
| 807 | 807 | #undef V | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -83,79 +83,75 @@ static void ReportEndpoints(uv_handle_t* h, JSONWriter* writer) { | |||
| 83 | 83 | // Utility function to format libuv pipe information. | |
| 84 | 84 | static void ReportPipeEndpoints(uv_handle_t* h, JSONWriter* writer) { | |
| 85 | 85 | uv_any_handle* handle = reinterpret_cast<uv_any_handle*>(h); | |
| 86 | - MallocedBuffer<char> buffer(0); | ||
| 87 | - size_t buffer_size = 0; | ||
| 86 | + MaybeStackBuffer<char> buffer; | ||
| 87 | + size_t buffer_size = buffer.capacity(); | ||
| 88 | 88 | int rc = -1; | |
| 89 | 89 | ||
| 90 | 90 | // First call to get required buffer size. | |
| 91 | - rc = uv_pipe_getsockname(&handle->pipe, buffer.data, &buffer_size); | ||
| 91 | + rc = uv_pipe_getsockname(&handle->pipe, buffer.out(), &buffer_size); | ||
| 92 | 92 | if (rc == UV_ENOBUFS) { | |
| 93 | - buffer = MallocedBuffer<char>(buffer_size); | ||
| 94 | - if (buffer.data != nullptr) { | ||
| 95 | - rc = uv_pipe_getsockname(&handle->pipe, buffer.data, &buffer_size); | ||
| 96 | - } else { | ||
| 97 | - buffer_size = 0; | ||
| 98 | - } | ||
| 93 | + buffer.AllocateSufficientStorage(buffer_size); | ||
| 94 | + rc = uv_pipe_getsockname(&handle->pipe, buffer.out(), &buffer_size); | ||
| 99 | 95 | } | |
| 100 | - if (rc == 0 && buffer_size != 0 && buffer.data != nullptr) { | ||
| 101 | - writer->json_keyvalue("localEndpoint", buffer.data); | ||
| 96 | + if (rc == 0 && buffer_size != 0) { | ||
| 97 | + buffer.SetLength(buffer_size); | ||
| 98 | + writer->json_keyvalue("localEndpoint", buffer.ToStringView()); | ||
| 102 | 99 | } else { | |
| 103 | 100 | writer->json_keyvalue("localEndpoint", null); | |
| 104 | 101 | } | |
| 105 | 102 | ||
| 106 | 103 | // First call to get required buffer size. | |
| 107 | - rc = uv_pipe_getpeername(&handle->pipe, buffer.data, &buffer_size); | ||
| 104 | + buffer_size = buffer.capacity(); | ||
| 105 | + rc = uv_pipe_getpeername(&handle->pipe, buffer.out(), &buffer_size); | ||
| 108 | 106 | if (rc == UV_ENOBUFS) { | |
| 109 | - buffer = MallocedBuffer<char>(buffer_size); | ||
| 110 | - if (buffer.data != nullptr) { | ||
| 111 | - rc = uv_pipe_getpeername(&handle->pipe, buffer.data, &buffer_size); | ||
| 112 | - } | ||
| 107 | + buffer.AllocateSufficientStorage(buffer_size); | ||
| 108 | + rc = uv_pipe_getpeername(&handle->pipe, buffer.out(), &buffer_size); | ||
| 113 | 109 | } | |
| 114 | - if (rc == 0 && buffer_size != 0 && buffer.data != nullptr) { | ||
| 115 | - writer->json_keyvalue("remoteEndpoint", buffer.data); | ||
| 110 | + if (rc == 0 && buffer_size != 0) { | ||
| 111 | + buffer.SetLength(buffer_size); | ||
| 112 | + writer->json_keyvalue("remoteEndpoint", buffer.ToStringView()); | ||
| 116 | 113 | } else { | |
| 117 | 114 | writer->json_keyvalue("remoteEndpoint", null); | |
| 118 | 115 | } | |
| 119 | 116 | } | |
| 120 | 117 | ||
| 121 | 118 | // Utility function to format libuv path information. | |
| 122 | 119 | static void ReportPath(uv_handle_t* h, JSONWriter* writer) { | |
| 123 | - MallocedBuffer<char> buffer(0); | ||
| 120 | + MaybeStackBuffer<char> buffer; | ||
| 124 | 121 | int rc = -1; | |
| 125 | - size_t size = 0; | ||
| 122 | + size_t size = buffer.capacity(); | ||
| 126 | 123 | uv_any_handle* handle = reinterpret_cast<uv_any_handle*>(h); | |
| 127 | - bool wrote_filename = false; | ||
| 128 | 124 | // First call to get required buffer size. | |
| 129 | 125 | switch (h->type) { | |
| 130 | 126 | case UV_FS_EVENT: | |
| 131 | - rc = uv_fs_event_getpath(&(handle->fs_event), buffer.data, &size); | ||
| 127 | + rc = uv_fs_event_getpath(&(handle->fs_event), buffer.out(), &size); | ||
| 132 | 128 | break; | |
| 133 | 129 | case UV_FS_POLL: | |
| 134 | - rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.data, &size); | ||
| 130 | + rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.out(), &size); | ||
| 135 | 131 | break; | |
| 136 | 132 | default: | |
| 137 | 133 | break; | |
| 138 | 134 | } | |
| 139 | 135 | if (rc == UV_ENOBUFS) { | |
| 140 | - buffer = MallocedBuffer<char>(size + 1); | ||
| 136 | + buffer.AllocateSufficientStorage(size); | ||
| 141 | 137 | switch (h->type) { | |
| 142 | 138 | case UV_FS_EVENT: | |
| 143 | - rc = uv_fs_event_getpath(&(handle->fs_event), buffer.data, &size); | ||
| 139 | + rc = uv_fs_event_getpath(&(handle->fs_event), buffer.out(), &size); | ||
| 144 | 140 | break; | |
| 145 | 141 | case UV_FS_POLL: | |
| 146 | - rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.data, &size); | ||
| 142 | + rc = uv_fs_poll_getpath(&(handle->fs_poll), buffer.out(), &size); | ||
| 147 | 143 | break; | |
| 148 | 144 | default: | |
| 149 | 145 | break; | |
| 150 | 146 | } | |
| 151 | - if (rc == 0) { | ||
| 152 | - // buffer is not null terminated. | ||
| 153 | - buffer.data[size] = '\0'; | ||
| 154 | - writer->json_keyvalue("filename", buffer.data); | ||
| 155 | - wrote_filename = true; | ||
| 156 | - } | ||
| 157 | 147 | } | |
| 158 | - if (!wrote_filename) writer->json_keyvalue("filename", null); | ||
| 148 | + | ||
| 149 | + if (rc == 0 && size > 0) { | ||
| 150 | + buffer.SetLength(size); | ||
| 151 | + writer->json_keyvalue("filename", buffer.ToStringView()); | ||
| 152 | + } else { | ||
| 153 | + writer->json_keyvalue("filename", null); | ||
| 154 | + } | ||
| 159 | 155 | } | |
| 160 | 156 | ||
| 161 | 157 | // Utility function to walk libuv handles. | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -38,10 +38,10 @@ | |||
| 38 | 38 | #include <array> | |
| 39 | 39 | #include <limits> | |
| 40 | 40 | #include <memory> | |
| 41 | + #include <set> | ||
| 41 | 42 | #include <string> | |
| 42 | 43 | #include <string_view> | |
| 43 | 44 | #include <type_traits> | |
| 44 | - #include <set> | ||
| 45 | 45 | #include <unordered_map> | |
| 46 | 46 | #include <utility> | |
| 47 | 47 | #include <vector> | |
@@ -486,6 +486,11 @@ class MaybeStackBuffer { | |||
| 486 | 486 | free(buf_); | |
| 487 | 487 | } | |
| 488 | 488 | ||
| 489 | + inline std::basic_string<T> ToString() const { return {out(), length()}; } | ||
| 490 | + inline std::basic_string_view<T> ToStringView() const { | ||
| 491 | + return {out(), length()}; | ||
| 492 | + } | ||
| 493 | + | ||
| 489 | 494 | private: | |
| 490 | 495 | size_t length_; | |
| 491 | 496 | // capacity of the malloc'ed buf_ | |
@@ -533,8 +538,6 @@ class Utf8Value : public MaybeStackBuffer<char> { | |||
| 533 | 538 | public: | |
| 534 | 539 | explicit Utf8Value(v8::Isolate* isolate, v8::Local<v8::Value> value); | |
| 535 | 540 | ||
| 536 | - inline std::string ToString() const { return std::string(out(), length()); } | ||
| 537 | - | ||
| 538 | 541 | inline bool operator==(const char* a) const { | |
| 539 | 542 | return strcmp(out(), a) == 0; | |
| 540 | 543 | } | |
@@ -609,7 +612,7 @@ struct MallocedBuffer { | |||
| 609 | 612 | } | |
| 610 | 613 | ||
| 611 | 614 | void Truncate(size_t new_size) { | |
| 612 | - CHECK(new_size <= size); | ||
| 615 | + CHECK_LE(new_size, size); | ||
| 613 | 616 | size = new_size; | |
| 614 | 617 | } | |
| 615 | 618 | ||
@@ -618,7 +621,7 @@ struct MallocedBuffer { | |||
| 618 | 621 | data = UncheckedRealloc(data, new_size); | |
| 619 | 622 | } | |
| 620 | 623 | ||
| 621 | - inline bool is_empty() const { return data == nullptr; } | ||
| 624 | + bool is_empty() const { return data == nullptr; } | ||
| 622 | 625 | ||
| 623 | 626 | MallocedBuffer() : data(nullptr), size(0) {} | |
| 624 | 627 | explicit MallocedBuffer(size_t size) : data(Malloc<T>(size)), size(size) {} | |
| Back | FazBrowse Home | New Git URL |
0 commit comments