[sgen] Don't reallocate mod_union at each major
[mono.git] / mcs / class / corlib / System / Exception.cs
index 4a03d8bd6703c1e9f5b70615851855ae4bc580a9..7b6b4923842067847bc9a421e96aae5ad1db0672 100644 (file)
@@ -57,7 +57,7 @@ namespace System
                   (vtable/MRGCTX) of the frames. */
                IntPtr [] trace_ips;
                Exception inner_exception;
-               internal string message;
+               internal string _message;
                string help_link;
                string class_name;
                string stack_trace;
@@ -67,8 +67,9 @@ namespace System
                internal int hresult = -2146233088;
                string source;
                IDictionary _data;
-               StackTrace[] captured_traces;
+               internal StackTrace[] captured_traces;
                IntPtr[] native_trace_ips;
+               object dynamic_methods;
                #endregion
 #pragma warning restore 169, 649
 
@@ -80,7 +81,7 @@ namespace System
 
                public Exception (string message)
                {
-                       this.message = message;
+                       this._message = message;
                }
 
                protected Exception (SerializationInfo info, StreamingContext context)
@@ -89,7 +90,7 @@ namespace System
                                throw new ArgumentNullException ("info");
 
                        class_name          = info.GetString ("ClassName");
-                       message             = info.GetString ("Message");
+                       _message             = info.GetString ("Message");
                        help_link           = info.GetString ("HelpURL");
                        stack_trace         = info.GetString ("StackTraceString");
                        _remoteStackTraceString  = info.GetString ("RemoteStackTraceString");
@@ -108,7 +109,7 @@ namespace System
                public Exception (string message, Exception innerException)
                {
                        inner_exception = innerException;
-                       this.message = message;
+                       this._message = message;
                }
 
                public Exception InnerException {
@@ -124,9 +125,15 @@ namespace System
                        get { return hresult; }
                        protected set { hresult = value; }
                }
+               
+               internal void SetErrorCode(int hr)
+               {
+                       HResult = hr;
+               }
+
                internal void SetMessage (string s)
                {
-                       message = s;
+                       _message = s;
                }
 
                internal void SetStackTrace (string s)
@@ -144,11 +151,11 @@ namespace System
 
                public virtual string Message {
                        get {
-                               if (message == null)
-                                       message = string.Format (Locale.GetText ("Exception of type '{0}' was thrown."),
+                               if (_message == null)
+                                       _message = string.Format (Locale.GetText ("Exception of type '{0}' was thrown."),
                                                ClassName);
 
-                               return message;
+                               return _message;
                        }
                }
                
@@ -184,38 +191,6 @@ namespace System
                        }
                }
 
