Use & rather than * for pointers that should never be null

This is a rather mechanical refactor that uses references (&) rather than pointers (*) for parameters that are not permitted to ever be given null arguments. In effect, the onus for checking null pointers is shifted from the callee to the caller. The & type annotation makes it clear that the callee is not prepared to deal with a null pointer.
Esse commit está contido em:
Herman Venter
2013-05-17 11:14:59 -07:00
commit de Sara Golemon
commit f9197ff35c
79 arquivos alterados com 1122 adições e 1122 exclusões
+8 -8
Ver Arquivo
@@ -27,21 +27,21 @@ void CmdMachine::recvImpl(DebuggerThriftBuffer &thrift) {
DebuggerCommand::recvImpl(thrift);
}
void CmdMachine::list(DebuggerClient *client) {
void CmdMachine::list(DebuggerClient &client) {
}
bool CmdMachine::help(DebuggerClient *client) {
client->error("not implemented yet"); return true;
bool CmdMachine::help(DebuggerClient &client) {
client.error("not implemented yet"); return true;
client->helpTitle("Machine Command");
client->help("machine: ");
client->helpBody(
client.helpTitle("Machine Command");
client.help("machine: ");
client.helpBody(
""
);
return true;
}
bool CmdMachine::onClient(DebuggerClient *client) {
bool CmdMachine::onClient(DebuggerClient &client) {
if (DebuggerCommand::onClient(client)) return true;
//TODO
@@ -49,7 +49,7 @@ bool CmdMachine::onClient(DebuggerClient *client) {
return help(client);
}
bool CmdMachine::onServer(DebuggerProxy *proxy) {
bool CmdMachine::onServer(DebuggerProxy &proxy) {
assert(false); // this command is processed entirely locally
return false;
}
+4 -4
Ver Arquivo
@@ -27,11 +27,11 @@ class CmdMachine : public DebuggerCommand {
public:
CmdMachine() : DebuggerCommand(KindOfMachine) {}
virtual void list(DebuggerClient *client);
virtual bool help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual bool help(DebuggerClient &client);
virtual bool onClient(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onClient(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+7 -7
Ver Arquivo
@@ -21,24 +21,24 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdAbort::help(DebuggerClient *client) {
client->helpTitle("Abort Command");
client->helpCmds(
void CmdAbort::help(DebuggerClient &client) {
client.helpTitle("Abort Command");
client.helpCmds(
"[a]bort", "aborts current PHP code input",
nullptr
);
client->helpBody(
client.helpBody(
"You will have to type this command on a new line, while you're typing "
"ad-hoc PHP code to evaluate. In other words, it only works when you see "
"continuation prompt like \">>>>\"."
);
}
void CmdAbort::onClientImpl(DebuggerClient *client) {
void CmdAbort::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
client->tutorial(
if (client.argCount() == 0) {
client.tutorial(
"This command only works when you started typing ad-hoc PHP code with "
"\"<?\" then decided to abort the input. So it only makes sense when "
"you see continuation prompt like \">>>>\"."
+2 -2
Ver Arquivo
@@ -27,10 +27,10 @@ class CmdAbort : public DebuggerCommand {
public:
CmdAbort() : DebuggerCommand(KindOfAbort) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+96 -96
Ver Arquivo
@@ -40,10 +40,10 @@ void CmdBreak::recvImpl(DebuggerThriftBuffer &thrift) {
// Informs the client of all strings that may follow a break command.
// Used for auto completion. The client uses the prefix of the argument
// following the command to narrow down the list displayed to the user.
void CmdBreak::list(DebuggerClient *client) {
if (client->argCount() == 0 ||
(client->argCount() == 1 &&
(client->arg(1, "regex") || client->arg(1, "once")))) {
void CmdBreak::list(DebuggerClient &client) {
if (client.argCount() == 0 ||
(client.argCount() == 1 &&
(client.arg(1, "regex") || client.arg(1, "once")))) {
static const char *keywords1[] = {
"regex",
"once",
@@ -57,26 +57,26 @@ void CmdBreak::list(DebuggerClient *client) {
"disable",
nullptr
};
client->addCompletion(keywords1);
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
client->addCompletion(DebuggerClient::AutoCompleteFunctions);
client->addCompletion(DebuggerClient::AutoCompleteClasses);
client->addCompletion(DebuggerClient::AutoCompleteClassMethods);
} else if (client->argCount() == 1) {
client.addCompletion(keywords1);
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
client.addCompletion(DebuggerClient::AutoCompleteFunctions);
client.addCompletion(DebuggerClient::AutoCompleteClasses);
client.addCompletion(DebuggerClient::AutoCompleteClassMethods);
} else if (client.argCount() == 1) {
if (hasStatusChangeArg(client)) {
client->addCompletion("all");
} else if (!client->arg(1, "list")) {
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
client.addCompletion("all");
} else if (!client.arg(1, "list")) {
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
}
} else {
client->addCompletion(DebuggerClient::AutoCompleteCode);
client.addCompletion(DebuggerClient::AutoCompleteCode);
}
}
// The text to display when the debugger client processes "help break".
void CmdBreak::help(DebuggerClient *client) {
client->helpTitle("Break Command");
client->helpCmds(
void CmdBreak::help(DebuggerClient &client) {
client.helpTitle("Break Command");
client.helpCmds(
"[b]reak", "breaks at current line of code",
"[b]reak {exp}", "breaks at matching location",
"", "",
@@ -105,8 +105,8 @@ void CmdBreak::help(DebuggerClient *client) {
nullptr
);
client->helpTitle("Where to break?");
client->helpSection(
client.helpTitle("Where to break?");
client.helpSection(
"There are many ways to specify a source file location to set a "
"breakpoint, but it's ONE single string without whitespaces. The "
"format looks like this,\n"
@@ -122,8 +122,8 @@ void CmdBreak::help(DebuggerClient *client) {
"\tb MyClass::foo()\n"
);
client->helpTitle("Special Breakpoints");
client->helpSection(
client.helpTitle("Special Breakpoints");
client.helpSection(
"There are special breakpoints what can only be set by names:\n"
"\n"
"\tstart\n"
@@ -138,8 +138,8 @@ void CmdBreak::help(DebuggerClient *client) {
"'end', because end of a request is the same as beginning of psp."
);
client->helpTitle("Conditional Breakpoints and Watchpoints");
client->helpSection(
client.helpTitle("Conditional Breakpoints and Watchpoints");
client.helpSection(
"Every breakpoint can specify a condition, which is an arbitrary PHP "
"expression that will be evaluated to TRUE or FALSE. When TRUE, it will "
"break. When FALSE, it will continue without break. \"&&\" is similar to "
@@ -151,8 +151,8 @@ void CmdBreak::help(DebuggerClient *client) {
"So every time it breaks at mypage.php line 123, it will print out $a."
);
client->helpTitle("Breakpoint States and List");
client->helpSection(
client.helpTitle("Breakpoint States and List");
client.helpSection(
"Every breakpoint has 3 states: ALWAYS, ONCE, DISABLED. Without keyword "
"\"once\", a breakpoint is in ALWAYS state. ONCE breakpoints will turn "
"into DISABLED after it's hit once. DISABLED breakpoints will not break, "
@@ -165,31 +165,31 @@ void CmdBreak::help(DebuggerClient *client) {
"different machines, sandboxes and threads."
);
client->helpTitle("Hard Breakpoints");
client->helpSection(
client.helpTitle("Hard Breakpoints");
client.helpSection(
"From within PHP code, you can place a function call hphpd_break() to "
"embed a breakpoint. You may also specify a condition as the function's "
"parameter, so it breaks when the condition is met. Please read about "
"this function for more details with '[i]nfo hphpd_break'."
);
client->help("");
client.help("");
}
// Carries out the "break list" command.
void CmdBreak::processList(DebuggerClient *client) {
m_breakpoints = client->getBreakPoints();
void CmdBreak::processList(DebuggerClient &client) {
m_breakpoints = client.getBreakPoints();
for (int i = 0; i < (int)m_breakpoints->size(); i++) {
BreakPointInfoPtr bpi = m_breakpoints->at(i);
client->print(" %d\t%s %s", bpi->index(), bpi->state(true).c_str(),
client.print(" %d\t%s %s", bpi->index(), bpi->state(true).c_str(),
bpi->desc().c_str());
}
if (m_breakpoints->empty()) {
client->tutorial(
client.tutorial(
"Use '[b]reak ?|[h]elp' to read how to set breakpoints. "
);
} else {
client->tutorial(
client.tutorial(
"Use '[b]reak [c]lear {index}|[a]ll' to remove breakpoint(s). "
"Use '[b]reak [t]oggle {index}|[a]ll' to change their states."
);
@@ -197,19 +197,19 @@ void CmdBreak::processList(DebuggerClient *client) {
}
// Carries out commands that change the status of a breakpoint.
void CmdBreak::processStatusChange(DebuggerClient *client) {
m_breakpoints = client->getBreakPoints();
void CmdBreak::processStatusChange(DebuggerClient &client) {
m_breakpoints = client.getBreakPoints();
if (m_breakpoints->empty()) {
client->error("There is no breakpoint to clear or toggle.");
client->tutorial(
client.error("There is no breakpoint to clear or toggle.");
client.tutorial(
"Use '[b]reak ?|[h]elp' to read how to set breakpoints. "
);
return;
}
if (client->argCount() == 1) {
BreakPointInfoPtrVec *matched = client->getMatchedBreakPoints();
BreakPointInfoPtrVec *bps = client->getBreakPoints();
if (client.argCount() == 1) {
BreakPointInfoPtrVec *matched = client.getMatchedBreakPoints();
BreakPointInfoPtrVec *bps = client.getBreakPoints();
bool found = false;
for (unsigned int i = 0; i < matched->size(); i++) {
BreakPointInfoPtr bpm = (*matched)[i];
@@ -237,7 +237,7 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
action = "updated";
bp->toggle();
}
client->info("Breakpoint %d is %s %s", bp->index(),
client.info("Breakpoint %d is %s %s", bp->index(),
action, bp->site().c_str());
found = true;
}
@@ -247,15 +247,15 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
return;
}
client->error("There is no current breakpoint to clear or toggle.");
client.error("There is no current breakpoint to clear or toggle.");
return;
}
if (client->arg(2, "all")) {
if (client.arg(2, "all")) {
if (hasClearArg(client)) {
m_breakpoints->clear();
updateServer(client);
client->info("All breakpoints are cleared.");
client.info("All breakpoints are cleared.");
return;
}
@@ -277,10 +277,10 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
return processList(client);
}
string snum = client->argValue(2);
string snum = client.argValue(2);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("'[b]reak [c]lear|[t]oggle' needs an {index} argument.");
client->tutorial(
client.error("'[b]reak [c]lear|[t]oggle' needs an {index} argument.");
client.tutorial(
"You will have to run '[b]reak [l]ist' first to see a list of valid "
"numbers or indices to specify."
);
@@ -296,7 +296,7 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
}
}
if (index < 0) {
client->error("\"%s\" is not a valid breakpoint index. Choose one from "
client.error("\"%s\" is not a valid breakpoint index. Choose one from "
"this list:", snum.c_str());
processList(client);
return;
@@ -306,23 +306,23 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
if (hasClearArg(client)) {
m_breakpoints->erase(m_breakpoints->begin() + index);
updateServer(client);
client->info("Breakpoint %d cleared %s", bpi->index(),
client.info("Breakpoint %d cleared %s", bpi->index(),
bpi->desc().c_str());
} else if (hasEnableArg(client)) {
bpi->setState(BreakPointInfo::Always);
updateServer(client);
client->info("Breakpoint %d's state is changed to %s.", bpi->index(),
client.info("Breakpoint %d's state is changed to %s.", bpi->index(),
bpi->state(false).c_str());
} else if (hasDisableArg(client)) {
bpi->setState(BreakPointInfo::Disabled);
updateServer(client);
client->info("Breakpoint %d's state is changed to %s.", bpi->index(),
client.info("Breakpoint %d's state is changed to %s.", bpi->index(),
bpi->state(false).c_str());
} else {
assert(hasToggleArg(client));
bpi->toggle();
updateServer(client);
client->info("Breakpoint %d's state is changed to %s.", bpi->index(),
client.info("Breakpoint %d's state is changed to %s.", bpi->index(),
bpi->state(false).c_str());
}
}
@@ -331,17 +331,17 @@ void CmdBreak::processStatusChange(DebuggerClient *client) {
// will update its breakpoint list with the one in this command.
// The client will block until the server echoes
// this command back to it. The echoed command is discarded.
bool CmdBreak::updateServer(DebuggerClient *client) {
bool CmdBreak::updateServer(DebuggerClient &client) {
m_body = "update";
client->xend<CmdBreak>(this);
client.xend<CmdBreak>(this);
return true;
}
// Creates a new CmdBreak instance, sets its breakpoints to the client's
// list, sends the command to the server and waits for a response.
bool CmdBreak::SendClientBreakpointListToServer(DebuggerClient *client) {
bool CmdBreak::SendClientBreakpointListToServer(DebuggerClient &client) {
auto cmd = CmdBreak();
cmd.m_breakpoints = client->getBreakPoints();
cmd.m_breakpoints = client.getBreakPoints();
return cmd.updateServer(client);
}
@@ -350,25 +350,25 @@ bool CmdBreak::SendClientBreakpointListToServer(DebuggerClient *client) {
// to the server so that it too can update it's list.
// Returns false if the breakpoint is not well formed.
bool CmdBreak::addToBreakpointListAndUpdateServer(
DebuggerClient *client, BreakPointInfoPtr bpi, int index) {
DebuggerClient &client, BreakPointInfoPtr bpi, int index) {
++index;
if (client->arg(index, "if")) {
bpi->setClause(client->lineRest(++index), true);
} else if (client->arg(index, "&&")) {
bpi->setClause(client->lineRest(++index), false);
if (client.arg(index, "if")) {
bpi->setClause(client.lineRest(++index), true);
} else if (client.arg(index, "&&")) {
bpi->setClause(client.lineRest(++index), false);
}
if (bpi->valid()) {
m_breakpoints = client->getBreakPoints();
m_breakpoints = client.getBreakPoints();
for (int i = 0; i < (int)m_breakpoints->size(); i++) {
if ((*m_breakpoints)[i]->same(bpi)) {
client->error("Breakpoint was already set previously.");
client.error("Breakpoint was already set previously.");
return true;
}
}
m_breakpoints->push_back(bpi);
updateServer(client);
client->info("Breakpoint %d set %s", bpi->index(), bpi->desc().c_str());
client.info("Breakpoint %d set %s", bpi->index(), bpi->desc().c_str());
return true;
}
@@ -377,9 +377,9 @@ bool CmdBreak::addToBreakpointListAndUpdateServer(
// into a separate check and report method and report from there.
// See task 2368334.
if (!bpi->m_url.empty()) {
client->error("@{url} cannot be specified alone.");
client.error("@{url} cannot be specified alone.");
} else {
client->error("Breakpoint was not set in right format.");
client.error("Breakpoint was not set in right format.");
}
return false;
}
@@ -387,20 +387,20 @@ bool CmdBreak::addToBreakpointListAndUpdateServer(
// Carries out the Break command. This always involves an action on the
// client and usually, but not always, involves the server by sending
// this command to the server and waiting for its response.
void CmdBreak::onClientImpl(DebuggerClient *client) {
void CmdBreak::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
bool regex = false;
BreakPointInfo::State state = BreakPointInfo::Always;
int index = 1;
if (client->arg(1, "regex")) {
if (client.arg(1, "regex")) {
regex = true;
index++;
} else if (client->arg(1, "once")) {
} else if (client.arg(1, "once")) {
state = BreakPointInfo::Once;
index++;
} else if (client->arg(1, "list")) {
} else if (client.arg(1, "list")) {
processList(client);
return;
} else if (hasStatusChangeArg(client)) {
@@ -410,7 +410,7 @@ void CmdBreak::onClientImpl(DebuggerClient *client) {
string currentFile;
int currentLine = 0;
BreakPointInfoPtr loc = client->getCurrentLocation();
BreakPointInfoPtr loc = client.getCurrentLocation();
if (loc) {
currentFile = loc->m_file;
currentLine = loc->m_line1;
@@ -419,9 +419,9 @@ void CmdBreak::onClientImpl(DebuggerClient *client) {
BreakPointInfoPtr bpi;
InterruptType interrupt = (InterruptType)(-1);
if (client->argCount() == 0) {
if (client.argCount() == 0) {
if (currentFile.empty() || currentLine == 0) {
client->error("There is no current file or line to set breakpoint. "
client.error("There is no current file or line to set breakpoint. "
"You will have to specify source file location yourself.");
return;
}
@@ -429,28 +429,28 @@ void CmdBreak::onClientImpl(DebuggerClient *client) {
bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state,
currentFile.c_str(),
currentLine));
} else if (client->arg(index, "start")) {
} else if (client.arg(index, "start")) {
interrupt = RequestStarted;
} else if (client->arg(index, "end")) {
} else if (client.arg(index, "end")) {
interrupt = RequestEnded;
} else if (client->arg(index, "psp")) {
} else if (client.arg(index, "psp")) {
interrupt = PSPEnded;
} else {
bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state, BreakPointReached,
client->argValue(index),
client.argValue(index),
currentFile));
}
if (interrupt >= 0) {
string url;
if (!client->arg(index + 1, "if") && !client->arg(index + 1, "&&")) {
url = client->argValue(++index);
if (!client.arg(index + 1, "if") && !client.arg(index + 1, "&&")) {
url = client.argValue(++index);
}
bpi = BreakPointInfoPtr(new BreakPointInfo(regex, state, interrupt, url));
}
if (!addToBreakpointListAndUpdateServer(client, bpi, index)) {
client->tutorial(
client.tutorial(
"This is the order of different arguments:\n"
"\n"
"\t[b]reak [o]nce {exp} if|&& {php}\n"
@@ -485,11 +485,11 @@ static const StaticString s_desc("desc");
// Updates the client with information about the execution of this command.
// This information is not used by the command line client, but can be accessed
// via the debugger client API exposed to PHP programs.
void CmdBreak::setClientOutput(DebuggerClient *client) {
void CmdBreak::setClientOutput(DebuggerClient &client) {
// Output an array of current breakpoints including exceptions
client->setOutputType(DebuggerClient::OTValues);
client.setOutputType(DebuggerClient::OTValues);
Array values;
m_breakpoints = client->getBreakPoints();
m_breakpoints = client.getBreakPoints();
for (int i = 0; i < (int)m_breakpoints->size(); i++) {
BreakPointInfoPtr bpi = m_breakpoints->at(i);
Array breakpoint;
@@ -514,18 +514,18 @@ void CmdBreak::setClientOutput(DebuggerClient *client) {
breakpoint.set(s_desc, bpi->desc());
values.append(breakpoint);
}
client->setOTValues(values);
client.setOTValues(values);
}
// Updates the breakpoint list in the proxy with the new list
// received from the client. Then sends the command back to the
// client as confirmation. Returns false if the confirmation message
// send failed.
bool CmdBreak::onServer(DebuggerProxy *proxy) {
bool CmdBreak::onServer(DebuggerProxy &proxy) {
if (m_body == "update") {
proxy->setBreakPoints(m_bps);
proxy.setBreakPoints(m_bps);
m_breakpoints = &m_bps;
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
return false;
}
@@ -533,7 +533,7 @@ bool CmdBreak::onServer(DebuggerProxy *proxy) {
// Returns true if the last command parsed by the client has
// an argument that changes the status of a breakpoint.
// I.e. clear, enable, disable or toggle.
bool CmdBreak::hasStatusChangeArg(DebuggerClient *client) {
bool CmdBreak::hasStatusChangeArg(DebuggerClient &client) {
return
hasClearArg(client) || hasEnableArg(client) ||
hasDisableArg(client) || hasToggleArg(client);
@@ -541,26 +541,26 @@ bool CmdBreak::hasStatusChangeArg(DebuggerClient *client) {
// Returns true if the last command parsed by the client has
// the string "enable" in its first argument position.
bool CmdBreak::hasEnableArg(DebuggerClient *client) {
return client->arg(1, "enable");
bool CmdBreak::hasEnableArg(DebuggerClient &client) {
return client.arg(1, "enable");
}
// Returns true if the last command parsed by the client has
// the string "disable" in its first argument position.
bool CmdBreak::hasDisableArg(DebuggerClient *client) {
return client->arg(1, "disable");
bool CmdBreak::hasDisableArg(DebuggerClient &client) {
return client.arg(1, "disable");
}
// Returns true if the last command parsed by the client has
// the string "clear" in its first argument position.
bool CmdBreak::hasClearArg(DebuggerClient *client) {
return client->arg(1, "clear");
bool CmdBreak::hasClearArg(DebuggerClient &client) {
return client.arg(1, "clear");
}
// Returns true if the last command parsed by the client has
// the string "toggle" in its first argument position.
bool CmdBreak::hasToggleArg(DebuggerClient *client) {
return client->arg(1, "toggle");
bool CmdBreak::hasToggleArg(DebuggerClient &client) {
return client.arg(1, "toggle");
}
///////////////////////////////////////////////////////////////////////////////
+15 -15
Ver Arquivo
@@ -30,31 +30,31 @@ public:
// Informs the client of all strings that may follow a break command.
// Used for auto completion. The client uses the prefix of the argument
// following the command to narrow down the list displayed to the user.
virtual void list(DebuggerClient *client);
virtual void list(DebuggerClient &client);
// The text to display when the debugger client processes "help break".
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
// Updates the client with information about the execution of this command.
// This information is not used by the command line client, but can
// be accessed via the debugger client API exposed to PHP programs.
virtual void setClientOutput(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient &client);
// Updates the breakpoint list in the proxy with the new list
// received from the client. Then sends the command back to the
// client as confirmation. Returns false if the confirmation message
// send failed.
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
// Creates a new CmdBreak instance, sets its breakpoints to the client's
// list, sends the command to the server and waits for a response.
static bool SendClientBreakpointListToServer(DebuggerClient *client);
static bool SendClientBreakpointListToServer(DebuggerClient &client);
protected:
// Carries out the Break command. This always involves an action on the
// client and usually, but not always, involves the server by sending
// this command to the server and waiting for its response.
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
// Serializes this command into the given Thrift buffer.
virtual void sendImpl(DebuggerThriftBuffer &thrift);
@@ -67,7 +67,7 @@ protected:
// to the server so that it too can update it's list.
// Returns false if the breakpoint is not well formed.
bool addToBreakpointListAndUpdateServer(
DebuggerClient *client, BreakPointInfoPtr bpi, int index);
DebuggerClient &client, BreakPointInfoPtr bpi, int index);
private:
// Either points to the breakpoint collection of a debugger client
@@ -84,34 +84,34 @@ private:
// will update its breakpoint list with the one in this command.
// The client will block until the server echoes
// this command back to it. The echoed command is discarded.
bool updateServer(DebuggerClient *client);
bool updateServer(DebuggerClient &client);
// Carries out the "break list" command.
void processList(DebuggerClient *client);
void processList(DebuggerClient &client);
// Carries out commands that change the status of a breakpoint.
void processStatusChange(DebuggerClient *client);
void processStatusChange(DebuggerClient &client);
// Returns true if the last command parsed by the client has
// an argument that changes the status of a breakpoint.
// I.e. clear, enable, disable or toggle.
bool hasStatusChangeArg(DebuggerClient *client);
bool hasStatusChangeArg(DebuggerClient &client);
// Returns true if the last command parsed by the client has
// the string "enable" in its first argument position.
bool hasEnableArg(DebuggerClient *client);
bool hasEnableArg(DebuggerClient &client);
// Returns true if the last command parsed by the client has
// the string "disable" in its first argument position.
bool hasDisableArg(DebuggerClient *client);
bool hasDisableArg(DebuggerClient &client);
// Returns true if the last command parsed by the client has
// the string "clear" in its first argument position.
bool hasClearArg(DebuggerClient *client);
bool hasClearArg(DebuggerClient &client);
// Returns true if the last command parsed by the client has
// the string "toggle" in its first argument position.
bool hasToggleArg(DebuggerClient *client);
bool hasToggleArg(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+10 -10
Ver Arquivo
@@ -30,13 +30,13 @@ void CmdComplete::recvImpl(DebuggerThriftBuffer &thrift) {
DebuggerCommand::recvImpl(thrift);
}
void CmdComplete::list(DebuggerClient *client) {
void CmdComplete::list(DebuggerClient &client) {
}
void CmdComplete::help(DebuggerClient *client) {
client->helpTitle("Copmplete");
client->help("complete <cmd>");
client->helpBody(
void CmdComplete::help(DebuggerClient &client) {
client.helpTitle("Copmplete");
client.help("complete <cmd>");
client.helpBody(
"This command provides the same results as TAB completion does on the"
" command line, but bypasses the complexity of interacting with the"
" readline library. This help is primarily for use by programs that"
@@ -44,16 +44,16 @@ void CmdComplete::help(DebuggerClient *client) {
);
}
void CmdComplete::onClientImpl(DebuggerClient *client) {
void CmdComplete::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
std::string text = client->lineRest(1);
std::vector<std::string> res = client->getAllCompletions(text);
std::string text = client.lineRest(1);
std::vector<std::string> res = client.getAllCompletions(text);
for (size_t i = 0; i < res.size(); ++i) {
client->print(res[i].c_str());
client.print(res[i].c_str());
}
}
bool CmdComplete::onServer(DebuggerProxy *proxy) {
bool CmdComplete::onServer(DebuggerProxy &proxy) {
assert(false); // this command is processed entirely locally
return false;
}
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdComplete : public DebuggerCommand {
public:
CmdComplete() : DebuggerCommand(KindOfComplete) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+60 -60
Ver Arquivo
@@ -21,39 +21,39 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdConfig::help(DebuggerClient *client) {
client->helpTitle("Config Command");
client->helpCmds("set <var> <value>", "set variable <var> to be <value>",
void CmdConfig::help(DebuggerClient &client) {
client.helpTitle("Config Command");
client.helpCmds("set <var> <value>", "set variable <var> to be <value>",
"set", "list current values of variables",
nullptr);
client->helpBody(
client.helpBody(
"Use this command to set up config variable, "
"e.g. turning on/off a special mode."
);
}
void CmdConfig::onClientImpl(DebuggerClient *client) {
void CmdConfig::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
listVars(client);
return;
}
std::string var = client->argValue(1);
if (var == "help" || client->argCount() < 2) {
std::string var = client.argValue(1);
if (var == "help" || client.argCount() < 2) {
help(client);
return;
}
std::string value = client->argValue(2);
std::string value = client.argValue(2);
if (var == "BypassAccessCheck" || var == "bac") {
if (value == "on") {
client->print("BypassAccessCheck(bac) set to on.\n"
client.print("BypassAccessCheck(bac) set to on.\n"
"All code executed from debugger is bypassing "
"access check!");
client->setDebuggerBypassCheck(true);
client.setDebuggerBypassCheck(true);
} else if (value == "off") {
client->print("BypassAccessCheck(bac) set to off");
client->setDebuggerBypassCheck(false);
client.print("BypassAccessCheck(bac) set to off");
client.setDebuggerBypassCheck(false);
} else {
help(client);
}
@@ -61,10 +61,10 @@ void CmdConfig::onClientImpl(DebuggerClient *client) {
}
if (var == "LogFile" || var == "lf") {
// Close the current log file handler
FILE *f = client->getLogFileHandler();
FILE *f = client.getLogFileHandler();
if (f != nullptr) {
fclose(f);
client->setLogFileHandler(nullptr);
client.setLogFileHandler(nullptr);
}
if (value == "off") {
@@ -73,36 +73,36 @@ void CmdConfig::onClientImpl(DebuggerClient *client) {
// Try open the log file and error if it's not working
f = fopen(value.c_str(), "a");
if (f == nullptr) {
client->error("Cannot open log file '%s'",
client.error("Cannot open log file '%s'",
value.c_str());
value = "";
client->setLogFileHandler(nullptr);
client.setLogFileHandler(nullptr);
} else {
client->setLogFileHandler(f);
client.setLogFileHandler(f);
}
}
client->print("LogFile(lf) is set to %s", value == "" ? "off"
client.print("LogFile(lf) is set to %s", value == "" ? "off"
: value.c_str());
client->setLogFile(value);
client.setLogFile(value);
return;
}
if (var == "PrintLevel" || var == "pl") {
int pl = strtol(value.c_str(), nullptr, 10);
if (pl > 0 && pl < DebuggerClient::MinPrintLevel) {
client->error("%d is invalid for PrintLevel(pl)", pl);
client.error("%d is invalid for PrintLevel(pl)", pl);
return;
}
client->setDebuggerPrintLevel(pl);
client->print("PrintLevel(pl) is set to %d", pl);
client.setDebuggerPrintLevel(pl);
client.print("PrintLevel(pl) is set to %d", pl);
return;
}
if (var == "SmallStep" || var == "ss") {
if (value == "on") {
client->print("SmallStep(ss) set to on.\n");
client->setDebuggerSmallStep(true);
client.print("SmallStep(ss) set to on.\n");
client.setDebuggerSmallStep(true);
} else if (value == "off") {
client->print("SmallStep(ss) set to off");
client->setDebuggerSmallStep(false);
client.print("SmallStep(ss) set to off");
client.setDebuggerSmallStep(false);
} else {
help(client);
}
@@ -110,22 +110,22 @@ void CmdConfig::onClientImpl(DebuggerClient *client) {
}
if (var == "StackArgs" || var == "sa") {
if (value == "on") {
client->print("StackArgs(sa) set to on.\n");
client->setDebuggerStackArgs(true);
client.print("StackArgs(sa) set to on.\n");
client.setDebuggerStackArgs(true);
} else if (value == "off") {
client->print("StackArgs(sa) set to off");
client->setDebuggerStackArgs(false);
client.print("StackArgs(sa) set to off");
client.setDebuggerStackArgs(false);
} else {
help(client);
}
return;
}
if (var == "ApiModeSerialize") {
assert(client->isApiMode());
assert(client.isApiMode());
if (value == "on") {
client->setDebuggerClientApiModeSerialize(true);
client.setDebuggerClientApiModeSerialize(true);
} else if (value == "off") {
client->setDebuggerClientApiModeSerialize(false);
client.setDebuggerClientApiModeSerialize(false);
}
return;
}
@@ -136,10 +136,10 @@ void CmdConfig::onClientImpl(DebuggerClient *client) {
// pointer to the current line).
int mcl = strtol(value.c_str(), nullptr, 10);
if (mcl < -1) {
client->error("%d is invalid for MaxCodeLines(mcl)", mcl);
client.error("%d is invalid for MaxCodeLines(mcl)", mcl);
} else {
client->setDebuggerClientMaxCodeLines(mcl);
client->print("MaxCodeLines(mcl) is set to %d", mcl);
client.setDebuggerClientMaxCodeLines(mcl);
client.print("MaxCodeLines(mcl) is set to %d", mcl);
}
return;
}
@@ -154,33 +154,33 @@ static const StaticString s_SmallStep("SmallStep");
static const StaticString s_StackArgs("StackArgs");
static const StaticString s_ApiModeSerialize("ApiModeSerialize");
void CmdConfig::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdConfig::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
ArrayInit values(6);
values.set("BypassAccessCheck", client->getDebuggerBypassCheck());
values.set("LogFile", client->getLogFile());
values.set("PrintLevel", client->getDebuggerPrintLevel());
values.set("SmallStep", client->getDebuggerSmallStep());
values.set("StackArgs", client->getDebuggerStackArgs());
values.set("ApiModeSerialize", client->getDebuggerClientApiModeSerialize());
client->setOTValues(values.create());
values.set("BypassAccessCheck", client.getDebuggerBypassCheck());
values.set("LogFile", client.getLogFile());
values.set("PrintLevel", client.getDebuggerPrintLevel());
values.set("SmallStep", client.getDebuggerSmallStep());
values.set("StackArgs", client.getDebuggerStackArgs());
values.set("ApiModeSerialize", client.getDebuggerClientApiModeSerialize());
client.setOTValues(values.create());
}
void CmdConfig::listVars(DebuggerClient *client) {
std::string LogFile = client->getLogFile();
client->print("LogFile(lf) %s", LogFile == "" ?
void CmdConfig::listVars(DebuggerClient &client) {
std::string LogFile = client.getLogFile();
client.print("LogFile(lf) %s", LogFile == "" ?
"off" : LogFile.c_str());
client->print("BypassAccessCheck(bac) %s",
client->getDebuggerBypassCheck() ? "on" : "off");
client->print("PrintLevel(pl) %d", client->getDebuggerPrintLevel());
client->print("SmallStep(ss) %s",
client->getDebuggerSmallStep() ? "on" : "off");
client->print("StackArgs(sa) %s",
client->getDebuggerStackArgs() ? "on" : "off");
client->print("ApiModeSerialize %s",
client->getDebuggerClientApiModeSerialize() ? "on" : "off");
client->print("MaxCodeLines(mcl) %d",
client->getDebuggerClientMaxCodeLines());
client.print("BypassAccessCheck(bac) %s",
client.getDebuggerBypassCheck() ? "on" : "off");
client.print("PrintLevel(pl) %d", client.getDebuggerPrintLevel());
client.print("SmallStep(ss) %s",
client.getDebuggerSmallStep() ? "on" : "off");
client.print("StackArgs(sa) %s",
client.getDebuggerStackArgs() ? "on" : "off");
client.print("ApiModeSerialize %s",
client.getDebuggerClientApiModeSerialize() ? "on" : "off");
client.print("MaxCodeLines(mcl) %d",
client.getDebuggerClientMaxCodeLines());
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdConfig : public DebuggerCommand {
public:
CmdConfig() : DebuggerCommand(KindOfConfig) {}
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
private:
void listVars(DebuggerClient *client);
void listVars(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+22 -22
Ver Arquivo
@@ -33,35 +33,35 @@ void CmdConstant::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_constants);
}
void CmdConstant::help(DebuggerClient *client) {
client->helpTitle("Constant Command");
client->helpCmds(
void CmdConstant::help(DebuggerClient &client) {
client.helpTitle("Constant Command");
client.helpCmds(
"[k]onstant", "lists all constants",
"[k]onstant {text}", "full-text search constants",
nullptr
);
client->helpBody(
client.helpBody(
"This will print names and values of all constants, if {text} is not "
"speified. Otherwise, it will print names and values of all constants "
"specified. Otherwise, it will print names and values of all constants "
"that contain the text in their names or values. The search is case-"
"insensitive and string-based."
);
}
void CmdConstant::onClientImpl(DebuggerClient *client) {
void CmdConstant::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
String text;
if (client->argCount() == 1) {
text = client->argValue(1);
} else if (client->argCount() != 0) {
if (client.argCount() == 1) {
text = client.argValue(1);
} else if (client.argCount() != 0) {
help(client);
return;
}
CmdConstantPtr cmd = client->xend<CmdConstant>(this);
CmdConstantPtr cmd = client.xend<CmdConstant>(this);
if (cmd->m_constants.empty()) {
client->info("(no constant was defined)");
client.info("(no constant was defined)");
} else {
int i = 0;
bool found = false;
@@ -74,15 +74,15 @@ void CmdConstant::onClientImpl(DebuggerClient *client) {
String fullvalue = DebuggerClient::FormatVariable(iter.second(), -1);
if (name.find(text, 0, false) >= 0 ||
fullvalue.find(text, 0, false) >= 0) {
client->print("%s = %s", name.data(), value.data());
client.print("%s = %s", name.data(), value.data());
found = true;
}
} else {
client->print("%s = %s", name.data(), value.data());
client.print("%s = %s", name.data(), value.data());
++i;
if (!client->isApiMode() &&
if (!client.isApiMode() &&
i % DebuggerClient::ScrollBlockSize == 0 &&
client->ask("There are %d more constants. Continue? [Y/n]",
client.ask("There are %d more constants. Continue? [Y/n]",
m_constants.size() - i) == 'n') {
break;
}
@@ -90,31 +90,31 @@ void CmdConstant::onClientImpl(DebuggerClient *client) {
}
if (!text.empty() && !found) {
client->info("(unable to find specified text in any constants)");
client.info("(unable to find specified text in any constants)");
}
}
}
void CmdConstant::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdConstant::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
Array values;
for (ArrayIter iter(m_constants); iter; ++iter) {
String name = iter.first().toString();
if (client->getDebuggerClientApiModeSerialize()) {
if (client.getDebuggerClientApiModeSerialize()) {
values.set(name,
DebuggerClient::FormatVariable(iter.second(), 200));
} else {
values.set(name, iter.second());
}
}
client->setOTValues(values);
client.setOTValues(values);
}
bool CmdConstant::onServer(DebuggerProxy *proxy) {
bool CmdConstant::onServer(DebuggerProxy &proxy) {
try {
m_constants = ClassInfo::GetConstants();
} catch (...) {}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdConstant : public DebuggerCommand {
public:
CmdConstant() : DebuggerCommand(KindOfConstant) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+6 -6
Ver Arquivo
@@ -21,19 +21,19 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdContinue::help(DebuggerClient *client) {
client->helpTitle("Continue Command");
client->helpCmds(
void CmdContinue::help(DebuggerClient &client) {
client.helpTitle("Continue Command");
client.helpCmds(
"[c]ontinue {count=1}", "continues program execution",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command at break to resume program execution. Specify a "
"count to repeat the same command many times."
);
}
void CmdContinue::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdContinue::onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
assert(!m_complete); // Complete cmds should not be asked to do work.
CmdFlowControl::onSetup(proxy, interrupt);
// If there's a remaining count on this cmd then we want it left installed
@@ -41,7 +41,7 @@ void CmdContinue::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
m_complete = (decCount() == 0);
}
void CmdContinue::onBeginInterrupt(DebuggerProxy *proxy,
void CmdContinue::onBeginInterrupt(DebuggerProxy &proxy,
CmdInterrupt &interrupt) {
assert(!m_complete); // Complete cmds should not be asked to do work.
m_complete = (decCount() == 0);
+3 -3
Ver Arquivo
@@ -27,9 +27,9 @@ class CmdContinue : public CmdFlowControl {
public:
CmdContinue() : CmdFlowControl(KindOfContinue) {}
virtual void help(DebuggerClient *client);
virtual void onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void help(DebuggerClient &client);
virtual void onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt);
};
///////////////////////////////////////////////////////////////////////////////
+9 -9
Ver Arquivo
@@ -23,31 +23,31 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdDown::help(DebuggerClient *client) {
client->helpTitle("Down Command");
client->helpCmds(
void CmdDown::help(DebuggerClient &client) {
client.helpTitle("Down Command");
client.helpCmds(
"[d]own {num=1}", "moves to inner frames (callees) on stacktrace",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command to walk down on stacktrace to find out inner callees of "
"current frame. By default it moves down by one level. Specify a number "
"to move down several levels a time."
);
}
void CmdDown::onClientImpl(DebuggerClient *client) {
void CmdDown::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
} else {
CmdWhere().fetchStackTrace(client);
client->moveToFrame(client->getFrame() - CmdUp::ParseNumber(client));
client.moveToFrame(client.getFrame() - CmdUp::ParseNumber(client));
}
}
void CmdDown::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTStacktrace);
void CmdDown::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTStacktrace);
}
///////////////////////////////////////////////////////////////////////////////
+3 -3
Ver Arquivo
@@ -27,11 +27,11 @@ class CmdDown : public DebuggerCommand {
public:
CmdDown() : DebuggerCommand(KindOfDown) {}
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+15 -15
Ver Arquivo
@@ -36,14 +36,14 @@ void CmdEval::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_bypassAccessCheck);
}
void CmdEval::onClientImpl(DebuggerClient *client) {
m_body = client->getCode();
m_frame = client->getFrame();
m_bypassAccessCheck = client->getDebuggerBypassCheck();
client->sendToServer(this);
DebuggerCommandPtr res = client->recvFromServer(m_type);
void CmdEval::onClientImpl(DebuggerClient &client) {
m_body = client.getCode();
m_frame = client.getFrame();
m_bypassAccessCheck = client.getDebuggerBypassCheck();
client.sendToServer(this);
DebuggerCommandPtr res = client.recvFromServer(m_type);
if (!res->is(m_type)) {
assert(client->isApiMode());
assert(client.isApiMode());
m_incomplete = true;
res->setClientOutput(client);
} else {
@@ -51,30 +51,30 @@ void CmdEval::onClientImpl(DebuggerClient *client) {
}
}
void CmdEval::handleReply(DebuggerClient *client) {
client->print(m_output);
void CmdEval::handleReply(DebuggerClient &client) {
client.print(m_output);
}
static const StaticString s_body("body");
static const StaticString s_value("value");
void CmdEval::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdEval::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
ArrayInit values(2);
values.set("body", m_body);
values.set("value", m_output);
client->setOTValues(values.create());
client.setOTValues(values.create());
}
bool CmdEval::onServer(DebuggerProxy *proxy) {
bool CmdEval::onServer(DebuggerProxy &proxy) {
PCFilter* locSave = g_vmContext->m_lastLocFilter;
g_vmContext->m_lastLocFilter = new PCFilter();
g_vmContext->setDebuggerBypassCheck(m_bypassAccessCheck);
DebuggerProxy::ExecutePHP(m_body, m_output, !proxy->isLocal(), m_frame);
DebuggerProxy::ExecutePHP(m_body, m_output, !proxy.isLocal(), m_frame);
g_vmContext->setDebuggerBypassCheck(false);
delete g_vmContext->m_lastLocFilter;
g_vmContext->m_lastLocFilter = locSave;
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdEval : public DebuggerCommand {
public:
CmdEval() : DebuggerCommand(KindOfEval), m_bypassAccessCheck(false) {}
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
virtual void handleReply(DebuggerClient *client);
virtual void handleReply(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+14 -14
Ver Arquivo
@@ -33,19 +33,19 @@ void CmdExample::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_output);
}
void CmdExample::list(DebuggerClient *client) {
client->addCompletion("tic-tac-toe");
client->addCompletion("hip-hop-roll");
void CmdExample::list(DebuggerClient &client) {
client.addCompletion("tic-tac-toe");
client.addCompletion("hip-hop-roll");
}
void CmdExample::help(DebuggerClient *client) {
client->helpTitle("Example Command");
client->helpCmds(
void CmdExample::help(DebuggerClient &client) {
client.helpTitle("Example Command");
client.helpCmds(
"xample {string}", "it will tell you how long it is!",
"x ample {string}", "it will tell you how long it is!",
nullptr
);
client->helpBody(
client.helpBody(
"This is just an example of extending debugger commands with C++. "
"To add a new command, simply run \"php new_cmd.php {name}\" under "
"runtime/eval/debugger/cmd, and it will generate two files to start with. "
@@ -54,21 +54,21 @@ void CmdExample::help(DebuggerClient *client) {
);
}
void CmdExample::onClientImpl(DebuggerClient *client) {
void CmdExample::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 1) {
if (client.argCount() == 1) {
help(client);
return;
}
m_input = client->lineRest(2);
CmdExamplePtr res = client->xend<CmdExample>(this);
client->output("%d", res->m_output);
m_input = client.lineRest(2);
CmdExamplePtr res = client.xend<CmdExample>(this);
client.output("%d", res->m_output);
}
bool CmdExample::onServer(DebuggerProxy *proxy) {
bool CmdExample::onServer(DebuggerProxy &proxy) {
m_output = m_input.size();
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -25,13 +25,13 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdExample);
class CmdExample : public CmdExtended {
public:
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+20 -20
Ver Arquivo
@@ -21,22 +21,22 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdException::list(DebuggerClient *client) {
if (client->argCount() == 0) {
client->addCompletion(DebuggerClient::AutoCompleteClasses);
client->addCompletion("error");
client->addCompletion("regex");
client->addCompletion("once");
} else if (client->arg(1, "regex") || client->arg(1, "once")) {
client->addCompletion(DebuggerClient::AutoCompleteClasses);
void CmdException::list(DebuggerClient &client) {
if (client.argCount() == 0) {
client.addCompletion(DebuggerClient::AutoCompleteClasses);
client.addCompletion("error");
client.addCompletion("regex");
client.addCompletion("once");
} else if (client.arg(1, "regex") || client.arg(1, "once")) {
client.addCompletion(DebuggerClient::AutoCompleteClasses);
} else {
client->addCompletion(DebuggerClient::AutoCompleteCode);
client.addCompletion(DebuggerClient::AutoCompleteCode);
}
}
void CmdException::help(DebuggerClient *client) {
client->helpTitle("Exception Command");
client->helpCmds(
void CmdException::help(DebuggerClient &client) {
client.helpTitle("Exception Command");
client.helpCmds(
"[e]xception {cls}", "breaks if class of exception throws",
"[e]xception {ns}::{cls}", "breaks if class of exception throws",
"[e]xception error", "breaks on errors, warnings and notices",
@@ -49,7 +49,7 @@ void CmdException::help(DebuggerClient *client) {
"[e]xception {above} && {php}", "breaks and evaluates an expression",
nullptr
);
client->helpBody(
client.helpBody(
"Exception command is similar to '[b]reak' command, except it's used "
"to specify how to break on (or catch) a throw of an exception. Program "
"stops right before the exception is about to throw. Resuming program "
@@ -66,9 +66,9 @@ void CmdException::help(DebuggerClient *client) {
);
}
void CmdException::onClientImpl(DebuggerClient *client) {
void CmdException::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
help(client);
return;
}
@@ -77,18 +77,18 @@ void CmdException::onClientImpl(DebuggerClient *client) {
BreakPointInfo::State state = BreakPointInfo::Always;
int index = 1;
if (client->arg(1, "regex")) {
if (client.arg(1, "regex")) {
regex = true;
index++;
} else if (client->arg(1, "once")) {
} else if (client.arg(1, "once")) {
state = BreakPointInfo::Once;
index++;
}
BreakPointInfoPtr bpi(new BreakPointInfo(regex, state, ExceptionThrown,
client->argValue(index), ""));
client.argValue(index), ""));
if (!addToBreakpointListAndUpdateServer(client, bpi, index)) {
client->tutorial(
client.tutorial(
"This is the order of different arguments:\n"
"\n"
"\t[e]xception [r]egex|[o]nce {exp} if|&& {php}\n"
@@ -102,7 +102,7 @@ void CmdException::onClientImpl(DebuggerClient *client) {
}
}
void CmdException::setClientOutput(DebuggerClient *client) {
void CmdException::setClientOutput(DebuggerClient &client) {
// Also output an array of all breakpoints which include exceptions
CmdBreak().setClientOutput(client);
}
+4 -4
Ver Arquivo
@@ -29,12 +29,12 @@ public:
m_type = KindOfException;
}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+29 -29
Ver Arquivo
@@ -23,12 +23,12 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdExtended::list(DebuggerClient *client) {
if (client->argCount() == 0) {
void CmdExtended::list(DebuggerClient &client) {
if (client.argCount() == 0) {
const ExtendedCommandMap &cmds = getCommandMap();
for (ExtendedCommandMap::const_iterator iter = cmds.begin();
iter != cmds.end(); ++iter) {
client->addCompletion(iter->first.c_str());
client.addCompletion(iter->first.c_str());
}
} else {
ExtendedCommandMap matches = match(client, 1);
@@ -47,53 +47,53 @@ static string format_unique_prefix(const std::string &cmd,
return "[" + cmd.substr(0, i) + "]" + cmd.substr(i);
}
}
return cmd + " (ambigulously bad command)";
return cmd + " (ambiguous command)";
}
void CmdExtended::helpImpl(DebuggerClient *client, const char *name) {
void CmdExtended::helpImpl(DebuggerClient &client, const char *name) {
const char *cmd = "{cmd} {arg1} {arg2} ...";
const char *help = "invoke specified command";
client->helpCmds((string(name) + " " + cmd).c_str(), help,
client.helpCmds((string(name) + " " + cmd).c_str(), help,
(string(name) + cmd).c_str(), help,
nullptr);
const ExtendedCommandMap &cmds = getCommandMap();
if (!cmds.empty()) {
client->help("");
client->help("where {cmd} can be:");
client->help("");
client.help("");
client.help("where {cmd} can be:");
client.help("");
vector<string> vcmds;
for (ExtendedCommandMap::const_iterator iter = cmds.begin();
iter != cmds.end(); ++iter) {
vcmds.push_back(iter->first);
}
for (unsigned int i = 0; i < vcmds.size(); i++) {
client->help("\t%s", format_unique_prefix
client.help("\t%s", format_unique_prefix
(vcmds[i], i ? vcmds[i-1] : "",
i < vcmds.size() - 1 ? vcmds[i+1] : "").c_str());
}
client->help("");
client->help("Type '%s [h]elp|? {cmd} to read their usages.", name);
client.help("");
client.help("Type '%s [h]elp|? {cmd} to read their usages.", name);
}
}
ExtendedCommandMap CmdExtended::match(DebuggerClient *client, int argIndex) {
ExtendedCommandMap CmdExtended::match(DebuggerClient &client, int argIndex) {
ExtendedCommandMap matches;
const ExtendedCommandMap &cmds = getCommandMap();
for (ExtendedCommandMap::const_iterator iter = cmds.begin();
iter != cmds.end(); ++iter) {
if (client->arg(argIndex, iter->first.c_str())) {
if (client.arg(argIndex, iter->first.c_str())) {
matches[iter->first] = iter->second;
}
}
if (matches.empty()) {
client->error("Cannot find the specified user command: %s",
client->argValue(argIndex).c_str());
client.error("Cannot find the specified user command: %s",
client.argValue(argIndex).c_str());
}
return matches;
}
void CmdExtended::helpCommands(DebuggerClient *client,
void CmdExtended::helpCommands(DebuggerClient &client,
const ExtendedCommandMap &matches) {
for (ExtendedCommandMap::const_iterator iter = matches.begin();
iter != matches.end(); ++iter) {
@@ -101,9 +101,9 @@ void CmdExtended::helpCommands(DebuggerClient *client,
}
}
void CmdExtended::onClientImpl(DebuggerClient *client) {
if (client->arg(1, "help") || client->arg(1, "?")) {
if (client->argCount() == 1) {
void CmdExtended::onClientImpl(DebuggerClient &client) {
if (client.arg(1, "help") || client.arg(1, "?")) {
if (client.argCount() == 1) {
help(client);
return;
}
@@ -120,13 +120,13 @@ void CmdExtended::onClientImpl(DebuggerClient *client) {
if (matches.empty()) {
help(client);
} else if (matches.size() > 1) {
client->error("Need more letters to tell which one of these:");
client.error("Need more letters to tell which one of these:");
for (ExtendedCommandMap::const_iterator iter = matches.begin();
iter != matches.end(); ++iter) {
client->error("\t%s", iter->first.c_str());
client.error("\t%s", iter->first.c_str());
}
} else if (!invokeClient(client, matches.begin()->second)) {
if (client->arg(2, "help") || client->arg(2, "?")) {
if (client.arg(2, "help") || client.arg(2, "?")) {
helpCommands(client, matches);
}
}
@@ -134,8 +134,8 @@ void CmdExtended::onClientImpl(DebuggerClient *client) {
///////////////////////////////////////////////////////////////////////////////
void CmdExtended::help(DebuggerClient *client) {
client->helpTitle("Extended Command");
void CmdExtended::help(DebuggerClient &client) {
client.helpTitle("Extended Command");
helpImpl(client, "x");
}
@@ -143,14 +143,14 @@ const ExtendedCommandMap &CmdExtended::getCommandMap() {
return GetExtendedCommandMap();
}
void CmdExtended::invokeList(DebuggerClient *client, const std::string &cls){
void CmdExtended::invokeList(DebuggerClient &client, const std::string &cls){
DebuggerCommandPtr cmd = CreateExtendedCommand(cls);
if (cmd) {
cmd->list(client);
}
}
bool CmdExtended::invokeHelp(DebuggerClient *client, const std::string &cls) {
bool CmdExtended::invokeHelp(DebuggerClient &client, const std::string &cls) {
DebuggerCommandPtr cmd = CreateExtendedCommand(cls);
if (cmd) {
cmd->help(client);
@@ -159,7 +159,7 @@ bool CmdExtended::invokeHelp(DebuggerClient *client, const std::string &cls) {
return false;
}
bool CmdExtended::invokeClient(DebuggerClient *client, const std::string &cls){
bool CmdExtended::invokeClient(DebuggerClient &client, const std::string &cls){
DebuggerCommandPtr cmd = CreateExtendedCommand(cls);
if (cmd) {
cmd->onClient(client);
@@ -168,7 +168,7 @@ bool CmdExtended::invokeClient(DebuggerClient *client, const std::string &cls){
return false;
}
bool CmdExtended::onServer(DebuggerProxy *proxy) {
bool CmdExtended::onServer(DebuggerProxy &proxy) {
assert(false);
return false;
}
+10 -10
Ver Arquivo
@@ -34,24 +34,24 @@ public:
public:
CmdExtended() : DebuggerCommand(KindOfExtended) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
// so CmdUser can override these functions
virtual const ExtendedCommandMap &getCommandMap();
virtual void invokeList(DebuggerClient *client, const std::string &cls);
virtual bool invokeHelp(DebuggerClient *client, const std::string &cls);
virtual bool invokeClient(DebuggerClient *client, const std::string &cls);
virtual void invokeList(DebuggerClient &client, const std::string &cls);
virtual bool invokeHelp(DebuggerClient &client, const std::string &cls);
virtual bool invokeClient(DebuggerClient &client, const std::string &cls);
protected:
virtual void onClientImpl(DebuggerClient *client);
void helpImpl(DebuggerClient *client, const char *name);
virtual void onClientImpl(DebuggerClient &client);
void helpImpl(DebuggerClient &client, const char *name);
private:
ExtendedCommandMap match(DebuggerClient *client, int argIndex);
void helpCommands(DebuggerClient *client, const ExtendedCommandMap &matches);
ExtendedCommandMap match(DebuggerClient &client, int argIndex);
void helpCommands(DebuggerClient &client, const ExtendedCommandMap &matches);
};
///////////////////////////////////////////////////////////////////////////////
+19 -19
Ver Arquivo
@@ -39,11 +39,11 @@ void CmdExtension::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_err);
}
void CmdExtension::list(DebuggerClient *client) {
if (client->argCount() == 2) {
client->addCompletion("dump");
} else if (client->argCount() > 2) {
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
void CmdExtension::list(DebuggerClient &client) {
if (client.argCount() == 2) {
client.addCompletion("dump");
} else if (client.argCount() > 2) {
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
} else {
// This is cheating, assuming server has same list of extensions.
Array exts = Extension::GetLoadedExtensions();
@@ -51,20 +51,20 @@ void CmdExtension::list(DebuggerClient *client) {
for (ArrayIter iter(exts); iter; ++iter) {
items.push_back(iter.second().toString()->toCPPString());
}
client->addCompletion(items);
client.addCompletion(items);
}
}
void CmdExtension::help(DebuggerClient *client) {
client->helpTitle("Extension Command");
client->helpCmds(
void CmdExtension::help(DebuggerClient &client) {
client.helpTitle("Extension Command");
client.helpCmds(
"x [t]ension", "lists all extensions",
"x [t]ension {name}", "shows summary info of the extension",
"x [t]ension {name} dump", "shows detailed info of the extension",
"x [t]ension {name} {verb} {args} ...", "executes an action",
nullptr
);
client->helpBody(
client.helpBody(
"In PHP, a lot of library functions are implemented as \"extensions\". "
"This command allows extensions to support debugger by providing their "
"version numbers, current status and cached data and by providing "
@@ -72,18 +72,18 @@ void CmdExtension::help(DebuggerClient *client) {
);
}
void CmdExtension::onClientImpl(DebuggerClient *client) {
void CmdExtension::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
m_args = *client->args();
CmdExtensionPtr cmd = client->xend<CmdExtension>(this);
m_args = *client.args();
CmdExtensionPtr cmd = client.xend<CmdExtension>(this);
if (cmd->m_out.empty()) {
client->error(cmd->m_err);
client.error(cmd->m_err);
} else {
client->print(cmd->m_out);
client.print(cmd->m_out);
}
}
bool CmdExtension::processList(DebuggerProxy *proxy) {
bool CmdExtension::processList(DebuggerProxy &proxy) {
IDebuggable::InfoVec info;
Array exts = Extension::GetLoadedExtensions();
@@ -120,10 +120,10 @@ bool CmdExtension::processList(DebuggerProxy *proxy) {
for (int i = 0; i < hrLen; i++) sb.append(BOX_H); sb.append("\n");
m_out = sb.detach();
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
bool CmdExtension::onServer(DebuggerProxy *proxy) {
bool CmdExtension::onServer(DebuggerProxy &proxy) {
if (m_args.size() <= 1) {
return processList(proxy);
}
@@ -163,7 +163,7 @@ bool CmdExtension::onServer(DebuggerProxy *proxy) {
m_err = "Unable to find the specified extension: ";
m_err += String(name);
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+5 -5
Ver Arquivo
@@ -25,13 +25,13 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdExtension);
class CmdExtension : public CmdExtended {
public:
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -40,7 +40,7 @@ private:
String m_out;
String m_err;
bool processList(DebuggerProxy *proxy);
bool processList(DebuggerProxy &proxy);
};
///////////////////////////////////////////////////////////////////////////////
@@ -39,41 +39,41 @@ void CmdFlowControl::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_smallStep);
}
void CmdFlowControl::onClientImpl(DebuggerClient *client) {
void CmdFlowControl::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
client->setFrame(0);
client.setFrame(0);
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
return;
}
if (client->argCount() == 1) {
string snum = client->argValue(1);
if (client.argCount() == 1) {
string snum = client.argValue(1);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("Count needs to be a number.");
client.error("Count needs to be a number.");
return;
}
m_count = atoi(snum.c_str());
if (m_count < 1) {
client->error("Count needs to be a positive number.");
client.error("Count needs to be a positive number.");
return;
}
}
m_smallStep = client->getDebuggerSmallStep();
client->sendToServer(this);
m_smallStep = client.getDebuggerSmallStep();
client.sendToServer(this);
throw DebuggerConsoleExitException();
}
bool CmdFlowControl::onServer(DebuggerProxy *proxy) {
bool CmdFlowControl::onServer(DebuggerProxy &proxy) {
// Flow control cmds do their work in onSetup() and onBeginInterrupt(), so
// there is no real work to do in here.
return true;
}
void CmdFlowControl::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdFlowControl::onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
// Should only do setting and nothing else
g_context->setDebuggerSmallStep(m_smallStep);
}
@@ -47,13 +47,13 @@ public:
m_count(1) { }
virtual ~CmdFlowControl();
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
// Work done to setup a new flow command, after receiving it from the client.
virtual void onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt);
// Work done when a VM thread interrupts the proxy.
virtual void onBeginInterrupt(DebuggerProxy *proxy,
virtual void onBeginInterrupt(DebuggerProxy &proxy,
CmdInterrupt &interrupt) = 0;
// A completed flow cmd has done all its work and can be deleted.
@@ -63,7 +63,7 @@ public:
bool needsVMInterrupt() { return m_needsVMInterrupt; }
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+9 -9
Ver Arquivo
@@ -23,31 +23,31 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdFrame::help(DebuggerClient *client) {
client->helpTitle("Frame Command");
client->helpCmds(
void CmdFrame::help(DebuggerClient &client) {
client.helpTitle("Frame Command");
client.helpCmds(
"[f]rame {index}", "jumps to one particular frame",
nullptr
);
client->helpBody(
client.helpBody(
"Use '[w]here' command to find out the frame number. Use 'f 0' to jump "
"back to the most recent frame or the innermost frame. Use 'f 999' or "
"some big number to jump to the outermost frame."
);
}
void CmdFrame::onClientImpl(DebuggerClient *client) {
void CmdFrame::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() != 1) {
if (client.argCount() != 1) {
help(client);
} else {
CmdWhere().fetchStackTrace(client);
client->moveToFrame(CmdUp::ParseNumber(client));
client.moveToFrame(CmdUp::ParseNumber(client));
}
}
void CmdFrame::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTStacktrace);
void CmdFrame::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTStacktrace);
}
///////////////////////////////////////////////////////////////////////////////
+3 -3
Ver Arquivo
@@ -27,11 +27,11 @@ class CmdFrame : public DebuggerCommand {
public:
CmdFrame() : DebuggerCommand(KindOfFrame) {}
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+16 -16
Ver Arquivo
@@ -32,14 +32,14 @@ void CmdGlobal::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_globals);
}
void CmdGlobal::help(DebuggerClient *client) {
client->helpTitle("Global Command");
client->helpCmds(
void CmdGlobal::help(DebuggerClient &client) {
client.helpTitle("Global Command");
client.helpCmds(
"[g]lobal", "lists all global variables",
"[g]lobal {text}", "full-text search global variables",
nullptr
);
client->helpBody(
client.helpBody(
"This will print names and values of all global variables, if {text} is "
"not speified. Otherwise, it will print global variables that contain the "
"text in their names or values. The search is case-insensitive and "
@@ -47,44 +47,44 @@ void CmdGlobal::help(DebuggerClient *client) {
);
}
void CmdGlobal::onClientImpl(DebuggerClient *client) {
void CmdGlobal::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
String text;
if (client->argCount() == 1) {
text = client->argValue(1);
} else if (client->argCount() != 0) {
if (client.argCount() == 1) {
text = client.argValue(1);
} else if (client.argCount() != 0) {
help(client);
return;
}
CmdGlobalPtr cmd = client->xend<CmdGlobal>(this);
CmdGlobalPtr cmd = client.xend<CmdGlobal>(this);
if (cmd->m_globals.empty()) {
client->info("(no global variable was found)");
client.info("(no global variable was found)");
} else {
m_globals = cmd->m_globals;
CmdVariable::PrintVariables(client, cmd->m_globals, true, text);
}
}
void CmdGlobal::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdGlobal::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
Array values;
for (ArrayIter iter(m_globals); iter; ++iter) {
String name = iter.first().toString();
if (client->getDebuggerClientApiModeSerialize()) {
if (client.getDebuggerClientApiModeSerialize()) {
values.set(name,
DebuggerClient::FormatVariable(iter.second(), 200));
} else {
values.set(name, iter.second());
}
}
client->setOTValues(values);
client.setOTValues(values);
}
bool CmdGlobal::onServer(DebuggerProxy *proxy) {
bool CmdGlobal::onServer(DebuggerProxy &proxy) {
m_globals = CmdVariable::GetGlobalVariables();
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdGlobal : public DebuggerCommand {
public:
CmdGlobal() : DebuggerCommand(KindOfGlobal) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+34 -34
Ver Arquivo
@@ -21,8 +21,8 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdHelp::HelpAll(DebuggerClient *client) {
client->helpCmds(
void CmdHelp::HelpAll(DebuggerClient &client) {
client.helpCmds(
"Session Commands", "",
"[m]achine", "connects to an HHVM server",
"[t]hread", "switches between different threads",
@@ -72,14 +72,14 @@ void CmdHelp::HelpAll(DebuggerClient *client) {
nullptr
);
client->helpBody("* These commands are replayable by just hitting return.\n"
client.helpBody("* These commands are replayable by just hitting return.\n"
"** Type \"help help\" to get more help.");
}
void CmdHelp::HelpStarted(DebuggerClient *client) {
client->helpTitle("Getting Started with Debugger");
void CmdHelp::HelpStarted(DebuggerClient &client) {
client.helpTitle("Getting Started with Debugger");
client->helpBody(
client.helpBody(
"1. Quick Overview\n"
"\n"
"(1) from A to Z\n"
@@ -117,7 +117,7 @@ void CmdHelp::HelpStarted(DebuggerClient *client) {
"documentation]] for more details."
);
client->helpBody(
client.helpBody(
"2. Debugging local script\n"
"\n"
"The command to run a script normally looks like this,\n"
@@ -169,7 +169,7 @@ void CmdHelp::HelpStarted(DebuggerClient *client) {
" hphpd> quit"
);
client->helpBody(
client.helpBody(
"3. Debugging sandbox\n"
"\n"
"Connect to an HHVM server from command line,\n"
@@ -196,7 +196,7 @@ void CmdHelp::HelpStarted(DebuggerClient *client) {
"shared by all of them."
);
client->helpBody(
client.helpBody(
"4. Understanding dummy sandbox\n"
"\n"
"When a web request hits a breakpoint, debugger will run in a "
@@ -228,7 +228,7 @@ void CmdHelp::HelpStarted(DebuggerClient *client) {
" Ctrl-C"
);
client->helpBody(
client.helpBody(
"5. Colors and Configuration\n"
"\n"
"By default, it will use emacs colors for dark background. To change "
@@ -244,26 +244,26 @@ void CmdHelp::HelpStarted(DebuggerClient *client) {
);
}
void CmdHelp::list(DebuggerClient *client) {
if (client->argCount() == 0) {
client->addCompletion(DebuggerClient::GetCommands());
client->addCompletion("tutorial");
client->addCompletion("start");
} else if (client->arg(1, "tutorial")) {
client->addCompletion("on");
client->addCompletion("off");
client->addCompletion("auto");
void CmdHelp::list(DebuggerClient &client) {
if (client.argCount() == 0) {
client.addCompletion(DebuggerClient::GetCommands());
client.addCompletion("tutorial");
client.addCompletion("start");
} else if (client.arg(1, "tutorial")) {
client.addCompletion("on");
client.addCompletion("off");
client.addCompletion("auto");
}
}
void CmdHelp::help(DebuggerClient *client) {
client->helpTitle("Help Command");
client->helpCmds(
void CmdHelp::help(DebuggerClient &client) {
client.helpTitle("Help Command");
client.helpCmds(
"[h]elp [s]tart", "displays material for getting started",
"[h]elp [t]utorial on|off|auto", "changing tutorial modes",
nullptr
);
client->helpBody(
client.helpBody(
"Please read \"Getting Started\" material with '[h]elp [s]tart' for "
"first time use to get yourself familiar with basics.\n"
"\n"
@@ -277,32 +277,32 @@ void CmdHelp::help(DebuggerClient *client) {
);
}
void CmdHelp::onClientImpl(DebuggerClient *client) {
void CmdHelp::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
HelpAll(client);
} else if (client->arg(1, "start")) {
} else if (client.arg(1, "start")) {
HelpStarted(client);
} else if (client->arg(1, "tutorial")) {
} else if (client.arg(1, "tutorial")) {
if (!processTutorial(client)) {
help(client);
}
} else {
client->swapHelp();
if (!client->process()) {
client.swapHelp();
if (!client.process()) {
help(client);
}
}
}
bool CmdHelp::processTutorial(DebuggerClient *client) {
string mode = client->argValue(2);
bool CmdHelp::processTutorial(DebuggerClient &client) {
string mode = client.argValue(2);
if (mode == "off") {
client->setTutorial(-1);
client.setTutorial(-1);
} else if (mode == "on") {
client->setTutorial(1);
client.setTutorial(1);
} else if (mode == "auto") {
client->setTutorial(0);
client.setTutorial(0);
} else {
return false;
}
+6 -6
Ver Arquivo
@@ -25,20 +25,20 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdHelp);
class CmdHelp : public DebuggerCommand {
public:
static void HelpAll(DebuggerClient *client);
static void HelpStarted(DebuggerClient *client);
static void HelpAll(DebuggerClient &client);
static void HelpStarted(DebuggerClient &client);
public:
CmdHelp() : DebuggerCommand(KindOfHelp) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
private:
bool processTutorial(DebuggerClient *client);
bool processTutorial(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+38 -38
Ver Arquivo
@@ -89,17 +89,17 @@ void CmdInfo::recvImpl(DebuggerThriftBuffer &thrift) {
}
}
void CmdInfo::list(DebuggerClient *client) {
client->addCompletion(DebuggerClient::AutoCompleteFunctions);
client->addCompletion(DebuggerClient::AutoCompleteClasses);
client->addCompletion(DebuggerClient::AutoCompleteClassMethods);
client->addCompletion(DebuggerClient::AutoCompleteClassProperties);
client->addCompletion(DebuggerClient::AutoCompleteClassConstants);
void CmdInfo::list(DebuggerClient &client) {
client.addCompletion(DebuggerClient::AutoCompleteFunctions);
client.addCompletion(DebuggerClient::AutoCompleteClasses);
client.addCompletion(DebuggerClient::AutoCompleteClassMethods);
client.addCompletion(DebuggerClient::AutoCompleteClassProperties);
client.addCompletion(DebuggerClient::AutoCompleteClassConstants);
}
void CmdInfo::help(DebuggerClient *client) {
client->helpTitle("Info Command");
client->helpCmds(
void CmdInfo::help(DebuggerClient &client) {
client.helpTitle("Info Command");
client.helpCmds(
"info", "displays current function's info",
"info {cls}", "displays declaration of this class",
"info {function}", "displays declaration of this function",
@@ -108,14 +108,14 @@ void CmdInfo::help(DebuggerClient *client) {
"info {cls::$property}", "displays declaration of this property",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command to display declaration of a symbol."
);
}
bool CmdInfo::parseZeroArg(DebuggerClient *client) {
assert(client->argCount() == 0);
BreakPointInfoPtr bpi = client->getCurrentLocation();
bool CmdInfo::parseZeroArg(DebuggerClient &client) {
assert(client.argCount() == 0);
BreakPointInfoPtr bpi = client.getCurrentLocation();
if (bpi) {
m_symbol = bpi->getClass();
m_type = KindOfClass;
@@ -127,9 +127,9 @@ bool CmdInfo::parseZeroArg(DebuggerClient *client) {
return !m_symbol.empty();
}
void CmdInfo::parseOneArg(DebuggerClient *client, string &subsymbol) {
assert(client->argCount() == 1);
string symbol = client->argValue(1);
void CmdInfo::parseOneArg(DebuggerClient &client, string &subsymbol) {
assert(client.argCount() == 1);
string symbol = client.argValue(1);
size_t pos = symbol.find("::");
if (pos != string::npos) {
m_symbol = String(symbol.substr(0, pos));
@@ -144,49 +144,49 @@ void CmdInfo::parseOneArg(DebuggerClient *client, string &subsymbol) {
}
}
void CmdInfo::onClientImpl(DebuggerClient *client) {
void CmdInfo::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
string subsymbol;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
if (!parseZeroArg(client)) {
client->error("There is no current function or method to look up.");
client->tutorial(
client.error("There is no current function or method to look up.");
client.tutorial(
"You can only use '[i]nfo' without a symbol name when you are running "
"your program and it breaks at a function or a class method. It will "
"then look up information about that function or method."
);
return;
}
} else if (client->argCount() == 1) {
} else if (client.argCount() == 1) {
parseOneArg(client, subsymbol);
} else {
help(client);
return;
}
CmdInfoPtr cmd = client->xend<CmdInfo>(this);
CmdInfoPtr cmd = client.xend<CmdInfo>(this);
Array info = cmd->m_info;
if (info.empty()) {
client->info("(specified symbol cannot be found)");
client.info("(specified symbol cannot be found)");
} else {
for (ArrayIter iter(info); iter; ++iter) {
StringBuffer sb;
PrintInfo(client, sb, iter.second(), subsymbol);
client->code(sb.detach());
client.code(sb.detach());
}
}
}
void CmdInfo::UpdateLiveLists(DebuggerClient *client) {
void CmdInfo::UpdateLiveLists(DebuggerClient &client) {
CmdInfo cmd;
cmd.m_type = KindOfLiveLists;
CmdInfoPtr res = client->xend<CmdInfo>(&cmd);
client->setLiveLists(res->m_acLiveLists);
CmdInfoPtr res = client.xend<CmdInfo>(&cmd);
client.setLiveLists(res->m_acLiveLists);
}
String CmdInfo::GetProtoType(DebuggerClient *client, const std::string &cls,
String CmdInfo::GetProtoType(DebuggerClient &client, const std::string &cls,
const std::string &func) {
CmdInfo cmd;
cmd.m_type = KindOfFunction;
@@ -195,7 +195,7 @@ String CmdInfo::GetProtoType(DebuggerClient *client, const std::string &cls,
} else {
cmd.m_symbol = String(cls) + "::" + String(func);
}
CmdInfoPtr res = client->xend<CmdInfo>(&cmd);
CmdInfoPtr res = client.xend<CmdInfo>(&cmd);
Array info = res->m_info;
if (!info.empty()) {
info = info[0];
@@ -211,7 +211,7 @@ String CmdInfo::GetProtoType(DebuggerClient *client, const std::string &cls,
return String();
}
bool CmdInfo::onServer(DebuggerProxy *proxy) {
bool CmdInfo::onServer(DebuggerProxy &proxy) {
if (m_type == KindOfLiveLists) {
std::vector<String> tmpAcLiveLists[DebuggerClient::AutoCompleteCount];
m_acLiveLists = DebuggerClient::CreateNewLiveLists();
@@ -254,7 +254,7 @@ bool CmdInfo::onServer(DebuggerProxy *proxy) {
vars.push_back("$" + iter.first().toString()->toCPPString());
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
if (m_type == KindOfUnknown || m_type == KindOfClass) {
@@ -273,7 +273,7 @@ bool CmdInfo::onServer(DebuggerProxy *proxy) {
}
} catch (...) {}
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
@@ -296,7 +296,7 @@ void CmdInfo::PrintDocComments(StringBuffer &sb, CArrRef info) {
}
}
void CmdInfo::PrintHeader(DebuggerClient *client, StringBuffer &sb,
void CmdInfo::PrintHeader(DebuggerClient &client, StringBuffer &sb,
CArrRef info) {
if (!info[s_internal].toBoolean()) {
String file = info[s_file].toString();
@@ -309,11 +309,11 @@ void CmdInfo::PrintHeader(DebuggerClient *client, StringBuffer &sb,
} else if (line1 && line2 && line1 != line2) {
sb.printf("// defined on line %d to %d of %s\n", line1, line2,
file.data());
client->setListLocation(file.data(), line1 - 1, false);
client.setListLocation(file.data(), line1 - 1, false);
} else {
int line = line1 ? line1 : line2;
sb.printf("// defined on line %d of %s\n", line, file.data());
client->setListLocation(file.data(), line - 1, false);
client.setListLocation(file.data(), line - 1, false);
}
}
@@ -421,7 +421,7 @@ bool CmdInfo::TryProperty(StringBuffer &sb, CArrRef info,
return false;
}
bool CmdInfo::TryMethod(DebuggerClient *client, StringBuffer &sb, CArrRef info,
bool CmdInfo::TryMethod(DebuggerClient &client, StringBuffer &sb, CArrRef info,
std::string subsymbol) {
if (subsymbol.size() > 2 && subsymbol.substr(subsymbol.size() - 2) == "()") {
subsymbol = subsymbol.substr(0, subsymbol.size() - 2);
@@ -445,7 +445,7 @@ bool CmdInfo::TryMethod(DebuggerClient *client, StringBuffer &sb, CArrRef info,
return false;
}
void CmdInfo::PrintInfo(DebuggerClient *client, StringBuffer &sb, CArrRef info,
void CmdInfo::PrintInfo(DebuggerClient &client, StringBuffer &sb, CArrRef info,
const std::string &subsymbol) {
if (info.exists(s_params)) {
PrintHeader(client, sb, info);
@@ -462,7 +462,7 @@ void CmdInfo::PrintInfo(DebuggerClient *client, StringBuffer &sb, CArrRef info,
if (TryProperty(sb, info, subsymbol)) found = true;
if (TryMethod(client, sb, info, subsymbol)) found = true;
if (found) return;
client->info("Specified symbol cannot be found. Here the whole class:\n");
client.info("Specified symbol cannot be found. Here the whole class:\n");
}
PrintHeader(client, sb, info);
+11 -11
Ver Arquivo
@@ -25,25 +25,25 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdInfo);
class CmdInfo : public DebuggerCommand {
public:
static void UpdateLiveLists(DebuggerClient *client);
static String GetProtoType(DebuggerClient *client, const std::string &cls,
static void UpdateLiveLists(DebuggerClient &client);
static String GetProtoType(DebuggerClient &client, const std::string &cls,
const std::string &func);
public:
CmdInfo() : DebuggerCommand(KindOfInfo) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
bool parseZeroArg(DebuggerClient *client);
void parseOneArg(DebuggerClient *client, std::string &subsymbol);
bool parseZeroArg(DebuggerClient &client);
void parseOneArg(DebuggerClient &client, std::string &subsymbol);
Array getInfo() { return m_info; }
static String FindSubSymbol(CArrRef symbols, const std::string &symbol);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -68,13 +68,13 @@ private:
const std::string &subsymbol);
static bool TryProperty(StringBuffer &sb, CArrRef info,
const std::string &subsymbol);
static bool TryMethod(DebuggerClient *client, StringBuffer &sb,
static bool TryMethod(DebuggerClient &client, StringBuffer &sb,
CArrRef info, std::string subsymbol);
static void PrintDocComments(StringBuffer &sb, CArrRef info);
static void PrintInfo(DebuggerClient *client, StringBuffer &sb, CArrRef info,
static void PrintInfo(DebuggerClient &client, StringBuffer &sb, CArrRef info,
const std::string &subsymbol);
static void PrintHeader(DebuggerClient *client, StringBuffer &sb,
static void PrintHeader(DebuggerClient &client, StringBuffer &sb,
CArrRef info);
};
+49 -49
Ver Arquivo
@@ -38,10 +38,10 @@ void CmdInstrument::recvImpl(DebuggerThriftBuffer &thrift) {
InstPointInfo::RecvImpl(m_ips, thrift);
}
void CmdInstrument::help(DebuggerClient *client) {
client->helpTitle("Instrument Command");
void CmdInstrument::help(DebuggerClient &client) {
client.helpTitle("Instrument Command");
// TODO: more functionalities
client->helpCmds("inst here <file> [desc]",
client.helpCmds("inst here <file> [desc]",
"inject <file> to here",
"inst <func>() <file> [desc]",
"inject <file> to the entry point of <func>",
@@ -50,40 +50,40 @@ void CmdInstrument::help(DebuggerClient *client) {
"inst [c]lear",
"clear all injections",
nullptr);
client->helpBody(
client.helpBody(
"Use this command to instrument the program"
);
}
void CmdInstrument::onClientImpl(DebuggerClient *client) {
void CmdInstrument::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 1) {
if (client->argValue(1) == "list" || client->argValue(1) == "l") {
if (client.argCount() == 1) {
if (client.argValue(1) == "list" || client.argValue(1) == "l") {
listInst(client);
return;
}
if (client->argValue(1) == "clear" || client->argValue(1) == "c") {
if (client.argValue(1) == "clear" || client.argValue(1) == "c") {
clearInst(client);
return;
}
}
if (client->argCount() < 2 || client->argValue(1) == "help") {
if (client.argCount() < 2 || client.argValue(1) == "help") {
help(client);
return;
}
std::string loc = client->argValue(1);
std::string file = client->argValue(2);
std::string loc = client.argValue(1);
std::string file = client.argValue(2);
std::string desc;
if (client->argCount() >= 3) {
desc = client->argValue(3);
if (client.argCount() >= 3) {
desc = client.argValue(3);
}
Variant code = f_file_get_contents(file.c_str());
if (code.isNull()) {
client->error("Unable to read from file %s", file.c_str());
client.error("Unable to read from file %s", file.c_str());
return;
}
m_instPoints = client->getInstPoints();
m_instPoints = client.getInstPoints();
if (loc == "here") {
InstPointInfoPtr ipi(new InstPointInfo());
ipi->setLocHere();
@@ -97,15 +97,15 @@ void CmdInstrument::onClientImpl(DebuggerClient *client) {
ipi->m_desc = desc;
m_instPoints->push_back(ipi);
} else {
client->error("Not implemented\n");
client.error("Not implemented\n");
return;
}
m_type = ActionWrite;
CmdInstrumentPtr instCmdPtr = client->xend<CmdInstrument>(this);
CmdInstrumentPtr instCmdPtr = client.xend<CmdInstrument>(this);
if (!instCmdPtr->m_enabled) {
client->error("Instrumentation is not enabled on the server");
client.error("Instrumentation is not enabled on the server");
}
client->setInstPoints(instCmdPtr->m_ips);
client.setInstPoints(instCmdPtr->m_ips);
CmdInstrument::PrintInstPoints(client);
}
@@ -118,11 +118,11 @@ static const StaticString s_line("line");
static const StaticString s_func_entry("func_entry");
static const StaticString s_func("func");
void CmdInstrument::setClientOutput(DebuggerClient *client) {
void CmdInstrument::setClientOutput(DebuggerClient &client) {
// Output all instrumentation point info
client->setOutputType(DebuggerClient::OTValues);
client.setOutputType(DebuggerClient::OTValues);
Array values;
InstPointInfoPtrVec* ips = client->getInstPoints();
InstPointInfoPtrVec* ips = client.getInstPoints();
for (unsigned int i = 0; i < ips->size(); i++) {
InstPointInfoPtr ipi = (*ips)[i];
Array instpoint;
@@ -138,10 +138,10 @@ void CmdInstrument::setClientOutput(DebuggerClient *client) {
}
values.append(instpoint);
}
client->setOTValues(values);
client.setOTValues(values);
}
bool CmdInstrument::onServer(DebuggerProxy *proxy) {
bool CmdInstrument::onServer(DebuggerProxy &proxy) {
m_instPoints = &m_ips;
m_enabled = true;
if (m_type == ActionRead) {
@@ -149,19 +149,19 @@ bool CmdInstrument::onServer(DebuggerProxy *proxy) {
} else if (m_type == ActionWrite) {
validateAndWriteToTable(proxy);
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
void CmdInstrument::readFromTable(DebuggerProxy *proxy) {
proxy->readInjTablesFromThread();
void CmdInstrument::readFromTable(DebuggerProxy &proxy) {
proxy.readInjTablesFromThread();
m_ips.clear();
if (!proxy->getInjTables()) {
if (!proxy.getInjTables()) {
// nothing there
return;
}
// Bytecode address
InjectionTableInt64* tablePC =
proxy->getInjTables()->getInt64Table(InstHookTypeBCPC);
proxy.getInjTables()->getInt64Table(InstHookTypeBCPC);
if (tablePC) {
for (InjectionTableInt64::const_iterator it = tablePC->begin();
it != tablePC->end(); ++it) {
@@ -178,7 +178,7 @@ void CmdInstrument::readFromTable(DebuggerProxy *proxy) {
}
}
InjectionTableSD* tableFEntry =
proxy->getInjTables()->getSDTable(InstHookTypeFuncEntry);
proxy.getInjTables()->getSDTable(InstHookTypeFuncEntry);
if (tableFEntry) {
for (InjectionTableSD::const_iterator it = tableFEntry->begin();
it != tableFEntry->end(); ++it) {
@@ -195,9 +195,9 @@ void CmdInstrument::readFromTable(DebuggerProxy *proxy) {
}
}
void CmdInstrument::validateAndWriteToTable(DebuggerProxy *proxy) {
if (!proxy->getInjTables()) {
proxy->setInjTables(new InjectionTables());
void CmdInstrument::validateAndWriteToTable(DebuggerProxy &proxy) {
if (!proxy.getInjTables()) {
proxy.setInjTables(new InjectionTables());
}
InjectionTableInt64* tablePC = nullptr;
InjectionTableSD* tableFEntry = nullptr;
@@ -233,41 +233,41 @@ void CmdInstrument::validateAndWriteToTable(DebuggerProxy *proxy) {
}
}
proxy->getInjTables()->setInt64Table(InstHookTypeBCPC, tablePC);
proxy->getInjTables()->setSDTable(InstHookTypeFuncEntry, tableFEntry);
proxy.getInjTables()->setInt64Table(InstHookTypeBCPC, tablePC);
proxy.getInjTables()->setSDTable(InstHookTypeFuncEntry, tableFEntry);
proxy->writeInjTablesToThread();
proxy.writeInjTablesToThread();
}
void CmdInstrument::listInst(DebuggerClient *client) {
void CmdInstrument::listInst(DebuggerClient &client) {
m_type = ActionRead;
m_instPoints = client->getInstPoints();
CmdInstrumentPtr instCmdPtr = client->xend<CmdInstrument>(this);
client->setInstPoints(instCmdPtr->m_ips);
m_instPoints = client.getInstPoints();
CmdInstrumentPtr instCmdPtr = client.xend<CmdInstrument>(this);
client.setInstPoints(instCmdPtr->m_ips);
PrintInstPoints(client);
}
void CmdInstrument::clearInst(DebuggerClient *client) {
void CmdInstrument::clearInst(DebuggerClient &client) {
m_type = ActionWrite;
m_instPoints = client->getInstPoints();
m_instPoints = client.getInstPoints();
m_instPoints->clear();
CmdInstrumentPtr instCmdPtr = client->xend<CmdInstrument>(this);
client->setInstPoints(instCmdPtr->m_ips);
CmdInstrumentPtr instCmdPtr = client.xend<CmdInstrument>(this);
client.setInstPoints(instCmdPtr->m_ips);
PrintInstPoints(client);
}
void CmdInstrument::PrintInstPoints(DebuggerClient *client) {
InstPointInfoPtrVec* ips = client->getInstPoints();
void CmdInstrument::PrintInstPoints(DebuggerClient &client) {
InstPointInfoPtrVec* ips = client.getInstPoints();
int size = ips->size();
client->print("%d instrumentation points", size);
client.print("%d instrumentation points", size);
for (int i = 0; i < size; i++) {
InstPointInfoPtr ipi = (*ips)[i];
if (ipi->m_locType == InstPointInfo::LocFileLine) {
client->print(" %d\t%s\t%s\tfile:\t%s:%d", i,
client.print(" %d\t%s\t%s\tfile:\t%s:%d", i,
ipi->m_valid ? "valid" : "invalid",
ipi->m_desc.c_str(), ipi->m_file.c_str(), ipi->m_line);
} else if (ipi->m_locType == InstPointInfo::LocFuncEntry) {
client->print(" %d\t%s\t%s\tfunc entry:\t%s", i,
client.print(" %d\t%s\t%s\tfunc entry:\t%s", i,
ipi->m_valid ? "valid" : "invalid",
ipi->m_desc.c_str(), ipi->m_func.c_str());
}
+9 -9
Ver Arquivo
@@ -29,12 +29,12 @@ public:
CmdInstrument() : DebuggerCommand(KindOfInstrument), m_type(ActionRead),
m_enabled(false), m_instPoints(nullptr) {}
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -49,13 +49,13 @@ private:
InstPointInfoPtrVec *m_instPoints;
InstPointInfoPtrVec m_ips;
void readFromTable(DebuggerProxy *proxy);
void validateAndWriteToTable(DebuggerProxy *proxy);
void readFromTable(DebuggerProxy &proxy);
void validateAndWriteToTable(DebuggerProxy &proxy);
void listInst(DebuggerClient *client);
void clearInst(DebuggerClient *client);
void listInst(DebuggerClient &client);
void clearInst(DebuggerClient &client);
static void PrintInstPoints(DebuggerClient *client);
static void PrintInstPoints(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+34 -34
Ver Arquivo
@@ -129,43 +129,43 @@ std::string CmdInterrupt::desc() const {
return "";
}
void CmdInterrupt::onClientImpl(DebuggerClient *client) {
client->setCurrentLocation(m_threadId, m_bpi);
if (!client->getDebuggerSmallStep()) {
void CmdInterrupt::onClientImpl(DebuggerClient &client) {
client.setCurrentLocation(m_threadId, m_bpi);
if (!client.getDebuggerSmallStep()) {
// Adjust line and char if it's not small stepping
if (m_bpi->m_line1 == m_bpi->m_line2) {
m_bpi->m_char1 = 1;
m_bpi->m_char2 = 100;
}
}
client->setMatchedBreakPoints(m_matched);
client.setMatchedBreakPoints(m_matched);
switch (m_interrupt) {
case SessionStarted:
if (!m_program.empty()) {
client->info("Program %s loaded. Type '[r]un' or '[c]ontinue' to go.",
client.info("Program %s loaded. Type '[r]un' or '[c]ontinue' to go.",
m_program.c_str());
m_bpi->m_file = m_program;
}
break;
case SessionEnded:
if (!m_program.empty()) {
client->info("Program %s exited normally.", m_program.c_str());
client.info("Program %s exited normally.", m_program.c_str());
}
break;
case RequestStarted:
if (!m_program.empty()) {
client->info("Web request %s started.", m_program.c_str());
client.info("Web request %s started.", m_program.c_str());
}
break;
case RequestEnded:
if (!m_program.empty()) {
client->info("Web request %s ended.", m_program.c_str());
client.info("Web request %s ended.", m_program.c_str());
}
break;
case PSPEnded:
if (!m_program.empty()) {
client->info("Post-Send Processing for %s was ended.",
client.info("Post-Send Processing for %s was ended.",
m_program.c_str());
}
break;
@@ -174,7 +174,7 @@ void CmdInterrupt::onClientImpl(DebuggerClient *client) {
case ExceptionThrown: {
bool found = false;
bool toggled = false;
BreakPointInfoPtrVec *bps = client->getBreakPoints();
BreakPointInfoPtrVec *bps = client.getBreakPoints();
for (unsigned int i = 0; i < m_matched.size(); i++) {
BreakPointInfoPtr bpm = m_matched[i];
BreakPointInfoPtr bp;
@@ -193,27 +193,27 @@ void CmdInterrupt::onClientImpl(DebuggerClient *client) {
}
if (m_interrupt == BreakPointReached ||
m_interrupt == HardBreakPoint) {
client->info("Breakpoint %d reached %s", bp->index(),
client.info("Breakpoint %d reached %s", bp->index(),
m_bpi->site().c_str());
client->shortCode(m_bpi);
client.shortCode(m_bpi);
} else {
if (m_bpi->m_exceptionClass == BreakPointInfo::ErrorClassName) {
client->info("Breakpoint %d reached: An error occurred %s",
client.info("Breakpoint %d reached: An error occurred %s",
bp->index(), m_bpi->site().c_str());
client->shortCode(m_bpi);
client->error("Error Message: %s",
client.shortCode(m_bpi);
client.error("Error Message: %s",
m_bpi->m_exceptionObject.c_str());
} else {
client->info("Breakpoint %d reached: Throwing %s %s",
client.info("Breakpoint %d reached: Throwing %s %s",
bp->index(),
m_bpi->m_exceptionClass.c_str(),
m_bpi->site().c_str());
client->shortCode(m_bpi);
client->output(m_bpi->m_exceptionObject);
client.shortCode(m_bpi);
client.output(m_bpi->m_exceptionObject);
}
}
if (!bpm->m_output.empty()) {
client->print(bpm->m_output);
client.print(bpm->m_output);
}
}
}
@@ -223,17 +223,17 @@ void CmdInterrupt::onClientImpl(DebuggerClient *client) {
if (!found) {
if (m_interrupt == HardBreakPoint) {
// for HardBreakPoint, default the frame to the caller
client->setFrame(1);
client.setFrame(1);
}
client->info("Break %s", m_bpi->site().c_str());
client->shortCode(m_bpi);
client.info("Break %s", m_bpi->site().c_str());
client.shortCode(m_bpi);
}
break;
}
}
if (!m_errorMsg.empty()) {
client->error(m_errorMsg);
client.error(m_errorMsg);
}
// watches
@@ -242,13 +242,13 @@ void CmdInterrupt::onClientImpl(DebuggerClient *client) {
case RequestStarted:
break;
default: {
DebuggerClient::WatchPtrVec &watches = client->getWatches();
DebuggerClient::WatchPtrVec &watches = client.getWatches();
for (int i = 0; i < (int)watches.size(); i++) {
if (i > 0) client->output("");
client->info("Watch %d: %s =", i + 1, watches[i]->second.c_str());
if (i > 0) client.output("");
client.info("Watch %d: %s =", i + 1, watches[i]->second.c_str());
Variant v = CmdPrint().processWatch(client, watches[i]->first,
watches[i]->second);
client->output(CmdPrint::FormatResult(watches[i]->first, v));
client.output(CmdPrint::FormatResult(watches[i]->first, v));
}
}
}
@@ -258,11 +258,11 @@ static const StaticString s_format("format");
static const StaticString s_php("php");
static const StaticString s_value("value");
void CmdInterrupt::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTCodeLoc);
client->setOTFileLine(m_bpi->m_file, m_bpi->m_line1);
void CmdInterrupt::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTCodeLoc);
client.setOTFileLine(m_bpi->m_file, m_bpi->m_line1);
Array values;
DebuggerClient::WatchPtrVec &watches = client->getWatches();
DebuggerClient::WatchPtrVec &watches = client.getWatches();
for (int i = 0; i < (int)watches.size(); i++) {
ArrayInit watch(3);
watch.set(s_format, watches[i]->first);
@@ -272,11 +272,11 @@ void CmdInterrupt::setClientOutput(DebuggerClient *client) {
watch.set(s_value, CmdPrint::FormatResult(watches[i]->first, v));
values.append(watch.create());
}
client->setOTValues(values);
client.setOTValues(values);
}
bool CmdInterrupt::onServer(DebuggerProxy *proxy) {
return proxy->sendToClient(this);
bool CmdInterrupt::onServer(DebuggerProxy &proxy) {
return proxy.sendToClient(this);
}
bool CmdInterrupt::shouldBreak(const BreakPointInfoPtrVec &bps) {
+3 -3
Ver Arquivo
@@ -44,8 +44,8 @@ public:
std::string desc() const;
std::string error() const { return m_errorMsg;}
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
bool shouldBreak(const BreakPointInfoPtrVec &bps);
std::string getFileLine() const;
@@ -53,7 +53,7 @@ public:
InterruptSite *getSite() { return m_site;}
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+40 -40
Ver Arquivo
@@ -45,14 +45,14 @@ void CmdList::recvImpl(DebuggerThriftBuffer &thrift) {
// Informs the client of all strings that may follow a list command.
// Used for auto completion. The client uses the prefix of the argument
// following the command to narrow down the list displayed to the user.
void CmdList::list(DebuggerClient *client) {
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
void CmdList::list(DebuggerClient &client) {
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
}
// The text to display when the debugger client processes "help break".
void CmdList::help(DebuggerClient *client) {
client->helpTitle("List Command");
client->helpCmds(
void CmdList::help(DebuggerClient &client) {
client.helpTitle("List Command");
client.helpCmds(
"list", "displays current block of source code",
"list {line}", "displays code around specified line",
"list {line1}-{line2}", "displays specified block of source code",
@@ -69,7 +69,7 @@ void CmdList::help(DebuggerClient *client) {
"list {directory}", "sets PHP source root directory",
nullptr
);
client->helpBody(
client.helpBody(
"Use list command to display PHP source code. In remote debugging, this "
"is displaying source code on server side. When server side cannot find "
"the file, it will fall back to local files.\n"
@@ -83,29 +83,29 @@ void CmdList::help(DebuggerClient *client) {
);
}
bool CmdList::listCurrent(DebuggerClient *client, int &line,
bool CmdList::listCurrent(DebuggerClient &client, int &line,
int &charFocus0, int &lineFocus1,
int &charFocus1) {
int linePrev = 0;
client->getListLocation(m_file, linePrev, line, charFocus0, lineFocus1,
client.getListLocation(m_file, linePrev, line, charFocus0, lineFocus1,
charFocus1);
if (m_line1 == 0 && m_line2 == 0) {
m_line1 = linePrev + 1;
m_line2 = m_line1 + DebuggerClient::CodeBlockSize;
}
if (m_file.empty()) {
string code = client->getCode();
string code = client.getCode();
if (code.empty()) {
client->error("There is no current source file.");
client.error("There is no current source file.");
return true;
}
client->print(highlight_php(code));
client.print(highlight_php(code));
return true;
}
return false;
}
bool CmdList::listFileRange(DebuggerClient *client, int line,
bool CmdList::listFileRange(DebuggerClient &client, int line,
int charFocus0, int lineFocus1,
int charFocus1) {
if (m_line1 <= 0) m_line1 = 1;
@@ -116,13 +116,13 @@ bool CmdList::listFileRange(DebuggerClient *client, int line,
m_line2 = tmp;
}
CmdListPtr res = client->xend<CmdList>(this);
CmdListPtr res = client.xend<CmdList>(this);
if (res->m_code.isString()) {
if (!client->code(res->m_code, line, m_line1, m_line2, charFocus0,
if (!client.code(res->m_code, line, m_line1, m_line2, charFocus0,
lineFocus1, charFocus1)) {
client->info("No more lines in %s to display.", m_file.c_str());
client.info("No more lines in %s to display.", m_file.c_str());
}
client->setListLocation(m_file, m_line2, false);
client.setListLocation(m_file, m_line2, false);
return true;
}
return false;
@@ -134,13 +134,13 @@ static const StaticString
s_line1("line2"),
s_line2("line2");
bool CmdList::listFunctionOrClass(DebuggerClient *client) {
assert(client->argCount() == 1);
bool CmdList::listFunctionOrClass(DebuggerClient &client) {
assert(client.argCount() == 1);
CmdInfoPtr cmdInfo(new CmdInfo());
DebuggerCommandPtr deleter(cmdInfo);
string subsymbol;
cmdInfo->parseOneArg(client, subsymbol);
CmdInfoPtr cmd = client->xend<CmdInfo>(cmdInfo.get());
CmdInfoPtr cmd = client.xend<CmdInfo>(cmdInfo.get());
Array info = cmd->getInfo();
if (info.empty()) return false;
always_assert(info.size() == 1);
@@ -156,7 +156,7 @@ bool CmdList::listFunctionOrClass(DebuggerClient *client) {
int line2 = funcInfo[s_line2].toInt32();
int line = line1 ? line1 : line2;
if (file.empty() || !line) return false;
client->setListLocation(file.data(), line - 1, false);
client.setListLocation(file.data(), line - 1, false);
line = 0;
int charFocus0 = 0;
int lineFocus1 = 0;
@@ -172,21 +172,21 @@ bool CmdList::listFunctionOrClass(DebuggerClient *client) {
return false;
}
void CmdList::onClientImpl(DebuggerClient *client) {
void CmdList::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
return;
}
int line = 0;
m_line1 = m_line2 = 0;
if (client->argCount() == 1) {
string arg = client->argValue(1);
if (client.argCount() == 1) {
string arg = client.argValue(1);
if (DebuggerClient::IsValidNumber(arg)) {
line = atoi(arg.c_str());
if (line <= 0) {
client->error("A line number has to be a positive integer.");
client.error("A line number has to be a positive integer.");
help(client);
return;
}
@@ -194,7 +194,7 @@ void CmdList::onClientImpl(DebuggerClient *client) {
m_line2 = m_line1 + DebuggerClient::CodeBlockSize;
} else if (arg.find("::") != string::npos) {
if (!listFunctionOrClass(client)) {
client->error("Unable to read specified method.");
client.error("Unable to read specified method.");
}
return;
} else {
@@ -203,7 +203,7 @@ void CmdList::onClientImpl(DebuggerClient *client) {
if (pos != string::npos) {
m_file = arg.substr(0, pos);
if (m_file.empty()) {
client->error("File name cannot be empty.");
client.error("File name cannot be empty.");
help(client);
return;
}
@@ -220,7 +220,7 @@ void CmdList::onClientImpl(DebuggerClient *client) {
m_line1 = 1;
m_line2 = DebuggerClient::CodeBlockSize;
} else {
client->error("Line numbers have to be integers.");
client.error("Line numbers have to be integers.");
help(client);
return;
}
@@ -234,7 +234,7 @@ void CmdList::onClientImpl(DebuggerClient *client) {
m_line2 = m_line1 + DebuggerClient::CodeBlockSize;
}
if (m_line1 <= 0 || m_line2 <= 0) {
client->error("Line numbers have to be positive integers.");
client.error("Line numbers have to be positive integers.");
help(client);
return;
}
@@ -246,14 +246,14 @@ void CmdList::onClientImpl(DebuggerClient *client) {
m_line1 = 1;
m_line2 = DebuggerClient::CodeBlockSize;
} else {
client->error("A line number has to be an integer.");
client.error("A line number has to be an integer.");
help(client);
return;
}
} else {
int line = atoi(arg.c_str());
if (line <= 0) {
client->error("A line number has to be a positive integer.");
client.error("A line number has to be a positive integer.");
help(client);
return;
}
@@ -276,25 +276,25 @@ void CmdList::onClientImpl(DebuggerClient *client) {
struct stat sb;
stat(m_file.c_str(), &sb);
if ((sb.st_mode & S_IFMT) == S_IFDIR) {
client->setSourceRoot(m_file);
client->info("PHP source root directory is set to %s", m_file.c_str());
client.setSourceRoot(m_file);
client.info("PHP source root directory is set to %s", m_file.c_str());
return;
}
}
if (listFileRange(client, line, charFocus0, lineFocus1, charFocus1)) {
return;
} else if (client->argCount() != 1 || !listFunctionOrClass(client)) {
client->error(
} else if (client.argCount() != 1 || !listFunctionOrClass(client)) {
client.error(
"Unable to read specified function, class or source file location.");
return;
}
}
bool CmdList::onServer(DebuggerProxy *proxy) {
bool CmdList::onServer(DebuggerProxy &proxy) {
m_code = f_file_get_contents(m_file.c_str());
if (!m_code && m_file[0] != '/') {
DSandboxInfo info = proxy->getSandbox();
DSandboxInfo info = proxy.getSandbox();
if (info.m_path.empty()) {
raise_warning("path for sandbox %s is not setup, run a web request",
info.desc().c_str());
@@ -303,17 +303,17 @@ bool CmdList::onServer(DebuggerProxy *proxy) {
m_code = f_file_get_contents(full_path.c_str());
}
}
return proxy->sendToClient(this);
return proxy.sendToClient((DebuggerCommand*)this);
}
// Sends a "list file" command to the proxy attached to the given client.
// Returns false if the file does not exist or could not be read or an
// HPHP::String instance containing the contents of the file.
Variant CmdList::GetSourceFile(DebuggerClient *client,
Variant CmdList::GetSourceFile(DebuggerClient &client,
const std::string &file) {
CmdList cmd;
cmd.m_file = file;
CmdListPtr res = client->xend<CmdList>(&cmd);
CmdListPtr res = client.xend<CmdList>(&cmd);
return res->m_code;
}
+8 -8
Ver Arquivo
@@ -30,28 +30,28 @@ public:
// Sends a "list file" command to the proxy attached to the given client.
// Returns false if the file does not exist or could not be read or an
// HPHP::String instance containing the contents of the file.
static Variant GetSourceFile(DebuggerClient *client,
static Variant GetSourceFile(DebuggerClient &client,
const std::string &file);
// Informs the client of all strings that may follow a list command.
// Used for auto completion. The client uses the prefix of the argument
// following the command to narrow down the list displayed to the user.
virtual void list(DebuggerClient *client);
virtual void list(DebuggerClient &client);
// The text to display when the debugger client processes "help break".
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
// Puts the specified range of the contents of the source file referenced
// by this command in m_code and sends a copy of the updated command back
// to the client.
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
// Verifies the arguments of this command, sends the command to the
// server to get back the listing, updates the client with the current
// position in the source file and displays a list of source lines to
// the console.
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
// Serializes this command into the given Thrift buffer.
virtual void sendImpl(DebuggerThriftBuffer &thrift);
@@ -75,15 +75,15 @@ private:
// range of source text to be listed by this command.
Variant m_code;
bool listCurrent(DebuggerClient *client, int &line,
bool listCurrent(DebuggerClient &client, int &line,
int &charFocus0, int &lineFocus1,
int &charFocus1);
bool listFileRange(DebuggerClient *client, int line,
bool listFileRange(DebuggerClient &client, int line,
int charFocus0, int lineFocus1,
int charFocus1);
bool listFunctionOrClass(DebuggerClient *client);
bool listFunctionOrClass(DebuggerClient &client);
};
+60 -60
Ver Arquivo
@@ -43,17 +43,17 @@ void CmdMachine::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_succeed);
}
void CmdMachine::list(DebuggerClient *client) {
if (client->argCount() == 0) {
void CmdMachine::list(DebuggerClient &client) {
if (client.argCount() == 0) {
static const char *keywords[] =
{ "disconnect", "connect", "rpc", "list", "attach", nullptr };
client->addCompletion(keywords);
client.addCompletion(keywords);
}
}
void CmdMachine::help(DebuggerClient *client) {
client->helpTitle("Machine Command");
client->helpCmds(
void CmdMachine::help(DebuggerClient &client) {
client.helpTitle("Machine Command");
client.helpCmds(
"[m]achine [c]onnect {host}", "debugging remote server natively",
"[m]achine [c]onnect {host}:{port}", "debugging remote server natively",
"[m]achine [r]pc {host}", "debugging remote server with RPC",
@@ -66,7 +66,7 @@ void CmdMachine::help(DebuggerClient *client) {
"attach to a sandbox by user and name",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command to switch between different machines or "
"sandboxes.\n"
"\n"
@@ -99,25 +99,25 @@ void CmdMachine::help(DebuggerClient *client) {
);
}
bool CmdMachine::processList(DebuggerClient *client,
bool CmdMachine::processList(DebuggerClient &client,
bool output /* = true */) {
m_body = "list";
CmdMachinePtr res = client->xend<CmdMachine>(this);
client->updateSandboxes(res->m_sandboxes);
CmdMachinePtr res = client.xend<CmdMachine>(this);
client.updateSandboxes(res->m_sandboxes);
if (!output) return true;
if (res->m_sandboxes.empty()) {
client->info("(no sandbox was found)");
client->tutorial(
client.info("(no sandbox was found)");
client.tutorial(
"Please hit the sandbox from browser at least once. Then run "
"'[m]achine [l]ist' again."
);
} else {
for (int i = 0; i < (int)res->m_sandboxes.size(); i++) {
client->print(" %d\t%s", i + 1,
client.print(" %d\t%s", i + 1,
res->m_sandboxes[i]->desc().c_str());
}
client->tutorial(
client.tutorial(
"Use '[m]achine [a]ttach {index}' to attach to one sandbox. For "
"example, 'm a 1'. If desired sandbox is not on the list, please "
"hit the sandbox from browser once. Then run '[m]achine [l]ist' "
@@ -128,16 +128,16 @@ bool CmdMachine::processList(DebuggerClient *client,
return true;
}
bool CmdMachine::AttachSandbox(DebuggerClient *client,
bool CmdMachine::AttachSandbox(DebuggerClient &client,
const char *user /* = NULL */,
const char *name /* = NULL */,
bool force /* = false */) {
string login;
if (user == nullptr) {
login = client->getCurrentUser();
login = client.getCurrentUser();
user = login.c_str();
}
if (client->isApiMode()) {
if (client.isApiMode()) {
force = true;
}
@@ -147,11 +147,11 @@ bool CmdMachine::AttachSandbox(DebuggerClient *client,
return AttachSandbox(client, sandbox, force);
}
bool CmdMachine::AttachSandbox(DebuggerClient *client,
bool CmdMachine::AttachSandbox(DebuggerClient &client,
DSandboxInfoPtr sandbox,
bool force /* = false */) {
if (client->isLocal()) {
client->error("Local script doesn't have sandbox to attach to.");
if (client.isLocal()) {
client.error("Local script doesn't have sandbox to attach to.");
return false;
}
@@ -160,13 +160,13 @@ bool CmdMachine::AttachSandbox(DebuggerClient *client,
cmd.m_sandboxes.push_back(sandbox);
cmd.m_force = force;
client->info("Attaching to %s and pre-loading, please wait...",
client.info("Attaching to %s and pre-loading, please wait...",
sandbox->desc().c_str());
CmdMachinePtr cmdMachine = client->xend<CmdMachine>(&cmd);
CmdMachinePtr cmdMachine = client.xend<CmdMachine>(&cmd);
if (cmdMachine->m_succeed) {
client->playMacro("startup");
client.playMacro("startup");
} else {
client->error("failed to attach to sandbox, maybe another client is "
client.error("failed to attach to sandbox, maybe another client is "
"debugging, \nattach to another sandbox, exit the "
"attached hphpd client, or try \n"
"[m]achine [a]ttach [f]orce [%s] [%s]",
@@ -180,7 +180,7 @@ static const StaticString s_port("port");
static const StaticString s_auth("auth");
static const StaticString s_timeout("timeout");
void CmdMachine::UpdateIntercept(DebuggerClient *client,
void CmdMachine::UpdateIntercept(DebuggerClient &client,
const std::string &host, int port) {
CmdMachine cmd;
cmd.m_body = "rpc";
@@ -189,28 +189,28 @@ void CmdMachine::UpdateIntercept(DebuggerClient *client,
s_port, port ? port : RuntimeOption::DebuggerDefaultRpcPort,
s_auth, String(RuntimeOption::DebuggerDefaultRpcAuth),
s_timeout, RuntimeOption::DebuggerDefaultRpcTimeout);
client->xend<CmdMachine>(&cmd);
client.xend<CmdMachine>(&cmd);
}
void CmdMachine::onClientImpl(DebuggerClient *client) {
void CmdMachine::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
help(client);
return;
}
bool rpc = client->arg(1, "rpc");
if (rpc || client->arg(1, "connect")) {
if (client->argCount() != 2) {
bool rpc = client.arg(1, "rpc");
if (rpc || client.arg(1, "connect")) {
if (client.argCount() != 2) {
help(client);
return;
}
string host = client->argValue(2);
string host = client.argValue(2);
int port = 0;
size_t pos = host.find(":");
if (pos != string::npos) {
if (!DebuggerClient::IsValidNumber(host.substr(pos + 1))) {
client->error("Port needs to be a number");
client.error("Port needs to be a number");
help(client);
return;
}
@@ -219,43 +219,43 @@ void CmdMachine::onClientImpl(DebuggerClient *client) {
}
if (rpc) {
if (client->connectRPC(host, port)) {
if (client.connectRPC(host, port)) {
throw DebuggerConsoleExitException();
}
} else {
if (client->connect(host, port)) {
if (client.connect(host, port)) {
throw DebuggerConsoleExitException();
}
}
client->initializeMachine();
client.initializeMachine();
return;
}
if (client->arg(1, "disconnect")) {
if (client->disconnect()) {
if (client.arg(1, "disconnect")) {
if (client.disconnect()) {
throw DebuggerConsoleExitException();
}
client->initializeMachine();
client.initializeMachine();
return;
}
if (client->arg(1, "list")) {
if (client.arg(1, "list")) {
processList(client);
return;
}
if (client->arg(1, "attach")) {
if (client.arg(1, "attach")) {
DSandboxInfoPtr sandbox;
string snum = client->argValue(2);
string snum = client.argValue(2);
if (DebuggerClient::IsValidNumber(snum)) {
int num = atoi(snum.c_str());
sandbox = client->getSandbox(num);
sandbox = client.getSandbox(num);
if (!sandbox) {
processList(client, false);
sandbox = client->getSandbox(num);
sandbox = client.getSandbox(num);
if (!sandbox) {
client->error("\"%s\" is not a valid sandbox index. Choose one from "
client.error("\"%s\" is not a valid sandbox index. Choose one from "
"this list:", snum.c_str());
processList(client);
return;
@@ -263,20 +263,20 @@ void CmdMachine::onClientImpl(DebuggerClient *client) {
}
} else {
int argBase = 2;
if (client->argCount() >= 2 && client->arg(2, "force")) {
if (client.argCount() >= 2 && client.arg(2, "force")) {
m_force = true;
argBase++;
}
sandbox = DSandboxInfoPtr(new DSandboxInfo());
if (client->argCount() < argBase) {
sandbox->m_user = client->getCurrentUser();
if (client.argCount() < argBase) {
sandbox->m_user = client.getCurrentUser();
sandbox->m_name = "default";
} else if (client->argCount() == argBase) {
sandbox->m_user = client->getCurrentUser();
sandbox->m_name = client->argValue(argBase);
} else if (client->argCount() == argBase + 1) {
sandbox->m_user = client->argValue(argBase);
sandbox->m_name = client->argValue(argBase + 1);
} else if (client.argCount() == argBase) {
sandbox->m_user = client.getCurrentUser();
sandbox->m_name = client.argValue(argBase);
} else if (client.argCount() == argBase + 1) {
sandbox->m_user = client.argValue(argBase);
sandbox->m_name = client.argValue(argBase + 1);
} else {
help(client);
return;
@@ -292,7 +292,7 @@ void CmdMachine::onClientImpl(DebuggerClient *client) {
help(client);
}
bool CmdMachine::onServer(DebuggerProxy *proxy) {
bool CmdMachine::onServer(DebuggerProxy &proxy) {
if (m_body == "rpc") {
String host = m_rpcConfig[s_host].toString();
if (host.empty()) {
@@ -302,19 +302,19 @@ bool CmdMachine::onServer(DebuggerProxy *proxy) {
LibEventHttpClient::SetCache(host.data(), port, 1);
register_intercept("", "fb_rpc_intercept_handler", m_rpcConfig);
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
if (m_body == "list") {
Debugger::GetRegisteredSandboxes(m_sandboxes);
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
if (m_body == "attach" && !m_sandboxes.empty()) {
m_succeed = proxy->switchSandbox(m_sandboxes[0]->id(), m_force);
m_succeed = proxy.switchSandbox(m_sandboxes[0]->id(), m_force);
if (m_succeed) {
proxy->notifyDummySandbox();
proxy.notifyDummySandbox();
m_exitInterrupt = true;
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
return false;
}
+8 -8
Ver Arquivo
@@ -25,25 +25,25 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdMachine);
class CmdMachine : public DebuggerCommand {
public:
static bool AttachSandbox(DebuggerClient *client, const char *user = nullptr,
static bool AttachSandbox(DebuggerClient &client, const char *user = nullptr,
const char *name = nullptr, bool force = false);
static bool AttachSandbox(DebuggerClient *client,
static bool AttachSandbox(DebuggerClient &client,
DSandboxInfoPtr sandbox,
bool force = false);
static void UpdateIntercept(DebuggerClient *client,
static void UpdateIntercept(DebuggerClient &client,
const std::string &host, int port);
public:
CmdMachine() : DebuggerCommand(KindOfMachine),
m_force(false), m_succeed(false) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -53,7 +53,7 @@ private:
bool m_force;
bool m_succeed;
bool processList(DebuggerClient *client, bool output = true);
bool processList(DebuggerClient &client, bool output = true);
};
///////////////////////////////////////////////////////////////////////////////
+27 -27
Ver Arquivo
@@ -21,17 +21,17 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdMacro::list(DebuggerClient *client) {
if (client->argCount() == 0) {
void CmdMacro::list(DebuggerClient &client) {
if (client.argCount() == 0) {
static const char *keywords[] =
{ "start", "end", "replay", "list", "clear", nullptr};
client->addCompletion(keywords);
client.addCompletion(keywords);
}
}
void CmdMacro::help(DebuggerClient *client) {
client->helpTitle("Macro Command");
client->helpCmds(
void CmdMacro::help(DebuggerClient &client) {
client.helpTitle("Macro Command");
client.helpCmds(
"& [s]tart", "starts recording of default macro",
"& [s]tart {name}", "starts recording of a named macro",
"& [e]nd", "stops and saves recorded macro",
@@ -41,7 +41,7 @@ void CmdMacro::help(DebuggerClient *client) {
"& [c]lear {index}", "deletes a macro",
nullptr
);
client->helpBody(
client.helpBody(
"Macro command allows you to record a series of debugger command, so "
"you can replay later by its name. When name is not specified, it will "
"use \"default\" as the name.\n"
@@ -54,38 +54,38 @@ void CmdMacro::help(DebuggerClient *client) {
);
}
void CmdMacro::processList(DebuggerClient *client) {
const MacroPtrVec &macros = client->getMacros();
void CmdMacro::processList(DebuggerClient &client) {
const MacroPtrVec &macros = client.getMacros();
for (unsigned int i = 0; i < macros.size(); i++) {
MacroPtr macro = macros[i];
client->output("%4d %s", i + 1, macro->m_name.c_str());
client->print(macro->desc(" > ").c_str());
client.output("%4d %s", i + 1, macro->m_name.c_str());
client.print(macro->desc(" > ").c_str());
}
}
void CmdMacro::onClientImpl(DebuggerClient *client) {
void CmdMacro::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
help(client);
return;
}
if (client->arg(1, "start")) {
client->startMacro(client->argValue(2));
} else if (client->arg(1, "end")) {
client->endMacro();
} else if (client->arg(1, "replay")) {
if (!client->playMacro(client->argValue(2))) {
client->error("Unable to find specified macro.");
if (client.arg(1, "start")) {
client.startMacro(client.argValue(2));
} else if (client.arg(1, "end")) {
client.endMacro();
} else if (client.arg(1, "replay")) {
if (!client.playMacro(client.argValue(2))) {
client.error("Unable to find specified macro.");
processList(client);
}
} else if (client->arg(1, "list")) {
} else if (client.arg(1, "list")) {
processList(client);
} else if (client->arg(1, "clear")) {
string snum = client->argValue(2);
} else if (client.arg(1, "clear")) {
string snum = client.argValue(2);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("'& [c]lear' needs an {index} argument.");
client->tutorial(
client.error("'& [c]lear' needs an {index} argument.");
client.tutorial(
"You will have to run '& [l]ist' first to see a list of valid "
"numbers or indices to specify."
);
@@ -93,8 +93,8 @@ void CmdMacro::onClientImpl(DebuggerClient *client) {
}
int num = atoi(snum.c_str());
if (!client->deleteMacro(num)) {
client->error("\"%s\" is not a valid macro index. Choose one from "
if (!client.deleteMacro(num)) {
client.error("\"%s\" is not a valid macro index. Choose one from "
"this list:", snum.c_str());
processList(client);
return;
+4 -4
Ver Arquivo
@@ -27,14 +27,14 @@ class CmdMacro : public DebuggerCommand {
public:
CmdMacro() : DebuggerCommand(KindOfMacro) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
private:
void processList(DebuggerClient *client);
void processList(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+8 -8
Ver Arquivo
@@ -21,23 +21,23 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdNext::help(DebuggerClient *client) {
client->helpTitle("Next Command");
client->helpCmds(
void CmdNext::help(DebuggerClient &client) {
client.helpTitle("Next Command");
client.helpCmds(
"[n]ext {count=1}", "steps over lines of code",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command at break to step over lines of code. Specify a "
"count to step over more than one line of code."
);
}
void CmdNext::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdNext::onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
TRACE(2, "CmdNext::onSetup\n");
assert(!m_complete); // Complete cmds should not be asked to do work.
CmdFlowControl::onSetup(proxy, interrupt);
m_stackDepth = proxy->getStackDepth();
m_stackDepth = proxy.getStackDepth();
m_vmDepth = g_vmContext->m_nesting;
m_loc = interrupt.getFileLine();
@@ -46,7 +46,7 @@ void CmdNext::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
m_needsVMInterrupt = true;
}
void CmdNext::onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdNext::onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
TRACE(2, "CmdNext::onBeginInterrupt\n");
assert(!m_complete); // Complete cmds should not be asked to do work.
if (interrupt.getInterruptType() == ExceptionThrown) {
@@ -58,7 +58,7 @@ void CmdNext::onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
}
int currentVMDepth = g_vmContext->m_nesting;
int currentStackDepth = proxy->getStackDepth();
int currentStackDepth = proxy.getStackDepth();
if ((currentVMDepth < m_vmDepth) ||
((currentVMDepth == m_vmDepth) && (currentStackDepth <= m_stackDepth))) {
+3 -3
Ver Arquivo
@@ -27,9 +27,9 @@ class CmdNext : public CmdFlowControl {
public:
CmdNext() : CmdFlowControl(KindOfNext) {}
virtual void help(DebuggerClient *client);
virtual void onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void help(DebuggerClient &client);
virtual void onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt);
};
///////////////////////////////////////////////////////////////////////////////
+8 -8
Ver Arquivo
@@ -21,30 +21,30 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdOut::help(DebuggerClient *client) {
client->helpTitle("Out Command");
client->helpCmds(
void CmdOut::help(DebuggerClient &client) {
client.helpTitle("Out Command");
client.helpCmds(
"[o]ut {count=1}", "steps out function calls",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command at break to step out function calls. Specify a "
"count to step out more than one level of function calls."
);
}
void CmdOut::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdOut::onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
TRACE(2, "CmdOut::onSetup\n");
assert(!m_complete); // Complete cmds should not be asked to do work.
CmdFlowControl::onSetup(proxy, interrupt);
m_stackDepth = proxy->getStackDepth();
m_stackDepth = proxy.getStackDepth();
m_vmDepth = g_vmContext->m_nesting;
// Simply setup a "step out breakpoint" and let the program run.
setupStepOut();
}
void CmdOut::onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdOut::onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
TRACE(2, "CmdNext::onBeginInterrupt\n");
assert(!m_complete); // Complete cmds should not be asked to do work.
if (interrupt.getInterruptType() == ExceptionThrown) {
@@ -56,7 +56,7 @@ void CmdOut::onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
}
int currentVMDepth = g_vmContext->m_nesting;
int currentStackDepth = proxy->getStackDepth();
int currentStackDepth = proxy.getStackDepth();
if (currentVMDepth < m_vmDepth) {
// Cut corner here, just break when cross VM boundary no matter how
// many levels we want to go out of
+3 -3
Ver Arquivo
@@ -27,9 +27,9 @@ class CmdOut : public CmdFlowControl {
public:
CmdOut() : CmdFlowControl(KindOfOut) {}
virtual void help(DebuggerClient *client);
virtual void onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void help(DebuggerClient &client);
virtual void onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt);
};
///////////////////////////////////////////////////////////////////////////////
+62 -62
Ver Arquivo
@@ -164,26 +164,26 @@ void CmdPrint::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_noBreak);
}
void CmdPrint::list(DebuggerClient *client) {
if (client->arg(1, "clear")) {
client->addCompletion("all");
void CmdPrint::list(DebuggerClient &client) {
if (client.arg(1, "clear")) {
client.addCompletion("all");
return;
}
client->addCompletion(DebuggerClient::AutoCompleteCode);
client.addCompletion(DebuggerClient::AutoCompleteCode);
if (client->argCount() == 0) {
client->addCompletion(Formats);
client->addCompletion("always");
client->addCompletion("list");
client->addCompletion("clear");
} else if (client->argCount() == 1 && client->arg(1, "always")) {
client->addCompletion(Formats);
if (client.argCount() == 0) {
client.addCompletion(Formats);
client.addCompletion("always");
client.addCompletion("list");
client.addCompletion("clear");
} else if (client.argCount() == 1 && client.arg(1, "always")) {
client.addCompletion(Formats);
}
}
void CmdPrint::help(DebuggerClient *client) {
client->helpTitle("Print Command");
client->helpCmds(
void CmdPrint::help(DebuggerClient &client) {
client.helpTitle("Print Command");
client.helpCmds(
"[p]rint {php}", "prints result of PHP code, (print_r)",
"[p]rint v {php}", "prints result of PHP code, (var_dump)",
"[p]rint x {php}", "prints hex encoded string or number",
@@ -199,7 +199,7 @@ void CmdPrint::help(DebuggerClient *client) {
"[p]rint [c]lear [a]ll", "clears all watch expressions",
nullptr
);
client->helpBody(
client.helpBody(
"Prints result of an expression in certain format. If '[a]lways' is "
"specified, the expression will be added to a watch list. At every break, "
"either at a breakpoint or caused by step commands, these expressions "
@@ -207,47 +207,47 @@ void CmdPrint::help(DebuggerClient *client) {
);
}
void CmdPrint::processList(DebuggerClient *client) {
DebuggerClient::WatchPtrVec &watches = client->getWatches();
void CmdPrint::processList(DebuggerClient &client) {
DebuggerClient::WatchPtrVec &watches = client.getWatches();
for (int i = 0; i < (int)watches.size(); i++) {
client->print(" %d %s %s", i + 1,
client.print(" %d %s %s", i + 1,
StringUtil::Pad(watches[i]->first, 8, " ",
StringUtil::PadLeft).data(),
watches[i]->second.c_str());
}
if (watches.empty()) {
client->tutorial(
client.tutorial(
"Use '[p]rint [a]lways ...' to set new watch expressions. "
"Use '[p]rint ?|[h]elp' to read how to set them. "
);
} else {
client->tutorial(
client.tutorial(
"Use '[p]rint [c]lear {index}|[a]ll' to remove watch expression(s). "
);
}
}
void CmdPrint::processClear(DebuggerClient *client) {
DebuggerClient::WatchPtrVec &watches = client->getWatches();
void CmdPrint::processClear(DebuggerClient &client) {
DebuggerClient::WatchPtrVec &watches = client.getWatches();
if (watches.empty()) {
client->error("There is no watch expression to clear.");
client->tutorial(
client.error("There is no watch expression to clear.");
client.tutorial(
"Use '[p]rint [a]lways ...' to set new watch expressions. "
"Use '[p]rint ?|[h]elp' to read how to set them. "
);
return;
}
if (client->arg(2, "all")) {
if (client.arg(2, "all")) {
watches.clear();
client->info("All watch expressions are cleared.");
client.info("All watch expressions are cleared.");
return;
}
string snum = client->argValue(2);
string snum = client.argValue(2);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("'[p]rint [c]lear' needs an {index} argument.");
client->tutorial(
client.error("'[p]rint [c]lear' needs an {index} argument.");
client.tutorial(
"You will have to run '[p]rint [l]ist' first to see a list of valid "
"numbers or indices to specify."
);
@@ -256,7 +256,7 @@ void CmdPrint::processClear(DebuggerClient *client) {
int num = atoi(snum.c_str()) - 1;
if (num < 0 || num >= (int)watches.size()) {
client->error("\"%s\" is not a valid index. Choose one from this list:",
client.error("\"%s\" is not a valid index. Choose one from this list:",
snum.c_str());
processList(client);
return;
@@ -265,45 +265,45 @@ void CmdPrint::processClear(DebuggerClient *client) {
watches.erase(watches.begin() + num);
}
Variant CmdPrint::processWatch(DebuggerClient *client, const char *format,
Variant CmdPrint::processWatch(DebuggerClient &client, const char *format,
const std::string &php) {
m_body = php;
m_frame = client->getFrame();
m_frame = client.getFrame();
m_noBreak = true;
CmdPrintPtr res = client->xend<CmdPrint>(this);
CmdPrintPtr res = client.xend<CmdPrint>(this);
if (!res->m_output.empty()) {
client->output(res->m_output);
client.output(res->m_output);
}
return res->m_ret;
}
void CmdPrint::handleReply(DebuggerClient *client) {
void CmdPrint::handleReply(DebuggerClient &client) {
if (!m_output.empty()) {
client->output(m_output);
client.output(m_output);
}
client->output(m_ret);
client.output(m_ret);
}
void CmdPrint::onClientImpl(DebuggerClient *client) {
void CmdPrint::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
help(client);
return;
}
int index = 1;
if (client->arg(1, "always")) {
if (client.arg(1, "always")) {
m_isForWatch = true;
if (client->argCount() == 1) {
client->error("'[p]rint [a]lways' needs an expression to watch.");
if (client.argCount() == 1) {
client.error("'[p]rint [a]lways' needs an expression to watch.");
return;
}
index++;
} else if (client->arg(1, "list")) {
} else if (client.arg(1, "list")) {
m_isForWatch = true;
processList(client);
return;
} else if (client->arg(1, "clear")) {
} else if (client.arg(1, "clear")) {
m_isForWatch = true;
processClear(client);
return;
@@ -311,33 +311,33 @@ void CmdPrint::onClientImpl(DebuggerClient *client) {
const char *format = nullptr;
for (const char **fmt = Formats; *fmt; fmt++) {
if (client->arg(index, *fmt)) {
if (client.arg(index, *fmt)) {
format = *fmt;
index++;
break;
}
}
m_body = client->lineRest(index);
m_body = client.lineRest(index);
if (m_isForWatch) {
client->addWatch(format, m_body);
client.addWatch(format, m_body);
return;
}
m_bypassAccessCheck = client->getDebuggerBypassCheck();
m_printLevel = client->getDebuggerPrintLevel();
m_bypassAccessCheck = client.getDebuggerBypassCheck();
m_printLevel = client.getDebuggerPrintLevel();
assert(m_printLevel <= 0 || m_printLevel >= DebuggerClient::MinPrintLevel);
m_frame = client->getFrame();
CmdPrintPtr res = client->xend<CmdPrint>(this);
m_frame = client.getFrame();
CmdPrintPtr res = client.xend<CmdPrint>(this);
if (!res->is(m_type)) {
assert(client->isApiMode());
assert(client.isApiMode());
m_incomplete = true;
res->setClientOutput(client);
} else {
m_output = res->m_output;
m_ret = res->m_ret;
if (!m_output.empty()) {
client->output(m_output);
client.output(m_output);
}
client->output(FormatResult(format, m_ret));
client.output(FormatResult(format, m_ret));
}
}
@@ -347,12 +347,12 @@ static const StaticString s_body("body");
static const StaticString s_value_serialize("value_serialize");
static const StaticString s_value("value");
void CmdPrint::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdPrint::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
Array values;
if (m_isForWatch) {
// Manipulating the watch list, output the current list
DebuggerClient::WatchPtrVec &watches = client->getWatches();
DebuggerClient::WatchPtrVec &watches = client.getWatches();
for (int i = 0; i < (int)watches.size(); i++) {
ArrayInit watch(2);
watch.set(s_format, watches[i]->first);
@@ -362,29 +362,29 @@ void CmdPrint::setClientOutput(DebuggerClient *client) {
} else {
// Just print an expression, do similar output as eval
values.set(s_body, m_body);
if (client->getDebuggerClientApiModeSerialize()) {
if (client.getDebuggerClientApiModeSerialize()) {
values.set(s_value_serialize,
DebuggerClient::FormatVariable(m_ret, 200));
} else {
values.set(s_value, m_ret);
}
}
client->setOTValues(values);
client.setOTValues(values);
}
bool CmdPrint::onServer(DebuggerProxy *proxy) {
bool CmdPrint::onServer(DebuggerProxy &proxy) {
PCFilter* locSave = g_vmContext->m_lastLocFilter;
g_vmContext->m_lastLocFilter = new PCFilter();
g_vmContext->setDebuggerBypassCheck(m_bypassAccessCheck);
{
EvalBreakControl eval(m_noBreak);
m_ret = DebuggerProxy::ExecutePHP(DebuggerProxy::MakePHPReturn(m_body),
m_output, !proxy->isLocal(), m_frame);
m_output, !proxy.isLocal(), m_frame);
}
g_vmContext->setDebuggerBypassCheck(false);
delete g_vmContext->m_lastLocFilter;
g_vmContext->m_lastLocFilter = locSave;
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+9 -9
Ver Arquivo
@@ -32,19 +32,19 @@ public:
CmdPrint() : DebuggerCommand(KindOfPrint), m_bypassAccessCheck(false),
m_isForWatch(false), m_noBreak(false) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
Variant processWatch(DebuggerClient *client, const char *format,
Variant processWatch(DebuggerClient &client, const char *format,
const std::string &php);
virtual void handleReply(DebuggerClient *client);
virtual void handleReply(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -57,8 +57,8 @@ private:
bool m_isForWatch;
bool m_noBreak;
void processList(DebuggerClient *client);
void processClear(DebuggerClient *client);
void processList(DebuggerClient &client);
void processClear(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+8 -8
Ver Arquivo
@@ -22,27 +22,27 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
// The text to display when the debugger client processes "help quit".
void CmdQuit::help(DebuggerClient *client) {
void CmdQuit::help(DebuggerClient &client) {
TRACE(2, "CmdQuit::help\n");
client->helpTitle("Quit Command");
client->helpCmds(
client.helpTitle("Quit Command");
client.helpCmds(
"[q]uit", "quits this program",
nullptr
);
client->helpBody(
client.helpBody(
"After you type this command, you will not see me anymore."
);
}
// Carries out the Quit command by informing the server the client
// is going away and then getting the client to quit.
void CmdQuit::onClientImpl(DebuggerClient *client) {
void CmdQuit::onClientImpl(DebuggerClient &client) {
TRACE(2, "CmdQuit::onClientImpl\n");
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
client->sendToServer(this);
client->quit();
if (client.argCount() == 0) {
client.sendToServer(this);
client.quit();
} else {
help(client);
}
+2 -2
Ver Arquivo
@@ -28,12 +28,12 @@ public:
CmdQuit() : DebuggerCommand(KindOfQuit) {}
// The text to display when the debugger client processes "help quit".
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
protected:
// Carries out the Quit command by informing the server the client
// is going away and then getting the client to quit.
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
+13 -13
Ver Arquivo
@@ -32,18 +32,18 @@ void CmdRun::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(*m_args);
}
void CmdRun::list(DebuggerClient *client) {
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
void CmdRun::list(DebuggerClient &client) {
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
}
void CmdRun::help(DebuggerClient *client) {
client->helpTitle("Run Command");
client->helpCmds(
void CmdRun::help(DebuggerClient &client) {
client.helpTitle("Run Command");
client.helpCmds(
"[r]un", "restarts program",
"[r]un {file} {arg1} {arg2} ...", "starts a new program",
nullptr
);
client->helpBody(
client.helpBody(
"Aborts current execution and restarts program with specified arguments. "
"If no arguments are specified, it will reuse the PHP file and old "
"arguments. If arguments are to be changed, please include file name, "
@@ -54,18 +54,18 @@ void CmdRun::help(DebuggerClient *client) {
);
}
void CmdRun::onClientImpl(DebuggerClient *client) {
void CmdRun::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
m_args = StringVecPtr(client->args(), null_deleter());
m_smallStep = client->getDebuggerSmallStep();
client->sendToServer(this);
client->clearCachedLocal();
client->setFrame(0);
m_args = StringVecPtr(client.args(), null_deleter());
m_smallStep = client.getDebuggerSmallStep();
client.sendToServer(this);
client.clearCachedLocal();
client.setFrame(0);
throw DebuggerConsoleExitException();
}
bool CmdRun::onServer(DebuggerProxy *proxy) {
bool CmdRun::onServer(DebuggerProxy &proxy) {
g_context->setDebuggerSmallStep(m_smallStep);
throw DebuggerRestartException(m_args);
}
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdRun : public DebuggerCommand {
public:
CmdRun() : DebuggerCommand(KindOfRun) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+13 -13
Ver Arquivo
@@ -34,32 +34,32 @@ void CmdShell::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_out);
}
void CmdShell::list(DebuggerClient *client) {
client->addCompletion(DebuggerClient::AutoCompleteFileNames);
void CmdShell::list(DebuggerClient &client) {
client.addCompletion(DebuggerClient::AutoCompleteFileNames);
}
void CmdShell::help(DebuggerClient *client) {
client->helpTitle("Shell Command");
client->help("! {cmd} {arg1} {arg2} ... remotely executes shell command");
client->helpBody(
void CmdShell::help(DebuggerClient &client) {
client.helpTitle("Shell Command");
client.help("! {cmd} {arg1} {arg2} ... remotely executes shell command");
client.helpBody(
"Executes the shell command on connected machine.\n"
"\n"
"The space between ! and command is not needed. '!ls' works as well."
);
}
void CmdShell::onClientImpl(DebuggerClient *client) {
void CmdShell::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
if (client.argCount() == 0) {
help(client);
return;
}
m_args = *client->args();
CmdShellPtr cmd = client->xend<CmdShell>(this);
client->print(cmd->m_out);
m_args = *client.args();
CmdShellPtr cmd = client.xend<CmdShell>(this);
client.print(cmd->m_out);
}
bool CmdShell::onServer(DebuggerProxy *proxy) {
bool CmdShell::onServer(DebuggerProxy &proxy) {
const char **argv =
(const char **)malloc((m_args.size() + 1) * sizeof(char*));
for (unsigned int i = 0; i < m_args.size(); i++) {
@@ -68,7 +68,7 @@ bool CmdShell::onServer(DebuggerProxy *proxy) {
argv[m_args.size()] = nullptr;
Process::Exec(argv[0], argv, nullptr, m_out, &m_out, true);
free(argv);
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -27,13 +27,13 @@ class CmdShell : public DebuggerCommand {
public:
CmdShell() : DebuggerCommand(KindOfShell) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+5 -5
Ver Arquivo
@@ -31,13 +31,13 @@ void CmdSignal::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_signum);
}
void CmdSignal::onClientImpl(DebuggerClient *client) {
m_signum = client->pollSignal();
client->sendToServer(this);
void CmdSignal::onClientImpl(DebuggerClient &client) {
m_signum = client.pollSignal();
client.sendToServer(this);
}
bool CmdSignal::onServer(DebuggerProxy *proxy) {
return proxy->sendToClient(this);
bool CmdSignal::onServer(DebuggerProxy &proxy) {
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+2 -2
Ver Arquivo
@@ -36,10 +36,10 @@ public:
Signal getSignal() const { return (Signal)m_signum;}
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+8 -8
Ver Arquivo
@@ -21,32 +21,32 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdStep::help(DebuggerClient *client) {
client->helpTitle("Step Command");
client->helpCmds(
void CmdStep::help(DebuggerClient &client) {
client.helpTitle("Step Command");
client.helpCmds(
"[s]tep {count=1}", "steps into lines of code",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command at break to step into lines of code. Specify a "
"count to step more than once."
);
}
void CmdStep::onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdStep::onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
assert(!m_complete); // Complete cmds should not be asked to do work.
CmdFlowControl::onSetup(proxy, interrupt);
// Allows a breakpoint on this same line to be hit again when control returns
// from function call.
BreakPointInfoPtr bp = proxy->getBreakPointAtCmd(interrupt);
BreakPointInfoPtr bp = proxy.getBreakPointAtCmd(interrupt);
if (bp) {
bp->setBreakable(proxy->getRealStackDepth());
bp->setBreakable(proxy.getRealStackDepth());
}
installLocationFilterForLine(interrupt.getSite());
m_needsVMInterrupt = true;
}
void CmdStep::onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt) {
void CmdStep::onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt) {
m_complete = (decCount() == 0);
if (!m_complete) {
installLocationFilterForLine(interrupt.getSite());
+3 -3
Ver Arquivo
@@ -27,9 +27,9 @@ class CmdStep : public CmdFlowControl {
public:
CmdStep() : CmdFlowControl(KindOfStep) {}
virtual void help(DebuggerClient *client);
virtual void onSetup(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy *proxy, CmdInterrupt &interrupt);
virtual void help(DebuggerClient &client);
virtual void onSetup(DebuggerProxy &proxy, CmdInterrupt &interrupt);
virtual void onBeginInterrupt(DebuggerProxy &proxy, CmdInterrupt &interrupt);
};
///////////////////////////////////////////////////////////////////////////////
+45 -45
Ver Arquivo
@@ -36,17 +36,17 @@ void CmdThread::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_threads);
}
void CmdThread::list(DebuggerClient *client) {
if (client->argCount() == 0) {
void CmdThread::list(DebuggerClient &client) {
if (client.argCount() == 0) {
static const char *keywords[] =
{ "list", "normal", "sticky", "exclusive", nullptr };
client->addCompletion(keywords);
client.addCompletion(keywords);
}
}
void CmdThread::help(DebuggerClient *client) {
client->helpTitle("Thread Command");
client->helpCmds(
void CmdThread::help(DebuggerClient &client) {
client.helpTitle("Thread Command");
client.helpCmds(
"[t]hread", "displays current thread's information",
"[t]hread [l]ist", "lists all threads at break",
"[t]hread {index}", "switches to the specified thread",
@@ -55,7 +55,7 @@ void CmdThread::help(DebuggerClient *client) {
"[t]hread [e]xclusive", "only break current thread",
nullptr
);
client->helpBody(
client.helpBody(
"Use '[t]hread' alone to display information of current thread.\n"
"\n"
"When a thread is at break, you may specify how other threads should "
@@ -82,58 +82,58 @@ void CmdThread::help(DebuggerClient *client) {
);
}
void CmdThread::processList(DebuggerClient *client, bool output /* = true */) {
void CmdThread::processList(DebuggerClient &client, bool output /* = true */) {
m_body = "list";
CmdThreadPtr res = client->xend<CmdThread>(this);
client->updateThreads(res->m_threads);
CmdThreadPtr res = client.xend<CmdThread>(this);
client.updateThreads(res->m_threads);
if (!output) return;
for (int i = 0; i < (int)res->m_threads.size(); i++) {
DThreadInfoPtr thread = res->m_threads[i];
const char *flag = " ";
if (thread->m_id == client->getCurrentThreadId()) {
if (thread->m_id == client.getCurrentThreadId()) {
flag = "*";
}
client->print("%4d %s %s (%lld) %s\n %s", thread->m_index,
client.print("%4d %s %s (%lld) %s\n %s", thread->m_index,
flag, thread->m_type.c_str(), thread->m_id,
thread->m_url.c_str(), thread->m_desc.c_str());
}
}
void CmdThread::onClientImpl(DebuggerClient *client) {
void CmdThread::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
return;
}
if (client->argCount() == 0) {
if (client.argCount() == 0) {
m_body = "info";
CmdThreadPtr res = client->xend<CmdThread>(this);
client->print(res->m_out);
} else if (client->arg(1, "list")) {
CmdThreadPtr res = client.xend<CmdThread>(this);
client.print(res->m_out);
} else if (client.arg(1, "list")) {
processList(client);
} else if (client->arg(1, "normal")) {
} else if (client.arg(1, "normal")) {
m_body = "normal";
client->sendToServer(this);
client->info("Thread is running in normal mode now. Other threads will "
client.sendToServer(this);
client.info("Thread is running in normal mode now. Other threads will "
"interleave when they hit breakpoints as well.");
} else if (client->arg(1, "sticky")) {
} else if (client.arg(1, "sticky")) {
m_body = "sticky";
client->sendToServer(this);
client->info("Thread is running in sticky mode now. All other threads "
client.sendToServer(this);
client.info("Thread is running in sticky mode now. All other threads "
"will wait until this thread finishes, when they hit "
"breakpoints.");
} else if (client->arg(1, "exclusive")) {
} else if (client.arg(1, "exclusive")) {
m_body = "exclusive";
client->sendToServer(this);
client->info("Thread is running in exclusive mode now. All other threads "
client.sendToServer(this);
client.info("Thread is running in exclusive mode now. All other threads "
"will not break, even when they hit breakpoints.");
} else {
string snum = client->argValue(1);
string snum = client.argValue(1);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("'[t]hread {index}' needs a numeric argument.");
client->tutorial(
client.error("'[t]hread {index}' needs a numeric argument.");
client.tutorial(
"You will have to run '[t]hread [l]ist' first to see a list of valid "
"numbers or indices to specify. Thread 1 is always your current "
"thread. If that's the only thread on the list, you do not have "
@@ -143,26 +143,26 @@ void CmdThread::onClientImpl(DebuggerClient *client) {
}
int num = atoi(snum.c_str());
DThreadInfoPtr thread = client->getThread(num);
DThreadInfoPtr thread = client.getThread(num);
if (!thread) {
processList(client, false);
thread = client->getThread(num);
thread = client.getThread(num);
if (!thread) {
client->error("\"%s\" is not a valid thread index. Choose one from "
client.error("\"%s\" is not a valid thread index. Choose one from "
"this list:", snum.c_str());
processList(client);
return;
}
}
if (thread->m_id == client->getCurrentThreadId()) {
client->info("This is your current thread already.");
if (thread->m_id == client.getCurrentThreadId()) {
client.info("This is your current thread already.");
return;
}
m_body = "switch";
m_threads.push_back(thread);
client->sendToServer(this);
client.sendToServer(this);
throw DebuggerConsoleExitException();
}
}
@@ -175,7 +175,7 @@ void CmdThread::debuggerInfo(InfoVec &info) {
Add(info, "Thread ID", FormatNumber("0x%llx", (int64_t)Process::GetThreadId()));
}
bool CmdThread::onServer(DebuggerProxy *proxy) {
bool CmdThread::onServer(DebuggerProxy &proxy) {
if (m_body == "info") {
// collect info
InfoVec info;
@@ -184,36 +184,36 @@ bool CmdThread::onServer(DebuggerProxy *proxy) {
if (transport) {
transport->debuggerInfo(info);
} else {
Add(info, "Thread Type", proxy->getThreadType());
Add(info, "Thread Type", proxy.getThreadType());
}
g_context->debuggerInfo(info);
m_out = DebuggerClient::FormatInfoVec(info);
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
if (m_body == "list") {
proxy->getThreads(m_threads);
return proxy->sendToClient(this);
proxy.getThreads(m_threads);
return proxy.sendToClient(this);
}
if (m_body == "switch") {
if (!m_threads.empty()) {
proxy->switchThread(m_threads[0]);
proxy.switchThread(m_threads[0]);
m_exitInterrupt = true;
return true;
}
}
if (m_body == "normal") {
proxy->switchThreadMode(DebuggerProxy::Normal);
proxy.switchThreadMode(DebuggerProxy::Normal);
return true;
}
if (m_body == "sticky") {
proxy->switchThreadMode(DebuggerProxy::Sticky);
proxy.switchThreadMode(DebuggerProxy::Sticky);
return true;
}
if (m_body == "exclusive") {
proxy->switchThreadMode(DebuggerProxy::Exclusive);
proxy.switchThreadMode(DebuggerProxy::Exclusive);
return true;
}
+5 -5
Ver Arquivo
@@ -28,13 +28,13 @@ class CmdThread : public DebuggerCommand, public IDebuggable {
public:
CmdThread() : DebuggerCommand(KindOfThread) {}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
@@ -45,7 +45,7 @@ private:
String m_out;
DThreadInfoPtrVec m_threads;
void processList(DebuggerClient *client, bool output = true);
void processList(DebuggerClient &client, bool output = true);
};
///////////////////////////////////////////////////////////////////////////////
+14 -14
Ver Arquivo
@@ -22,25 +22,25 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdUp::help(DebuggerClient *client) {
client->helpTitle("Up Command");
client->helpCmds(
void CmdUp::help(DebuggerClient &client) {
client.helpTitle("Up Command");
client.helpCmds(
"[u]p {num=1}", "moves to outer frames (callers) on stacktrace",
nullptr
);
client->helpBody(
client.helpBody(
"Use this command to walk up on stacktrace to find out outer callers of "
"current frame. By default it moves up by one level. Specify a number "
"to move up several levels a time."
);
}
int CmdUp::ParseNumber(DebuggerClient *client) {
if (client->argCount() == 1) {
string snum = client->argValue(1);
int CmdUp::ParseNumber(DebuggerClient &client) {
if (client.argCount() == 1) {
string snum = client.argValue(1);
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("Please specify a number.");
client->tutorial(
client.error("Please specify a number.");
client.tutorial(
"Run '[w]here' command to see the entire stacktrace."
);
return true;
@@ -50,18 +50,18 @@ int CmdUp::ParseNumber(DebuggerClient *client) {
return 1;
}
void CmdUp::onClientImpl(DebuggerClient *client) {
void CmdUp::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
} else {
CmdWhere().fetchStackTrace(client);
client->moveToFrame(client->getFrame() + ParseNumber(client));
client.moveToFrame(client.getFrame() + ParseNumber(client));
}
}
void CmdUp::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTStacktrace);
void CmdUp::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTStacktrace);
}
///////////////////////////////////////////////////////////////////////////////
+4 -4
Ver Arquivo
@@ -25,16 +25,16 @@ namespace HPHP { namespace Eval {
DECLARE_BOOST_TYPES(CmdUp);
class CmdUp : public DebuggerCommand {
public:
static int ParseNumber(DebuggerClient *client);
static int ParseNumber(DebuggerClient &client);
public:
CmdUp() : DebuggerCommand(KindOfUp) {}
virtual void help(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
+12 -12
Ver Arquivo
@@ -37,15 +37,15 @@ void CmdUser::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_cmd);
}
void CmdUser::list(DebuggerClient *client) {
void CmdUser::list(DebuggerClient &client) {
Lock lock(s_mutex);
CmdExtended::list(client);
}
void CmdUser::help(DebuggerClient *client) {
client->helpTitle("User Extended Command");
void CmdUser::help(DebuggerClient &client) {
client.helpTitle("User Extended Command");
helpImpl(client, "y");
client->helpBody(
client.helpBody(
"These commands are implemented and installed in PHP by implementing "
"DebuggerCommand and calling hphpd_install_user_command(). For example\n"
"\n"
@@ -75,18 +75,18 @@ const ExtendedCommandMap &CmdUser::getCommandMap() {
return s_commands;
}
void CmdUser::invokeList(DebuggerClient *client, const std::string &cls) {
void CmdUser::invokeList(DebuggerClient &client, const std::string &cls) {
p_DebuggerClientCmdUser pclient(NEWOBJ(c_DebuggerClientCmdUser)());
pclient->m_client = client;
pclient->m_client = &client;
try {
Object cmd = create_object(cls.c_str(), null_array);
cmd->o_invoke_few_args(s_onAutoComplete, 1, pclient);
} catch (...) {}
}
bool CmdUser::invokeHelp(DebuggerClient *client, const std::string &cls) {
bool CmdUser::invokeHelp(DebuggerClient &client, const std::string &cls) {
p_DebuggerClientCmdUser pclient(NEWOBJ(c_DebuggerClientCmdUser)());
pclient->m_client = client;
pclient->m_client = &client;
try {
Object cmd = create_object(cls.c_str(), null_array);
Variant ret = cmd->o_invoke_few_args(s_help, 1, pclient);
@@ -95,9 +95,9 @@ bool CmdUser::invokeHelp(DebuggerClient *client, const std::string &cls) {
return false;
}
bool CmdUser::invokeClient(DebuggerClient *client, const std::string &cls) {
bool CmdUser::invokeClient(DebuggerClient &client, const std::string &cls) {
p_DebuggerClientCmdUser pclient(NEWOBJ(c_DebuggerClientCmdUser)());
pclient->m_client = client;
pclient->m_client = &client;
try {
Object cmd = create_object(cls.c_str(), null_array);
Variant ret = cmd->o_invoke_few_args(s_onClient, 1, pclient);
@@ -106,10 +106,10 @@ bool CmdUser::invokeClient(DebuggerClient *client, const std::string &cls) {
return false;
}
bool CmdUser::onServer(DebuggerProxy *proxy) {
bool CmdUser::onServer(DebuggerProxy &proxy) {
if (m_cmd.isNull()) return false;
p_DebuggerProxyCmdUser pproxy(NEWOBJ(c_DebuggerProxyCmdUser)());
pproxy->m_proxy = proxy;
pproxy->m_proxy = &proxy;
try {
Variant ret = m_cmd->o_invoke_few_args(s_onServer, 1, pproxy);
return !same(ret, false);
+6 -6
Ver Arquivo
@@ -39,14 +39,14 @@ public:
Object getUserCommand() { return m_cmd;}
virtual void list(DebuggerClient *client);
virtual void help(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void list(DebuggerClient &client);
virtual void help(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
virtual const ExtendedCommandMap &getCommandMap();
virtual void invokeList(DebuggerClient *client, const std::string &cls);
virtual bool invokeHelp(DebuggerClient *client, const std::string &cls);
virtual bool invokeClient(DebuggerClient *client, const std::string &cls);
virtual void invokeList(DebuggerClient &client, const std::string &cls);
virtual bool invokeHelp(DebuggerClient &client, const std::string &cls);
virtual bool invokeClient(DebuggerClient &client, const std::string &cls);
protected:
virtual void sendImpl(DebuggerThriftBuffer &thrift);
+25 -25
Ver Arquivo
@@ -48,14 +48,14 @@ void CmdVariable::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_global);
}
void CmdVariable::help(DebuggerClient *client) {
client->helpTitle("Variable Command");
client->helpCmds(
void CmdVariable::help(DebuggerClient &client) {
client.helpTitle("Variable Command");
client.helpCmds(
"[v]ariable", "lists all local variables on stack",
"[v]ariable {text}", "full-text search local variables",
nullptr
);
client->helpBody(
client.helpBody(
"This will print names and values of all variables that are currently "
"accessible by simple names. Use '[w]here', '[u]p {num}', '[d]own {num}', "
"'[f]rame {index}' commands to choose a different frame to view variables "
@@ -67,7 +67,7 @@ void CmdVariable::help(DebuggerClient *client) {
);
}
void CmdVariable::PrintVariables(DebuggerClient *client, CArrRef variables,
void CmdVariable::PrintVariables(DebuggerClient &client, CArrRef variables,
bool global, CStrRef text) {
bool system = true;
int i = 0;
@@ -79,26 +79,26 @@ void CmdVariable::PrintVariables(DebuggerClient *client, CArrRef variables,
String fullvalue = DebuggerClient::FormatVariable(iter.second(), -1);
if (name.find(text, 0, false) >= 0 ||
fullvalue.find(text, 0, false) >= 0) {
client->print("%s = %s", name.data(), value.data());
client.print("%s = %s", name.data(), value.data());
found = true;
}
} else {
if (global && system) {
client->print("$%s = %s", name.data(), value.data());
client.print("$%s = %s", name.data(), value.data());
} else {
client->output("$%s = %s", name.data(), value.data());
client.output("$%s = %s", name.data(), value.data());
}
// we knew this is the last system global
if (global && name == "http_response_header") {
client->output("");
client.output("");
system = false;
}
++i;
if (!client->isApiMode() &&
if (!client.isApiMode() &&
i % DebuggerClient::ScrollBlockSize == 0 &&
client->ask("There are %d more variables. Continue? [Y/n]",
client.ask("There are %d more variables. Continue? [Y/n]",
variables.size() - i) == 'n') {
break;
}
@@ -106,44 +106,44 @@ void CmdVariable::PrintVariables(DebuggerClient *client, CArrRef variables,
}
if (!text.empty() && !found) {
client->info("(unable to find specified text in any variables)");
client.info("(unable to find specified text in any variables)");
}
}
void CmdVariable::onClientImpl(DebuggerClient *client) {
void CmdVariable::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
String text;
if (client->argCount() == 1) {
text = client->argValue(1);
} else if (client->argCount() != 0) {
if (client.argCount() == 1) {
text = client.argValue(1);
} else if (client.argCount() != 0) {
help(client);
return;
}
m_frame = client->getFrame();
CmdVariablePtr cmd = client->xend<CmdVariable>(this);
m_frame = client.getFrame();
CmdVariablePtr cmd = client.xend<CmdVariable>(this);
if (cmd->m_variables.empty()) {
client->info("(no variable was defined)");
client.info("(no variable was defined)");
} else {
m_variables = cmd->m_variables;
PrintVariables(client, cmd->m_variables, cmd->m_global, text);
}
}
void CmdVariable::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTValues);
void CmdVariable::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTValues);
Array values;
for (ArrayIter iter(m_variables); iter; ++iter) {
String name = iter.first().toString();
if (client->getDebuggerClientApiModeSerialize()) {
if (client.getDebuggerClientApiModeSerialize()) {
values.set(name,
DebuggerClient::FormatVariable(iter.second(), 200));
} else {
values.set(name, iter.second());
}
}
client->setOTValues(values);
client.setOTValues(values);
}
static const StaticString s_GLOBALS("GLOBALS");
@@ -154,9 +154,9 @@ Array CmdVariable::GetGlobalVariables() {
return ret;
}
bool CmdVariable::onServer(DebuggerProxy *proxy) {
bool CmdVariable::onServer(DebuggerProxy &proxy) {
m_variables = g_vmContext->getLocalDefinedVariables(m_frame);
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+5 -5
Ver Arquivo
@@ -26,19 +26,19 @@ DECLARE_BOOST_TYPES(CmdVariable);
class CmdVariable : public DebuggerCommand {
public:
static Array GetGlobalVariables();
static void PrintVariables(DebuggerClient *client, CArrRef variables,
static void PrintVariables(DebuggerClient &client, CArrRef variables,
bool global, CStrRef text);
public:
CmdVariable() : DebuggerCommand(KindOfVariable) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+28 -28
Ver Arquivo
@@ -46,83 +46,83 @@ void CmdWhere::recvImpl(DebuggerThriftBuffer &thrift) {
thrift.read(m_stackArgs);
}
void CmdWhere::help(DebuggerClient *client) {
client->helpTitle("Where Command");
client->helpCmds(
void CmdWhere::help(DebuggerClient &client) {
client.helpTitle("Where Command");
client.helpCmds(
"[w]here", "displays current stacktrace",
"[w]here {num}", "displays number of innermost frames",
"[w]here -{num}", "displays number of outermost frames",
nullptr
);
client->helpBody(
client.helpBody(
"Use '[u]p {num}' or '[d]own {num}' to walk up or down the stacktrace. "
"Use '[f]rame {index}' to jump to one particular frame. At any frame, "
"use '[v]ariable' command to display all local variables."
);
}
Array CmdWhere::fetchStackTrace(DebuggerClient *client) {
Array st = client->getStackTrace();
Array CmdWhere::fetchStackTrace(DebuggerClient &client) {
Array st = client.getStackTrace();
if (st.isNull()) {
m_stackArgs = client->getDebuggerStackArgs();
CmdWherePtr cmd = client->xend<CmdWhere>(this);
m_stackArgs = client.getDebuggerStackArgs();
CmdWherePtr cmd = client.xend<CmdWhere>(this);
st = cmd->m_stacktrace;
client->setStackTrace(st);
client.setStackTrace(st);
}
return st;
}
void CmdWhere::onClientImpl(DebuggerClient *client) {
void CmdWhere::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() > 1) {
if (client.argCount() > 1) {
help(client);
return;
}
Array st = fetchStackTrace(client);
if (st.empty()) {
client->info("(no stacktrace to display or in global scope)");
client->info("if you hit serialization limit, consider do "
client.info("(no stacktrace to display or in global scope)");
client.info("if you hit serialization limit, consider do "
"\"set sa off\" and then get the stack without args");
return;
}
// so list command can default to current frame
client->moveToFrame(client->getFrame(), false);
client.moveToFrame(client.getFrame(), false);
if (client->argCount() == 0) {
if (client.argCount() == 0) {
int i = 0;
for (ArrayIter iter(st); iter; ++iter) {
client->printFrame(i, iter.second());
client.printFrame(i, iter.second());
++i;
if (!client->isApiMode() &&
if (!client.isApiMode() &&
i % DebuggerClient::ScrollBlockSize == 0 &&
client->ask("There are %d more frames. Continue? [Y/n]",
client.ask("There are %d more frames. Continue? [Y/n]",
st.size() - i) == 'n') {
break;
}
}
} else {
string snum = client->argValue(1);
string snum = client.argValue(1);
int num = atoi(snum.c_str());
if (snum[0] == '-') {
snum = snum.substr(1);
}
if (!DebuggerClient::IsValidNumber(snum)) {
client->error("The argument, if specified, has to be numeric.");
client.error("The argument, if specified, has to be numeric.");
return;
}
if (num > 0) {
for (int i = 0; i < num && i < st.size(); i++) {
client->printFrame(i, st[i]);
client.printFrame(i, st[i]);
}
} else if (num < 0) {
for (int i = st.size() + num; i < st.size(); i++) {
client->printFrame(i, st[i]);
client.printFrame(i, st[i]);
}
} else {
client->error("0 was specified for the number of frames");
client->tutorial(
client.error("0 was specified for the number of frames");
client.tutorial(
"The optional argument is the number of frames to print out. "
"Use a positive number to print out innermost frames. Use a negative "
"number to print out outermost frames."
@@ -131,8 +131,8 @@ void CmdWhere::onClientImpl(DebuggerClient *client) {
}
}
void CmdWhere::setClientOutput(DebuggerClient *client) {
client->setOutputType(DebuggerClient::OTStacktrace);
void CmdWhere::setClientOutput(DebuggerClient &client) {
client.setOutputType(DebuggerClient::OTStacktrace);
}
void CmdWhere::processStackTrace() {
@@ -153,12 +153,12 @@ void CmdWhere::processStackTrace() {
m_stacktrace = smallST;
}
bool CmdWhere::onServer(DebuggerProxy *proxy) {
bool CmdWhere::onServer(DebuggerProxy &proxy) {
m_stacktrace = g_vmContext->debugBacktrace(false, true, false);
if (!m_stackArgs) {
processStackTrace();
}
return proxy->sendToClient(this);
return proxy.sendToClient(this);
}
///////////////////////////////////////////////////////////////////////////////
+5 -5
Ver Arquivo
@@ -27,16 +27,16 @@ class CmdWhere : public DebuggerCommand {
public:
CmdWhere() : DebuggerCommand(KindOfWhere), m_stackArgs(true) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
virtual void setClientOutput(DebuggerClient *client);
virtual bool onServer(DebuggerProxy *proxy);
virtual void setClientOutput(DebuggerClient &client);
virtual bool onServer(DebuggerProxy &proxy);
Array fetchStackTrace(DebuggerClient *client); // client side
Array fetchStackTrace(DebuggerClient &client); // client side
void processStackTrace(); // server side
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
virtual void sendImpl(DebuggerThriftBuffer &thrift);
virtual void recvImpl(DebuggerThriftBuffer &thrift);
+8 -8
Ver Arquivo
@@ -22,13 +22,13 @@ namespace HPHP { namespace Eval {
TRACE_SET_MOD(debugger);
void CmdZend::help(DebuggerClient *client) {
client->helpTitle("Zend Command");
client->helpCmds(
void CmdZend::help(DebuggerClient &client) {
client.helpTitle("Zend Command");
client.helpCmds(
"[z]end", "running the most recent code snippet in Zend PHP",
nullptr
);
client->helpBody(
client.helpBody(
"This is mainly for comparing results from PHP vs. HipHop. After you type "
"in some PHP code, it will be evaluated immediately in HipHop. Then you "
"can type '[z]end' command to re-run the same script in Zend PHP. Please "
@@ -37,14 +37,14 @@ void CmdZend::help(DebuggerClient *client) {
);
}
void CmdZend::onClientImpl(DebuggerClient *client) {
void CmdZend::onClientImpl(DebuggerClient &client) {
if (DebuggerCommand::displayedHelp(client)) return;
if (client->argCount() == 0) {
const std::string &code = client->getCode();
if (client.argCount() == 0) {
const std::string &code = client.getCode();
string out;
Process::Exec("php", nullptr, code.c_str(), out, &out, true);
client->print(out);
client.print(out);
} else {
help(client);
}
+2 -2
Ver Arquivo
@@ -27,10 +27,10 @@ class CmdZend : public DebuggerCommand {
public:
CmdZend() : DebuggerCommand(KindOfZend) {}
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
protected:
virtual void onClientImpl(DebuggerClient *client);
virtual void onClientImpl(DebuggerClient &client);
};
///////////////////////////////////////////////////////////////////////////////
+14 -14
Ver Arquivo
@@ -708,7 +708,7 @@ void DebuggerClient::run() {
void DebuggerClient::updateLiveLists() {
TRACE(2, "DebuggerClient::updateLiveLists\n");
ReadlineWaitCursor waitCursor;
CmdInfo::UpdateLiveLists(this);
CmdInfo::UpdateLiveLists(*this);
m_acLiveListsDirty = false;
}
@@ -740,7 +740,7 @@ void DebuggerClient::promptFunctionPrototype() {
}
}
String output = highlight_code(CmdInfo::GetProtoType(this, cls, func));
String output = highlight_code(CmdInfo::GetProtoType(*this, cls, func));
print("\n%s", output.data());
rl_forced_update_display();
}
@@ -891,7 +891,7 @@ char *DebuggerClient::getCompletion(const char *text, int state) {
if (cmd) {
if (cmd->is(DebuggerCommand::KindOfRun)) playMacro("startup");
DebuggerCommandPtr deleter(cmd);
cmd->list(this);
cmd->list(*this);
}
}
break;
@@ -943,14 +943,14 @@ bool DebuggerClient::initializeMachine() {
if (!m_machine->m_initialized) {
// set/clear intercept for RPC thread
if (!m_machines.empty() && m_machine == m_machines[0]) {
CmdMachine::UpdateIntercept(this, m_machine->m_rpcHost,
CmdMachine::UpdateIntercept(*this, m_machine->m_rpcHost,
m_machine->m_rpcPort);
}
// upload breakpoints
if (!m_breakpoints.empty()) {
info("Updating breakpoints...");
CmdBreak::SendClientBreakpointListToServer(this);
CmdBreak::SendClientBreakpointListToServer(*this);
}
// attaching to default sandbox
@@ -959,7 +959,7 @@ bool DebuggerClient::initializeMachine() {
const char *user = m_options.user.empty() ?
nullptr : m_options.user.c_str();
m_machine->m_sandboxAttached = (waitForgSandbox =
CmdMachine::AttachSandbox(this, user, m_options.sandbox.c_str()));
CmdMachine::AttachSandbox(*this, user, m_options.sandbox.c_str()));
if (!m_machine->m_sandboxAttached) {
Logger::Error("Unable to communicate with default sandbox.");
}
@@ -985,7 +985,7 @@ DebuggerCommandPtr DebuggerClient::waitForNextInterrupt() {
return DebuggerCommandPtr();
}
if (cmd->is(DebuggerCommand::KindOfSignal)) {
cmd->onClient(this);
cmd->onClient(*this);
continue;
}
if (!cmd->is(DebuggerCommand::KindOfInterrupt)) {
@@ -1024,7 +1024,7 @@ void DebuggerClient::runImpl() {
throw DebuggerServerLostException();
}
if (cmd->is(DebuggerCommand::KindOfSignal)) {
cmd->onClient(this);
cmd->onClient(*this);
continue;
}
if (!cmd->is(DebuggerCommand::KindOfInterrupt)) {
@@ -1034,7 +1034,7 @@ void DebuggerClient::runImpl() {
m_sigTime = 0;
usageLogInterrupt(cmd);
{
cmd->onClient(this);
cmd->onClient(*this);
}
m_machine->m_interrupting = true;
setClientState(StateReadyForCommand);
@@ -1198,7 +1198,7 @@ Array DebuggerClient::getOutputArray() {
void DebuggerClient::shortCode(BreakPointInfoPtr bp) {
TRACE(2, "DebuggerClient::shortCode\n");
if (bp && !bp->m_file.empty() && bp->m_line1) {
Variant source = CmdList::GetSourceFile(this, bp->m_file);
Variant source = CmdList::GetSourceFile(*this, bp->m_file);
if (source.isString()) {
// Line and column where highlight should start and end
int beginHighlightLine = bp->m_line1;
@@ -1630,7 +1630,7 @@ bool DebuggerClient::process() {
case '?': {
if (match("?")) {
usageLog("help", m_line);
CmdHelp().onClient(this);
CmdHelp().onClient(*this);
return true;
}
if (match("?>")) {
@@ -1645,7 +1645,7 @@ bool DebuggerClient::process() {
usageLog(m_commandCanonical, m_line);
if (cmd->is(DebuggerCommand::KindOfRun)) playMacro("startup");
DebuggerCommandPtr deleter(cmd);
cmd->onClient(this);
cmd->onClient(*this);
} else {
processTakeCode();
}
@@ -1854,7 +1854,7 @@ DebuggerCommandPtr DebuggerClient::recvFromServer(int expected) {
}
// eval() can cause more breakpoints
res->onClient(this);
res->onClient(*this);
if (!console()) {
if (m_quitting) {
throw DebuggerClientExitException();
@@ -1934,7 +1934,7 @@ void DebuggerClient::processEval() {
m_runState = Running;
m_inputState = TakingCommand;
m_acLiveListsDirty = true;
CmdEval().onClient(this);
CmdEval().onClient(*this);
}
void DebuggerClient::swapHelp() {
+10 -10
Ver Arquivo
@@ -145,11 +145,11 @@ bool DebuggerCommand::Receive(DebuggerThriftBuffer &thrift,
///////////////////////////////////////////////////////////////////////////////
// default handlers
void DebuggerCommand::list(DebuggerClient *client) {
void DebuggerCommand::list(DebuggerClient &client) {
TRACE(2, "DebuggerCommand::list\n");
}
void DebuggerCommand::help(DebuggerClient *client) {
void DebuggerCommand::help(DebuggerClient &client) {
TRACE(2, "DebuggerCommand::help\n");
assert(false);
}
@@ -157,30 +157,30 @@ void DebuggerCommand::help(DebuggerClient *client) {
// If the first argument of the command is "help" or "?"
// this displays help text for the command and returns true.
// Otherwise it returns false.
bool DebuggerCommand::displayedHelp(DebuggerClient *client) {
TRACE(2, "DebuggerCommand::onClientImpl\n");
if (client->arg(1, "help") || client->arg(1, "?")) {
bool DebuggerCommand::displayedHelp(DebuggerClient &client) {
TRACE(2, "DebuggerCommand::displayedHelp\n");
if (client.arg(1, "help") || client.arg(1, "?")) {
help(client);
return true;
}
return false;
}
void DebuggerCommand::onClient(DebuggerClient *client) {
void DebuggerCommand::onClient(DebuggerClient &client) {
TRACE(2, "DebuggerCommand::onClient\n");
onClientImpl(client);
if (client->isApiMode() && !m_incomplete) {
if (client.isApiMode() && !m_incomplete) {
setClientOutput(client);
}
}
void DebuggerCommand::setClientOutput(DebuggerClient *client) {
void DebuggerCommand::setClientOutput(DebuggerClient &client) {
TRACE(2, "DebuggerCommand::setClientOutput\n");
// Just default to text
client->setOutputType(DebuggerClient::OTText);
client.setOutputType(DebuggerClient::OTText);
}
bool DebuggerCommand::onServer(DebuggerProxy *proxy) {
bool DebuggerCommand::onServer(DebuggerProxy &proxy) {
TRACE(2, "DebuggerCommand::onServer\n");
assert(false);
Logger::Error("DebuggerCommand::onServer(): bad cmd type: %d", m_type);
+8 -8
Ver Arquivo
@@ -100,31 +100,31 @@ public:
// Informs the client of all strings that may follow a break command.
// Used for auto completion. The client uses the prefix of the argument
// following the command to narrow down the list displayed to the user.
virtual void list(DebuggerClient *client);
virtual void list(DebuggerClient &client);
// The text to display when the debugger client
// processes "help <this command name>".
virtual void help(DebuggerClient *client);
virtual void help(DebuggerClient &client);
// Carries out the command, possibly by sending it to the server.
// If the client is controlled via the API, the setClientOuput method
// is invoked to update the client with the command output for access
// via the API.
void onClient(DebuggerClient *client);
void onClient(DebuggerClient &client);
// Updates the client with information about the execution of this command.
// This information is not used by the command line client, but can
// be accessed via the debugger client API exposed to PHP programs.
virtual void setClientOutput(DebuggerClient *client);
virtual void setClientOutput(DebuggerClient &client);
// Server-side work for a command. Returning false indicates a failure to
// communicate with the client (for commands that do so).
virtual bool onServer(DebuggerProxy *proxy);
virtual bool onServer(DebuggerProxy &proxy);
// This seems to be confined to eval and print commands.
// It is not clear that it belongs in this interface or that the
// assert is safe.
virtual void handleReply(DebuggerClient *client) { assert(false); }
virtual void handleReply(DebuggerClient &client) { assert(false); }
// Returns true if DebuggerProxy::processInterrupt() should return
// to its caller instead of processing further commands from the client.
@@ -136,12 +136,12 @@ public:
protected:
// Carries out the command, possibly by sending it to the server.
virtual void onClientImpl(DebuggerClient *client) = 0;
virtual void onClientImpl(DebuggerClient &client) = 0;
// If the first argument of the command is "help" or "?"
// this displays help text for the command and returns true.
// Otherwise it returns false.
bool displayedHelp(DebuggerClient *client);
bool displayedHelp(DebuggerClient &client);
// Always called from send and must implement the subclass specific
// logic for serializing a command to send via Thrift.
+6 -6
Ver Arquivo
@@ -350,7 +350,7 @@ void DebuggerProxy::pollSignal() {
// Send CmdSignal over to the client and wait for a response.
CmdSignal cmd;
if (!cmd.onServer(this)) {
if (!cmd.onServer(*this)) {
TRACE_RB(2, "DebuggerProxy::pollSignal: "
"Failed to send CmdSignal to client\n");
break;
@@ -541,7 +541,7 @@ bool DebuggerProxy::checkFlowBreak(CmdInterrupt &cmd) {
cmd.getInterruptType() == HardBreakPoint ||
cmd.getInterruptType() == ExceptionThrown) && m_flow) {
if (!m_flow->is(DebuggerCommand::KindOfContinue)) {
m_flow->onBeginInterrupt(this, cmd);
m_flow->onBeginInterrupt(*this, cmd);
if (m_flow->complete()) {
fcShouldBreak = true;
m_flow.reset();
@@ -561,7 +561,7 @@ bool DebuggerProxy::checkFlowBreak(CmdInterrupt &cmd) {
if ((cmd.getInterruptType() == BreakPointReached ||
cmd.getInterruptType() == HardBreakPoint) && m_flow) {
if (m_flow->is(DebuggerCommand::KindOfContinue)) {
m_flow->onBeginInterrupt(this, cmd);
m_flow->onBeginInterrupt(*this, cmd);
if (m_flow->complete()) m_flow.reset();
return false;
}
@@ -581,7 +581,7 @@ void DebuggerProxy::checkStop() {
void DebuggerProxy::processInterrupt(CmdInterrupt &cmd) {
TRACE_RB(2, "DebuggerProxy::processInterrupt\n");
// Do the server-side work for this interrupt, which just notifies the client.
if (!cmd.onServer(this)) {
if (!cmd.onServer(*this)) {
TRACE_RB(1, "Failed to send CmdInterrupt to client\n");
Debugger::RemoveProxy(shared_from_this()); // on socket error
return;
@@ -602,7 +602,7 @@ void DebuggerProxy::processInterrupt(CmdInterrupt &cmd) {
// Any control flow command gets installed here and we continue execution.
m_flow = dynamic_pointer_cast<CmdFlowControl>(res);
if (m_flow) {
m_flow->onSetup(this, cmd);
m_flow->onSetup(*this, cmd);
if (!m_flow->complete()) {
TRACE_RB(2, "Incomplete flow command %d remaining on proxy for "
"further processing\n", m_flow->getType());
@@ -628,7 +628,7 @@ void DebuggerProxy::processInterrupt(CmdInterrupt &cmd) {
try {
// Perform the server-side work for this command.
if (res) {
if (!res->onServer(this)) {
if (!res->onServer(*this)) {
TRACE_RB(1, "Failed to execute cmd %d from client\n", res->getType());
cmdFailure = true;
}
+11 -11
Ver Arquivo
@@ -190,40 +190,40 @@ void c_DebuggerClientCmdUser::t_quit() {
m_client->quit();
}
static String format_string(DebuggerClient *client,
static String format_string(DebuggerClient &client,
int _argc, CStrRef format, CArrRef _argv) {
Variant ret = f_sprintf(_argc, format, _argv);
if (ret.isString()) {
return ret;
}
client->error("Debugger extension failed to format string: %s",
client.error("Debugger extension failed to format string: %s",
format.data());
return "";
}
void c_DebuggerClientCmdUser::t_print(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
m_client->print(format_string(m_client, _argc, format, _argv));
m_client->print(format_string(*m_client, _argc, format, _argv));
}
void c_DebuggerClientCmdUser::t_help(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
m_client->help(format_string(m_client, _argc, format, _argv));
m_client->help(format_string(*m_client, _argc, format, _argv));
}
void c_DebuggerClientCmdUser::t_info(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
m_client->info(format_string(m_client, _argc, format, _argv));
m_client->info(format_string(*m_client, _argc, format, _argv));
}
void c_DebuggerClientCmdUser::t_output(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
m_client->output(format_string(m_client, _argc, format, _argv));
m_client->output(format_string(*m_client, _argc, format, _argv));
}
void c_DebuggerClientCmdUser::t_error(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
m_client->error(format_string(m_client, _argc, format, _argv));
m_client->error(format_string(*m_client, _argc, format, _argv));
}
void c_DebuggerClientCmdUser::t_code(CStrRef source, int highlight_line /* = 0 */,
@@ -234,7 +234,7 @@ void c_DebuggerClientCmdUser::t_code(CStrRef source, int highlight_line /* = 0 *
Variant c_DebuggerClientCmdUser::t_ask(int _argc, CStrRef format,
CArrRef _argv /* = null_array */) {
String ret = format_string(m_client, _argc, format, _argv);
String ret = format_string(*m_client, _argc, format, _argv);
return String::FromChar(m_client->ask("%s", ret.data()));
}
@@ -550,11 +550,11 @@ Variant c_DebuggerClient::t_processcmd(CVarRef cmdName, CVarRef args) {
raise_warning("not getting a command");
} else if (cmd->is(DebuggerCommand::KindOfInterrupt)) {
CmdInterruptPtr cmdInterrupt = dynamic_pointer_cast<CmdInterrupt>(cmd);
cmdInterrupt->onClient(m_client);
cmdInterrupt->onClient(*m_client);
} else {
// Previous pending commands
cmd->handleReply(m_client);
cmd->setClientOutput(m_client);
cmd->handleReply(*m_client);
cmd->setClientOutput(*m_client);
}
Logger::Info("debugger client ready for command");
} catch (DebuggerClientExitException &e) {