[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Enable the use GDBTypeParser to parse GDB/MI types
|
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/ChangeLog,v
retrieving revision 1.134
diff -u -r1.134 ChangeLog
--- ChangeLog 25 May 2003 02:30:52 -0000 1.134
+++ ChangeLog 3 Jun 2003 02:25:47 -0000
@@ -1,3 +1,19 @@
+2003-06-02 Alain Magloire
+
+ Enable the new type parsing with the class GDBTypeParser.
+ This class takes the output of GDB/MI
+ (gdb) whatis
+ or
+ (gdb) ptype
+ And parse it.
+
+ * src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayType.java
+ * src/org/eclipse/cdt/debug/mi/core/cdi/model/type/DerivedType.java
+ * src/org/eclipse/cdt/debug/mi/core/cdi/model/type/PointerType.java
+ * src/org/eclipse/cdt/debug/mi/core/cdi/model/type/FunctionType.java
+ * src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
+ * src/org/eclipse/cdt/debug/mi/core/GDBTypeParser.java
+
2003-05-25 Alain Magloire
Do extra parsing.
Index: src/org/eclipse/cdt/debug/mi/core/GDBTypeParser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/GDBTypeParser.java,v
retrieving revision 1.4
diff -u -r1.4 GDBTypeParser.java
--- src/org/eclipse/cdt/debug/mi/core/GDBTypeParser.java 30 May 2003 18:40:55 -0000 1.4
+++ src/org/eclipse/cdt/debug/mi/core/GDBTypeParser.java 3 Jun 2003 02:25:50 -0000
@@ -296,7 +296,6 @@
}
while (namp-- > 0) {
prependChild(GDBType.REFERENCE);
- GDBDerivedType referenceType = new GDBDerivedType(genericType, GDBDerivedType.REFERENCE);
}
}
@@ -338,7 +337,13 @@
}
public static void main(String[] args) {
+
GDBTypeParser parser = new GDBTypeParser();
+
+ System.out.println("struct link { int i; int j; struct link * next} *");
+ parser.parse("struct link { int i; int j; struct link * next} *");
+ System.out.println(parser.getGDBType());
+
System.out.println("char **argv");
parser.parse("unsigned long long int **argv");
System.out.println(parser.getGDBType());
Index: src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java,v
retrieving revision 1.24
diff -u -r1.24 SourceManager.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java 25 May 2003 02:30:39 -0000 1.24
+++ src/org/eclipse/cdt/debug/mi/core/cdi/SourceManager.java 3 Jun 2003 02:26:42 -0000
@@ -12,13 +12,17 @@
import org.eclipse.cdt.debug.core.cdi.model.ICDIInstruction;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMixedInstruction;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
+import org.eclipse.cdt.debug.mi.core.GDBTypeParser;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.MISession;
+import org.eclipse.cdt.debug.mi.core.GDBTypeParser.GDBDerivedType;
+import org.eclipse.cdt.debug.mi.core.GDBTypeParser.GDBType;
import org.eclipse.cdt.debug.mi.core.cdi.model.Instruction;
import org.eclipse.cdt.debug.mi.core.cdi.model.MixedInstruction;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.ArrayType;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.BoolType;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.CharType;
+import org.eclipse.cdt.debug.mi.core.cdi.model.type.DerivedType;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.DoubleType;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.EnumType;
import org.eclipse.cdt.debug.mi.core.cdi.model.type.FloatType;
@@ -50,10 +54,12 @@
public class SourceManager extends SessionObject implements ICDISourceManager {
boolean autoupdate;
+ GDBTypeParser gdbTypeParser;
public SourceManager(Session session) {
super(session);
autoupdate = false;
+ gdbTypeParser = new GDBTypeParser();
}
/**
@@ -224,24 +230,49 @@
}
String typename = name.trim();
+ // Parse the string.
+ GDBType gdbType = gdbTypeParser.parse(typename);
+ Type type = null;
+
+ for (Type aType = null; gdbType != null; type = aType) {
+ if (gdbType instanceof GDBDerivedType) {
+ switch(gdbType.getType()) {
+ case GDBType.ARRAY:
+ int d = ((GDBDerivedType)gdbType).getDimension();
+ aType = new ArrayType(target, typename, d);
+ break;
+ case GDBType.FUNCTION:
+ aType = new FunctionType(target, typename);
+ break;
+ case GDBType.POINTER:
+ aType = new PointerType(target, typename);
+ break;
+ case GDBType.REFERENCE:
+ aType = new ReferenceType(target, typename);
+ break;
+ }
+ gdbType = ((GDBDerivedType)gdbType).getChild();
+ } else {
+ aType = toCDIType(target, gdbType.toString());
+ gdbType = null;
+ }
+ if (type instanceof DerivedType) {
+ ((DerivedType)type).setComponentType(aType);
+ }
+ }
+
+ if (type != null) {
+ return type;
+ }
+ throw new CDIException("Unknown type");
+ }
+
+ Type toCDIType(ICDITarget target, String name) throws CDIException {
// Check the derived types and agregate types
- if (typename.endsWith("]")) {
- return new ArrayType(target, typename);
- } else if (typename.endsWith("*")) {
- return new PointerType(target, typename);
- } else if (typename.endsWith("&")) {
- return new ReferenceType(target, typename);
- } else if (typename.endsWith(")")) {
- return new FunctionType(target, typename);
- } else if (typename.startsWith("enum ")) {
- return new EnumType(target, typename);
- } else if (typename.startsWith("union ")) {
- return new StructType(target, typename);
- } else if (typename.startsWith("struct ")) {
- return new StructType(target, typename);
- } else if (typename.startsWith("class ")) {
- return new StructType(target, typename);
+ if (name == null) {
+ name = new String();
}
+ String typename = name.trim();
// Check the primitives.
if (typename.equals("char")) {
@@ -268,6 +299,14 @@
return new DoubleType(target, typename);
} else if (typename.equals("void")) {
return new VoidType(target, typename);
+ } else if (typename.equals("enum")) {
+ return new EnumType(target, typename);
+ } else if (typename.equals("union")) {
+ return new StructType(target, typename);
+ } else if (typename.equals("struct")) {
+ return new StructType(target, typename);
+ } else if (typename.equals("class")) {
+ return new StructType(target, typename);
}
StringTokenizer st = new StringTokenizer(typename);
@@ -286,12 +325,18 @@
boolean isLong = (first.equals("long") || second.equals("long"));
boolean isShort = (first.equals("short") || second.equals("short"));
boolean isLongLong = (first.equals("long") && second.equals("long"));
+
boolean isDouble = (first.equals("double") || second.equals("double"));
boolean isFloat = (first.equals("float") || second.equals("float"));
boolean isComplex = (first.equals("complex") || second.equals("complex") ||
first.equals("_Complex") || second.equals("_Complex"));
boolean isImaginery = (first.equals("_Imaginary") || second.equals("_Imaginary"));
+ boolean isStruct = first.equals("struct");
+ boolean isClass = first.equals("class");
+ boolean isUnion = first.equals("union");
+ boolean isEnum = first.equals("enum");
+
if (isChar && (isSigned || isUnsigned)) {
return new CharType(target, typename, isUnsigned);
} else if (isShort && (isSigned || isUnsigned)) {
@@ -306,6 +351,14 @@
return new DoubleType(target, typename, isComplex, isImaginery, isLong);
} else if (isFloat && (isComplex || isImaginery)) {
return new FloatType(target, typename, isComplex, isImaginery);
+ } else if (isStruct) {
+ return new StructType(target, typename);
+ } else if (isClass) {
+ return new StructType(target, typename);
+ } else if (isUnion) {
+ return new StructType(target, typename);
+ } else if (isEnum) {
+ return new EnumType(target, typename);
}
} else if (count == 3) {
// ISOC allows permutation. replace short by: long or short
@@ -364,7 +417,6 @@
}
throw new CDIException("Unknown type");
}
-
public String getDetailTypeName(String typename) throws CDIException {
try {
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayType.java,v
retrieving revision 1.3
diff -u -r1.3 ArrayType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayType.java 25 May 2003 02:29:59 -0000 1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ArrayType.java 3 Jun 2003 02:26:45 -0000
@@ -18,8 +18,19 @@
/**
* @param typename
*/
- public ArrayType(ICDITarget target, String typename) {
+ public ArrayType(ICDITarget target, String typename,int dim) {
super(target, typename);
+ dimension = dim;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType#getDimension()
+ */
+ public int getDimension() {
+ if (derivedType == null) {
+ getComponentType();
+ }
+ return dimension;
}
/* (non-Javadoc)
@@ -39,20 +50,9 @@
}
name = orig.substring(0, lbracket).trim();
}
- setDerivedType(name);
+ setComponentType(name);
}
return derivedType;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.cdt.debug.core.cdi.model.type.ICDIArrayType#getDimension()
- */
- public int getDimension() {
- // Need to initialize.
- if (derivedType == null) {
- getComponentType();
- }
- return dimension;
}
}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/DerivedType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/DerivedType.java,v
retrieving revision 1.3
diff -u -r1.3 DerivedType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/DerivedType.java 25 May 2003 02:29:59 -0000 1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/DerivedType.java 3 Jun 2003 02:26:45 -0000
@@ -22,8 +22,11 @@
super(target, typename);
}
+ public void setComponentType(ICDIType dtype) {
+ derivedType = dtype;
+ }
- void setDerivedType(String name) {
+ public void setComponentType(String name) {
ICDITarget target = getTarget();
Session session = (Session)(target.getSession());
SourceManager sourceMgr = (SourceManager)session.getSourceManager();
@@ -41,5 +44,4 @@
derivedType = new IncompleteType(getTarget(), name);
}
}
-
}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/FunctionType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/FunctionType.java,v
retrieving revision 1.3
diff -u -r1.3 FunctionType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/FunctionType.java 25 May 2003 02:29:59 -0000 1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/FunctionType.java 3 Jun 2003 02:26:46 -0000
@@ -32,15 +32,9 @@
params = name.substring(lparen + 1, rparen).trim();
name = orig.substring(0, lparen).trim();
}
- setDerivedType(name);
+ setComponentType(name);
}
return derivedType;
}
- public String getArguments() {
- if (derivedType != null) {
- getComponentType();
- }
- return params;
- }
}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntType.java,v
retrieving revision 1.2
diff -u -r1.2 IntType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntType.java 23 May 2003 15:49:36 -0000 1.2
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntType.java 3 Jun 2003 02:26:46 -0000
@@ -19,8 +19,8 @@
this(target, typename, false);
}
- public IntType(ICDITarget target, String typename, boolean usigned) {
- super(target, typename, usigned);
+ public IntType(ICDITarget target, String typename, boolean isUnsigned) {
+ super(target, typename, isUnsigned);
}
}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntegralType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntegralType.java,v
retrieving revision 1.2
diff -u -r1.2 IntegralType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntegralType.java 23 May 2003 15:49:36 -0000 1.2
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/IntegralType.java 3 Jun 2003 02:26:46 -0000
@@ -14,9 +14,9 @@
boolean unSigned;
- public IntegralType(ICDITarget target, String typename, boolean usigned) {
+ public IntegralType(ICDITarget target, String typename, boolean isUnsigned) {
super(target, typename);
- unSigned = usigned;
+ unSigned = isUnsigned;
}
/* (non-Javadoc)
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/PointerType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/PointerType.java,v
retrieving revision 1.3
diff -u -r1.3 PointerType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/PointerType.java 25 May 2003 02:29:59 -0000 1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/PointerType.java 3 Jun 2003 02:26:46 -0000
@@ -17,7 +17,6 @@
super(target, typename);
}
-
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.cdi.model.type.ICDIDerivedType#getComponentType()
*/
@@ -30,7 +29,7 @@
if (star != -1) {
name = orig.substring(0, star).trim();
}
- setDerivedType(name);
+ setComponentType(name);
}
return derivedType;
}
Index: src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceType.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.debug.mi.core/src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceType.java,v
retrieving revision 1.3
diff -u -r1.3 ReferenceType.java
--- src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceType.java 25 May 2003 02:29:59 -0000 1.3
+++ src/org/eclipse/cdt/debug/mi/core/cdi/model/type/ReferenceType.java 3 Jun 2003 02:26:47 -0000
@@ -32,7 +32,7 @@
if (amp != -1) {
name = orig.substring(0, amp).trim();
}
- setDerivedType(name);
+ setComponentType(name);
}
return derivedType;
}