[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Implementing MIDisassemble parsing.
|
Implemen MIDisassemble and the parsing MIDisassembleInfo:
command/MIDisassemble.java
output/MIDisassembleInfo.java
output/MISrcAsm.java
output/MIAsm.java
==================
Index: MIAsm.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIAsm.java,v
retrieving revision 1.7
diff -u -r1.7 MIAsm.java
--- MIAsm.java 25 Sep 2002 20:00:31 -0000 1.7
+++ MIAsm.java 9 Oct 2002 21:08:04 -0000
@@ -10,13 +10,11 @@
*/
public class MIAsm {
long address;
- String func = "";
+ String function = "";
long offset;
- String inst = "";
- int line;
- String file = "";
+ String instruction = "";
- public MIAsm(MITuple tuple) {
+ public MIAsm (MITuple tuple) {
parse(tuple);
}
@@ -25,7 +23,7 @@
}
public String getFunction() {
- return func;
+ return function;
}
public long getOffset() {
@@ -33,33 +31,17 @@
}
public String getInstruction() {
- return inst;
- }
-
- public int getLine() {
- return line;
- }
-
- public String getFile() {
- return file;
+ return instruction;
}
public String toString() {
StringBuffer buffer = new StringBuffer();
- if (file.length() > 0) {
- buffer.append("line=\"").append(line);
- buffer.append("file=\"" + file + "\",");
- buffer.append("line_asm_insn=[");
- }
buffer.append('{');
buffer.append("address=\"" + Long.toHexString(address) +"\"");
- buffer.append(",func-name=\"" + func + "\"");
+ buffer.append(",func-name=\"" + function + "\"");
buffer.append(",offset=\"").append(offset).append('"');
- buffer.append(",inst=\"" + inst + "\"");
+ buffer.append(",inst=\"" + instruction + "\"");
buffer.append('}');
- if (file.length() > 0) {
- buffer.append(']');
- }
return buffer.toString();
}
@@ -70,48 +52,24 @@
MIValue value = results[i].getMIValue();
String str = "";
- // Recurse.
- if (value instanceof MITuple) {
- parse((MITuple)value);
- continue;
- }
-
-
if (value != null && value instanceof MIConst) {
str = ((MIConst)value).getCString();
}
- if (var.equals("line_asm_insn")) {
- if (value instanceof MIList) {
- MIList l = (MIList)value;
- MIValue[] values = l.getMIValues();
- for (int j = 0; j < values.length; j++) {
- if (values[j] instanceof MITuple) {
- parse((MITuple)values[j]);
- }
- }
- }
- } else if (var.equals("address")) {
+ if (var.equals("address")) {
try {
address = Long.decode(str.trim()).longValue();
} catch (NumberFormatException e) {
}
} else if (var.equals("func-name")) {
- func = str;
+ function = str;
} else if (var.equals("offset")) {
try {
offset = Long.decode(str.trim()).longValue();
} catch (NumberFormatException e) {
}
} else if (var.equals("inst")) {
- inst = str;
- } else if (var.equals("line")) {
- try {
- line = Integer.parseInt(str.trim());
- } catch (NumberFormatException e) {
- }
- } else if (var.equals("file")) {
- file = str;
+ instruction = str;
}
}
}
Index: MIDataDisassembleInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/output/MIDataDisassembleInfo.java,v
retrieving revision 1.4
diff -u -r1.4 MIDataDisassembleInfo.java
--- MIDataDisassembleInfo.java 25 Sep 2002 20:00:31 -0000 1.4
+++ MIDataDisassembleInfo.java 9 Oct 2002 21:08:04 -0000
@@ -13,30 +13,56 @@
*/
public class MIDataDisassembleInfo extends MIInfo {
- MIAsm[] asms;
+ MISrcAsm[] src_asm;
+ MIAsm[] asm;
+ boolean mixed;
public MIDataDisassembleInfo(MIOutput rr) {
super(rr);
+ mixed = false;
+ parse();
}
- public MIAsm[] getAsm() {
- if (asms == null) {
- parse();
- }
- return asms;
+ public MIAsm[] getMIAsms() {
+ return asm;
+ }
+
+ public boolean isMixed() {
+ return mixed;
+ }
+
+ public MISrcAsm[] getMISrcAsms() {
+ return src_asm;
}
public String toString() {
- MIAsm[] asms = getAsm();
StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < asms.length; i++) {
- buffer.append(asms[i].toString());
+ buffer.append("asm_insns=[");
+
+ if (isMixed()) {
+ MISrcAsm[] array = getMISrcAsms();
+ for (int i = 0; i < array.length; i++) {
+ if (i != 0) {
+ buffer.append(',');
+ }
+ buffer.append(array[i].toString());
+ }
+ } else {
+ MIAsm[] array = getMIAsms();
+ for (int i = 0; i < array.length; i++) {
+ if (i != 0) {
+ buffer.append(',');
+ }
+ buffer.append(array[i].toString());
+ }
}
+ buffer.append("]");
return buffer.toString();
}
void parse() {
- List aList = new ArrayList();
+ List asmList = new ArrayList();
+ List srcList = new ArrayList();
if (isDone()) {
MIOutput out = getMIOutput();
MIResultRecord rr = out.getMIResultRecord();
@@ -47,16 +73,17 @@
if (var.equals("asm_insns")) {
MIValue value = results[i].getMIValue();
if (value instanceof MIList) {
- parse((MIList)value, aList);
+ parse((MIList)value, srcList, asmList);
}
}
}
}
}
- asms = (MIAsm[])aList.toArray(new MIAsm[aList.size()]);
+ src_asm = (MISrcAsm[])srcList.toArray(new MISrcAsm[srcList.size()]);
+ asm = (MIAsm[])asmList.toArray(new MIAsm[asmList.size()]);
}
- void parse(MIList list, List aList) {
+ void parse(MIList list, List srcList, List asmList) {
// src and assenbly is different
// Mixed mode.
@@ -67,10 +94,11 @@
if (var.equals("src_and_asm_line")) {
MIValue value = results[i].getMIValue();
if (value instanceof MITuple) {
- aList.add(new MIAsm((MITuple)value));
+ srcList.add(new MISrcAsm((MITuple)value));
}
}
}
+ mixed = true;
}
// Non Mixed with source
@@ -78,9 +106,10 @@
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]));
+ asmList.add(new MIAsm((MITuple)values[i]));
}
}
+ mixed = false;
}
}
}
Index: MISrcAsm.java
===================================================================
RCS file: MISrcAsm.java
diff -N MISrcAsm.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ MISrcAsm.java 9 Oct 2002 21:08:04 -0000
@@ -0,0 +1,85 @@
+/*
+ * (c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ *
+ */
+package org.eclipse.cdt.debug.mi.core.output;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represent a GDB Tuple MI assembly response.
+ */
+public class MISrcAsm {
+ int line;
+ String file = "";
+ MIAsm[] asm;
+
+ public MISrcAsm(MITuple tuple) {
+ parse(tuple);
+ }
+
+ public int getLine() {
+ return line;
+ }
+
+ public String getFile() {
+ return file;
+ }
+
+ public MIAsm[] getMIAsms() {
+ return asm;
+ }
+
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("src_and_asm_line={");
+ buffer.append("line=\"").append(line).append('"');
+ buffer.append(",file=\"" + file + "\",");
+ buffer.append("line_asm_insn=[");
+ for (int i = 0; i < asm.length; i++) {
+ if (i != 0) {
+ buffer.append(',');
+ }
+ buffer.append(asm[i].toString());
+ }
+ buffer.append(']');
+ buffer.append('}');
+ return buffer.toString();
+ }
+
+ void parse(MITuple tuple) {
+ List aList = new ArrayList();
+ 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).getCString();
+ }
+
+ if (var.equals("line_asm_insn")) {
+ if (value instanceof MIList) {
+ MIList list = (MIList)value;
+ MIValue[] values = list.getMIValues();
+ for (int j = 0; j < values.length; j++) {
+ if (values[j] instanceof MITuple) {
+ aList.add(new MIAsm((MITuple)values[j]));
+ }
+ }
+ }
+ } if (var.equals("line")) {
+ try {
+ line = Integer.parseInt(str.trim());
+ } catch (NumberFormatException e) {
+ }
+ } else if (var.equals("file")) {
+ file = str;
+ }
+ }
+ asm = (MIAsm[])aList.toArray(new MIAsm[aList.size()]);
+ }
+}