|
16 | 16 |
|
17 | 17 | #include <atomic> |
18 | 18 | #include <cstdio> |
| 19 | + |
19 | 20 | #if defined(__EMSCRIPTEN__) |
20 | 21 | #include <emscripten/console.h> |
21 | 22 | #endif |
|
25 | 26 | #include "absl/base/internal/raw_logging.h" |
26 | 27 | #include "absl/base/log_severity.h" |
27 | 28 | #include "absl/strings/string_view.h" |
| 29 | +#include "absl/strings/strip.h" |
28 | 30 | #include "absl/time/time.h" |
29 | 31 |
|
30 | 32 | namespace absl { |
@@ -58,16 +60,19 @@ void SetInitialized() { |
58 | 60 | } |
59 | 61 |
|
60 | 62 | void WriteToStderr(absl::string_view message, absl::LogSeverity severity) { |
| 63 | + if (message.empty()) return; |
61 | 64 | #if defined(__EMSCRIPTEN__) |
62 | 65 | // In WebAssembly, bypass filesystem emulation via fwrite. |
63 | | - // TODO(b/282811932): Avoid this copy if these emscripten functions can |
64 | | - // be updated to accept size directly. |
65 | | - std::string null_terminated_message(message); |
66 | | - if (!null_terminated_message.empty() && |
67 | | - null_terminated_message.back() == '\n') { |
68 | | - null_terminated_message.pop_back(); |
69 | | - } |
| 66 | + // Skip a trailing newline character as emscripten_errn adds one itself. |
| 67 | + const auto message_minus_newline = absl::StripSuffix(message, "\n"); |
| 68 | + // emscripten_errn was introduced in 3.1.41 but broken in standalone mode |
| 69 | + // until 3.1.43. |
| 70 | +#if ABSL_INTERNAL_EMSCRIPTEN_VERSION >= 3001043 |
| 71 | + emscripten_errn(message_minus_newline.data(), message_minus_newline.size()); |
| 72 | +#else |
| 73 | + std::string null_terminated_message(message_minus_newline); |
70 | 74 | _emscripten_err(null_terminated_message.c_str()); |
| 75 | +#endif |
71 | 76 | #else |
72 | 77 | // Avoid using std::cerr from this module since we may get called during |
73 | 78 | // exit code, and cerr may be partially or fully destroyed by then. |
|
0 commit comments