Arquivos
hhvm/hphp/runtime/debugger/cmd/cmd_next.h
T
Mike Magruder 5299e5ba0d Basic stepping in generators
Add reasonable behavior for stepping within continuations (generators). Stepping over a yield now does what one would expect. When the generator is driven from a C++ extension like ASIO, the next logical execution point is after the yield statement, and that's where we'll stop now. When driven from PHP, say in a loop calling send(), the next execution point is in fact the call site of send(), so we go there. Stepping off the end of the generator function, goes to the caller of send(), or the caller of the C++ extension. Stepping _out_ of a generator driven by a C++ extension ensures that we go to the caller and not back into the generator again. The logic for both cases is exactly the same. The difference comes from the fact that we don't actually debug C++ extensions.

This also fixes a long-standing problem where breakpoints would interfere with control flow cmds on the same source line. This caused funny behavior, like taking multiple steps to get off of a breakpoint.
2013-06-04 17:53:37 -07:00

52 linhas
2.0 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) {}
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();
HPHP::Unit* m_stepContUnit;
Offset m_stepContOffset;
};
///////////////////////////////////////////////////////////////////////////////
}}
#endif // incl_HPHP_EVAL_DEBUGGER_CMD_NEXT_H_