Imported Upstream version 4.6.0.125

Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2016-08-03 10:59:49 +00:00
parent a569aebcfd
commit e79aa3c0ed
17047 changed files with 3137615 additions and 392334 deletions

View File

@@ -37,6 +37,7 @@ using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using System.IO;
namespace System.Diagnostics {
@@ -60,6 +61,9 @@ namespace System.Diagnostics {
readonly StackTrace[] captured_traces;
private bool debug_info;
private static Dictionary<string, Func<StackTrace, string>> metadataHandlers;
[MethodImplAttribute (MethodImplOptions.NoInlining)]
public StackTrace ()
{
init_frames (METHODS_TO_SKIP, false);
@@ -219,17 +223,14 @@ 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)
public 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;
const BindingFlags bindingflags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
foreach (var m in declaringType.GetMethods (bindingflags)) {
if (m.MetadataToken == mi.MetadataToken) {
mi = m;
@@ -253,7 +254,7 @@ namespace System.Diagnostics {
sb.Append ("]");
}
ParameterInfo[] p = mi.GetParametersInternal ();
ParameterInfo[] p = mi.GetParameters ();
sb.Append (" (");
for (int i = 0; i < p.Length; ++i) {
@@ -264,18 +265,15 @@ namespace System.Diagnostics {
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);
sb.Append (pt.ToString());
if (p [i].Name != null) {
sb.Append (" ");
sb.Append (p [i].Name);
}
}
sb.Append (")");
}
}
public override string ToString ()
{
@@ -289,6 +287,8 @@ namespace System.Diagnostics {
if (!t.AddFrames (sb))
continue;
t.AddMetadata (sb);
sb.Append (Environment.NewLine);
sb.Append ("--- End of stack trace from previous location where exception was thrown ---");
sb.Append (Environment.NewLine);
@@ -296,13 +296,78 @@ namespace System.Diagnostics {
}
AddFrames (sb);
AddMetadata (sb);
return sb.ToString ();
}
void AddMetadata (StringBuilder sb)
{
if (metadataHandlers == null)
InitMetadataHandlers ();
foreach (var handler in metadataHandlers) {
var lines = handler.Value (this);
using (var reader = new StringReader (lines)) {
string line;
while ((line = reader.ReadLine()) != null) {
sb.AppendLine ();
sb.AppendFormat ("[{0}] {1}", handler.Key, line);
}
}
}
}
internal String ToString (TraceFormat traceFormat)
{
// TODO:
return ToString ();
}
static void InitMetadataHandlers ()
{
metadataHandlers = new Dictionary<string, Func<StackTrace, string>> (StringComparer.Ordinal);
var aotid = Assembly.GetAotId ();
if (aotid != null)
AddMetadataHandler ("AOTID", st => { return new Guid (aotid).ToString ("N"); });
AddMetadataHandler ("MVID", st => {
var mvidLines = new Dictionary<Guid, List<int>> ();
var frames = st.GetFrames ();
for (var lineNumber = 0; lineNumber < frames.Length; lineNumber++) {
var method = frames[lineNumber].GetMethod ();
if (method == null)
continue;
var mvid = method.Module.ModuleVersionId;
List<int> lines = null;
if (!mvidLines.TryGetValue (mvid, out lines)) {
lines = new List<int> ();
mvidLines.Add (mvid, lines);
}
lines.Add (lineNumber);
}
var mvids = new List<Guid> (mvidLines.Keys);
mvids.Sort ();
var sb = new StringBuilder ();
foreach (var mvid in mvids)
sb.AppendLine (string.Format ("{0} {1}", mvid.ToString ("N"), string.Join (",", mvidLines[mvid])));
return sb.ToString ();
});
}
// This method signature should not change, apps can use it with reflection to add custom metadata handlers.
private static void AddMetadataHandler (string id, Func<StackTrace, string> handler)
{
if (metadataHandlers == null)
InitMetadataHandlers ();
metadataHandlers.Add (id, handler);
}
}
}