// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//=============================================================================
//
// Class: Exception
//
// Purpose: The base class for all exceptional conditions.
//
//=============================================================================
namespace System
{
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Diagnostics;
using System.Text;
using System.Reflection;
#if SINGULARITY_KERNEL
using Microsoft.Singularity;
#elif SINGULARITY_PROCESS
using Microsoft.Singularity.V1.Services;
#endif // SINGULARITY_PROCESS
//|
[AccessedByRuntime("referenced from halexn.cpp")]
public partial class Exception
{
//|
public Exception() {
_message = null;
#if SINGULARITY_KERNEL
//DebugStub.Break();
#elif SINGULARITY_PROCESS
//DebugService.Break();
#endif // SINGULARITY_PROCESS
}
// Creates a new Exception. All derived classes should
// provide this constructor.
// Note: the stack trace is not started until the exception
// is thrown
//
//|
public Exception (String message, Exception innerException)
{
// TODO: The innerException will be provided by the runtime
// in the M9 time frame. Until then, we need this method.
_message = message;
_innerException = innerException;
}
//|
public virtual String Message {
get {
if (_message == null) {
return "Exception_WasThrown";
}
else {
return _message;
}
}
}
private String GetClassName() {
return this.vtable.vtableType.FullName;
}
// Retrieves the lowest exception (inner most) for the given Exception.
// This will traverse exceptions using the innerException property.
//
//|
public virtual Exception GetBaseException()
{
Exception inner = InnerException;
Exception back = this;
while (inner != null) {
back = inner;
inner = inner.InnerException;
}
return back;
}
// Returns the inner exception contained in this exception
//
//|
public Exception InnerException {
get { return _innerException; }
}
//|
public override String ToString() {
String message = Message;
if (_innerException != null) {
message = message + " ---> " + _innerException.ToString() + "\r\n" + " " + "Exception_EndOfInnerExceptionStack";
}
return message;
}
[AccessedByRuntime("referenced from halasm.asm")]
internal static unsafe bool IsUnlinkStack(UIntPtr throwAddr) {
UIntPtr unlinkBegin;
UIntPtr unlinkLimit;
fixed (byte *begin = &Microsoft.Singularity.Memory.Stacks.LinkStackBegin) {
unlinkBegin = (UIntPtr)begin;
}
fixed (byte *limit = &Microsoft.Singularity.Memory.Stacks.LinkStackLimit) {
unlinkLimit = (UIntPtr)limit;
}
if (throwAddr >= unlinkBegin && throwAddr <= unlinkLimit) {
return true;
}
else {
return false;
}
}
// This is the function that users can override
// BUGBUG: provide a better default (probably deep copy). The
// current one does not deal with references well, and so, is
// not even a good shallow copy (it should at least null out the
// references).
virtual protected Exception cloneForUndo() {
return (Exception)this.MemberwiseClone();
}
[AccessedByRuntime("referenced from halexn.cpp")]
internal String _message;
private Exception _innerException;
[AccessedByRuntime("referenced from halexn.cpp")]
private UIntPtr _throwAddress;
[AccessedByRuntime("referenced from halexn.cpp")]
private bool _notifiedDebugger; // True if debugger first chance already thrown.
// [Bartok]:
public string StackTrace
{
get {
return "";
}
}
}
}