import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
-import java.io.RandomAccessFile;
-
/**
* The interface object are created by the proxy
*
}
/**
- * This method updates the 'static' variables list.
- * It does a replication between the 'static' list (the variable list which
- * is a member of this DBG interface object) and the DBG variable list
- * (the list of variables which is received from PHP via DBG with the current suspend)
- * Replication is done in the following way:
- * <ul>
- * <li> It looks for new variables within the DBG variables list and
- * adds them to the 'static' list.
- * <li> It looks for changed variables copies the current value to the variable within
- * the 'static list' and mark these variables as 'hasChanged' (which uses the UI
- * for showing the variable with a different color).
- * <li> It looks for variables within the 'static' list, and removes them
- * from the 'static' list in case the do not appear within the DBG list.
- * </ul>
- *
- * @param varListOld The 'static' list of variables which are to be updated.
- * @param varListNew The new list of (current) variables from DBG.
- */
- private void updateVariableList (Vector varListOld, Vector varListNew)
- {
- PHPVariable varOld; // The variable from the 'static' list
- PHPVariable varNew; // The variable from the DBG list
- PHPValue valOld; // The value of the current variable from 'static' list
- PHPValue valNew; // The value of the current variable from DBG list
- int n; // Index for the DBG list
- int o; // Index for the static list
-
- // Add the variables (and childs) to the static list if they are new
- // and update the values of variables which are already existend within
- // the 'static' list.
-
- for (n = 0; n < varListNew.size (); n++) { // For every variable in 'DBG list'
- varNew = (PHPVariable) varListNew.get (n); // Get the DBG variable
-
- for (o = 0; o < varListOld.size (); o++) { // For every variable in static list
- varOld = (PHPVariable) varListOld.get (o); // Get the static variable
-
- if (varNew.getName ().equals (varOld.getName ())) { // Did we found the variable within the 'static' list?
- valOld = (PHPValue) varOld.getValue (); // Get the value from 'static'
- valNew = (PHPValue) varNew.getValue (); // Get the value from DBG
-
- try {
- if (valOld.hasVariables () || // If the 'static' value has child variables
- valNew.hasVariables ()) { // or if the DBG value has child variables
- updateVariableList (valOld.getChildVariables (), // Update the variable list for the child variables
- valNew.getChildVariables ());
- }
- else if (!valOld.getValueString ().equals (valNew.getValueString ())) { // Has the value changed?
- valOld.setValueString (valNew.getValueString ()); // Yes, set the 'static' value (variable) to the new value
- varOld.setValueChanged (true); // and set the 'has changed' flag, so that the variable view
- // could show the user the changed status with a different
- // color
- }
- else {
- varOld.setValueChanged (false); // Reset the 'has changed' flag
- }
- }
- catch (DebugException e) { // That's, because of the hasVariables method
- }
-
- break; // Found the variable,
- }
- }
-
- if (o == varListOld.size ()) { // Did we found the variable within the static list?
- varListOld.add (varNew); // No, then add the DBG variable to the static list
- }
- }
-
- // Look for the variables we can remove from the 'static' list
-
- for (o = 0; o < varListOld.size (); o++) { // For every variable in 'static' list
- varOld = (PHPVariable) varListOld.get (o); // Get the static variable
-
- for (n = 0; n < varListNew.size (); n++) { // For all variables in 'DBG' list
- varNew = (PHPVariable) varListNew.get (n); // Get the variable from the 'DBG' list
-
- if (varNew.getName ().equals (varOld.getName ())) { // Did we found the 'static' list variable within the 'DBG' list?
- break; // Yes we found the variable, then leave the loop
- }
- }
-
- if (n == varListNew.size ()) { // Did not find the 'static' list variable within the 'DBG' list?
- varListOld.remove (o); // then remove the 'static' list variable from list
- o -= 1; // Adjust the 'static' list index
- }
- }
- }
-
- /**
* This method is called by the proxy.
* It sends a request to DBG to get the current variables
* with their values. It waits for the response and processes
flushAllPackets (); // Read and process the response from DBG
evalStr = new PHPDBGEvalString (stack, serGlobals); // Process serialized variables
- updateVariableList (DBGVarList, evalStr.getVariables ()); // Replicate the 'static' variable list and the via DBG received variable list
+ DBGVarList = evalStr.getVariables ();
+
+ if (DBGVarList.size () > 0) { // Did we get back variables?
+ PHPVariable var = (PHPVariable) DBGVarList.get (0); // Yes, then get the first PHPVariable
+
+ if (var.getName ().equals ("")) { // 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
+ // require a understanding and reworking of the PHPDBGEvalstring class.
+ }
- return DBGVarList; // Convert the list to an array and return the array
+ return DBGVarList; // Return the variables as list
}
/**
stackFrameNew = (PHPStackFrame) stackList.get(i);
for (n = 0; n < stackListOld.size (); n++) { // For all StackFrames in the StackFrame list
- stackFrameOld = (PHPStackFrame) stackListOld.get (n); // ---
+ stackFrameOld = (PHPStackFrame) stackListOld.get (n); //
- if (stackFrameNew.getModNo () == stackFrameOld.getModNo ()) { // Did we find the sent stackframe within the list of old stackframes?
+ if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ())) { // Did we find the sent stackframe within the list of old stackframes?
stackFrameOld.setLineNumber (stackFrameNew.getLineNumber ());
stackFrameOld.setIndex (stackFrameNew.getIndex ());
// 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); // ---
+ stackFrameOld = (PHPStackFrame) stackListOld.get (n); //
for (i = 0; i < stackList.size (); i++) { // For all stackList entries
stackFrameNew = (PHPStackFrame) stackList.get (i);
- if (stackFrameNew.getModNo () == stackFrameOld.getModNo ()) { // Did we find the sent stackframe within the list of old stackframes?
+ if (stackFrameNew.getDescription ().equals (stackFrameOld.getDescription ())) { // Did we find the sent stackframe within the list of old stackframes?
break; // Yes, then break;
}
}