96d6bab291
There were multiple issues with flow control when exceptions occur. Fixed these by ditching the reliance on the exception thrown interrupt and introduce an exception handler interrupt, which indicates control is about to pass to a catch clause. This gives us much better insight into how execution is flowing and how we might need to adjust an in-flight stepping operation.
55 linhas
2.2 KiB
C++
55 linhas
2.2 KiB
C++
/*
|
|
+----------------------------------------------------------------------+
|
|
| HipHop for PHP |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifndef incl_HPHP_EVAL_DEBUGGER_CMD_NEXT_H_
|
|
#define incl_HPHP_EVAL_DEBUGGER_CMD_NEXT_H_
|
|
|
|
#include "hphp/runtime/debugger/cmd/cmd_flow_control.h"
|
|
|
|
namespace HPHP { namespace Eval {
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DECLARE_BOOST_TYPES(CmdNext);
|
|
class CmdNext : public CmdFlowControl {
|
|
public:
|
|
CmdNext() : CmdFlowControl(KindOfNext),
|
|
m_stepContUnit(nullptr),
|
|
m_stepContOffset(InvalidAbsoluteOffset),
|
|
m_stepContTag(nullptr) {}
|
|
virtual ~CmdNext();
|
|
|
|
virtual void help(DebuggerClient& client);
|
|
virtual void onSetup(DebuggerProxy& proxy, CmdInterrupt& interrupt);
|
|
virtual void onBeginInterrupt(DebuggerProxy& proxy, CmdInterrupt& interrupt);
|
|
|
|
private:
|
|
void stepCurrentLine(CmdInterrupt& interrupt, ActRec* fp, PC pc);
|
|
bool hasStepCont();
|
|
bool atStepContOffset(Unit* unit, Offset o);
|
|
void setupStepCont(ActRec* fp, PC pc);
|
|
void cleanupStepCont();
|
|
void* getContinuationTag(ActRec* fp);
|
|
|
|
HPHP::Unit* m_stepContUnit;
|
|
Offset m_stepContOffset;
|
|
void* m_stepContTag; // Unique identifier for the continuation we're stepping
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
}}
|
|
|
|
#endif // incl_HPHP_EVAL_DEBUGGER_CMD_NEXT_H_
|