Merge pull request #2802 from BrzVlad/feature-evacuation-opt2
[mono.git] / mcs / class / corlib / System.Diagnostics / StackTrace.cs
index 721c38ef786a76870585e785cad0d2e3b9efe3ac..afa470dd5c3dbd1c4e500fec031ee5805e549959 100644 (file)
@@ -120,11 +120,6 @@ namespace System.Diagnostics {
                }
 
                public StackTrace (Exception e, int skipFrames, bool fNeedFileInfo)
-                       : this (e, skipFrames, fNeedFileInfo, false)
-               {
-               }
-
-               internal StackTrace (Exception e, int skipFrames, bool fNeedFileInfo, bool returnNativeFrames)
                {
                        if (e == null)
                                throw new ArgumentNullException ("e");
@@ -133,23 +128,6 @@ namespace System.Diagnostics {
 
                        frames = get_trace (e, skipFrames, fNeedFileInfo);
 
-                       if (!returnNativeFrames) {
-                               bool resize = false;
-                               for (int i = 0; i < frames.Length; ++i)
-                                       if (frames [i].GetMethod () == null)
-                                               resize = true;
-
-                               if (resize) {
-                                       var l = new List<StackFrame> ();
-
-                                       for (int i = 0; i < frames.Length; ++i)
-                                               if (frames [i].GetMethod () != null)
-                                                       l.Add (frames [i]);
-
-                                       frames = l.ToArray ();
-                               }
-                       }
-
                        captured_traces = e.captured_traces;
                }
 
@@ -171,6 +149,10 @@ namespace System.Diagnostics {
                        throw new NotImplementedException ();
                }
 
+               internal StackTrace (StackFrame[] frames) {
+                       this.frames = frames;
+               }
+
                public virtual int FrameCount {
                        get {
                                return (frames == null) ? 0 : frames.Length;
@@ -192,21 +174,14 @@ namespace System.Diagnostics {
                        return frames;
                }
 
-               bool AddFrames (StringBuilder sb, bool isException = false)
+               bool AddFrames (StringBuilder sb)
                {
                        bool printOffset;
                        string debugInfo, indentation;
                        string unknown = Locale.GetText ("<unknown method>");
 
-                       if (isException) {
-                               printOffset = true;
-                               indentation = "  ";
-                               debugInfo = Locale.GetText (" in {0}:{1} ");
-                       } else {
-                               printOffset = false;
-                               indentation = "   ";
-                               debugInfo = Locale.GetText (" in {0}:line {1}");
-                       }
+                       indentation = "  ";
+                       debugInfo = Locale.GetText (" in {0}:{1} ");
 
                        var newline = String.Format ("{0}{1}{2} ", Environment.NewLine, indentation,
                                        Locale.GetText ("at"));
@@ -223,21 +198,17 @@ namespace System.Diagnostics {
                                        string internal_name = frame.GetInternalMethodName ();
                                        if (internal_name != null)
                                                sb.Append (internal_name);
-                                       else if (printOffset)
-                                               sb.AppendFormat ("<0x{0:x5} + 0x{1:x5}> {2}", frame.GetMethodAddress (), frame.GetNativeOffset (), unknown);
                                        else
-                                               sb.AppendFormat (unknown);
+                                               sb.AppendFormat ("<0x{0:x5} + 0x{1:x5}> {2}", frame.GetMethodAddress (), frame.GetNativeOffset (), unknown);
                                } else {
-                                       GetFullNameForStackTrace (sb, frame.GetMethod ());
-
-                                       if (printOffset) {
-                                               if (frame.GetILOffset () == -1) {
-                                                       sb.AppendFormat (" <0x{0:x5} + 0x{1:x5}>", frame.GetMethodAddress (), frame.GetNativeOffset ());
-                                                       if (frame.GetMethodIndex () != 0xffffff)
-                                                               sb.AppendFormat (" {0}", frame.GetMethodIndex ());
-                                               } else {
-                                                       sb.AppendFormat (" [0x{0:x5}]", frame.GetILOffset ());
-                                               }
+                                       StackTraceHelper.GetFullNameForStackTrace (sb, frame.GetMethod ());
+
+                                       if (frame.GetILOffset () == -1) {
+                                               sb.AppendFormat (" <0x{0:x5} + 0x{1:x5}>", frame.GetMethodAddress (), frame.GetNativeOffset ());
+                                               if (frame.GetMethodIndex () != 0xffffff)
+                                                       sb.AppendFormat (" {0}", frame.GetMethodIndex ());
+                                       } else {
+                                               sb.AppendFormat (" [0x{0:x5}]", frame.GetILOffset ());
                                        }
 
                                        sb.AppendFormat (debugInfo, frame.GetSecureFileName (),
@@ -248,64 +219,6 @@ namespace System.Diagnostics {
                        return i != 0;
                }
 
-               // This method is also used with reflection by mono-symbolicate tool.
-               // mono-symbolicate tool uses this method to check which method matches
-               // the stack frame method signature.
-               static void GetFullNameForStackTrace (StringBuilder sb, MethodBase mi)
-               {
-                       var declaringType = mi.DeclaringType;
-                       if (declaringType.IsGenericType && !declaringType.IsGenericTypeDefinition)
-                               declaringType = declaringType.GetGenericTypeDefinition ();
-
-                       // Get generic definition
-                       var bindingflags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
-                       foreach (var m in declaringType.GetMethods (bindingflags)) {
-                               if (m.MetadataToken == mi.MetadataToken) {
-                                       mi = m;
-                                       break;
-                               }
-                       }
-
-                       sb.Append (declaringType.ToString ());
-
-                       sb.Append (".");
-                       sb.Append (mi.Name);
-
-                       if (mi.IsGenericMethod) {
-                               Type[] gen_params = mi.GetGenericArguments ();
-                               sb.Append ("[");
-                               for (int j = 0; j < gen_params.Length; j++) {
-                                       if (j > 0)
-                                               sb.Append (",");
-                                       sb.Append (gen_params [j].Name);
-                               }
-                               sb.Append ("]");
-                       }
-
-                       ParameterInfo[] p = mi.GetParametersInternal ();
-
-                       sb.Append (" (");
-                       for (int i = 0; i < p.Length; ++i) {
-                               if (i > 0)
-                                       sb.Append (", ");
-
-                               Type pt = p[i].ParameterType;
-                               if (pt.IsGenericType && ! pt.IsGenericTypeDefinition)
-                                       pt = pt.GetGenericTypeDefinition ();
-
-                               if (pt.IsClass && !String.IsNullOrEmpty (pt.Namespace)) {
-                                       sb.Append (pt.Namespace);
-                                       sb.Append (".");
-                               }
-                               sb.Append (pt.Name);
-                               if (p [i].Name != null) {
-                                       sb.Append (" ");
-                                       sb.Append (p [i].Name);
-                               }
-                       }
-                       sb.Append (")");
-               }
-
                public override string ToString ()
                {
                        StringBuilder sb = new StringBuilder ();
@@ -315,7 +228,7 @@ namespace System.Diagnostics {
                        //
                        if (captured_traces != null) {
                                foreach (var t in captured_traces) {
-                                       if (!t.AddFrames (sb, true))
+                                       if (!t.AddFrames (sb))
                                                continue;
 
                                        sb.Append (Environment.NewLine);