From c6cd20f2065f12cdd9c482b08531a6de1b5184b3 Mon Sep 17 00:00:00 2001 From: cperkonig Date: Wed, 11 Feb 2004 13:51:05 +0000 Subject: [PATCH] This commit was generated by cvs2svn to compensate for changes in r488, which included commits to RCS files with non-trunk default branches. --- net.sourceforge.phpeclipse.debug.core/.#.classpath | 39 + .../.#.classpath.1.3 | 7 + .../phpdt/debug/core/PHPDebugModel.class | Bin 0 -> 2766 bytes .../internal/debug/core/.#PHPDBGInterface.java.1.3 | 800 ++++++++++++++++++++ .../internal/debug/core/.#PHPDBGProxy.java.1.3 | 433 +++++++++++ .../phpdt/internal/debug/core/Environment.class | Bin 0 -> 634 bytes .../phpdt/internal/debug/core/PHPDBGBase.class | Bin 0 -> 3943 bytes .../phpdt/internal/debug/core/PHPDBGFrame.class | Bin 0 -> 2174 bytes .../internal/debug/core/PHPDBGInterface.class | Bin 0 -> 18687 bytes .../phpdt/internal/debug/core/PHPDBGMod.class | Bin 0 -> 917 bytes .../phpdt/internal/debug/core/PHPDBGPacket.class | Bin 0 -> 1784 bytes .../internal/debug/core/PHPDBGProxy$PHPLoop.class | Bin 0 -> 5658 bytes .../phpdt/internal/debug/core/PHPDBGProxy.class | Bin 0 -> 10620 bytes .../internal/debug/core/PHPDebugCorePlugin.class | Bin 0 -> 2118 bytes .../phpdt/internal/debug/core/SocketUtil.class | Bin 0 -> 1570 bytes .../debug/core/breakpoints/PHPBreakpoint.class | Bin 0 -> 3531 bytes .../core/breakpoints/PHPLineBreakpoint$1.class | Bin 0 -> 2224 bytes .../debug/core/breakpoints/PHPLineBreakpoint.class | Bin 0 -> 3264 bytes .../debug/core/model/IPHPDebugTarget.class | Bin 0 -> 515 bytes .../internal/debug/core/model/PHPDebugTarget.class | Bin 0 -> 7306 bytes .../internal/debug/core/model/PHPExpression.class | Bin 0 -> 1613 bytes .../internal/debug/core/model/PHPStackFrame.class | Bin 0 -> 6558 bytes .../internal/debug/core/model/PHPThread.class | Bin 0 -> 5229 bytes .../phpdt/internal/debug/core/model/PHPValue.class | Bin 0 -> 2786 bytes .../internal/debug/core/model/PHPVariable.class | Bin 0 -> 6613 bytes ...ceforge_phpdt_internal_debug_core_Environment.c | 76 ++ ...ceforge_phpdt_internal_debug_core_Environment.h | 29 + net.sourceforge.phpeclipse.debug.core/core.jar | Bin 0 -> 45511 bytes .../internal/debug/core/.#PHPDBGInterface.java.1.3 | 800 ++++++++++++++++++++ .../internal/debug/core/.#PHPDBGProxy.java.1.3 | 433 +++++++++++ .../temp.folder/core.jar.bin.log | 12 + 31 files changed, 2629 insertions(+), 0 deletions(-) create mode 100644 net.sourceforge.phpeclipse.debug.core/.#.classpath create mode 100644 net.sourceforge.phpeclipse.debug.core/.#.classpath.1.3 create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/debug/core/PHPDebugModel.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/Environment.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGBase.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGFrame.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGInterface.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGMod.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGPacket.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy$PHPLoop.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDebugCorePlugin.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/SocketUtil.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPBreakpoint.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPLineBreakpoint$1.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPLineBreakpoint.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/IPHPDebugTarget.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPDebugTarget.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPExpression.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPStackFrame.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPThread.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPValue.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPVariable.class create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.c create mode 100644 net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.h create mode 100644 net.sourceforge.phpeclipse.debug.core/core.jar create mode 100644 net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 create mode 100644 net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 create mode 100644 net.sourceforge.phpeclipse.debug.core/temp.folder/core.jar.bin.log diff --git a/net.sourceforge.phpeclipse.debug.core/.#.classpath b/net.sourceforge.phpeclipse.debug.core/.#.classpath new file mode 100644 index 0000000..7068fd9 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/.#.classpath @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/net.sourceforge.phpeclipse.debug.core/.#.classpath.1.3 b/net.sourceforge.phpeclipse.debug.core/.#.classpath.1.3 new file mode 100644 index 0000000..c5cfc92 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/.#.classpath.1.3 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/debug/core/PHPDebugModel.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/debug/core/PHPDebugModel.class new file mode 100644 index 0000000000000000000000000000000000000000..4dd2c39b94e335c7b8b6db5985b48cb99cc68167 GIT binary patch literal 2766 zcmbtW-*XdH6#j0z$+l@|OQA?9(12Ky7Fd2LYRfMvg+@{cZ7EVz+$1;2w&^BpHVn?F zw0EUW_=Uw0^u``>-gsc+T)3N0b_#xQG^hVz(9vUPs(xSwc2t?MQuRS#UqEi((o_e*!#szj1q@OO;3XYr1N!NGsj`Rd}#uKSVzO%mPxCJ_&*&N<+ zed)P&X)^*Q$VPx~qBjV4({=9EWFuS@edvi`J9aQ|)|0j`Rn-@1Emg_{7dRVFk!MS0 zOHQRK1ByKvbf9V_XV%Q|BtHv5<~83bS<`l9T=5#2e2|qD-zmFfX}A@t#>$tarIM|C zn%FI{U9+IErtE5wcqaC+Pw`}8UiE2j1cTToaOLHh$<*trDw%97)x?m3-4#I$2Lw9S zi)7X>#{g?B)g>b!k^-ICqV3K4wnrjOWly>}LKhu>qRhf|l!8-b59z-^0NZE7Gc{k5 ztezLxWQ!DjqdAigxRj2Hl7%R`RV&+YTwoiOHEnxKRPLu0iu$B_6T>NigUtCPIWuGH=&POmdi#{O@(+QM`?JA~=nAnJL#d5}mePyP#@3x;0X=#hrlTIHLg1 z3M95jpmmvv^8(!);*+EE@z!0HxU*GR%W8I5P1wxkJzVU<1xyGW-XfP^Rih3QlaxTc z7p+9}m9LA%$xj=3X#IOr$yYJ?t;Kjvm7@D)u)RI(x5hEu(m0aD3%~2 zSVT!6l#_Y2+0XsI#5lI9_I=qDghJC#bS_QLqqwKe+C^|KL}vAge%aB-?0UWW1V5&Z z0UY39GoU_UT0EpdMe*(wuY%Xm$P;w_M57H6{;D|$#JMDaE?UvRiPvqs>r|t14d9S| z0~o8=`Izs5^$H$1q1P&;PV{3J-@QiL;JX1G{9APBYiuC=2fCkO@OE$H3HFbLpCL9f zxOZQ_VGM+y;9w)KK3&8O7BGWe%wY&Ob&RP12e0E0BY?Z>4GilXVmM4o+|kA<-WiFrNST z&u{II7$P9>v?e;sBy%K5lI}cqqk#P=GI@u|E^)4xIOvv#$Z9fjj2$Rtl2^g}dR9@qI`TU@ zMpm%=STuSb^yV`{ea=u{uz)Y?+A(OkD06uyDs}OVYCymw;M1& literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 new file mode 100644 index 0000000..266460b --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 @@ -0,0 +1,800 @@ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html + +Contributors: + Vicente Fernando - www.alfersoft.com.ar - Initial implementation + Christian Perkonig - remote debug +**********************************************************************/ +package net.sourceforge.phpdt.internal.debug.core; + +import java.io.IOException; +import java.io.BufferedReader; +import java.io.OutputStream; +import java.util.Vector; +import java.lang.System; +import org.eclipse.debug.core.DebugException; +import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame; +import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable; +import net.sourceforge.phpdt.internal.debug.core.model.PHPValue; +import net.sourceforge.phpdt.internal.debug.core.PHPDBGMod; + +public class PHPDBGInterface { + + // Public + public boolean sessionEnded= false; + public int sessType= -1; + public int BPUnderHit= 0; + public String sessID= new String(); + + // Private + private int[] LastBPRead= new int[10]; + private Vector DBGBPList= new Vector(); + private PHPStackFrame[] DBGStackList; + private PHPVariable[] DBGVariableList; + private Vector DBGMods= new Vector(); + private Vector DBGVars= new Vector(); + private BufferedReader in; + private OutputStream os; + private boolean shouldStop= false, isRef= false, hasChildren= false, isObject= false; + private String evalRet= new String(""); + private String serGlobals= new String(""); + private String typeRead= new String(""); + private String className= new String(""); + private int finalPos=0, refCounter=0, rawCounter=1000; + private PHPDBGProxy proxy= null; + private int lastCmd=-1; + private int sid=0; + + public PHPDBGInterface(BufferedReader in, OutputStream os, PHPDBGProxy proxy) { + DBGBPList.clear(); + this.in= in; + this.os= os; + this.proxy= proxy; + } + + public int addBreakpoint(String mod_name, int line) throws IOException { + return setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_ENABLED + PHPDBGBase.BPS_UNRESOLVED, 0, 0, 0, 0, 0); + } + + public void removeBreakpoint(String mod_name, int line, int bpNo) throws IOException { + setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_DISABLED, 0, 0, 0, bpNo, 0); + } + + public void requestDBGVersion() throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_VER); + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void getSourceTree() throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_SRC_TREE); + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + + // Wait response (1 second) and read response + waitResponse(1000); + flushAllPackets(); + } + + public void addDBGModName(String modName) throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + rawCounter++; + DBGFrame.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame.addInt(modName.length() + 1); // length of rawdata (+ null char) + DBGFrame.addString(modName); // file name + DBGFrame.addChar('\0'); // null char + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + // Returns DBG Breakpoint ID + private int setBreakpoint(String mod_name, String condition, int line, int state, int istemp, int hitcount, int skiphits, int bpno, int isunderhit) throws IOException { + int modNo= 0; + + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_BPS); + PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + modNo= getModByName(mod_name); + + if(modNo >= 0) { + DBGFrame1.addInt(modNo); // mod number + } else { + DBGFrame1.addInt(0); // mod number (0 use file name) + } + + DBGFrame1.addInt(line); // line number + + if(modNo >= 0) { + DBGFrame1.addInt(0); // use mod number + } else { + rawCounter++; + DBGFrame1.addInt(rawCounter); // ID of FRAME_RAWDATA to send file name + } + + DBGFrame1.addInt(state); // state BPS_* + DBGFrame1.addInt(istemp); // istemp + DBGFrame1.addInt(hitcount); // hit count + DBGFrame1.addInt(skiphits); // skip hits + DBGFrame1.addInt(0); // ID of condition + DBGFrame1.addInt(bpno); // breakpoint number + DBGFrame1.addInt(isunderhit); // is under hit + + if(modNo < 0) { + DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame2.addInt(mod_name.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(mod_name); // file name + DBGFrame2.addChar('\0'); // null char + // First add file name data + DBGPacket.addFrame(DBGFrame2); + } + + // Second add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return 0; + DBGPacket.sendPacket(os); + + clearLastBP(); + + // Wait response (1 second) and read response + waitResponse(1000); + flushAllPackets(); + + return LastBPRead[8]; + } + + private void clearLastBP() { + int i; + + for(i=0; i < LastBPRead.length; i++) + LastBPRead[i]= 0; + } + + private void copyToLastBP(int[] BPBody) { + int i; + + for(i=0; i < LastBPRead.length; i++) + LastBPRead[i]= BPBody[i]; + } + + public void continueExecution() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_CONTINUE); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + private int getBPUnderHit() { + int i, BPUnder=0; + int[] dbg_bpl_body= new int[10]; + + // look for bp under hit + for(i=0; i < DBGBPList.size(); i++) { + dbg_bpl_body= (int[]) DBGBPList.get(i); + if(dbg_bpl_body[9] == 1) { + BPUnder= dbg_bpl_body[8]; + } + } + return BPUnder; + } + + public int getLastCmd() + { + return lastCmd; + } + + public int getSID() + { + return sid; + } + + public void setLastCmd(int cmd) + { + lastCmd=cmd; + } + + public void stepInto() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPINTO); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stepOver() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOVER); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stepOut() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOUT); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stopExecution() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STOP); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public PHPVariable[] getVariables(PHPStackFrame stack) throws IOException, DebugException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL); + //PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + DBGFrame1.addInt(0); // istr = raw data ID + DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth + + /* + String evalBlock= new String("$GLOBALS"); + DBGFrame2.addInt(1); // FRAME_RAWDATA ID + DBGFrame2.addInt(evalBlock.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(evalBlock); // eval block + DBGFrame2.addChar('\0'); // null char + */ + + // Add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return null; + DBGPacket.sendPacket(os); + + waitResponse(1000); + flushAllPackets(); + + // Process serialized variables + DBGVariableList= procVars(stack); + + return DBGVariableList; + } + + public void evalBlock(String evalString) throws IOException, DebugException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL); + PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + rawCounter++; + DBGFrame1.addInt(rawCounter); // istr = raw data ID + DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth + + DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame2.addInt(evalString.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(evalString); // eval block + DBGFrame2.addChar('\0'); // null char + + // Add raw data first + DBGPacket.addFrame(DBGFrame2); + // Add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + + waitResponse(1000); + flushAllPackets(); + } + + public void flushAllPackets() throws IOException { + while(readResponse() != 0); + } + + public String getModByNo(int modNo) { + int i; + PHPDBGMod dbg_mod; + + // look for mod + for(i=0; i < DBGMods.size(); i++) { + dbg_mod= (PHPDBGMod) DBGMods.get(i); + if(dbg_mod.getNo() == modNo) { + return dbg_mod.getName(); + } + } + return ""; + } + + private int getModByName(String modName) { + int i; + PHPDBGMod dbg_mod; + + // look for mod + for(i=0; i < DBGMods.size(); i++) { + dbg_mod= (PHPDBGMod) DBGMods.get(i); + if(dbg_mod.getName().equalsIgnoreCase(modName)) { + return dbg_mod.getNo(); + } + } + return -1; + } + + private String getRawFrameData(char[] framesInfo, int frameNo) { + int nextFrame= 0; + int[] dbg_frame= new int[2]; + + while(nextFrame < framesInfo.length) { + dbg_frame[0] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame); // frame name + dbg_frame[1] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4); // frame size + + nextFrame += 8; + if(dbg_frame[1] == 0) return ""; + + switch(dbg_frame[0]) { + case PHPDBGBase.FRAME_RAWDATA: + if(frameNo == PHPDBGBase.Char4ToInt(framesInfo, nextFrame)) { + int toRead= PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4); + return String.copyValueOf(framesInfo, nextFrame + 8, toRead); + } + break; + } + // go to next frame + nextFrame += dbg_frame[1]; + } + return ""; + } + + public PHPVariable[] getInstVars(PHPVariable phpVar) throws DebugException { + Vector vecVars= new Vector(); + PHPVariable localPHPVar; + int i=0; + + // already unserialized + for(i=0; i < DBGVars.size(); i++) { + localPHPVar= (PHPVariable)DBGVars.get(i); + if(localPHPVar.getParent() == phpVar) { + vecVars.add(localPHPVar); + } + } + PHPVariable[] arrVars= new PHPVariable[vecVars.size()]; + arrVars= (PHPVariable[]) vecVars.toArray(arrVars); + + return arrVars; + } + + private PHPVariable[] procVars(PHPStackFrame stack) throws DebugException { + Vector vecVars= new Vector(); + + // unserialize + finalPos= 0; + refCounter= 0; + doUnserialize(stack, vecVars, null); + + DBGVars= vecVars; + + return(getInstVars(null)); + } + + private String readValue(String serialVars) throws DebugException { + int startPos=0, endPos=0, lenStr=0, i=0, elements=0; + String ret= new String(""); + + switch(serialVars.charAt(0)) { + case 'a': // associative array, a:elements:{[index][value]...} + typeRead= "hash"; + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + finalPos += endPos + 2; + ret= new String(serialVars.substring(startPos + 1, endPos)); + + hasChildren= true; + break; + case 'O': // object, O:name_len:"name":elements:{[attribute][value]...} + typeRead= "object"; + + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + // get object class + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + className= new String(serialVars.substring(startPos, endPos).toString()); + + // get num of elements + startPos= endPos + 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + finalPos += endPos + 2; + ret= new String(serialVars.substring(startPos + 1, endPos)); + + isObject= true; + hasChildren= true; + break; + case 's': // string, s:length:"data"; + typeRead= "string"; + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + ret= new String(serialVars.substring(startPos, endPos).toString()); + finalPos += endPos + 2; + break; + case 'i': // integer, i:123; + typeRead= "integer"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + + ret= new String(serialVars.substring(startPos + 1, endPos).toString()); + finalPos += endPos + 1; + break; + case 'd': // double (float), d:1.23; + typeRead= "double"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + + ret= new String(serialVars.substring(startPos + 1, endPos).toString()); + finalPos += endPos + 1; + break; + case 'N': // NULL, N; + typeRead= "null"; + ret= "nil"; + finalPos += 2; + break; + case 'b': // bool, b:0 or 1 + typeRead= "boolean"; + ret= (serialVars.charAt(2) == '1')?"true":"false"; + finalPos += endPos + 4; + break; + case 'z': // resource, z:typename_len:"typename":valres; + typeRead= "resource"; + + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + // get resource type name + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + className= new String(serialVars.substring(startPos, endPos).toString()); + + // get resource value + startPos= endPos + 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + ret= new String(serialVars.substring(startPos + 1, endPos)); + finalPos += endPos + 1; + break; + case 'r': + case 'R': + typeRead= "reference"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return "0"; + + ret= new String(serialVars.substring(startPos + 1, endPos)); + finalPos += endPos + 1; + isRef= true; + break; + case ';': + typeRead= "unknown"; + finalPos+= 1; + break; + case '?': + finalPos+= 1; + default: + finalPos+= 1; + typeRead= "unknown"; + break; + } + return ret; + } + + private void doUnserialize(PHPStackFrame stack, Vector vecVars, PHPVariable parent) throws DebugException { + int i, elements= 0; + PHPVariable newVar= null; + String value= new String(""); + String name= new String(""); + String tmp= new String(""); + String[] tmpSplit; + + if(finalPos > serGlobals.length() || serGlobals.equals("") || serGlobals.substring(finalPos).equals("")) return; + + isRef= false; + hasChildren= false; + isObject= false; + name= readValue(serGlobals.substring(finalPos)); + + if(hasChildren) { + // main array + if(refCounter == 0) { + value= name; + name= ""; + } + } else { + hasChildren= false; + isRef= false; + value= readValue(serGlobals.substring(finalPos)); + // replaceAll doesn't work, why??? + tmpSplit= value.split("\\\\"); + value= ""; + for(i= 0; i < tmpSplit.length; i++) { + value= value + tmpSplit[i]; + if(!tmpSplit[i].equals("")) { + if(i < (tmpSplit.length - 1)) { + value= value + "\\"; + } + } + } + } + + if(!name.equals("")) { + if(isRef) { + PHPVariable varPHP; + for(i=0; i < vecVars.size(); i++) { + varPHP= (PHPVariable) vecVars.get(i); + if(varPHP.getObjectId().equals(value)) { + newVar= new PHPVariable(stack, name, "local", true, (PHPValue)varPHP.getValue()); + break; + } + } + if(newVar == null) { + newVar= new PHPVariable(stack, name, "local", false, null); + } + } else { + refCounter++; + newVar= new PHPVariable(stack, name, "local", value, typeRead, hasChildren, Integer.toString(refCounter), className); + } + newVar.setParent(parent); + vecVars.add(newVar); + } + if(hasChildren) { + elements= Integer.parseInt(value); + for(i=0; i < elements; i++) + doUnserialize(stack, vecVars, newVar); + + // skip "}" + finalPos += 1; + } + } + + public int readResponse() throws IOException { + int bytesToRead=0, nextFrame=0, i=0, cmdReceived=0, stackIndex=0; + char[] dbg_header_struct_read= new char[16]; + int[] dbg_header_struct= new int[4]; + int[] dbg_bpl_tmp= new int[10]; + int[] dbg_frame= new int[2]; + int[] dbg_eval_tmp= new int[3]; + int[] dbg_src_tree_tmp= new int[4]; + Vector rawList= new Vector(); + Vector stackList= new Vector(); + PHPStackFrame[] newStackList; + + rawList.clear(); + stackList.clear(); + // Read from input + while(readInput(dbg_header_struct_read, 16) != 0) { + dbg_header_struct[0] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 0); + dbg_header_struct[1] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 4); + dbg_header_struct[2] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 8); + dbg_header_struct[3] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 12); + + // Check DBG sync bytes + if(dbg_header_struct[0] != 0x5953) return 0; + + cmdReceived= dbg_header_struct[1]; + setLastCmd(cmdReceived); + bytesToRead= dbg_header_struct[3]; + + //System.out.println("Response Received: " + cmdReceived); + char[] entirePack= new char[bytesToRead]; + + if(bytesToRead > 0) { + if(readInput(entirePack, bytesToRead) < bytesToRead) return 0; + } + + // First process frames + nextFrame= 0; + while(nextFrame < bytesToRead) { + dbg_frame[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame); // frame name + dbg_frame[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // frame size + nextFrame += 8; + if(dbg_frame[1] == 0) return 0; + switch(dbg_frame[0]) { + case PHPDBGBase.FRAME_STACK: + int[] dbg_stack_new= new int[4]; + dbg_stack_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // line no + dbg_stack_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // mod no + dbg_stack_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // scope id + dbg_stack_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // id of description string + + stackIndex++; + if(dbg_stack_new[1] != 0) { + PHPStackFrame newStack= new PHPStackFrame(null, getModByNo(dbg_stack_new[1]), dbg_stack_new[0], stackIndex, getRawFrameData(entirePack, dbg_stack_new[3]), dbg_stack_new[1]); + stackList.add(newStack); + } + break; + case PHPDBGBase.FRAME_SOURCE: + break; + case PHPDBGBase.FRAME_SRC_TREE: + dbg_src_tree_tmp[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // parent_mod_no + dbg_src_tree_tmp[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // parent_line_no /* NOT USED */ + dbg_src_tree_tmp[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // mod_no + dbg_src_tree_tmp[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // imod_name + + if(getModByNo(dbg_src_tree_tmp[2]).equals("")) { + String fileName= new String(getRawFrameData(entirePack, dbg_src_tree_tmp[3])); + // Remove '\0' char + if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1); + + if(dbg_src_tree_tmp[2] != 0) { + PHPDBGMod modNew= new PHPDBGMod(dbg_src_tree_tmp[2], fileName); + DBGMods.add(modNew); + } + } + break; + case PHPDBGBase.FRAME_RAWDATA: + break; + case PHPDBGBase.FRAME_ERROR: + break; + case PHPDBGBase.FRAME_EVAL: + 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; + break; + case PHPDBGBase.FRAME_BPS: + break; + case PHPDBGBase.FRAME_BPL: + int[] dbg_bpl_new= new int[10]; + dbg_bpl_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); + dbg_bpl_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); + dbg_bpl_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); + dbg_bpl_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); + dbg_bpl_new[4] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 16); + dbg_bpl_new[5] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 20); + dbg_bpl_new[6] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 24); + dbg_bpl_new[7] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 28); + dbg_bpl_new[8] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 32); + dbg_bpl_new[9] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 36); + + // look if breakpoint already exists in vector + for(i=0; i < DBGBPList.size(); i++) { + dbg_bpl_tmp= (int[]) DBGBPList.get(i); + if(dbg_bpl_tmp[8] == dbg_bpl_new[8]) { + DBGBPList.remove(i); + break; + } + } + + // add breakpoint to vector + DBGBPList.add(dbg_bpl_new); + copyToLastBP(dbg_bpl_new); + + // mod no returned? + if(getModByNo(dbg_bpl_new[0]).equals("")) { + String fileName= new String(getRawFrameData(entirePack, dbg_bpl_new[2])); + // Remove '\0' char + if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1); + if(dbg_bpl_new[0] != 0) { + PHPDBGMod modNew= new PHPDBGMod(dbg_bpl_new[0], fileName); + DBGMods.add(modNew); + } + } + break; + case PHPDBGBase.FRAME_VER: + break; + case PHPDBGBase.FRAME_SID: + sid = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); + break; + case PHPDBGBase.FRAME_SRCLINESINFO: + break; + case PHPDBGBase.FRAME_SRCCTXINFO: + break; + case PHPDBGBase.FRAME_LOG: + break; + case PHPDBGBase.FRAME_PROF: + break; + case PHPDBGBase.FRAME_PROF_C: + break; + case PHPDBGBase.FRAME_SET_OPT: + break; + } + // go to next frame + nextFrame += dbg_frame[1]; + } + + // Now process command + switch(cmdReceived) { + case PHPDBGBase.DBGC_REPLY: + break; + case PHPDBGBase.DBGC_STARTUP: + break; + case PHPDBGBase.DBGC_END: + sessionEnded= true; + break; + case PHPDBGBase.DBGC_BREAKPOINT: + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + BPUnderHit= getBPUnderHit(); + break; + case PHPDBGBase.DBGC_STEPINTO_DONE: + case PHPDBGBase.DBGC_STEPOVER_DONE: + case PHPDBGBase.DBGC_STEPOUT_DONE: + case PHPDBGBase.DBGC_EMBEDDED_BREAK: + BPUnderHit= 1; + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + break; + case PHPDBGBase.DBGC_ERROR: + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + break; + case PHPDBGBase.DBGC_LOG: + break; + case PHPDBGBase.DBGC_SID: + break; + case PHPDBGBase.DBGC_PAUSE: + break; + } + } + + return cmdReceived; + } + + public PHPStackFrame[] getStackList() { + return DBGStackList; + } + + private int readInput(char[] buffer, int bytes) throws IOException { + int bytesRead= 0; + + for(int i=0; i < bytes; i++) { + if(in.ready()) { + buffer[i]= (char) (in.read() & 0x00FF); + bytesRead++; + } + else + break; + } + return bytesRead; + } + + public void setShouldStop() { + this.shouldStop= true; + } + + public boolean waitResponse(long milliseconds) throws IOException { + long timeout= System.currentTimeMillis() + milliseconds; + while(System.currentTimeMillis() < timeout) { + if(in.ready() || shouldStop) { + break; + } + } + return in.ready(); + } +} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 new file mode 100644 index 0000000..dd3b8f6 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 @@ -0,0 +1,433 @@ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html + +Contributors: + IBM Corporation - Initial implementation + Vicente Fernando - www.alfersoft.com.ar + Christian Perkonig - remote debug +**********************************************************************/ +package net.sourceforge.phpdt.internal.debug.core; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.Socket; +import java.net.ServerSocket; +import java.net.SocketTimeoutException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IBreakpoint; +import net.sourceforge.phpdt.internal.debug.core.model.IPHPDebugTarget; +import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame; +import net.sourceforge.phpdt.internal.debug.core.model.PHPThread; +import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable; +import net.sourceforge.phpdt.internal.debug.core.breakpoints.PHPLineBreakpoint; + +public class PHPDBGProxy { + + private ServerSocket server= null; + private Socket socket; + private BufferedReader reader= null; + private PHPDBGInterface DBGInt= null; + private IPHPDebugTarget debugTarget= null; + private PHPLoop phpLoop; + private PHPThread PHPMainThread; + private PHPDBGProxy thisProxy= null; + private int port; + private boolean remote; + private IPath remoteSourcePath; + + public PHPDBGProxy() { + thisProxy= this; + } + + public PHPDBGProxy(boolean remote,String remoteSourcePath) { + thisProxy= this; + this.remote=remote; + this.remoteSourcePath= new Path(remoteSourcePath); + } + + public void start() { + createServerSocket(); + this.startPHPLoop(); + } + + public void stop() { + phpLoop.setShouldStop(); + if(DBGInt != null) DBGInt.setShouldStop(); + phpLoop.notifyWait(); + } + + protected ServerSocket getServerSocket() throws IOException { + if (server == null) { + createServerSocket(); + } + return server; + } + + protected void createServerSocket() { +// port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101); + port = 10001; + if (port == -1) { + PHPDebugCorePlugin.log(5, "Cannot find free port!!!!"); + return; + } + try { + if (server == null) { + server = new ServerSocket(port); + //System.out.println("ServerSocket on port: " + port); + } + } catch (IOException e) { + // IO Error + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public Socket getSocket() throws IOException { + return socket; + } + + protected void setDBGInterface(PHPDBGInterface DBGInt) { + this.DBGInt= DBGInt; + } + + public BufferedReader getReader() throws IOException { + if (reader == null) { + reader = new BufferedReader(new InputStreamReader(this.getSocket().getInputStream(), "ISO8859_1")); + } + return reader; + } + + public BufferedReader getReader(Socket socket) throws IOException { + if (socket != null) + return new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO8859_1")); + else + return null; + } + + public OutputStream getOutputStream() throws IOException { + return this.getSocket().getOutputStream(); + } + + protected void setBreakPoints() throws IOException, CoreException { + IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(); + for (int i = 0; i < breakpoints.length; i++) { + addBreakpoint(breakpoints[i]); + } + } + + public void addBreakpoint(IBreakpoint breakpoint) { + if (DBGInt == null) return; + int bpNo= 0; + try { + PHPLineBreakpoint phpLBP; + if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) { + IPath filename; + phpLBP= (PHPLineBreakpoint)breakpoint; + // bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber()); + if (remote) + filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath()); + else + filename=phpLBP.getMarker().getResource().getLocation(); + bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber()); + phpLBP.setDBGBpNo(bpNo); + } + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } catch (CoreException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public void removeBreakpoint(IBreakpoint breakpoint) { + if (DBGInt == null) return; + try { + PHPLineBreakpoint phpLBP; + if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) { + phpLBP= (PHPLineBreakpoint)breakpoint; + IPath filename; + if (remote) + filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath()); + else + filename=phpLBP.getMarker().getResource().getLocation(); +// bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber()); + DBGInt.removeBreakpoint(filename.toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo()); + } + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } catch (CoreException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public void startPHPLoop() { + phpLoop = new PHPLoop(); + phpLoop.start(); + } + + public void resume(PHPThread thread) { + try { + DBGInt.continueExecution(); + phpLoop.notifyWait(); + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + protected IPHPDebugTarget getDebugTarget() { + return debugTarget; + } + + public void setDebugTarget(IPHPDebugTarget debugTarget) { + this.debugTarget = debugTarget; + debugTarget.setPHPDBGProxy(this); + } + + public PHPVariable[] readVariables(PHPStackFrame frame) { + try { + return DBGInt.getVariables(frame); + } catch (IOException ioex) { + ioex.printStackTrace(); + throw new RuntimeException(ioex.getMessage()); + } catch (DebugException ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + } + + public PHPVariable[] readInstanceVariables(PHPVariable variable) { + try { + return DBGInt.getInstVars(variable); + } catch (DebugException ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + + } + + public void readStepOverEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepOver(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + + public void readStepReturnEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepOut(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + + public void readStepIntoEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepInto(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + +/* + public PHPStackFrame[] readFrames(PHPThread thread) { + //try { + //this.println("th " + thread.getId() + " ; f "); + //return new FramesReader(getMultiReaderStrategy()).readFrames(thread); + return null; + //} catch (IOException e) { + // PHPDebugCorePlugin.log(e); + // return null; + //} + + } +*/ + + public void closeSocket() throws IOException { + if (socket != null) { + socket.close(); + } + } + + public void closeServerSocket() throws IOException { + if (server != null) { + server.close(); + } + } + + public int getPort() { + return port; + } + + class PHPLoop extends Thread { + private boolean shouldStop; + + public PHPLoop() { + shouldStop = false; + this.setName("PHPDebuggerLoop"); + } + + public synchronized void setShouldStop() { + shouldStop = true; + } + + public synchronized void notifyWait() { + notify(); + } + + public void run() { + try { + char[] buf= new char[16]; + int i, pos, timeout; + long interval= 200; // 200ms + String line; + PHPStackFrame[] StackList; + boolean endFile=false; + boolean newconnect=false; + Socket newSocket=null; + PHPDBGInterface newDBGInt; + int sid=-1; + + PHPMainThread = new PHPThread(getDebugTarget(), getPort()); + PHPMainThread.setName("Thread [main]"); + timeout = 0; + while ((getDebugTarget() == null) && (timeout < 100)) { + sleep(100); + timeout++; + } + // Be sure debug target is set + PHPMainThread.setDebugTarget(getDebugTarget()); + getDebugTarget().addThread(PHPMainThread); + + //System.out.println("Waiting for breakpoints."); + while (!shouldStop) + { + newconnect=true; + try { + newSocket = server.accept(); + //System.out.println("Accepted! : " + socket.toString()); + } catch (SocketTimeoutException e) { + // no one wants to connect + newconnect=false; + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + return; + } + + if (newconnect) + { + if (DBGInt==null) + server.setSoTimeout(1); + newDBGInt= new PHPDBGInterface(getReader(newSocket), newSocket.getOutputStream(), thisProxy); + newDBGInt.waitResponse(1000); + newDBGInt.flushAllPackets(); + // Check version and session ID + if ((DBGInt==null) || (DBGInt.getSID()==newDBGInt.getSID())) + { + DBGInt=newDBGInt; + try { + closeSocket(); + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + shouldStop=true; + } + socket=newSocket; + setBreakPoints(); + DBGInt.continueExecution(); + } else + { + newDBGInt.continueExecution(); + newSocket.close(); + } + } + + if(DBGInt.waitResponse(interval)) + { + + DBGInt.flushAllPackets(); + + if (DBGInt.BPUnderHit != 0) { + StackList = DBGInt.getStackList(); + if (StackList.length > 0) { + for (i = 0; i < StackList.length; i++) { + StackList[i].setThread(PHPMainThread); + if (DBGInt.getModByNo(StackList[i].getModNo()).equals("")) { + DBGInt.getSourceTree(); + } + StackList[i].setFile( + DBGInt.getModByNo(StackList[i].getModNo())); + } + PHPMainThread.setStackFrames(StackList); + } + // Fire debug event + PHPMainThread.suspend(); + + synchronized (this) { + wait(); + } + } + } + if (remote) { + if (PHPMainThread.isTerminated()) + { + shouldStop=true; + break; + } + } else { + if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) + { + shouldStop=true; + break; + } + } +// if (DBGInt.getLastCmd()==PHPDBGBase.DBGC_LOG) +// endFile=true; +// } +// try +// { +// closeSocket(); +// } +// catch (IOException e) { +// PHPDebugCorePlugin.log(e); +// shouldStop=true; +// } +// endFile=false; + } + } + catch (Exception ex) { + PHPDebugCorePlugin.log(ex); + System.out.println(ex); + } + finally { + try { + getDebugTarget().terminate(); + closeSocket(); + closeServerSocket(); + } + catch (IOException e) { + PHPDebugCorePlugin.log(e); + return; + } + //System.out.println("Socket loop finished."); + } + } + } +} diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/Environment.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/Environment.class new file mode 100644 index 0000000000000000000000000000000000000000..42a91e5411bfe828a3f7ecd970653e9093543028 GIT binary patch literal 634 zcmbV}%TB^T6o&udQlL~oF5X?ZF+ieS7^4ZsjnP%33k>^dJC-43N~Qw|kL60^!Uyo7 zjMGXY3MXp-7TlTE37PM{p!pYT=pxM&v%Zti!WKYE*v3w(cd@5og8lUAgD*y*nGpa0 literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGBase.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGBase.class new file mode 100644 index 0000000000000000000000000000000000000000..079b40ee759b825b1ac13ae060b8a50ec1fb3b7d GIT binary patch literal 3943 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 literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGInterface.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGInterface.class new file mode 100644 index 0000000000000000000000000000000000000000..f4adacd682f5a7f37abcbb4f34cf149262474415 GIT binary patch literal 18687 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 IxLyB$0Ma3*k^lez literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGMod.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGMod.class new file mode 100644 index 0000000000000000000000000000000000000000..31b39478743291a02998b2539b2e3a2b90bff6ee GIT binary patch literal 917 zcmbVJO>fgc6r4>Qn*@`zAu*KF(t=c+@Ue%A6Q~EMXd|ViQc)z1PQ19T61#F7eia9h zsE|1D1Nc#h_jauYn)bqF--qUnXU4yN|M-bAo?%m9J5jlurn79MKBifuN>?z{N3kNs2Ym>W3Q8dw@&NUz`(GJvCX>SNV5VB0W1`~8w&(Z2WJ%=}^YHA%V zdfRm7p^iJ6a>JYzltiF)vX%yiNVI~GcZ<(Rsz&EGv_2E4L`236aPLZuE3`Kn|33D< zTsmIA@^}^Zi{l;o6o+AJb8}xNqKBmVk!J7=>cWp*_z_sc`U2OJe=;&$TXgaG8ZJ(R K6L_H2Z~Ot{zm6*a literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGPacket.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGPacket.class new file mode 100644 index 0000000000000000000000000000000000000000..9d28a3616cd10ae87b58a19cba8b10f20eac7b5b GIT binary patch literal 1784 zcmbVMTUQ%Z7~Llc1kx!DP)I>+En3Z`FukNu3#}y~KqQh#Vk$(XLvnzrA(J(kQSsT| z;aWcVtgBF#x?Dc^%hD%&NamdL-S@Y@?~lKJ`V~P;!4#NjNk{Kku3eWq zmc1+W_FlW;=w{22cFSn$4Y}>^>UGPOdTFJ!m{~3v_0Odfh7gFpFupMKrqSBfi`y?` zov%TGq0&NjHCNeM$t^7A*0;*}&76S93tY}xt&U@~oT|}uWe`AAKx=#cR;1C8wm_hk z6^Qt6W%Fw((7R(B`?5p71uvZIm`%OPV3s{c>Acx8ohJf4@me-f6$oXm2CaheL{-B8 z1|tYzNJBp&{RrUdNz&)MgfSXHOetx&tdzzC(icS~V{~K~uL*<+QF&u6tKoGOast-{ z`s-HvAiHPStfG&3*0On(-5a2c)%X)O2;P;X^_`2i-!@+;9auB zBa^`F|15>*bY!dHVr|j6$*!L=q0>d74sg^IEK8Nv? z?(!|CVkvH<6^HYQ8kv(pRyBQ5;Hr`=*tT&{u`&ma^p0e`B6}^PVF}AhbA_5G5zZ$P z#{2a8rENOwA15TEXji}o5v*cOq0w|Zdm2h=OjhwB+eGA4oAQbOHcCSo71gGXNKxvY zjBF_GCH)K^E08xh=Uw=VJBx;6XsG${f5Ks>#A}l;_{=xi;?#CH>lzHD8N)Ucv0NrH z>Syt9c)3ovxguq6Yb}{-76#8Rr)h-+ZjwhKE}0O<(Su%)7rX_~#~;^$cP8DuFDIYh zAaw?Ch5u3BTv`VBol3sKa55VGrRNYM$)6G1c!g_+7*D>$$d9-YKE|8sm8o(*QBdVcrYy7*FW-Jz9i#U+}8^lV^pNRJHJz zK1MDa)mTzWy&NNdgdzj42OocrS(VSk5vspoW-T>!gv~QKZ=ZgPA@%zF?Dd;~m{3MX zsDJnO?`MhMBR0S-3?fb*C%6-D^EQpU+zIozgQq+#<384rMwPM#hgqSQ^pia;PEsOS W%p|hdA@Tv*#l3=6Q+H_*z}`Q9O_loq literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy$PHPLoop.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/PHPDBGProxy$PHPLoop.class new file mode 100644 index 0000000000000000000000000000000000000000..1e377ce2645539845d1409d0cb77534200d372a7 GIT binary patch literal 5658 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 LO1>bB^1u2Qq(475 literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPBreakpoint.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPBreakpoint.class new file mode 100644 index 0000000000000000000000000000000000000000..75326f9e5b388c793e3f381efec8051db5b48fe3 GIT binary patch literal 3531 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 literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPLineBreakpoint.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/breakpoints/PHPLineBreakpoint.class new file mode 100644 index 0000000000000000000000000000000000000000..aed5cb99db8f81db1cc6657906d0585d81007df2 GIT binary patch literal 3264 zcmb_e?N$?46y28uCd5!{6x;aKR1ibZOtl|cBPv9c)bJr77HVoI$puEjBx^Eh>kIT1 z`V#$N|H!hg)d%P+^j*5T@12kg2}PHcEN1SUoO{mR`<#0wfBo~vp9tYH9D)0e^vp)B z>6Yb2&E1q{eXCyaOxy9K>sVE@B1_Fpvs`nfS#qVdU9a)0hPgPqSg;*A-8LBz0=ah% z77P>;ND+!D%T>GHkUcQedettzD zUU+8xXqi>Z*)*3u*LF6u0z*0d#BX&BsDnNB@)Z^o~ku^#lX10uc`M| z{SHL_JaBn<;(=5{do}UWTDwXPD(o1!niTgQdzbfrI)nI|=VXgB$O*%;RGT@-70B5*#Ku6t7Y{sz8hCK7A6 znZU_l3$)%c`SE-VKfpSIrzrV5a-De-WdQZ4M~;%o5AL6Y69nF=b^EOqvC3uHXpHjU z)ZX8Ocq@%KESH}<-j?+2GLP-D{%vv3RJwF>V3OgC+9Y?yks?})720rEB4)cEi z5eS^ZAfmh<0cacIlThzUUO%MebKV8-{pnrAf7dR@c~!F?_=I7SIKfrScfv4E@<|2w zh#ntv9p=+19qJc`j?fZMPn3L}ssP2A zSrJjI^IV1WYJ{t>UX60quU8i^Myks1B2qB;Jzriu=w6UhlwL_i^fl6J>4`)nVQ8cS zySRK~Fr65Di7Oqfah++5*NaHt8gX6Mm^b`5ZOq9w=42alvW+>3J%}&BV6ot>VC_f6KvT^4U7IyZMXrh2NK_NoenxP#_Ntu%AVD!~o_y9hX@wO~P z<3bmco7|r-=bU-}czuI|Q#1${T3L}ME90xj#Dq#LXUo8fNLyvJj76ZPt5EofQDTt< zDi+@GX4uJ^W6A5b2qM(y@=1zV>QD@(bLDf_A+(q$lpjaSRQP`yfYYNfUl8Lt%KgdMmW4&2;LGFrFDD1H$=#K?p=8GgRWB-2c8(hW*Cqzk3Vr0GCQDKuTvv@mTNYEz0(5Npi)3k6mSDU#0|ycPsH^cJ;&vF?|0|kn@NT?aB?ztneTnx z=Uu<|n-~83#8FhC1%Fgnp0*0{e5RP|v3fJPJ}aK>&n63TJ6*7HX)_g1THVFIcuyv0 z#RoD;D;3{(-o|!$x7pU7a0xYb<88}m8 z`t{>uE~t#@FAtQP1A7)0i)Cli)skhlnX<333@nj^2!Yu*w!=ftuU#vqr5k^ zCUgy~iJ~2A6~_14Im;KL%h-$>w^m}~uXH?m9unfwbqXPCyTa__5L2jSp6JHG{@?gs zoanY4DebYse|0~bzvZ-80~>WXKS)JvN+m_D??Vr}tj+&~LPIf|l)kG`nFIB#IsMSK zBf;joyfM-AzBE-6P=MI05(X~D)+lD<68hKXOX(1v>ZZn~ieYklpkB*-iT0a$Pms{u zG@@&+?y<53JCmjvbKW(dN(&<(hX^@znggtj6WCb%^y(_)>~tS>O)7uaR_yJSJ+fb6 zD!cs*Cx_UYW|)N;DJif1Oun#W46b0g2NTvs)cKllLiBs|+p)ql$%m00Lj6}`hnRJZ!k9uvn`_`B z=#!V%vH9eS*({Osew&nbUa833p!KC*Ol zE|MW_HRra{26wZwy!K&KCXdJh`k@jEjqSNa_HgiUAHdR*uZk8UM&^q$&9=1 zyKH-U4F!xIGwn@N2I}=d@L3{p{?s#;ffI0|?BsXSm-#{_Yv6OzVG8&>mr;I`l`l#; zM0xLyVN8IW^VYx@^x9p_lf0hM6sogkG0%%0A*zR%}ah60Zi4^v7|9C8OD$ z1Cmbk>-9OrOS9P(sg%wm(&_8bEiL&e1E0oia`z02$-1&=rr2tSY!9yYnl3i*ES{5* z{(A=Q(3}7BJdtSiZaKMRytEn5i6NN^3_flnUvHNr;H{ZH%`YwoXNlC&iXJv7hwff@+x;iRylWKPKZ(yu?lT8^i(-KxO6W- zHNOL<96|d+%<^xKBWeV0*guPY+8Dbqjr)OcGX6CIPJg&LMwFQ zd{@OiG(yNNj6I4uN5hxX2c1>R_F-(xba^vl1s&f;Kdh!_*3cVk1AbWO`C%ctu$e^aaT+eb7SgTb;qyZJqKfyN zx?Pf6Tt7^8{4j3Zu^o{h(mKko4>)3~tGCW`L>M2!MXrt_HHr)8iuF^q?Sr^<+FnHU z!-0S!-ckp+G(?lZ?5gHxCqK{U30+8c()cb%@eB>=89WysrkNbQIe}|~6)wZ&E`>O+ zk`&dV&{t67yu8o>H1q-&P{Bku!FnhZ<~Np;ki0jK~UKRj8$pgLtHxfiDP{>J2hlWw= zaU^xlhCGjja1%aC8HJCLoW_{%Jk#XIaBI2#zJUI)r=K0om7V9xhGONC+X9j${YthB zS27r#Q_6)i0pV&-?PnMrO?k1aww^J$eHS8C`w$M72PGc>srNv*eT~52_HyB?0>VB6 zZeFf%7u_y#oI(aW2XR-a-NnL(aQo15)){>*B0M;Z#dVxkuV?IT2q=&OUr8{9yFGSG z`6LP&w29SK`+0M+PgAxOFqXB9q%=jH$_*aUJswiKi!^Bn(r~Y7#9N4XYXEVQhd9BoU(`2!V1@i^|}OhJ3ENq26Ydd`NP8ZJcEmv&sXY%;R>`R7 zVg!qAW_hE0DqxsjY>(p!S9m!IO8VBwU^dgw4V}Bs($wbyL~6YJsBz{(A;Mo^Mj*1Y zoXGPd5;=nJj6`H-IguAh^XWtOs$}iGx4iKGNOJ7}{^Qtpre^MWIgQ`ox3nvSZSKfc Zi>>$_2k9zeF2kGny)%3Lff_@2>;I>}a}@vp literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPExpression.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPExpression.class new file mode 100644 index 0000000000000000000000000000000000000000..06f00b6710fa931d49ab80deccbb816b3aa9e155 GIT binary patch literal 1613 zcmbtT+fEZv6kVq+v<#I(MHECq5NXS05D*{gB}OrlR3$)~_&9A3Wymm{%uEfRrHNql z!4L4GjO)zQc5Evq(1+Ql`|P#$I{WhT*Y_WYV+C6RPi^VzUZd$&6bUfM1vJ>SPActvt4x!}SlU~#EsjPGfX=TGTjfy3U0-9{g6v&o3BKLjQwCju* zd}7+B|4d*n*L!`X?D?`l;w9@P5YOeyX$)gTLjsvJl1L39hOsn;psCY!flSG?<-6ud zMY;z{z0%vL8rGlJw44e5$n*rBUq)J|-hB92UHTozfjnio$8-7KA_$}yS~jdEH7zpY z;-&_H+{KK*2=l*EGk9QdI;nHzzbYc(#We0=PEpMZBx|PUG(1&Z zGQCyPyi=35ZyuV`)z}Hf6fS;XK)r3r6T*_nrSSk$!^oo`FhtIh(X^{a0(1Y?xD&=u z*fLfWbd{4z=!=@+aODIRqO}2kJ7kKtL{<+XU{R)jh~O;Q*AuwqCftAH-51%et}O7^Di;C$}c)q35735fTEq4 zBhvzI(kh@uy+B^o literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPStackFrame.class b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/model/PHPStackFrame.class new file mode 100644 index 0000000000000000000000000000000000000000..79ae4547994a1fb5926f39890fea3f4394488476 GIT binary patch literal 6558 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 aMpS9On(@=$atHk2{#g~=-zd5cfBz5l8qZJw literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.c b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.c new file mode 100644 index 0000000..e771f98 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.c @@ -0,0 +1,76 @@ +#ifdef WIN32 +# include "windows.h" +#else +# include "string.h" +# include "stdlib.h" +#endif +#define BUFFER 512 + +#include "net_sourceforge_phpdt_internal_debug_core_Environment.h" + +JNIEXPORT jstring JNICALL Java_net_sourceforge_phpdt_internal_debug_core_Environment_getenv + (JNIEnv *env, jclass c, jstring jname) +{ + // Retrieve the argument + char cname[BUFFER]; + const char *str = (*env)->GetStringUTFChars(env, jname, (jboolean *)NULL); + + strncpy(cname, str, BUFFER); + (*env)->ReleaseStringUTFChars(env, jname, str); + + #ifdef WIN32 + char cvalue[BUFFER]; + int result = GetEnvironmentVariable(cname, cvalue, BUFFER); + if (result == 0) + return 0; + else + return (*env)->NewStringUTF(env, cvalue); + #else // UNIX + char *cvalue = getenv(cname); + if (cvalue == 0) + return 0; + else + return (*env)->NewStringUTF(env, cvalue); + #endif +} + +JNIEXPORT jstring JNICALL Java_net_sourceforge_phpdt_internal_debug_core_Environment_setenv + (JNIEnv *env, jclass c, jstring jname, jstring jvalue) +{ + // Retrieve the arguments + char cname[BUFFER], cvalue[BUFFER]; + const char *str = (*env)->GetStringUTFChars(env, jname, (jboolean *)NULL); + + strncpy(cname, str, BUFFER); + (*env)->ReleaseStringUTFChars(env, jname, str); + str = (*env)->GetStringUTFChars(env, jvalue, (jboolean *)NULL); + strncpy(cvalue, str, BUFFER); + (*env)->ReleaseStringUTFChars(env, jvalue, str); + + #ifdef WIN32 + SetEnvironmentVariable(cname, cvalue); + #else // UNIX + char envbuf[BUFFER]; + strncpy(envbuf, cname, BUFFER); + strncat(envbuf, "=", BUFFER-strlen(envbuf)); + strncat(envbuf, cvalue, BUFFER-strlen(envbuf)); + putenv(envbuf); + #endif + return 0; +} + +#ifdef __LCC__ + +/** + * Valentin Valchev (Bulgaria, www.prosyst.com) + * This is the standart implementation of Java 2 OnLoad and OnUnload native + * library calls. This template defines them empty functions + */ +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) +{ + return JNI_VERSION_1_2; +} +JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) +{ +} +#endif diff --git a/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.h b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.h new file mode 100644 index 0000000..350cdfe --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/bin/net/sourceforge/phpdt/internal/debug/core/net_sourceforge_phpdt_internal_debug_core_Environment.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class net_sourceforge_phpdt_internal_debug_core_Environment */ + +#ifndef _Included_net_sourceforge_phpdt_internal_debug_core_Environment +#define _Included_net_sourceforge_phpdt_internal_debug_core_Environment +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: net_sourceforge_phpdt_internal_debug_core_Environment + * Method: getenv + * Signature: (Ljava/lang/String;)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_net_sourceforge_phpdt_internal_debug_core_Environment_getenv + (JNIEnv *, jclass, jstring); + +/* + * Class: net_sourceforge_phpdt_internal_debug_core_Environment + * Method: setenv + * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_net_sourceforge_phpdt_internal_debug_core_Environment_setenv + (JNIEnv *, jclass, jstring, jstring); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/net.sourceforge.phpeclipse.debug.core/core.jar b/net.sourceforge.phpeclipse.debug.core/core.jar new file mode 100644 index 0000000000000000000000000000000000000000..51f1eba465c5bb606456891f8e2839c4e2b9ff29 GIT binary patch literal 45511 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 WCE%b#9t;dI^aG8)1cLy){PjOex4%*V literal 0 HcmV?d00001 diff --git a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 new file mode 100644 index 0000000..266460b --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGInterface.java.1.3 @@ -0,0 +1,800 @@ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html + +Contributors: + Vicente Fernando - www.alfersoft.com.ar - Initial implementation + Christian Perkonig - remote debug +**********************************************************************/ +package net.sourceforge.phpdt.internal.debug.core; + +import java.io.IOException; +import java.io.BufferedReader; +import java.io.OutputStream; +import java.util.Vector; +import java.lang.System; +import org.eclipse.debug.core.DebugException; +import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame; +import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable; +import net.sourceforge.phpdt.internal.debug.core.model.PHPValue; +import net.sourceforge.phpdt.internal.debug.core.PHPDBGMod; + +public class PHPDBGInterface { + + // Public + public boolean sessionEnded= false; + public int sessType= -1; + public int BPUnderHit= 0; + public String sessID= new String(); + + // Private + private int[] LastBPRead= new int[10]; + private Vector DBGBPList= new Vector(); + private PHPStackFrame[] DBGStackList; + private PHPVariable[] DBGVariableList; + private Vector DBGMods= new Vector(); + private Vector DBGVars= new Vector(); + private BufferedReader in; + private OutputStream os; + private boolean shouldStop= false, isRef= false, hasChildren= false, isObject= false; + private String evalRet= new String(""); + private String serGlobals= new String(""); + private String typeRead= new String(""); + private String className= new String(""); + private int finalPos=0, refCounter=0, rawCounter=1000; + private PHPDBGProxy proxy= null; + private int lastCmd=-1; + private int sid=0; + + public PHPDBGInterface(BufferedReader in, OutputStream os, PHPDBGProxy proxy) { + DBGBPList.clear(); + this.in= in; + this.os= os; + this.proxy= proxy; + } + + public int addBreakpoint(String mod_name, int line) throws IOException { + return setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_ENABLED + PHPDBGBase.BPS_UNRESOLVED, 0, 0, 0, 0, 0); + } + + public void removeBreakpoint(String mod_name, int line, int bpNo) throws IOException { + setBreakpoint(mod_name, "", line, PHPDBGBase.BPS_DISABLED, 0, 0, 0, bpNo, 0); + } + + public void requestDBGVersion() throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_VER); + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void getSourceTree() throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_SRC_TREE); + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + + // Wait response (1 second) and read response + waitResponse(1000); + flushAllPackets(); + } + + public void addDBGModName(String modName) throws IOException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + rawCounter++; + DBGFrame.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame.addInt(modName.length() + 1); // length of rawdata (+ null char) + DBGFrame.addString(modName); // file name + DBGFrame.addChar('\0'); // null char + + DBGPacket.addFrame(DBGFrame); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + // Returns DBG Breakpoint ID + private int setBreakpoint(String mod_name, String condition, int line, int state, int istemp, int hitcount, int skiphits, int bpno, int isunderhit) throws IOException { + int modNo= 0; + + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_BPS); + PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + modNo= getModByName(mod_name); + + if(modNo >= 0) { + DBGFrame1.addInt(modNo); // mod number + } else { + DBGFrame1.addInt(0); // mod number (0 use file name) + } + + DBGFrame1.addInt(line); // line number + + if(modNo >= 0) { + DBGFrame1.addInt(0); // use mod number + } else { + rawCounter++; + DBGFrame1.addInt(rawCounter); // ID of FRAME_RAWDATA to send file name + } + + DBGFrame1.addInt(state); // state BPS_* + DBGFrame1.addInt(istemp); // istemp + DBGFrame1.addInt(hitcount); // hit count + DBGFrame1.addInt(skiphits); // skip hits + DBGFrame1.addInt(0); // ID of condition + DBGFrame1.addInt(bpno); // breakpoint number + DBGFrame1.addInt(isunderhit); // is under hit + + if(modNo < 0) { + DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame2.addInt(mod_name.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(mod_name); // file name + DBGFrame2.addChar('\0'); // null char + // First add file name data + DBGPacket.addFrame(DBGFrame2); + } + + // Second add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return 0; + DBGPacket.sendPacket(os); + + clearLastBP(); + + // Wait response (1 second) and read response + waitResponse(1000); + flushAllPackets(); + + return LastBPRead[8]; + } + + private void clearLastBP() { + int i; + + for(i=0; i < LastBPRead.length; i++) + LastBPRead[i]= 0; + } + + private void copyToLastBP(int[] BPBody) { + int i; + + for(i=0; i < LastBPRead.length; i++) + LastBPRead[i]= BPBody[i]; + } + + public void continueExecution() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_CONTINUE); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + private int getBPUnderHit() { + int i, BPUnder=0; + int[] dbg_bpl_body= new int[10]; + + // look for bp under hit + for(i=0; i < DBGBPList.size(); i++) { + dbg_bpl_body= (int[]) DBGBPList.get(i); + if(dbg_bpl_body[9] == 1) { + BPUnder= dbg_bpl_body[8]; + } + } + return BPUnder; + } + + public int getLastCmd() + { + return lastCmd; + } + + public int getSID() + { + return sid; + } + + public void setLastCmd(int cmd) + { + lastCmd=cmd; + } + + public void stepInto() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPINTO); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stepOver() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOVER); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stepOut() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STEPOUT); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public void stopExecution() throws IOException { + BPUnderHit= 0; + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_STOP); + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + } + + public PHPVariable[] getVariables(PHPStackFrame stack) throws IOException, DebugException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL); + //PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + DBGFrame1.addInt(0); // istr = raw data ID + DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth + + /* + String evalBlock= new String("$GLOBALS"); + DBGFrame2.addInt(1); // FRAME_RAWDATA ID + DBGFrame2.addInt(evalBlock.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(evalBlock); // eval block + DBGFrame2.addChar('\0'); // null char + */ + + // Add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return null; + DBGPacket.sendPacket(os); + + waitResponse(1000); + flushAllPackets(); + + // Process serialized variables + DBGVariableList= procVars(stack); + + return DBGVariableList; + } + + public void evalBlock(String evalString) throws IOException, DebugException { + PHPDBGPacket DBGPacket= new PHPDBGPacket(PHPDBGBase.DBGA_REQUEST); + PHPDBGFrame DBGFrame1= new PHPDBGFrame(PHPDBGBase.FRAME_EVAL); + PHPDBGFrame DBGFrame2= new PHPDBGFrame(PHPDBGBase.FRAME_RAWDATA); + + rawCounter++; + DBGFrame1.addInt(rawCounter); // istr = raw data ID + DBGFrame1.addInt(1); // scope_id = -1 means current location, 0 never used, +1 first depth + + DBGFrame2.addInt(rawCounter); // FRAME_RAWDATA ID + DBGFrame2.addInt(evalString.length() + 1); // length of rawdata (+ null char) + DBGFrame2.addString(evalString); // eval block + DBGFrame2.addChar('\0'); // null char + + // Add raw data first + DBGPacket.addFrame(DBGFrame2); + // Add command data + DBGPacket.addFrame(DBGFrame1); + + if(proxy.getSocket().isClosed()) return; + DBGPacket.sendPacket(os); + + waitResponse(1000); + flushAllPackets(); + } + + public void flushAllPackets() throws IOException { + while(readResponse() != 0); + } + + public String getModByNo(int modNo) { + int i; + PHPDBGMod dbg_mod; + + // look for mod + for(i=0; i < DBGMods.size(); i++) { + dbg_mod= (PHPDBGMod) DBGMods.get(i); + if(dbg_mod.getNo() == modNo) { + return dbg_mod.getName(); + } + } + return ""; + } + + private int getModByName(String modName) { + int i; + PHPDBGMod dbg_mod; + + // look for mod + for(i=0; i < DBGMods.size(); i++) { + dbg_mod= (PHPDBGMod) DBGMods.get(i); + if(dbg_mod.getName().equalsIgnoreCase(modName)) { + return dbg_mod.getNo(); + } + } + return -1; + } + + private String getRawFrameData(char[] framesInfo, int frameNo) { + int nextFrame= 0; + int[] dbg_frame= new int[2]; + + while(nextFrame < framesInfo.length) { + dbg_frame[0] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame); // frame name + dbg_frame[1] = PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4); // frame size + + nextFrame += 8; + if(dbg_frame[1] == 0) return ""; + + switch(dbg_frame[0]) { + case PHPDBGBase.FRAME_RAWDATA: + if(frameNo == PHPDBGBase.Char4ToInt(framesInfo, nextFrame)) { + int toRead= PHPDBGBase.Char4ToInt(framesInfo, nextFrame + 4); + return String.copyValueOf(framesInfo, nextFrame + 8, toRead); + } + break; + } + // go to next frame + nextFrame += dbg_frame[1]; + } + return ""; + } + + public PHPVariable[] getInstVars(PHPVariable phpVar) throws DebugException { + Vector vecVars= new Vector(); + PHPVariable localPHPVar; + int i=0; + + // already unserialized + for(i=0; i < DBGVars.size(); i++) { + localPHPVar= (PHPVariable)DBGVars.get(i); + if(localPHPVar.getParent() == phpVar) { + vecVars.add(localPHPVar); + } + } + PHPVariable[] arrVars= new PHPVariable[vecVars.size()]; + arrVars= (PHPVariable[]) vecVars.toArray(arrVars); + + return arrVars; + } + + private PHPVariable[] procVars(PHPStackFrame stack) throws DebugException { + Vector vecVars= new Vector(); + + // unserialize + finalPos= 0; + refCounter= 0; + doUnserialize(stack, vecVars, null); + + DBGVars= vecVars; + + return(getInstVars(null)); + } + + private String readValue(String serialVars) throws DebugException { + int startPos=0, endPos=0, lenStr=0, i=0, elements=0; + String ret= new String(""); + + switch(serialVars.charAt(0)) { + case 'a': // associative array, a:elements:{[index][value]...} + typeRead= "hash"; + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + finalPos += endPos + 2; + ret= new String(serialVars.substring(startPos + 1, endPos)); + + hasChildren= true; + break; + case 'O': // object, O:name_len:"name":elements:{[attribute][value]...} + typeRead= "object"; + + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + // get object class + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + className= new String(serialVars.substring(startPos, endPos).toString()); + + // get num of elements + startPos= endPos + 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + finalPos += endPos + 2; + ret= new String(serialVars.substring(startPos + 1, endPos)); + + isObject= true; + hasChildren= true; + break; + case 's': // string, s:length:"data"; + typeRead= "string"; + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + ret= new String(serialVars.substring(startPos, endPos).toString()); + finalPos += endPos + 2; + break; + case 'i': // integer, i:123; + typeRead= "integer"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + + ret= new String(serialVars.substring(startPos + 1, endPos).toString()); + finalPos += endPos + 1; + break; + case 'd': // double (float), d:1.23; + typeRead= "double"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + + ret= new String(serialVars.substring(startPos + 1, endPos).toString()); + finalPos += endPos + 1; + break; + case 'N': // NULL, N; + typeRead= "null"; + ret= "nil"; + finalPos += 2; + break; + case 'b': // bool, b:0 or 1 + typeRead= "boolean"; + ret= (serialVars.charAt(2) == '1')?"true":"false"; + finalPos += endPos + 4; + break; + case 'z': // resource, z:typename_len:"typename":valres; + typeRead= "resource"; + + startPos= 1; + endPos= serialVars.indexOf(':', startPos + 1); + if(endPos == -1) return ""; + + // get resource type name + lenStr= Integer.parseInt(serialVars.substring(startPos + 1, endPos)); + startPos= endPos + 2; + endPos= lenStr + startPos; + className= new String(serialVars.substring(startPos, endPos).toString()); + + // get resource value + startPos= endPos + 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return ""; + ret= new String(serialVars.substring(startPos + 1, endPos)); + finalPos += endPos + 1; + break; + case 'r': + case 'R': + typeRead= "reference"; + startPos= 1; + endPos= serialVars.indexOf(';', startPos + 1); + if(endPos == -1) return "0"; + + ret= new String(serialVars.substring(startPos + 1, endPos)); + finalPos += endPos + 1; + isRef= true; + break; + case ';': + typeRead= "unknown"; + finalPos+= 1; + break; + case '?': + finalPos+= 1; + default: + finalPos+= 1; + typeRead= "unknown"; + break; + } + return ret; + } + + private void doUnserialize(PHPStackFrame stack, Vector vecVars, PHPVariable parent) throws DebugException { + int i, elements= 0; + PHPVariable newVar= null; + String value= new String(""); + String name= new String(""); + String tmp= new String(""); + String[] tmpSplit; + + if(finalPos > serGlobals.length() || serGlobals.equals("") || serGlobals.substring(finalPos).equals("")) return; + + isRef= false; + hasChildren= false; + isObject= false; + name= readValue(serGlobals.substring(finalPos)); + + if(hasChildren) { + // main array + if(refCounter == 0) { + value= name; + name= ""; + } + } else { + hasChildren= false; + isRef= false; + value= readValue(serGlobals.substring(finalPos)); + // replaceAll doesn't work, why??? + tmpSplit= value.split("\\\\"); + value= ""; + for(i= 0; i < tmpSplit.length; i++) { + value= value + tmpSplit[i]; + if(!tmpSplit[i].equals("")) { + if(i < (tmpSplit.length - 1)) { + value= value + "\\"; + } + } + } + } + + if(!name.equals("")) { + if(isRef) { + PHPVariable varPHP; + for(i=0; i < vecVars.size(); i++) { + varPHP= (PHPVariable) vecVars.get(i); + if(varPHP.getObjectId().equals(value)) { + newVar= new PHPVariable(stack, name, "local", true, (PHPValue)varPHP.getValue()); + break; + } + } + if(newVar == null) { + newVar= new PHPVariable(stack, name, "local", false, null); + } + } else { + refCounter++; + newVar= new PHPVariable(stack, name, "local", value, typeRead, hasChildren, Integer.toString(refCounter), className); + } + newVar.setParent(parent); + vecVars.add(newVar); + } + if(hasChildren) { + elements= Integer.parseInt(value); + for(i=0; i < elements; i++) + doUnserialize(stack, vecVars, newVar); + + // skip "}" + finalPos += 1; + } + } + + public int readResponse() throws IOException { + int bytesToRead=0, nextFrame=0, i=0, cmdReceived=0, stackIndex=0; + char[] dbg_header_struct_read= new char[16]; + int[] dbg_header_struct= new int[4]; + int[] dbg_bpl_tmp= new int[10]; + int[] dbg_frame= new int[2]; + int[] dbg_eval_tmp= new int[3]; + int[] dbg_src_tree_tmp= new int[4]; + Vector rawList= new Vector(); + Vector stackList= new Vector(); + PHPStackFrame[] newStackList; + + rawList.clear(); + stackList.clear(); + // Read from input + while(readInput(dbg_header_struct_read, 16) != 0) { + dbg_header_struct[0] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 0); + dbg_header_struct[1] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 4); + dbg_header_struct[2] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 8); + dbg_header_struct[3] = PHPDBGBase.Char4ToInt(dbg_header_struct_read, 12); + + // Check DBG sync bytes + if(dbg_header_struct[0] != 0x5953) return 0; + + cmdReceived= dbg_header_struct[1]; + setLastCmd(cmdReceived); + bytesToRead= dbg_header_struct[3]; + + //System.out.println("Response Received: " + cmdReceived); + char[] entirePack= new char[bytesToRead]; + + if(bytesToRead > 0) { + if(readInput(entirePack, bytesToRead) < bytesToRead) return 0; + } + + // First process frames + nextFrame= 0; + while(nextFrame < bytesToRead) { + dbg_frame[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame); // frame name + dbg_frame[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // frame size + nextFrame += 8; + if(dbg_frame[1] == 0) return 0; + switch(dbg_frame[0]) { + case PHPDBGBase.FRAME_STACK: + int[] dbg_stack_new= new int[4]; + dbg_stack_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // line no + dbg_stack_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // mod no + dbg_stack_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // scope id + dbg_stack_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // id of description string + + stackIndex++; + if(dbg_stack_new[1] != 0) { + PHPStackFrame newStack= new PHPStackFrame(null, getModByNo(dbg_stack_new[1]), dbg_stack_new[0], stackIndex, getRawFrameData(entirePack, dbg_stack_new[3]), dbg_stack_new[1]); + stackList.add(newStack); + } + break; + case PHPDBGBase.FRAME_SOURCE: + break; + case PHPDBGBase.FRAME_SRC_TREE: + dbg_src_tree_tmp[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); // parent_mod_no + dbg_src_tree_tmp[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); // parent_line_no /* NOT USED */ + dbg_src_tree_tmp[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); // mod_no + dbg_src_tree_tmp[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); // imod_name + + if(getModByNo(dbg_src_tree_tmp[2]).equals("")) { + String fileName= new String(getRawFrameData(entirePack, dbg_src_tree_tmp[3])); + // Remove '\0' char + if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1); + + if(dbg_src_tree_tmp[2] != 0) { + PHPDBGMod modNew= new PHPDBGMod(dbg_src_tree_tmp[2], fileName); + DBGMods.add(modNew); + } + } + break; + case PHPDBGBase.FRAME_RAWDATA: + break; + case PHPDBGBase.FRAME_ERROR: + break; + case PHPDBGBase.FRAME_EVAL: + 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; + break; + case PHPDBGBase.FRAME_BPS: + break; + case PHPDBGBase.FRAME_BPL: + int[] dbg_bpl_new= new int[10]; + dbg_bpl_new[0] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); + dbg_bpl_new[1] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 4); + dbg_bpl_new[2] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 8); + dbg_bpl_new[3] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 12); + dbg_bpl_new[4] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 16); + dbg_bpl_new[5] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 20); + dbg_bpl_new[6] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 24); + dbg_bpl_new[7] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 28); + dbg_bpl_new[8] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 32); + dbg_bpl_new[9] = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 36); + + // look if breakpoint already exists in vector + for(i=0; i < DBGBPList.size(); i++) { + dbg_bpl_tmp= (int[]) DBGBPList.get(i); + if(dbg_bpl_tmp[8] == dbg_bpl_new[8]) { + DBGBPList.remove(i); + break; + } + } + + // add breakpoint to vector + DBGBPList.add(dbg_bpl_new); + copyToLastBP(dbg_bpl_new); + + // mod no returned? + if(getModByNo(dbg_bpl_new[0]).equals("")) { + String fileName= new String(getRawFrameData(entirePack, dbg_bpl_new[2])); + // Remove '\0' char + if(fileName.length() > 0) fileName= fileName.substring(0, fileName.length() - 1); + if(dbg_bpl_new[0] != 0) { + PHPDBGMod modNew= new PHPDBGMod(dbg_bpl_new[0], fileName); + DBGMods.add(modNew); + } + } + break; + case PHPDBGBase.FRAME_VER: + break; + case PHPDBGBase.FRAME_SID: + sid = PHPDBGBase.Char4ToInt(entirePack, nextFrame + 0); + break; + case PHPDBGBase.FRAME_SRCLINESINFO: + break; + case PHPDBGBase.FRAME_SRCCTXINFO: + break; + case PHPDBGBase.FRAME_LOG: + break; + case PHPDBGBase.FRAME_PROF: + break; + case PHPDBGBase.FRAME_PROF_C: + break; + case PHPDBGBase.FRAME_SET_OPT: + break; + } + // go to next frame + nextFrame += dbg_frame[1]; + } + + // Now process command + switch(cmdReceived) { + case PHPDBGBase.DBGC_REPLY: + break; + case PHPDBGBase.DBGC_STARTUP: + break; + case PHPDBGBase.DBGC_END: + sessionEnded= true; + break; + case PHPDBGBase.DBGC_BREAKPOINT: + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + BPUnderHit= getBPUnderHit(); + break; + case PHPDBGBase.DBGC_STEPINTO_DONE: + case PHPDBGBase.DBGC_STEPOVER_DONE: + case PHPDBGBase.DBGC_STEPOUT_DONE: + case PHPDBGBase.DBGC_EMBEDDED_BREAK: + BPUnderHit= 1; + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + break; + case PHPDBGBase.DBGC_ERROR: + newStackList= new PHPStackFrame[stackList.size()]; + newStackList= (PHPStackFrame[]) stackList.toArray(newStackList); + DBGStackList= newStackList; + break; + case PHPDBGBase.DBGC_LOG: + break; + case PHPDBGBase.DBGC_SID: + break; + case PHPDBGBase.DBGC_PAUSE: + break; + } + } + + return cmdReceived; + } + + public PHPStackFrame[] getStackList() { + return DBGStackList; + } + + private int readInput(char[] buffer, int bytes) throws IOException { + int bytesRead= 0; + + for(int i=0; i < bytes; i++) { + if(in.ready()) { + buffer[i]= (char) (in.read() & 0x00FF); + bytesRead++; + } + else + break; + } + return bytesRead; + } + + public void setShouldStop() { + this.shouldStop= true; + } + + public boolean waitResponse(long milliseconds) throws IOException { + long timeout= System.currentTimeMillis() + milliseconds; + while(System.currentTimeMillis() < timeout) { + if(in.ready() || shouldStop) { + break; + } + } + return in.ready(); + } +} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 new file mode 100644 index 0000000..dd3b8f6 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/src/net/sourceforge/phpdt/internal/debug/core/.#PHPDBGProxy.java.1.3 @@ -0,0 +1,433 @@ +/********************************************************************** +Copyright (c) 2000, 2002 IBM Corp. and others. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html + +Contributors: + IBM Corporation - Initial implementation + Vicente Fernando - www.alfersoft.com.ar + Christian Perkonig - remote debug +**********************************************************************/ +package net.sourceforge.phpdt.internal.debug.core; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.Socket; +import java.net.ServerSocket; +import java.net.SocketTimeoutException; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IBreakpoint; +import net.sourceforge.phpdt.internal.debug.core.model.IPHPDebugTarget; +import net.sourceforge.phpdt.internal.debug.core.model.PHPStackFrame; +import net.sourceforge.phpdt.internal.debug.core.model.PHPThread; +import net.sourceforge.phpdt.internal.debug.core.model.PHPVariable; +import net.sourceforge.phpdt.internal.debug.core.breakpoints.PHPLineBreakpoint; + +public class PHPDBGProxy { + + private ServerSocket server= null; + private Socket socket; + private BufferedReader reader= null; + private PHPDBGInterface DBGInt= null; + private IPHPDebugTarget debugTarget= null; + private PHPLoop phpLoop; + private PHPThread PHPMainThread; + private PHPDBGProxy thisProxy= null; + private int port; + private boolean remote; + private IPath remoteSourcePath; + + public PHPDBGProxy() { + thisProxy= this; + } + + public PHPDBGProxy(boolean remote,String remoteSourcePath) { + thisProxy= this; + this.remote=remote; + this.remoteSourcePath= new Path(remoteSourcePath); + } + + public void start() { + createServerSocket(); + this.startPHPLoop(); + } + + public void stop() { + phpLoop.setShouldStop(); + if(DBGInt != null) DBGInt.setShouldStop(); + phpLoop.notifyWait(); + } + + protected ServerSocket getServerSocket() throws IOException { + if (server == null) { + createServerSocket(); + } + return server; + } + + protected void createServerSocket() { +// port = SocketUtil.findUnusedLocalPort("localhost", 10001, 10101); + port = 10001; + if (port == -1) { + PHPDebugCorePlugin.log(5, "Cannot find free port!!!!"); + return; + } + try { + if (server == null) { + server = new ServerSocket(port); + //System.out.println("ServerSocket on port: " + port); + } + } catch (IOException e) { + // IO Error + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public Socket getSocket() throws IOException { + return socket; + } + + protected void setDBGInterface(PHPDBGInterface DBGInt) { + this.DBGInt= DBGInt; + } + + public BufferedReader getReader() throws IOException { + if (reader == null) { + reader = new BufferedReader(new InputStreamReader(this.getSocket().getInputStream(), "ISO8859_1")); + } + return reader; + } + + public BufferedReader getReader(Socket socket) throws IOException { + if (socket != null) + return new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO8859_1")); + else + return null; + } + + public OutputStream getOutputStream() throws IOException { + return this.getSocket().getOutputStream(); + } + + protected void setBreakPoints() throws IOException, CoreException { + IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(); + for (int i = 0; i < breakpoints.length; i++) { + addBreakpoint(breakpoints[i]); + } + } + + public void addBreakpoint(IBreakpoint breakpoint) { + if (DBGInt == null) return; + int bpNo= 0; + try { + PHPLineBreakpoint phpLBP; + if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) { + IPath filename; + phpLBP= (PHPLineBreakpoint)breakpoint; + // bpNo= DBGInt.addBreakpoint(phpLBP.getMarker().getResource().getLocation().toOSString(), phpLBP.getLineNumber()); + if (remote) + filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath()); + else + filename=phpLBP.getMarker().getResource().getLocation(); + bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber()); + phpLBP.setDBGBpNo(bpNo); + } + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } catch (CoreException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public void removeBreakpoint(IBreakpoint breakpoint) { + if (DBGInt == null) return; + try { + PHPLineBreakpoint phpLBP; + if(breakpoint.getModelIdentifier() == PHPDebugCorePlugin.getDefault().getDescriptor().getUniqueIdentifier()) { + phpLBP= (PHPLineBreakpoint)breakpoint; + IPath filename; + if (remote) + filename=remoteSourcePath.append(phpLBP.getMarker().getResource().getProjectRelativePath()); + else + filename=phpLBP.getMarker().getResource().getLocation(); +// bpNo= DBGInt.addBreakpoint(filename.toOSString(), phpLBP.getLineNumber()); + DBGInt.removeBreakpoint(filename.toOSString(), phpLBP.getLineNumber(), phpLBP.getDBGBpNo()); + } + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } catch (CoreException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + public void startPHPLoop() { + phpLoop = new PHPLoop(); + phpLoop.start(); + } + + public void resume(PHPThread thread) { + try { + DBGInt.continueExecution(); + phpLoop.notifyWait(); + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + stop(); + } + } + + protected IPHPDebugTarget getDebugTarget() { + return debugTarget; + } + + public void setDebugTarget(IPHPDebugTarget debugTarget) { + this.debugTarget = debugTarget; + debugTarget.setPHPDBGProxy(this); + } + + public PHPVariable[] readVariables(PHPStackFrame frame) { + try { + return DBGInt.getVariables(frame); + } catch (IOException ioex) { + ioex.printStackTrace(); + throw new RuntimeException(ioex.getMessage()); + } catch (DebugException ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + } + + public PHPVariable[] readInstanceVariables(PHPVariable variable) { + try { + return DBGInt.getInstVars(variable); + } catch (DebugException ex) { + ex.printStackTrace(); + throw new RuntimeException(ex.getMessage()); + } + + } + + public void readStepOverEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepOver(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + + public void readStepReturnEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepOut(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + + public void readStepIntoEnd(PHPStackFrame stackFrame) { + try { + DBGInt.stepInto(); + phpLoop.notifyWait(); + } catch (Exception e) { + PHPDebugCorePlugin.log(e); + } + } + +/* + public PHPStackFrame[] readFrames(PHPThread thread) { + //try { + //this.println("th " + thread.getId() + " ; f "); + //return new FramesReader(getMultiReaderStrategy()).readFrames(thread); + return null; + //} catch (IOException e) { + // PHPDebugCorePlugin.log(e); + // return null; + //} + + } +*/ + + public void closeSocket() throws IOException { + if (socket != null) { + socket.close(); + } + } + + public void closeServerSocket() throws IOException { + if (server != null) { + server.close(); + } + } + + public int getPort() { + return port; + } + + class PHPLoop extends Thread { + private boolean shouldStop; + + public PHPLoop() { + shouldStop = false; + this.setName("PHPDebuggerLoop"); + } + + public synchronized void setShouldStop() { + shouldStop = true; + } + + public synchronized void notifyWait() { + notify(); + } + + public void run() { + try { + char[] buf= new char[16]; + int i, pos, timeout; + long interval= 200; // 200ms + String line; + PHPStackFrame[] StackList; + boolean endFile=false; + boolean newconnect=false; + Socket newSocket=null; + PHPDBGInterface newDBGInt; + int sid=-1; + + PHPMainThread = new PHPThread(getDebugTarget(), getPort()); + PHPMainThread.setName("Thread [main]"); + timeout = 0; + while ((getDebugTarget() == null) && (timeout < 100)) { + sleep(100); + timeout++; + } + // Be sure debug target is set + PHPMainThread.setDebugTarget(getDebugTarget()); + getDebugTarget().addThread(PHPMainThread); + + //System.out.println("Waiting for breakpoints."); + while (!shouldStop) + { + newconnect=true; + try { + newSocket = server.accept(); + //System.out.println("Accepted! : " + socket.toString()); + } catch (SocketTimeoutException e) { + // no one wants to connect + newconnect=false; + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + return; + } + + if (newconnect) + { + if (DBGInt==null) + server.setSoTimeout(1); + newDBGInt= new PHPDBGInterface(getReader(newSocket), newSocket.getOutputStream(), thisProxy); + newDBGInt.waitResponse(1000); + newDBGInt.flushAllPackets(); + // Check version and session ID + if ((DBGInt==null) || (DBGInt.getSID()==newDBGInt.getSID())) + { + DBGInt=newDBGInt; + try { + closeSocket(); + } catch (IOException e) { + PHPDebugCorePlugin.log(e); + shouldStop=true; + } + socket=newSocket; + setBreakPoints(); + DBGInt.continueExecution(); + } else + { + newDBGInt.continueExecution(); + newSocket.close(); + } + } + + if(DBGInt.waitResponse(interval)) + { + + DBGInt.flushAllPackets(); + + if (DBGInt.BPUnderHit != 0) { + StackList = DBGInt.getStackList(); + if (StackList.length > 0) { + for (i = 0; i < StackList.length; i++) { + StackList[i].setThread(PHPMainThread); + if (DBGInt.getModByNo(StackList[i].getModNo()).equals("")) { + DBGInt.getSourceTree(); + } + StackList[i].setFile( + DBGInt.getModByNo(StackList[i].getModNo())); + } + PHPMainThread.setStackFrames(StackList); + } + // Fire debug event + PHPMainThread.suspend(); + + synchronized (this) { + wait(); + } + } + } + if (remote) { + if (PHPMainThread.isTerminated()) + { + shouldStop=true; + break; + } + } else { + if (PHPMainThread.isTerminated() || getDebugTarget().getProcess().isTerminated()) + { + shouldStop=true; + break; + } + } +// if (DBGInt.getLastCmd()==PHPDBGBase.DBGC_LOG) +// endFile=true; +// } +// try +// { +// closeSocket(); +// } +// catch (IOException e) { +// PHPDebugCorePlugin.log(e); +// shouldStop=true; +// } +// endFile=false; + } + } + catch (Exception ex) { + PHPDebugCorePlugin.log(ex); + System.out.println(ex); + } + finally { + try { + getDebugTarget().terminate(); + closeSocket(); + closeServerSocket(); + } + catch (IOException e) { + PHPDebugCorePlugin.log(e); + return; + } + //System.out.println("Socket loop finished."); + } + } + } +} diff --git a/net.sourceforge.phpeclipse.debug.core/temp.folder/core.jar.bin.log b/net.sourceforge.phpeclipse.debug.core/temp.folder/core.jar.bin.log new file mode 100644 index 0000000..761d107 --- /dev/null +++ b/net.sourceforge.phpeclipse.debug.core/temp.folder/core.jar.bin.log @@ -0,0 +1,12 @@ +---------- +1. ERROR in D:\Development\eclipse\workspace\net.sourceforge.phpeclipse.debug.core\src\net\sourceforge\phpdt\internal\debug\core\PHPDebugCorePlugin.java (at line 3) + import net.sourceforge.phpeclipse.PHPeclipsePlugin; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The import net.sourceforge.phpeclipse cannot be resolved +---------- +2. ERROR in D:\Development\eclipse\workspace\net.sourceforge.phpeclipse.debug.core\src\net\sourceforge\phpdt\internal\debug\core\PHPDebugCorePlugin.java (at line 38) + return PHPeclipsePlugin.getWorkspace(); + ^^^^^^^^^^^^^^^^ +PHPeclipsePlugin cannot be resolved +---------- +2 problems (2 errors) -- 1.7.1