aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/EmException.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/EmException.cpp')
-rw-r--r--SrcShared/EmException.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/SrcShared/EmException.cpp b/SrcShared/EmException.cpp
new file mode 100644
index 0000000..dd664f8
--- /dev/null
+++ b/SrcShared/EmException.cpp
@@ -0,0 +1,242 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+\* ===================================================================== */
+
+#include "EmCommon.h"
+#include "EmException.h"
+
+#include "EmPalmFunction.h" // GetTrapName
+#include "EmSession.h" // gSession
+#include "ErrorHandling.h" // Errors::DoDialog
+#include "Hordes.h" // Hordes::Stop
+#include "Platform.h" // Platform::GetString
+#include "Strings.r.h" // kStr_InternalErrorException
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmException::EmException
+// ---------------------------------------------------------------------------
+
+EmException::EmException (void) throw () :
+ exception ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmException::~EmException
+// ---------------------------------------------------------------------------
+
+EmException::~EmException (void) throw ()
+{
+}
+
+
+#pragma mark -
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionTopLevelAction::EmExceptionTopLevelAction
+// ---------------------------------------------------------------------------
+
+EmExceptionTopLevelAction::EmExceptionTopLevelAction (void) throw () :
+ EmException ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionTopLevelAction::~EmExceptionTopLevelAction
+// ---------------------------------------------------------------------------
+
+EmExceptionTopLevelAction::~EmExceptionTopLevelAction (void) throw ()
+{
+}
+
+
+#pragma mark -
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionEnterDebugger::EmExceptionEnterDebugger
+// ---------------------------------------------------------------------------
+
+EmExceptionEnterDebugger::EmExceptionEnterDebugger (void) throw () :
+ EmExceptionTopLevelAction ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionEnterDebugger::~EmExceptionEnterDebugger
+// ---------------------------------------------------------------------------
+
+EmExceptionEnterDebugger::~EmExceptionEnterDebugger (void) throw ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionEnterDebugger::DoAction
+// ---------------------------------------------------------------------------
+
+void EmExceptionEnterDebugger::DoAction (void)
+{
+ // We've already entered debug mode. The only thing left to do
+ // is stop Gremlins.
+
+ // !!! This should probably be changed so that the only thing
+ // done at the point of error/exception is the sending of the
+ // state packet to the debugger. If that succeeds, this exception
+ // is thrown and performs the real entry into debug mode. Right
+ // now, both those tasks are intertwined in Debug::EnterDebugger.
+
+ // If we're entering the debugger while running a Gremlin, save the events.
+
+ if (Hordes::IsOn ())
+ {
+ Hordes::SaveEvents ();
+ }
+
+ Hordes::Stop ();
+}
+
+
+#pragma mark -
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionReset::EmExceptionReset
+// ---------------------------------------------------------------------------
+
+EmExceptionReset::EmExceptionReset (EmResetType type) throw () :
+ EmExceptionTopLevelAction (),
+ fType (type),
+ fWhat (),
+ fMessage (),
+ fException (0),
+ fTrapWord (0)
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionReset::~EmExceptionReset
+// ---------------------------------------------------------------------------
+
+EmExceptionReset::~EmExceptionReset (void) throw ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionReset::DoAction
+// ---------------------------------------------------------------------------
+
+void EmExceptionReset::DoAction (void)
+{
+ EmAssert (gSession);
+ gSession->Reset (fType);
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionReset::what
+// ---------------------------------------------------------------------------
+
+const char* EmExceptionReset::what (void) const throw ()
+{
+ if (fWhat.empty ())
+ {
+ char buffer[1000] = {0};
+
+ string trapName (::GetTrapName (fTrapWord));
+ string errTemplate;
+
+ if (fException)
+ {
+ errTemplate = Platform::GetString (kStr_InternalErrorException);
+ sprintf (buffer, errTemplate.c_str (), fException, trapName.c_str ());
+ }
+ else if (!fMessage.empty ())
+ {
+ errTemplate = Platform::GetString (kStr_InternalErrorMessage);
+ sprintf (buffer, errTemplate.c_str (), fMessage.c_str (), trapName.c_str ());
+ }
+
+ if (strlen (buffer) > 0)
+ {
+ fWhat = buffer;
+
+ fWhat += Platform::GetString (kStr_WillNowReset);
+ }
+ }
+
+ return fWhat.c_str ();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionReset::Display
+// ---------------------------------------------------------------------------
+
+void EmExceptionReset::Display (void) const
+{
+ // Generate fWhat.
+
+ this->what ();
+
+ // If there's something there, show it.
+
+ if (!fWhat.empty ())
+ {
+ Errors::DoDialog (this->what (), kDlgFlags_continue_debug_RESET, -1);
+ }
+}
+
+
+#pragma mark -
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionNextGremlin::EmExceptionNextGremlin
+// ---------------------------------------------------------------------------
+
+EmExceptionNextGremlin::EmExceptionNextGremlin (void) throw () :
+ EmExceptionTopLevelAction ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionNextGremlin::~EmExceptionNextGremlin
+// ---------------------------------------------------------------------------
+
+EmExceptionNextGremlin::~EmExceptionNextGremlin (void) throw ()
+{
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmExceptionNextGremlin::DoAction
+// ---------------------------------------------------------------------------
+
+void EmExceptionNextGremlin::DoAction (void)
+{
+ Hordes::ErrorEncountered ();
+
+ // The previous session state has been safely tucked away in bed, and the
+ // next session state has been scheduled to be loaded. However, it will
+ // not actually be loaded until after the next opcode is executed. If
+ // that opcode causes an error (and may in fact be the reason for
+ // switching to a new Gremlin), then we'd end up executing it again. We
+ // don't want that, so let's run any queued "load next state" commands now.
+
+ EmAssert (gSession);
+ gSession->ExecuteSpecial (false);
+}