diff --git a/deps/v8/src/codegen.cc b/deps/v8/src/codegen.cc index 6b12d64563..a24220d9d0 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 3ddd7cce83..63174aa5db 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 29af1d8337..cfdb9ccb63 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/src/objects.cc @@ -11417,7 +11417,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 0f5bec41d2..62304eb908 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 f70b6de230..08f53c52ac 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