using System.Collections;
using System.Diagnostics;
using System.Reflection;
+using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
+using System.Security.Permissions;
namespace System
{
[Serializable]
+#if NET_2_0
+ [ComVisible(true)]
+ [ComDefaultInterface (typeof (_Exception))]
+ [ClassInterface (ClassInterfaceType.None)]
+#else
[ClassInterface (ClassInterfaceType.AutoDual)]
+#endif
public class Exception : ISerializable
#if NET_2_0
, _Exception
#endif
{
+ #region Sync with object-internals.h
IntPtr [] trace_ips;
Exception inner_exception;
- string message;
+ internal string message;
string help_link;
string class_name;
string stack_trace;
string remote_stack_trace;
int remote_stack_index;
- int hresult = unchecked ((int)0x80004005);
+ internal int hresult = unchecked ((int)0x80004005);
string source;
+ private IDictionary _data;
+ #endregion
public Exception ()
{
}
public virtual string Source {
+#if ONLY_1_1
+ [ReflectionPermission (SecurityAction.Assert, TypeInformation = true)]
+#endif
get {
if (source == null) {
StackTrace st = new StackTrace (this, true);
if (st != null) {
MethodBase method = sf.GetMethod ();
if (method != null) {
- source = method.DeclaringType.Assembly.GetName ().Name;
+ source = method.DeclaringType.Assembly.UnprotectedGetName ().Name;
}
}
}
public virtual string StackTrace {
get {
- if (stack_trace == null)
- stack_trace = get_trace ();
+ if (stack_trace == null) {
+ if (trace_ips == null)
+ /* Not thrown yet */
+ return null;
+
+ StackTrace st = new StackTrace (this, 0, true, true);
+
+ StringBuilder sb = new StringBuilder ();
+
+ string newline = String.Format ("{0} {1} ", Environment.NewLine, Locale.GetText ("at"));
+ string unknown = Locale.GetText ("<unknown method>");
+
+ for (int 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}> {1}", frame.GetNativeOffset (), unknown);
+ } else {
+ sb.Append (GetFullNameForStackTrace (frame.GetMethod ()));
+
+ if (frame.GetILOffset () == -1)
+ sb.AppendFormat (" <0x{0:x5}> ", frame.GetNativeOffset ());
+ else
+ sb.AppendFormat (" [0x{0:x5}] ", frame.GetILOffset ());
+
+ string fileName = frame.GetFileName ();
+ if (fileName != null)
+ sb.AppendFormat ("in {0}:{1} ", fileName, frame.GetFileLineNumber ());
+ }
+ }
+ stack_trace = sb.ToString ();
+ }
+
return stack_trace;
}
}
public MethodBase TargetSite {
+#if ONLY_1_1
+ [ReflectionPermission (SecurityAction.Demand, TypeInformation = true)]
+#endif
get {
StackTrace st = new StackTrace (this, true);
if (st.FrameCount > 0)
}
#if NET_2_0
- private IDictionary _data;
-
public virtual IDictionary Data {
get {
if (_data == null) {
return this;
}
+#if ONLY_1_1
+ [ReflectionPermission (SecurityAction.Assert, TypeInformation = true)]
+#endif
+ [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
{
+ if (info == null)
+ throw new ArgumentNullException ("info");
+
if (class_name == null)
class_name = GetType ().FullName;
-
+
info.AddValue ("ClassName", class_name);
info.AddValue ("Message", message);
info.AddValue ("InnerException", inner_exception);
info.AddValue ("ExceptionMethod", null);
}
+#if ONLY_1_1
+ [ReflectionPermission (SecurityAction.Assert, TypeInformation = true)]
+#endif
public override string ToString ()
{
System.Text.StringBuilder result = new System.Text.StringBuilder (this.GetType ().FullName);
return this;
}
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- extern string get_trace ();
+ internal string GetFullNameForStackTrace (MethodBase mi)
+ {
+ string parms = String.Empty;
+ ParameterInfo[] p = mi.GetParameters ();
+ for (int i = 0; i < p.Length; ++i) {
+ if (i > 0)
+ parms = parms + ", ";
+ string paramName = (p [i].Name == null) ? String.Empty : (" " + p [i].Name);
+ Type pt = p[i].ParameterType;
+ if (pt.IsClass && pt.Namespace != String.Empty)
+ parms = parms + pt.Namespace + "." + pt.Name + paramName;
+ else
+ parms = parms + pt.Name + paramName;
+ }
+
+ string generic = String.Empty;
+#if NET_2_0 || BOOTSTRAP_NET_2_0
+ if (mi.IsGenericMethod) {
+ Type[] gen_params = mi.GetGenericArguments ();
+ generic = "[";
+ for (int j = 0; j < gen_params.Length; j++) {
+ if (j > 0)
+ generic += ",";
+ generic += gen_params [j].Name;
+ }
+ generic += "]";
+ }
+#endif
+ return mi.DeclaringType.ToString () + "." + mi.Name + generic + " (" + parms + ")";
+ }
+
+#if NET_2_0
+ //
+ // The documentation states that this is available in 1.x,
+ // but it was not available (MemberRefing this would fail)
+ // and it states the signature is `override sealed', but the
+ // correct value is `newslot'
+ //
+ public new Type GetType ()
+ {
+ return base.GetType ();
+ }
+#endif
}
}