From 5710934d1db186379c401c4973be63b14fbcf51b Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Tue, 18 Sep 2012 18:06:55 -0400 Subject: [PATCH] [Mono.Debugger.Soft] Escape some unicode characters in literal strings Fix for bug #6369 --- .../Mono.Debugger.Soft/MethodBodyMirror.cs | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs index c383005a0d4..61af2c0c49c 100644 --- a/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs +++ b/mcs/class/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodBodyMirror.cs @@ -56,8 +56,38 @@ namespace Mono.Debugger.Soft static OpCode [] OneByteOpCode = new OpCode [0xe0 + 1]; static OpCode [] TwoBytesOpCode = new OpCode [0x1e + 1]; + static string EscapeString (string text) + { + StringBuilder sb = new StringBuilder (); + for (int i = 0; i < text.Length; i++) { + char c = text[i]; + string txt; + switch (c) { + case '"': txt = "\\\""; break; + case '\0': txt = @"\0"; break; + case '\\': txt = @"\\"; break; + case '\a': txt = @"\a"; break; + case '\b': txt = @"\b"; break; + case '\f': txt = @"\f"; break; + case '\v': txt = @"\v"; break; + case '\n': txt = @"\n"; break; + case '\r': txt = @"\r"; break; + case '\t': txt = @"\t"; break; + default: + if (char.GetUnicodeCategory (c) == UnicodeCategory.OtherNotAssigned) { + sb.AppendFormat ("\\u{0:x4}", (int) c); + } else { + sb.Append (c); + } + continue; + } + sb.Append (txt); + } + return sb.ToString (); + } + // Adapted from Cecil - List ReadCilBody (BinaryReader br, int code_size) + List ReadCilBody (BinaryReader br, int code_size) { long start = br.BaseStream.Position; ILInstruction last = null; @@ -153,7 +183,7 @@ namespace Mono.Debugger.Soft token = br.ReadInt32 (); t = vm.conn.Method_ResolveToken (Method.Id, token); if (t.Type == TokenType.STRING) - instr.Operand = t.Str; + instr.Operand = EscapeString (t.Str); break; case OperandType.InlineField : case OperandType.InlineMethod : -- 2.25.1