diff options
Diffstat (limited to 'SrcShared/EmException.cpp')
-rw-r--r-- | SrcShared/EmException.cpp | 242 |
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); +} |