diff --git a/debug/org.eclipse.cdt.debug.mi.core/design.txt b/debug/org.eclipse.cdt.debug.mi.core/design.txt index 54664f41905..5542af6d32c 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/design.txt +++ b/debug/org.eclipse.cdt.debug.mi.core/design.txt @@ -9,6 +9,7 @@ Note this is an interim the document and subject to changes. **** This MI implementation is base on GDB/MI 5.2.1. +* Command/Response channels To create an MISession an InputStream and OutputStream are needed(assuming this the pipe connected to gdb). MISession MIPlugin.createSession(InputStream, OutputStream); @@ -26,6 +27,57 @@ for a synchronous response(MIResultRecord). Any out-of-band responses(MIOOBRecord) are dispatch, clients interested in those notifications should register to MISession. +* MI Parsing +There is a generic MI parser (MIParser) constructing an Abstract +Syntax Tree. For example, a ResultRecord response after a +break-insert, the parser will generate this AST: + -break-insert main + ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y", + addr="0x08048468",func="main",file="hello.c",line="4",times="0"} + + - MIOutput + - MIOOBRecord[0] + - MIResutRecord + - token = 0 + - ResultClass = "done" + - MIResult[1] + - MIResult[0] + - variable = "bkpt" + - value = MITuple + - MIResult[9] + - MiResult[0] + - variable = "number" + - MIConst = "1" + - MiResult[1] + - variable = "type" + - MIConst = "breakpoint" + - MiResult[2] + - variable = "disp" + - MIConst = "keep" + - MiResult[3] + - variable = "enabled" + - MIConst = "y" + - MiResult[4] + - variable = "addr" + - MIConst = "0x08048468" + - MiResult[5] + - variable = "func" + - MIConst = "main" + - MiResult[6] + - variable = "file" + - MIConst = "hello.c" + - MiResult[7] + - variable = "line" + - MIConst = "4" + - MiResult[8] + - variable = "times" + - MIConst = "0" + +MICommands will do there own parsing: + session = MISession(in, out); + MIBreakInsert cmd = new MIBreakInsert("main"); + session.postCommand(cmd); // sent to gdb. + MIBreakInsertInfo info = cmd.getBreakInsertInfo(); // Parsing of the Result Record. **** MI <==> CDI Adapters @@ -33,4 +85,4 @@ MI <==> CDI Adapters To do. - \ No newline at end of file + diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java index dd75e72af40..2fcbeb6b6fc 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/MISession.java @@ -2,7 +2,6 @@ package org.eclipse.cdt.debug.mi.core; import java.io.InputStream; import java.io.OutputStream; -import java.io.Reader; import org.eclipse.cdt.debug.mi.core.command.CommandFactory; import org.eclipse.cdt.debug.mi.core.output.MIOutput; @@ -13,8 +12,8 @@ import org.eclipse.cdt.debug.mi.core.output.MIParser; */ public class MISession { - InputStream in; - OutputStream out; + InputStream inChannel; + OutputStream outChannel; Thread txThread; Thread rxThread; @@ -22,9 +21,9 @@ public class MISession { Queue txQueue; Queue rxQueue; - Reader consoleStream = null; - Reader targetStream = null; - Reader logStream = null; + OutputStream consoleStream = null; + OutputStream targetStream = null; + OutputStream logStream = null; CommandFactory factory; @@ -34,8 +33,8 @@ public class MISession { * The constructor. */ MISession(InputStream i, OutputStream o) { - in = i; - out = o; + inChannel = i; + outChannel= o; factory = new CommandFactory(); parser = new MIParser(); txQueue = new Queue(); @@ -49,21 +48,21 @@ public class MISession { /** * Set Console Stream. */ - public void setConsoleStream(Reader console) { + public void setConsoleStream(OutputStream console) { consoleStream = console; } /** * Set Target Stream. */ - public void setTargetStreamOutput(Reader target) { + public void setTargetStreamOutput(OutputStream target) { targetStream = target; } /** * Set Log Stream */ - public void setLogStreamOutput(Reader log) { + public void setLogStreamOutput(OutputStream log) { logStream = log; } @@ -103,12 +102,12 @@ public class MISession { return rxQueue; } - InputStream getInputStream() { - return in; + InputStream getChannelInputStream() { + return inChannel; } - OutputStream getOutputStream() { - return out; + OutputStream getChannelOutputStream() { + return outChannel; } MIOutput parse(String buffer) { diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java index 6eab87b7eb9..be91f1abecd 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/RxThread.java @@ -33,7 +33,7 @@ public class RxThread extends Thread { */ public void run () { BufferedReader reader = - new BufferedReader(new InputStreamReader(session.getInputStream())); + new BufferedReader(new InputStreamReader(session.getChannelInputStream())); StringBuffer buffer = new StringBuffer(); try { while (true) { diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java index 14586acdb6e..e883ab76edb 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/TxThread.java @@ -39,7 +39,7 @@ public class TxThread extends Thread { // - Remove from the TxQueue // - Move to the RxQueue if (cmd != null) { - OutputStream out = session.getOutputStream(); + OutputStream out = session.getChannelOutputStream(); cmd.setToken(token); //System.out.println("Tx " + cmd.toString()); try { diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java index d290ed392a3..cb301e52104 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/CommandFactory.java @@ -32,8 +32,8 @@ public class CommandFactory { return new MIBreakInsert(isTemporary, isHardware, condition, ignoreCount, line); } - public MIBreakInsert createMIBreakInsert(String regex) { - return new MIBreakInsert(regex); + public MIBreakInsert createMIBreakInsert(String func) { + return new MIBreakInsert(func); } public MIBreakList createMIBreakList() { diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java index fc2e29edace..06aafd1220b 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MIBreakInsert.java @@ -50,6 +50,10 @@ package org.eclipse.cdt.debug.mi.core.command; */ public class MIBreakInsert extends MICommand { + public MIBreakInsert(String func) { + this(false, false, null, 0, func); + } + public MIBreakInsert(boolean isTemporary, boolean isHardware, String condition, int ignoreCount, String line) { super("-break-insert"); @@ -93,8 +97,4 @@ public class MIBreakInsert extends MICommand } setParameters(new String[]{line}); } - - public MIBreakInsert(String regex) { - super("-break-insert", new String[]{"-r"}, new String[]{regex}); - } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java index 33ddeb391fa..c624110a581 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/command/MICommand.java @@ -110,6 +110,10 @@ public class MICommand extends Command token = t; } + public MIOutput getMIOutput() { + return miOutput; + } + public void setMIOutput(MIOutput mi) { miOutput = mi; } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java new file mode 100644 index 00000000000..5aeec87a26b --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIArg.java @@ -0,0 +1,76 @@ +package org.eclipse.cdt.debug.mi.core.output; + +import java.util.ArrayList; +import java.util.List; + + + +/** + */ +public class MIArg { + String name; + String value; + + public MIArg(String name, String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + /** + * Parsing a MIList of the form: + * [{name="xxx",value="yyy"},{name="xxx",value="yyy"},..] + */ + public static MIArg[] getMIArgs(MIList miList) { + List aList = new ArrayList(); + MIResult[] results = miList.getMIResults(); + for (int i = 0; i < results.length; i++) { + MIValue value = results[i].getMIValue(); + if (value instanceof MITuple) { + MIArg arg = getMIArg((MITuple)value); + if (arg != null) { + aList.add(arg); + } + } + } + return ((MIArg[])aList.toArray(new MIArg[aList.size()])); + } + + /** + * Parsing a MITuple of the form: + * {name="xxx",value="yyy"} + */ + public static MIArg getMIArg(MITuple tuple) { + MIResult[] args = tuple.getMIResults(); + MIArg arg = null; + if (args.length == 2) { + // Name + String aName = ""; + MIValue value = args[0].getMIValue(); + if (value != null && value instanceof MIConst) { + aName = ((MIConst)value).getString(); + } else { + aName = ""; + } + + // Value + String aValue = ""; + value = args[1].getMIValue(); + if (value != null && value instanceof MIConst) { + aValue = ((MIConst)value).getString(); + } else { + aValue = ""; + } + + arg = new MIArg(aName, aValue); + } + return arg; + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java new file mode 100644 index 00000000000..dc2d9083ce9 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java @@ -0,0 +1,83 @@ +package org.eclipse.cdt.debug.mi.core.output; + + + +/** + */ +public class MIAsm { + long address; + String func = ""; + long offset; + String inst = ""; + int line; + String file = ""; + + public MIAsm(MITuple tuple) { + parse(tuple); + } + + public long getAddress() { + return address; + } + + public String getFunction() { + return func; + } + + public long getOffset() { + return offset; + } + + public String getInstruction() { + return inst; + } + + public int getLine() { + return line; + } + + public String getFile() { + return file; + } + + void parse(MITuple tuple) { + MIResult[] results = tuple.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue value = results[i].getMIValue(); + String str = ""; + + if (value instanceof MITuple) { + parse((MITuple)value); + continue; + } + + if (value != null && value instanceof MIConst) { + str = ((MIConst)value).getString(); + } + + if (var.equals("address")) { + try { + address = Long.parseLong(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("func-name")) { + func = str; + } else if (var.equals("offset")) { + try { + offset = Long.parseLong(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("inst")) { + inst = str; + } else if (var.equals("line")) { + try { + line = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("file")) { + file = str; + } + } + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java new file mode 100644 index 00000000000..31303f915a9 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakHitInfo.java @@ -0,0 +1,88 @@ +package org.eclipse.cdt.debug.mi.core.output; + + + +/** + * ^done,reason="breakpoint-hit",bkptno="1",thread-id="0",frame={addr="0x08048468",func="main",args=[{name="argc",value="1"},{name="argv",value="0xbffff18c"}],file="hello.c",line="4"} + * + */ +public class MIBreakHitInfo { + + int bkptno; + int threadId; + MIFrame frame; + String file = ""; + int line; + MIExecAsyncOutput exec; + MIResultRecord rr; + + public MIBreakHitInfo(MIExecAsyncOutput record) { + exec = record; + } + + public MIBreakHitInfo(MIResultRecord record) { + rr = record; + } + + public int getBreakNumber() { + return bkptno; + } + + public int getThreadId() { + return threadId; + } + + public MIFrame getFrame() { + return frame; + } + + public String getFile() { + return file; + } + + public int getLine() { + return line; + } + + void parse () { + MIResult[] results = null; + if (exec != null) { + results = exec.getMIResults(); + } else if (rr != null) { + results = rr.getMIResults(); + } + if (results != null) { + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue value = results[i].getMIValue(); + String str = ""; + if (value != null && value instanceof MIConst) { + str = ((MIConst)value).getString(); + } + + if (var.equals("bkptno")) { + try { + bkptno = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("thread-id")) { + try { + threadId = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("frame")) { + if (value instanceof MITuple) { + frame = new MIFrame((MITuple)value); + } + } else if (var.equals("file")) { + file = str; + } else if (var.equals("line")) { + try { + line = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } + } + } + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java new file mode 100644 index 00000000000..06045e14960 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakInsertInfo.java @@ -0,0 +1,47 @@ +package org.eclipse.cdt.debug.mi.core.output; + +import java.util.ArrayList; +import java.util.List; + + + +/** + * -break-insert main + * ^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x08048468",func="main",file="hello.c",line="4",times="0"} + */ +public class MIBreakInsertInfo extends MIInfo { + + MIBreakPoint[] breakpoints; + + void parse() { + List aList = new ArrayList(1); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("bkpt")) { + MIValue val = results[i].getMIValue(); + if (val instanceof MITuple) { + aList.add(new MIBreakPoint((MITuple)val)); + } + } + } + } + } + breakpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]); + } + + public MIBreakInsertInfo(MIOutput record) { + super(record); + } + + public MIBreakPoint[] getBreakPoints() { + if (breakpoints == null) { + parse(); + } + return breakpoints; + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java index 95722fb6f38..a765ac3d2b0 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakListInfo.java @@ -1,26 +1,73 @@ package org.eclipse.cdt.debug.mi.core.output; +import java.util.ArrayList; +import java.util.List; + /** + * A -break-list result-record is the form: + *
+ * ^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[..],body=[brkpt={},brkpt={}]}
+ * 
*/ public class MIBreakListInfo extends MIInfo { - public class BreakPoint { - int number; - String type; - String disposition; - boolean enabled; - int address; - String what; - int times; - } + MIBreakPoint[] breakpoints; public MIBreakListInfo(MIOutput rr) { super(rr); } - BreakPoint[] getBreakPoints() { - return null; + public MIBreakPoint[] getBreakPoints() { + if (breakpoints == null) { + parse(); + } + return breakpoints; + } + + void parse() { + List aList = new ArrayList(1); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("BreakpointTable")) { + parseTable(results[i].getMIValue(), aList); + } + } + } + } + breakpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]); + } + + void parseTable(MIValue val, List aList) { + if (val instanceof MITuple) { + MIResult[] table = ((MITuple)val).getMIResults(); + for (int j = 0; j < table.length; j++) { + String variable = table[j].getVariable(); + if (variable.equals("body")) { + parseBody(table[j].getMIValue(), aList); + } + } + } + } + + void parseBody(MIValue body, List aList) { + if (body instanceof MIList) { + MIResult[] bkpts = ((MIList)body).getMIResults(); + for (int i = 0; i < bkpts.length; i++) { + String b = bkpts[i].getVariable(); + if (b.equals("bkpt")) { + MIValue value = bkpts[i].getMIValue(); + if (value instanceof MITuple) { + aList.add(new MIBreakPoint((MITuple)value)); + } + } + } + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java new file mode 100644 index 00000000000..b00964beac1 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakPoint.java @@ -0,0 +1,107 @@ +package org.eclipse.cdt.debug.mi.core.output; + +/** + */ +public class MIBreakPoint { + + int number; + String type = ""; + String disp = ""; + boolean enabled; + long address; + String func = ""; + String file = ""; + int line; + int times; + String what = ""; + + public MIBreakPoint(MITuple tuple) { + parse(tuple); + } + + public int getNumber() { + return number; + } + + public String getType() { + return type; + } + + public String getDisposition() { + return disp; + } + + public boolean isEnabled() { + return enabled; + } + + public long getAddress() { + return address; + } + + public String getFunction() { + return func; + } + + public String getFile() { + return file; + } + + public int getLine() { + return line; + } + + public int getTimes() { + return times; + } + + public String getWhat() { + return what; + } + + void parse(MITuple tuple) { + MIResult[] results = tuple.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue value = results[i].getMIValue(); + String str = ""; + if (value != null && value instanceof MIConst) { + str = ((MIConst)value).getString(); + } + + if (var.equals("number")) { + try { + number = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("type")) { + type = str; + } else if (var.equals("disp")) { + disp = str; + } else if (var.equals("enabled")) { + enabled = str.equals("y"); + } else if (var.equals("addr")) { + try { + address = Long.parseLong(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("func")) { + func = str; + } else if (var.equals("file")) { + file = str; + } else if (var.equals("line")) { + try { + line = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("times")) { + try { + times = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("what") || var.equals("exp")) { + what = str; + } + } + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java index a6342171644..2d6309f2769 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakWatchInfo.java @@ -1,20 +1,50 @@ package org.eclipse.cdt.debug.mi.core.output; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.debug.mi.core.command.MIBreakInsert; + /** + * -break-watch buf + * ^done,wpt={number="2",exp="buf"} */ public class MIBreakWatchInfo extends MIInfo { + MIBreakPoint[] watchpoints = null; + public MIBreakWatchInfo(MIOutput rr) { super(rr); } - public int getNumber () { - return 0; + public MIBreakPoint[] getBreakpoints () { + if (watchpoints == null) { + parse(); + } + return watchpoints; } - public String getExpression() { - return null; + + void parse() { + List aList = new ArrayList(1); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("wpt")) { + MIValue val = results[i].getMIValue(); + if (val instanceof MITuple) { + aList.add(new MIBreakPoint((MITuple)val)); + } + } + } + } + } + watchpoints = (MIBreakPoint[])aList.toArray(new MIBreakPoint[aList.size()]); } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java deleted file mode 100644 index c898ab6fcc8..00000000000 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointHitInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.eclipse.cdt.debug.mi.core.output; - - - -/** - */ -public class MIBreakpointHitInfo extends MIInfo { - - public MIBreakpointHitInfo(MIOutput record) { - super(record); - } - - int getBreakNumber() { - return 0; - } - - String getFunction() { - return null; - } - - int getAddress() { - return 0; - } - - String getFileName() { - return null; - } - - int getLineNumber() { - return 0; - } - - String[] getArguments () { - return null; - } -} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java deleted file mode 100644 index 87d6d945eeb..00000000000 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIBreakpointInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.eclipse.cdt.debug.mi.core.output; - - - -/** - */ -public class MIBreakpointInfo extends MIInfo { - - public MIBreakpointInfo(MIOutput record) { - super(record); - } - - int getBreakNumber() { - return 0; - } - - String getFunction() { - return null; - } - - int getAddress() { - return 0; - } - - String getFileName() { - return null; - } - - int getLineNumber() { - return 0; - } -} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java index d189800f6a0..d7b74d773e1 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIConst.java @@ -12,4 +12,11 @@ public class MIConst extends MIValue { public void setCString(String str) { cstring = str; } + + /** + * Translate gdb c-string. + */ + public String getString() { + return cstring; + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java index 0d848564ee6..ec9a4a2f560 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java @@ -1,25 +1,68 @@ package org.eclipse.cdt.debug.mi.core.output; - +import java.util.ArrayList; +import java.util.List; /** */ public class MIDataDisassembleInfo extends MIInfo { - public class ASM { - int address; - String function; - int offset; - String instruction; - int line; - String file; - } + MIAsm[] asms; public MIDataDisassembleInfo(MIOutput rr) { super(rr); } - public ASM[] getData() { - return null; + public MIAsm[] getAsm() { + if (asms == null) { + parse(); + } + return asms; + } + + void parse() { + List aList = new ArrayList(); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("asm_insns")) { + MIValue value = results[i].getMIValue(); + if (value instanceof MIList) { + parse((MIList)value, aList); + } + } + } + } + } + asms = (MIAsm[])aList.toArray(new MIAsm[aList.size()]); + } + + void parse(MIList list, List aList) { + // src and assenbly is different + MIResult[] results = list.getMIResults(); + if (results != null && results.length > 0) { + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("src_and_asm_line")) { + MIValue value = results[i].getMIValue(); + if (value instanceof MITuple) { + aList.add(new MIAsm((MITuple)value)); + } + } + } + } + + MIValue[] values = list.getMIValues(); + if (values != null && values.length > 0) { + for (int i = 0; i < values.length; i++) { + if (values[i] instanceof MITuple) { + aList.add(new MIAsm((MITuple)values[i])); + } + } + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java index cd67bf4f879..30e042e92aa 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataEvaluateExpressionInfo.java @@ -6,11 +6,36 @@ package org.eclipse.cdt.debug.mi.core.output; */ public class MIDataEvaluateExpressionInfo extends MIInfo{ + String expr; + public MIDataEvaluateExpressionInfo(MIOutput rr) { super(rr); } - public String getValue() { - return null; + public String getExpression() { + if (expr == null) { + parse(); + } + return expr; + } + + void parse() { + expr = ""; + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("value")) { + MIValue value = results[i].getMIValue(); + if (value instanceof MIConst) { + expr = ((MIConst)value).getString(); + } + } + } + } + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java index f130a6f3413..64b2962714a 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListChangedRegistersInfo.java @@ -1,14 +1,62 @@ package org.eclipse.cdt.debug.mi.core.output; +import java.util.ArrayList; +import java.util.List; + /** */ public class MIDataListChangedRegistersInfo extends MIInfo { + int[] registers; + public MIDataListChangedRegistersInfo(MIOutput rr) { super(rr); } int[] getRegisters() { - return null; + if (registers == null) { + parse(); + } + return registers; + } + + void parse() { + List aList = new ArrayList(); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("changed-registers")) { + MIValue value = results[i].getMIValue(); + if (value instanceof MIList) { + parseRegisters((MIList)value, aList); + } + } + } + } + } + registers = new int[aList.size()]; + for (int i = 0; i < aList.size(); i++) { + String str = (String)aList.get(i); + try { + registers[i] = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } + } + + void parseRegisters(MIList list, List aList) { + MIValue[] values = list.getMIValues(); + for (int i = 0; i < values.length; i++) { + if (values[i] instanceof MIConst) { + String str = ((MIConst)values[i]).getString(); + if (str != null && str.length() > 0) { + aList.add(str); + } + } + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java index ceb989afc6c..d1bba94184d 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataListRegistersNamesInfo.java @@ -1,16 +1,55 @@ package org.eclipse.cdt.debug.mi.core.output; - +import java.util.ArrayList; +import java.util.List; /** */ public class MIDataListRegistersNamesInfo extends MIInfo { + String[] names; + public MIDataListRegistersNamesInfo(MIOutput rr) { super(rr); } String[] getRegistersNames () { - return null; + if (names == null) { + parse(); + } + return names; + } + + void parse() { + List aList = new ArrayList(); + if (isDone()) { + MIOutput out = getMIOutput(); + MIResultRecord rr = out.getMIResultRecord(); + if (rr != null) { + MIResult[] results = rr.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + if (var.equals("register-names")) { + MIValue value = results[i].getMIValue(); + if (value instanceof MIList) { + parseRegisters((MIList)value, aList); + } + } + } + } + } + names = (String[])aList.toArray(new String[aList.size()]); + } + + void parseRegisters(MIList list, List aList) { + MIValue[] values = list.getMIValues(); + for (int i = 0; i < values.length; i++) { + if (values[i] instanceof MIConst) { + String str = ((MIConst)values[i]).getString(); + if (str != null && str.length() > 0) { + aList.add(str); + } + } + } } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java new file mode 100644 index 00000000000..7051c7f59f0 --- /dev/null +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIFrame.java @@ -0,0 +1,68 @@ +package org.eclipse.cdt.debug.mi.core.output; + + + +/** + */ +public class MIFrame { + + int level; + long addr; + String func; + String file; + int line; + MIArg[] args = new MIArg[0]; + + public MIFrame(MITuple tuple) { + parse(tuple); + } + + public MIArg[] getArgs() { + return args; + } + + public String getFunction() { + return func; + } + + public int getLevel() { + return level; + } + + void parse(MITuple tuple) { + MIResult[] results = tuple.getMIResults(); + for (int i = 0; i < results.length; i++) { + String var = results[i].getVariable(); + MIValue value = results[i].getMIValue(); + String str = ""; + if (value != null && value instanceof MIConst) { + str = ((MIConst)value).getString(); + } + + if (var.equals("level")) { + try { + level = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("addr")) { + try { + addr = Long.parseLong(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("func")) { + func = str; + } else if (var.equals("file")) { + file = str; + } else if (var.equals("line")) { + try { + line = Integer.parseInt(str); + } catch (NumberFormatException e) { + } + } else if (var.equals("args")) { + if (value instanceof MIList) { + args = MIArg.getMIArgs((MIList)value); + } + } + } + } +} diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java index 817e3338da2..4a16659ae03 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIInfo.java @@ -12,7 +12,38 @@ public class MIInfo { miOutput = record; } - MIOutput getMIOutput () { + public MIOutput getMIOutput () { return miOutput; } + + public boolean isDone() { + return isResultClass(MIResultRecord.DONE); + } + + public boolean isRunning() { + return isResultClass(MIResultRecord.RUNNING); + } + + public boolean isConnected() { + return isResultClass(MIResultRecord.CONNECTED); + } + + public boolean isError() { + return isResultClass(MIResultRecord.ERROR); + } + + public boolean isExit() { + return isResultClass(MIResultRecord.EXIT); + } + + boolean isResultClass(String rc) { + if (miOutput != null) { + MIResultRecord rr = miOutput.getMIResultRecord(); + if (rr != null) { + String clazz = rr.getResultClass(); + return clazz.equals(rc); + } + } + return false; + } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java index c327c42d531..67da4a8445b 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIParser.java @@ -158,7 +158,7 @@ public class MIParser { if (buffer.charAt(0) == ',') { String s = buffer.substring(1); MIResult[] res = processMIResults(s); - rr.setResults(res); + rr.setMIResults(res); } return rr; } @@ -304,10 +304,12 @@ public class MIParser { if (sb.charAt(0) == '"') { sb.deleteCharAt(0); } - for (int i = 0; i < sb.length() || termination; i++) { + int i = 0; + for (i = 0; i < sb.length() || termination; i++) { switch (sb.charAt(i)) { case '\\': if (escape) { + sb.setCharAt(i, '\\'); sb.deleteCharAt(i - 1); escape = false; } else { @@ -315,22 +317,6 @@ public class MIParser { } break; - case 'n': - if (escape) { - sb.setCharAt(i, '\n'); - sb.deleteCharAt(i - 1); - escape = false; - } - break; - - case 'r': - if (escape) { - sb.setCharAt(i, '\n'); - sb.deleteCharAt(i - 1); - escape = false; - } - break; - case '"': if (escape) { sb.setCharAt(i, '"'); @@ -345,6 +331,6 @@ public class MIParser { escape = false; } } - return sb.toString(); + return sb.substring(0, i); } } diff --git a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java index 1c5aeb5cee0..742de854b16 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java +++ b/debug/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIResultRecord.java @@ -33,14 +33,14 @@ public class MIResultRecord { resultClass = type; } - public MIResult[] getResults() { + public MIResult[] getMIResults() { if (results == null) { return nullResults; } return results; } - public void setResults(MIResult[] res) { + public void setMIResults(MIResult[] res) { results = res; } }