-               bool AddFrames (StringBuilder sb, string newline, string unknown, StackTrace st)
-               {
-                       int i;
-                       for (i = 0; i < st.FrameCount; i++) {
-                               StackFrame frame = st.GetFrame (i);
-                               if (i == 0)
-                                       sb.AppendFormat ("  {0} ", Locale.GetText ("at"));
-                               else
-                                       sb.Append (newline);
-
-                               if (frame.GetMethod () == null) {
-                                       string internal_name = frame.GetInternalMethodName ();
-                                       if (internal_name != null)
-                                               sb.Append (internal_name);
-                                       else
-                                               sb.AppendFormat ("<0x{0:x5} + 0x{1:x5}> {2}", frame.GetMethodAddress (), frame.GetNativeOffset (), unknown);
-                               } else {
-                                       GetFullNameForStackTrace (sb, frame.GetMethod ());
-
-                                       if (frame.GetILOffset () == -1)
-                                               sb.AppendFormat ("<0x{0:x5} + 0x{1:x5}> ", frame.GetMethodAddress (), frame.GetNativeOffset ());
-                                       else
-                                               sb.AppendFormat (" [0x{0:x5}] ", frame.GetILOffset ());
-
-                                       sb.AppendFormat ("in {0}:{1} ", frame.GetSecureFileName (),
-                                                                        frame.GetFileLineNumber ());
-                               }
-                       }
-
-                       return i != 0;
-               }
-
                public virtual string StackTrace {
                        get {
                                if (stack_trace != null)
@@ -225,29 +200,8 @@ namespace System
                                        /* Not thrown yet */
                                        return null;
 
-                               StringBuilder sb = new StringBuilder ();
-
-                               string newline = String.Format ("{0}  {1} ", Environment.NewLine, Locale.GetText ("at"));
-                               string unknown = Locale.GetText ("<unknown method>");
-
-                               // Add traces captured using ExceptionDispatchInfo
-                               if (captured_traces != null) {
-                                       foreach (var t in captured_traces) {
-                                               if (!AddFrames (sb, newline, unknown, t))
-                                                       continue;
-
-                                               sb.Append (Environment.NewLine);
-                                               sb.Append ("--- End of stack trace from previous location where exception was thrown ---");
-                                               sb.Append (Environment.NewLine);
-                                       }
-                               }
-
-                               StackTrace st = new StackTrace (this, 0, true, true);
-                               AddFrames (sb, newline, unknown, st);
-
-                               stack_trace = sb.ToString ();
-
-                               return stack_trace;
+                               StackTrace st = new StackTrace (this, 0, true);
+                               return stack_trace = st.ToString ();
                        }
                }
 
@@ -293,8 +247,8 @@ namespace System
                                throw new ArgumentNullException ("info");
 
                        info.AddValue ("ClassName", ClassName);
-                       info.AddValue ("Message", message);
-                       info.AddValue ("InnerException", inner_exception);
+                       info.AddValue ("Message", _message);
+                       info.AddValue ("InnerException", inner_exception, typeof (Exception));
                        info.AddValue ("HelpURL", help_link);
                        info.AddValue ("StackTraceString", StackTrace);
                        info.AddValue ("RemoteStackTraceString", _remoteStackTraceString);
@@ -340,53 +294,12 @@ namespace System
                        return this;
                }
 
-               internal void GetFullNameForStackTrace (StringBuilder sb, MethodBase mi)
-               {
-                       ParameterInfo[] p = mi.GetParametersInternal ();
-                       sb.Append (mi.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 ("]");
-                       }
-
-                       sb.Append (" (");
-                       for (int i = 0; i < p.Length; ++i) {
-                               if (i > 0)
-                                       sb.Append (", ");
-                               Type pt = p[i].ParameterType;
-                               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 (")");
-               }
-
                // For ExceptionDispatchInfo
-               internal void CaptureTrace ()
+               internal void RestoreExceptionDispatchInfo (System.Runtime.ExceptionServices.ExceptionDispatchInfo exceptionDispatchInfo)
                {
-                       if (captured_traces != null) {
-                               Array.Resize (ref captured_traces, captured_traces.Length + 1);
-                       } else {
-                               captured_traces = new StackTrace [1];
-                       }
-                       captured_traces [captured_traces.Length - 1] = new StackTrace (this, 0, true, true);
-
+                       captured_traces = (StackTrace[]) exceptionDispatchInfo.BinaryStackTraceArray;
                        trace_ips = null;
+                       stack_trace = null;
                }
 
                //
@@ -399,5 +312,25 @@ namespace System
                {
                        return base.GetType ();
                }
+
+               internal enum ExceptionMessageKind
+               {
+                       ThreadAbort = 1,
+                       ThreadInterrupted = 2,
+                       OutOfMemory = 3
+               }
+
+               internal static String GetMessageFromNativeResources (ExceptionMessageKind kind)
+               {
+                       switch (kind) {
+                       case ExceptionMessageKind.ThreadAbort:
+                               return "";
+                       case ExceptionMessageKind.ThreadInterrupted:
+                               return "";
+                       case ExceptionMessageKind.OutOfMemory:
+                               return "Out of memory";
+                       }
+                       return "";
+               }
        }
 }