Merge pull request #2819 from BrzVlad/fix-major-log
[mono.git] / mcs / class / corlib / System.Diagnostics / StackFrame.cs
index fd1c8bc4a89af8fbaa1c1c89f9450c52cbb9f89b..702cd540d976d92e34dbce66fc2e116a679f2603 100644 (file)
@@ -34,22 +34,31 @@ using System.Runtime.CompilerServices;
 using System.Security;
 using System.Security.Permissions;
 using System.Text;
+using System.Runtime.InteropServices;
 
 namespace System.Diagnostics {
 
        [Serializable]
-       [MonoTODO ("Fix serialization compatibility with MS.NET")]
+       [ComVisible (true)]
+       [MonoTODO ("Serialized objects are not compatible with MS.NET")]
+       [StructLayout (LayoutKind.Sequential)]
         public class StackFrame {
 
                 public const int OFFSET_UNKNOWN = -1;
-                
-                private int ilOffset = OFFSET_UNKNOWN;
-                private int nativeOffset = OFFSET_UNKNOWN;
-                private MethodBase methodBase;
-                private string fileName;
-                private int lineNumber;
-                private int columnNumber;
+
+               #region Keep in sync with object-internals.h
+               private int ilOffset = OFFSET_UNKNOWN;
+               private int nativeOffset = OFFSET_UNKNOWN;
+               private long methodAddress;
+               private uint methodIndex;
+               private MethodBase methodBase;
+               private string fileName;
+               private int lineNumber;
+               private int columnNumber;
+        #pragma warning disable 649
                private string internalMethodName;
+               #pragma warning restore 649
+               #endregion
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                extern static bool get_frame_info (int skip, bool needFileInfo, out MethodBase method,
@@ -63,9 +72,9 @@ namespace System.Diagnostics {
                                        out columnNumber);                      
                 }
                 
-               public StackFrame (bool needFileInfo)
+               public StackFrame (bool fNeedFileInfo)
                {
-                       get_frame_info (2, needFileInfo, out methodBase, out ilOffset,
+                       get_frame_info (2, fNeedFileInfo, out methodBase, out ilOffset,
                                        out nativeOffset, out fileName, out lineNumber,
                                        out columnNumber);                      
                 }
@@ -77,9 +86,9 @@ namespace System.Diagnostics {
                                        out columnNumber);                      
                 }
                 
-                public StackFrame (int skipFrames, bool needFileInfo) 
+                public StackFrame (int skipFrames, bool fNeedFileInfo) 
                {
-                       get_frame_info (skipFrames + 2, needFileInfo, out methodBase, out ilOffset,
+                       get_frame_info (skipFrames + 2, fNeedFileInfo, out methodBase, out ilOffset,
                                        out nativeOffset, out fileName, out lineNumber,
                                        out columnNumber);
                 }
@@ -120,7 +129,7 @@ namespace System.Diagnostics {
                 
                 public virtual string GetFileName()
                 {
-#if NET_2_0
+#if !NET_2_1
                        if (SecurityManager.SecurityEnabled && (fileName != null) && (fileName.Length > 0)) {
                                string fn = Path.GetFullPath (fileName);
                                new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fn).Demand ();
@@ -128,15 +137,26 @@ namespace System.Diagnostics {
 #endif
                         return fileName;
                 }
+
+               internal string GetSecureFileName ()
+               {
+                       string filename = "<filename unknown>";
+                       if (fileName == null)
+                               return filename;
+                       try {
+                               filename = GetFileName ();
+                       }
+                       catch (SecurityException) {
+                               // CAS check failure
+                       }
+                       return filename;
+               }
                 
                 public virtual int GetILOffset()
                 {
                         return ilOffset;
                 }
                 
-#if ONLY_1_1
-               [ReflectionPermission (SecurityAction.Demand, TypeInformation = true)]
-#endif
                public virtual MethodBase GetMethod ()
                 {
                         return methodBase;
@@ -147,6 +167,16 @@ namespace System.Diagnostics {
                         return nativeOffset;                        
                 }
 
+               internal long GetMethodAddress ()
+               {
+                       return methodAddress;
+               }
+
+               internal uint GetMethodIndex ()
+               {
+                       return methodIndex;
+               }
+
                internal string GetInternalMethodName ()
                {
                        return internalMethodName;
@@ -172,18 +202,7 @@ namespace System.Diagnostics {
                        }
 
                        sb.Append (Locale.GetText (" in file:line:column "));
-
-                       if (fileName == null) {
-                               sb.Append (Locale.GetText ("<filename unknown>"));
-                       } else {
-                               try {
-                                       sb.Append (GetFileName ());
-                               }
-                               catch (SecurityException) {
-                                       sb.Append (Locale.GetText ("<filename unknown>"));
-                               }
-                       }
-
+                       sb.Append (GetSecureFileName ());
                        sb.AppendFormat (":{0}:{1}", lineNumber, columnNumber);
                        return sb.ToString ();
                }