Skip to main content

[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()]);
+	}
+}



Back to the top