import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Vector;
+import net.sourceforge.phpdt.internal.debug.core.PHPDBGProxy.PHPLoop;
import net.sourceforge.phpdt.internal.debug.core.model.PHPDBGEvalString;
import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame;
import net.sourceforge.phpdt.internal.debug.core.model.PHPValue;
private OutputStream os; // The stream which goes to DBG
private boolean shouldStop = false;
private String evalRet = new String("");
- //private String serGlobals = new String("");
private int rawCounter = 1000; // An rawData frame ID counter
private PHPDBGProxy proxy = null;
private int lastCmd = -1;
if (proxy.getSocket ().isClosed ()) { // Can we communiate with DBG?
return; // No
}
-
DBGPacket.sendPacket (os); // Send the request to DBG
lastCommand = PHPDBGBase.DBGA_CONTINUE; // Store the info about the command we sent
* @return The array of variables
*/
public synchronized Vector getVariables(PHPStackFrame stack) throws IOException, DebugException {
- PHPDBGPacket DBGPacket;
- PHPDBGFrame DBGFrame1;
- PHPDBGEvalString evalStr;
-
- Vector globalList = new Vector();
- // IStackFrame[] stacks = stack.getThread().getStackFrames();
- // ( PHPStackFrame.getThread().getStackFrames() returns DBGStackList )
- if (DBGStackList.length > 1) {
- // get global variables (and assign them to 'main()' stackframe)
- globalList = getVariables(DBGStackList[DBGStackList.length - 1], PHPDBGBase.GLOBAL_SCOPE_ID);
- if (!globalList.isEmpty()) {
- // remove unexpected '$this=?' variable
- PHPVariable var = (PHPVariable) globalList.get(0);
- PHPValue val = (PHPValue) var.getValue();
- Vector workList = val.getChildVariables();
- for (int i = 0; i < workList.size(); i++) {
- if (((PHPVariable) workList.get(i)).getName().equals("$this")) {
- workList.remove(i);
- break;
- }
- }
- var.setName(GlobalVariablesTitle);
- var.setModifiable(false);
- }
+ if (DBGStackList.length == 0) {
+ DBGVarList.clear();
+ return DBGVarList;
}
-// DBGPacket = new PHPDBGPacket (PHPDBGBase.DBGA_REQUEST); //
-// DBGFrame1 = new PHPDBGFrame (PHPDBGBase.FRAME_EVAL); //
-//
-// DBGFrame1.addInt (0); // istr = raw data ID
-// DBGFrame1.addInt (1); // scope_id = -1 means current location, 0 never used, +1 first depth
-//
-// DBGPacket.addFrame (DBGFrame1); // Add command data
-//
-// if (proxy.getSocket ().isClosed ()) { // Do we have a socket for DBG communication?
-// return new Vector (); // No, then leave here with an empty vector
-// }
-//
-// serGlobals = "";
-// DBGPacket.sendPacket (os); // Send the request to DBG
-//
-// waitResponse (1000); // Wait for the DBG response (1 second)
-// flushAllPackets (); // Read and process the response from DBG
-//
-// evalStr = new PHPDBGEvalString (stack, serGlobals); // Process serialized variables
-// DBGVarList = evalStr.getVariables ();
+ // get global variables (and assign them to 'main()' stackframe)
+ int global_scope_id = (DBGStackList.length > 1) ? 2 : PHPDBGBase.GLOBAL_SCOPE_ID;
+ // DBG 2.13.1 doesn't return Super Globals with GLOBAL_SCOPE_ID in nested stackframes,
+ // so using 2(most out-standing stack context) instead of GLOBAL_SCOPE_ID.
+ // Also note that 2.13.1 doesn't return $this in class context.
+ // (You can inspect $this in Expressions View. And once it is shown, 2.13.1 comes to return $this.)
+ Vector globalList = getVariables(DBGStackList[DBGStackList.length - 1], global_scope_id);
+ if (!globalList.isEmpty()) {
+ // remove unresolved '$this=?' variable
+ removeUnresolvedThisVar(globalList);
- int scopeID = stack.getScopeID();
- if (scopeID == PHPDBGBase.CURLOC_SCOPE_ID) {
- // current stackframe
- DBGVarList = getVariables(stack, PHPDBGBase.CURLOC_SCOPE_ID);
- } else if ((scopeID == PHPDBGBase.CURLOC_SCOPE_ID + 1) && !globalList.isEmpty()) {
+ PHPVariable var = (PHPVariable) globalList.get(0);
+ var.setName(GlobalVariablesTitle);
+ var.setModifiable(false);
+ }
+
+ int scopeID = stack.getScopeID();
+ if (!globalList.isEmpty()
+ && ((DBGStackList.length == 1)
+ || (scopeID == PHPDBGBase.CURLOC_SCOPE_ID + 1))) {
// 'main()' stackframe
PHPVariable var = (PHPVariable) globalList.get(0);
PHPValue val = (PHPValue) var.getValue();
DBGVarList = val.getChildVariables();
return DBGVarList;
+
+ } else if (scopeID == PHPDBGBase.CURLOC_SCOPE_ID) {
+ // current stackframe
+ DBGVarList = getVariables(stack, PHPDBGBase.CURLOC_SCOPE_ID);
+
} else {
// back-trace stackframe
- // Never: DBGVarList = getVariables(stack, scopeID);
- // DBG 2.15.5 causes Application Error (on win32) in some cases
+ //DBGVarList = getVariables(stack, scopeID);
+ //removeUnresolvedThisVar(DBGVarList);
+ // DBG 2.15.5 causes Application Error (on win32) in *some* cases.
DBGVarList.clear();
}
// The eclipse variable view cannot handle Variables which have an empty name
// when it comes to variable tree restore operation. Without a name, no restore!
//var.setName (" "); // Give a name to the variable root node. Even if it is only a space :-)
- } // TODO the best would be to remove the empty root node, but this would
+ } // TO DO the best would be to remove the empty root node, but this would
// require a understanding and reworking of the PHPDBGEvalstring class.
}
/**
*
- * @throws IOException
*/
private Vector getVariables(PHPStackFrame stack, int scope_id) throws IOException {
PHPDBGPacket DBGPacket = new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST);
return new Vector();
}
DBGPacket.sendPacket(os);
+
waitResponse(1000);
flushAllPackets();
}
/**
+ * Remove unresolved $this variable
+ *
+ * DBG returns $this=? in function's or intermediate stackframes.
+ * (In current method's stackframe, DBG returns $this=classname)
+ *
+ * @param varList
+ */
+ private void removeUnresolvedThisVar(Vector varList) {
+ if (varList.size() > 0) {
+ PHPVariable var = (PHPVariable) varList.get(0);
+ PHPValue val = (PHPValue) var.getValue();
+ Vector workList = val.getChildVariables();
+ for (int i = 0; i < workList.size(); i++) {
+ PHPVariable workvar = (PHPVariable) workList.get(i);
+ if (workvar.getName().equals("$this")) {
+ String workval = ((PHPValue) workvar.getValue()).getValueString();
+ if (workval.equals("?") || workval.equals("NULL")) {
+ workList.remove(i);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ /**
*
* @param logString
*/
rawCounter++;
DBGFrame1.addInt(rawCounter); // istr = raw data ID
//DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth
- DBGFrame1.addInt(stack.getScopeID());
+ int scope_id = stack.getScopeID();
+ /* test code : unnecessary
+ if (DBGStackList.length == 1 || scope_id == (PHPDBGBase.CURLOC_SCOPE_ID + 1)) {
+ scope_id = PHPDBGBase.GLOBAL_SCOPE_ID;
+ }
+ */
+ DBGFrame1.addInt(scope_id);
DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID
DBGFrame2.addInt(evalString.length() + 1); // length of rawdata (+ null char)
waitResponse(1000);
flushAllPackets();
- PHPDBGEvalString evalStr=new PHPDBGEvalString(stack,evalRet);
+ PHPDBGEvalString evalStr=new PHPDBGEvalString(stack, evalRet);
return evalStr.getVars();
}
// And now for removing unused stackframes from list
- for (n = 0; n < stackListOld.size (); n++) { // For all StackFrames in the StackFrame list
- stackFrameOld = (PHPStackFrame) stackListOld.get (n); //
-
- i = 0;
- if (!stackFrameOld.isAvailable ()) {
- i = stackList.size ();
- }
+ for (n = 0; n < stackListOld.size(); n++) {
+ stackFrameOld = (PHPStackFrame) stackListOld.get(n);
- if (i == stackList.size ()) { // Did not find the old stackframe within the list of new ones
- stackListOld.remove (n); // then remove the old stackframe from list
- n -= 1; // Adjust the stack list index
+ if (!stackFrameOld.isAvailable()) {
+ stackListOld.remove(n--);
}
}
break;
case PHPDBGBase.FRAME_EVAL:
- String evalString;
+ //String evalString;
- evalString = new String ("");
+ //evalString = new String ("");
dbg_eval_tmp[0] = PHPDBGBase.Char4ToInt (entirePack, nextFrame + 0); // istr
dbg_eval_tmp[1] = PHPDBGBase.Char4ToInt (entirePack, nextFrame + 4); // iresult
dbg_eval_tmp[2] = PHPDBGBase.Char4ToInt (entirePack, nextFrame + 8); // ierror
evalRet = getRawFrameData (entirePack, dbg_eval_tmp[1]); //
- evalString = getRawFrameData (entirePack, dbg_eval_tmp[0]); //
- //serGlobals = evalRet; //
+ //evalString = getRawFrameData (entirePack, dbg_eval_tmp[0]); //
break;
case PHPDBGBase.FRAME_BPS: //
break;
case PHPDBGBase.DBGC_END:
- sessionEnded = true;
- this.proxy.setTerminated();
+ sessionEnded = true;
+ this.proxy.setTerminated();
break;
case PHPDBGBase.DBGC_BREAKPOINT: