1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-15 20:25:46 +02:00

Bug 124966: GDBTypeParser.parse(String) parses incorrectly. Applied patch from Matthias Spycher (matthias@coware.com).

This commit is contained in:
Mikhail Khodjaiants 2006-01-31 16:52:11 +00:00
parent ef1cb915f1
commit 06c2cfafd5
2 changed files with 41 additions and 10 deletions

View file

@ -1,3 +1,8 @@
2006-01-31 Mikhail Khodjaiants
Bug 124966: GDBTypeParser.parse(String) parses incorrectly.
Applied patch from Matthias Spycher (matthias@coware.com).
* GDBTypeParser.java
2006-01-27 Mikhail Khodjaiants
Bug 107202: slow debug launch with external sources.
Use "-p" option when passing a large number of directories to "cygpath".

View file

@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Matthias Spycher (matthias@coware.com) - bug 124966
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core;
@ -82,13 +83,16 @@ public class GDBTypeParser {
// Hack for GDB, the typename can be something like
// class A : public B, C { ... } *
// We are only interested in "class A"
// Carefull for class A::data
// Carefull for class A::data or class ns::A<ns::data>
int column = dataType.indexOf(':');
if (column > 0) {
if ((column + 1) < dataType.length() && dataType.charAt(column + 1) != ':') {
dataType = dataType.substring(0, column);
}
}
while (column > 0) {
if ((column + 2) < dataType.length() && dataType.charAt(column + 1) == ':') {
column = dataType.indexOf(':', column+2);
continue;
}
dataType = dataType.substring(0, column);
break;
}
genericType = new GDBType(dataType);
// Start the recursive parser.
@ -336,13 +340,29 @@ public class GDBTypeParser {
}
tokenType = BRACKETS;
} else if (isCIdentifierStart(c)) {
token = "" + (char) c; //$NON-NLS-1$
StringBuffer sb = new StringBuffer();
sb.append((char) c);
while (isCIdentifierPart((c = getch())) && c != EOF) {
token += (char) c;
sb.append((char) c);
}
if (c != EOF) {
if (c == '<') {
// Swallow template args in types like "class foobar<A,B> : public C {..} *"
// FIXME: if the bracket is not terminate do we throw exception?
sb.append((char) c);
int count = 1;
do {
c = getch();
if (c == '<') {
count++;
} else if (c == '>') {
count--;
}
sb.append((char)c);
} while (count > 0 && c != EOF);
} else if (c != EOF) {
ungetch();
}
token = sb.toString();
tokenType = NAME;
} else if (c == '{') {
// Swallow gdb sends things like "struct foobar {..} *"
@ -464,7 +484,13 @@ public class GDBTypeParser {
System.out.println(parser.getGDBType().verbose());
System.out.println();
System.out.println("char **argv"); //$NON-NLS-1$
System.out.println("class ns::link<8, ns::A> : public ns::B { int i; int j; struct link * next;} *"); //$NON-NLS-1$
parser.parse("class ns::link<8, ns::A> : public ns::B { int i; int j; struct link * next;} *"); //$NON-NLS-1$
System.out.println(GDBTypeParser.unParse(parser.getGDBType()));
System.out.println(parser.getGDBType().verbose());
System.out.println();
System.out.println("char **argv"); //$NON-NLS-1$
parser.parse("char **argv"); //$NON-NLS-1$
System.out.println(GDBTypeParser.unParse(parser.getGDBType()));
System.out.println(parser.getGDBType().verbose());