diff --git a/deps/v8/src/codegen.cc b/deps/v8/src/codegen.cc index 6b12d64563f..a24220d9d0a 100644 --- a/deps/v8/src/codegen.cc +++ b/deps/v8/src/codegen.cc @@ -190,7 +190,7 @@ void CodeGenerator::PrintCode(Handle code, CompilationInfo* info) { function->end_position() - function->start_position() + 1; for (int i = 0; i < source_len; i++) { if (stream.HasMore()) { - os << AsUC16(stream.GetNext()); + os << AsReversiblyEscapedUC16(stream.GetNext()); } } os << "\n\n"; diff --git a/deps/v8/src/hydrogen.cc b/deps/v8/src/hydrogen.cc index 9f3945f275d..8800ed6b955 100644 --- a/deps/v8/src/hydrogen.cc +++ b/deps/v8/src/hydrogen.cc @@ -3498,7 +3498,7 @@ int HGraph::TraceInlinedFunction( shared->end_position() - shared->start_position() + 1; for (int i = 0; i < source_len; i++) { if (stream.HasMore()) { - os << AsUC16(stream.GetNext()); + os << AsReversiblyEscapedUC16(stream.GetNext()); } } } diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index a994718bd07..d3ad92d1994 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -11431,7 +11431,10 @@ void Code::Disassemble(const char* name, OStream& os) { // NOLINT os << "Instructions (size = " << instruction_size() << ")\n"; // TODO(svenpanne) The Disassembler should use streams, too! - Disassembler::Decode(stdout, this); + { + CodeTracer::Scope trace_scope(GetIsolate()->GetCodeTracer()); + Disassembler::Decode(trace_scope.file(), this); + } os << "\n"; if (kind() == FUNCTION) { diff --git a/deps/v8/src/ostreams.cc b/deps/v8/src/ostreams.cc index 0f5bec41d2b..62304eb9081 100644 --- a/deps/v8/src/ostreams.cc +++ b/deps/v8/src/ostreams.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include +#include #include #include "src/base/platform/platform.h" // For isinf/isnan with MSVC @@ -163,11 +164,21 @@ OFStream& OFStream::flush() { } +OStream& operator<<(OStream& os, const AsReversiblyEscapedUC16& c) { + char buf[10]; + const char* format = + (std::isprint(c.value) || std::isspace(c.value)) && c.value != '\\' + ? "%c" + : (c.value <= 0xff) ? "\\x%02x" : "\\u%04x"; + snprintf(buf, sizeof(buf), format, c.value); + return os << buf; +} + + OStream& operator<<(OStream& os, const AsUC16& c) { char buf[10]; - const char* format = (0x20 <= c.value && c.value <= 0x7F) - ? "%c" - : (c.value <= 0xff) ? "\\x%02x" : "\\u%04x"; + const char* format = + std::isprint(c.value) ? "%c" : (c.value <= 0xff) ? "\\x%02x" : "\\u%04x"; snprintf(buf, sizeof(buf), format, c.value); return os << buf; } diff --git a/deps/v8/src/ostreams.h b/deps/v8/src/ostreams.h index f70b6de230d..08f53c52ac3 100644 --- a/deps/v8/src/ostreams.h +++ b/deps/v8/src/ostreams.h @@ -117,13 +117,26 @@ class OFStream: public OStream { }; -// A wrapper to disambiguate uint16_t and uc16. +// Wrappers to disambiguate uint16_t and uc16. struct AsUC16 { explicit AsUC16(uint16_t v) : value(v) {} uint16_t value; }; +struct AsReversiblyEscapedUC16 { + explicit AsReversiblyEscapedUC16(uint16_t v) : value(v) {} + uint16_t value; +}; + + +// Writes the given character to the output escaping everything outside of +// printable/space ASCII range. Additionally escapes '\' making escaping +// reversible. +OStream& operator<<(OStream& os, const AsReversiblyEscapedUC16& c); + +// Writes the given character to the output escaping everything outside +// of printable ASCII range. OStream& operator<<(OStream& os, const AsUC16& c); } } // namespace v8::internal