Skip to main content

[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;
 	}



Back to the top