Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser - get rid of infinite loops

CORE
	Fixed Bug36532  -   Hang on partial template definition.
	Fixed Bug36432  -   Trying to open attached source code hangs
Eclipse. 
	Fixed Bug36594  -   Parser Stack Overflow on unaryExpression
	Fixed Bug36600  -   Elaborated Enumerated Types Parse Incorrectly. 

TESTS
	Added DOMTests::testBug36532().
	Added DOMTests::testBug36432(). 
	Added DOMTests::testBug36594().
	Added DOMTests::testBug36600(). 
	Added DOMTests::testArrayOfPointerToFunctions(). 

JohnC


Index: dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java,v
retrieving revision 1.23
diff -u -r1.23 DOMBuilder.java
--- dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	16 Apr 2003 12:30:47 -0000	1.23
+++ dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java	16 Apr 2003 20:47:08 -0000
@@ -632,7 +632,7 @@
 	 * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierBegin(java.lang.Object)
 	 */
 	public Object enumSpecifierBegin(Object container, Token enumKey) {
-		SimpleDeclaration decl = (SimpleDeclaration)container;
+		TypeSpecifier.IOwner decl = (TypeSpecifier.IOwner)container;
 		EnumerationSpecifier es = new EnumerationSpecifier( decl );
 		es.setStartToken(enumKey);
 		decl.setTypeSpecifier(es);
Index: dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java,v
retrieving revision 1.7
diff -u -r1.7 EnumerationSpecifier.java
--- dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java	16 Apr 2003 12:30:47 -0000	1.7
+++ dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java	16 Apr 2003 20:47:08 -0000
@@ -24,7 +24,7 @@
  */
 public class EnumerationSpecifier extends TypeSpecifier implements IOffsetable {
 	
-	public EnumerationSpecifier(SimpleDeclaration declaration) {
+	public EnumerationSpecifier(IOwner declaration) {
 		super(declaration);
 	}
 	
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.31
diff -u -r1.31 ChangeLog
--- parser/ChangeLog	16 Apr 2003 12:30:47 -0000	1.31
+++ parser/ChangeLog	16 Apr 2003 20:47:08 -0000
@@ -1,3 +1,9 @@
+2003-04-16 John Camelon
+	Fixed Bug36532  -   Hang on partial template definition.
+	Fixed Bug36432  -   Trying to open attached source code hangs Eclipse. 
+	Fixed Bug36594  -   Parser Stack Overflow on unaryExpression
+	Fixed Bug36600  -   Elaborated Enumerated Types Parse Incorrectly. 
+
 2003-04-15 John Camelon
 	Fixed bug36434 - Broken outline in winbase.h
 	Partial Fix for bug36379 - The parser to set Line informations when scanning.
Index: parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java,v
retrieving revision 1.13
diff -u -r1.13 CModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java	16 Apr 2003 20:32:20 -0000	1.13
+++ parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java	16 Apr 2003 20:47:08 -0000
@@ -38,6 +38,7 @@
 import org.eclipse.cdt.internal.core.dom.ITemplateParameterListOwner;
 import org.eclipse.cdt.internal.core.dom.Inclusion;
 import org.eclipse.cdt.internal.core.dom.Macro;
+import org.eclipse.cdt.internal.core.dom.Name;
 import org.eclipse.cdt.internal.core.dom.NamespaceDefinition;
 import org.eclipse.cdt.internal.core.dom.ParameterDeclaration;
 import org.eclipse.cdt.internal.core.dom.ParameterDeclarationClause;
@@ -80,8 +81,16 @@
 			System.out.println( "Parse Exception in Outline View" ); 
 			e.printStackTrace();
 		}
-		long startTime = System.currentTimeMillis(); 
-		generateModelElements(domBuilder.getTranslationUnit());
+		long startTime = System.currentTimeMillis();
+		try
+		{ 
+			generateModelElements(domBuilder.getTranslationUnit());
+		}
+		catch( NullPointerException npe )
+		{
+			System.out.println( "NullPointer exception generating CModel");
+			npe.printStackTrace();
+		}
 		System.out.println("CModel build: "+ ( System.currentTimeMillis() - startTime ) + "ms" );
 		return this.newElements;
 	}
@@ -343,7 +352,10 @@
 	
 	protected TypeDef createTypeDef(Parent parent, Declarator declarator, SimpleDeclaration simpleDeclaration){
 		// create the element
-		String declaratorName = declarator.getName().toString();		
+		Name domName = ( declarator.getDeclarator() != null ) ? declarator.getDeclarator().getName() : 
+			declarator.getName(); 
+		String declaratorName = domName.toString();		
+			
 		TypeDef element = new TypeDef( parent, declaratorName );
 		String type = getType(simpleDeclaration, declarator);
 		element.setTypeName(type);
@@ -352,21 +364,21 @@
 		parent.addChild((CElement)element);
 
 		// set positions
-		element.setIdPos(declarator.getName().getStartOffset(), declarator.getName().length());	
+		element.setIdPos(domName.getStartOffset(), domName.length());	
 		element.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength());
 
 		this.newElements.put(element, element.getElementInfo());
 		return element;	
 	}
 
-	protected VariableDeclaration createVariableSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator){	
-		String declaratorName = declarator.getName().toString();
+	protected VariableDeclaration createVariableSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator){
+		String variableName = declarator.getName().toString();  
 		DeclSpecifier declSpecifier = simpleDeclaration.getDeclSpecifier();
 		
 		VariableDeclaration element = null;
 		if(parent instanceof IStructure){
 			// field
-			Field newElement = new Field( parent, declaratorName );
+			Field newElement = new Field( parent, variableName);
 			newElement.setMutable(declSpecifier.isMutable());			
 			newElement.setVisibility(simpleDeclaration.getAccessSpecifier().getAccess());
 			element = newElement;			
@@ -374,12 +386,12 @@
 		else {
 			if(declSpecifier.isExtern()){
 				// variableDeclaration
-				VariableDeclaration newElement = new VariableDeclaration( parent, declaratorName );
+				VariableDeclaration newElement = new VariableDeclaration( parent, variableName );
 				element = newElement;
 			}
 			else {
 				// variable
-				Variable newElement = new Variable( parent, declaratorName );
+				Variable newElement = new Variable( parent, variableName );
 				element = newElement;				
 			}
 		}
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.31
diff -u -r1.31 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	16 Apr 2003 12:30:46 -0000	1.31
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	16 Apr 2003 20:47:08 -0000
@@ -130,6 +130,7 @@
 		while (LT(1) != Token.tSEMI) {
 			consume();
 		}
+		consume();
 	}
 	
 	/**
@@ -340,6 +341,7 @@
 		} catch( Backtrack bt )
 		{
 			try { callback.templateDeclarationAbort( templateDeclaration ); } catch( Exception e ) {}
+			throw bt;
 		}
 	}
 
@@ -639,6 +641,7 @@
 	
 	protected void parameterDeclaration( Object containerObject ) throws Backtrack
 	{
+		Token current = LA(1);
 		Object parameterDecl = null;
 		try{ parameterDecl = callback.parameterDeclarationBegin( containerObject );} catch( Exception e ) {}
 		declSpecifierSeq( parameterDecl, true );
@@ -647,10 +650,13 @@
 			try {
 				Object declarator = initDeclarator(parameterDecl);
 				
+				
 			} catch (Backtrack b) {
 				// allowed to be empty
 			}
- 		 
+ 		
+		if( current == LA(1) )
+			throw backtrack; 
 		try{ callback.parameterDeclarationEnd( parameterDecl );} catch( Exception e ) {}
 		 
 	}
@@ -944,6 +950,7 @@
 	 */
 	protected Object initDeclarator( Object owner ) throws Backtrack {
 		Object declarator = declarator( owner );
+		
 			
 		// handle = initializerClause
 		if (LT(1) == Token.tASSIGN) {
@@ -1347,6 +1354,7 @@
 	protected void enumSpecifier( Object owner ) throws Backtrack
 	{
 		Object enumSpecifier = null;
+		Token mark = mark(); 
 		try{ enumSpecifier = callback.enumSpecifierBegin( owner, consume( Token.t_enum ) );} catch( Exception e ) {}
 
 		if( LT(1) == Token.tIDENTIFIER )
@@ -1402,6 +1410,7 @@
 		else
 		{
 			// enumSpecifierAbort
+			backup(mark);
 			throw backtrack; 
 		}
 
@@ -2008,8 +2017,9 @@
 				try{ callback.expressionOperator(expression, t);} catch( Exception e ) {}
 				return;
 			case Token.t_sizeof:
+				consume(Token.t_sizeof);
 				if (LT(1) == Token.tLPAREN) {
-					consume();
+					consume( Token.tLPAREN );	
 					typeId();
 					consume(Token.tRPAREN);
 				} else {
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.30
diff -u -r1.30 ChangeLog
--- ChangeLog	16 Apr 2003 13:52:08 -0000	1.30
+++ ChangeLog	16 Apr 2003 20:47:23 -0000
@@ -1,3 +1,10 @@
+2003-04-16 John Camelon
+	Added DOMTests::testBug36532().
+	Added DOMTests::testBug36432(). 
+	Added DOMTests::testBug36594().
+	Added DOMTests::testBug36600(). 
+	Added DOMTests::testArrayOfPointerToFunctions(). 
+
 2003-04-15 John Camelon
 	Added ScannerTestCase::testBug36434().
 	Added ScannerTestCase::testMultipleLines(). 
Index: parser/org/eclipse/cdt/core/parser/tests/DOMTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/DOMTests.java,v
retrieving revision 1.21
diff -u -r1.21 DOMTests.java
--- parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	16 Apr 2003 12:30:40 -0000	1.21
+++ parser/org/eclipse/cdt/core/parser/tests/DOMTests.java	16 Apr 2003 20:47:24 -0000
@@ -1264,6 +1264,54 @@
 		assertEquals( clause.getDeclarations().size(), 3 );
 	}
 	
+	public void testBug36532() throws Exception
+	{
+		try
+		{
+			TranslationUnit tu = parse( "template<int f() {\n" );
+			fail( "We should not make it this far");
+		}
+		catch( ParserException pe )
+		{
+		}
+		catch( Exception e )
+		{
+			fail( "We should have gotten a ParserException rather than" + e);
+		}
+	}
+
+	public void testBug36432() throws Exception
+	{
+		Writer code = new StringWriter(); 
+		code.write( "#define CMD_GET		\"g\"\n" ); 	 
+		code.write( "#define CMD_ACTION   	\"a\"\n" ); 	 
+		code.write( "#define CMD_QUIT		\"q\"\n" );
+		code.write( "static const memevent_cmd_func memevent_cmd_funcs[sizeof memevent_cmds - 1] = {\n");
+		code.write( "memevent_get,\n");
+		code.write( "memevent_action,\n");
+		code.write( "memevent_quit,\n");
+		code.write( "};\n");
+		TranslationUnit tu = parse( code.toString() );
+		assertEquals( tu.getDeclarations().size(), 1 );
+	}
+	
+	public void testBug36594() throws Exception
+	{
+		TranslationUnit tu = parse( "const int n = sizeof(A) / sizeof(B);");
+		assertEquals( tu.getDeclarations().size(), 1 );
+	}
+	
+	public void testArrayOfPointerToFunctions() throws Exception
+	{
+		TranslationUnit tu = parse( "unsigned char (*main_data)[MAD_BUFFER_MDLEN];");
+	}
+	
+	public void testBug36600() throws Exception
+	{
+		TranslationUnit tu = parse( "enum mad_flow (*input_func)(void *, struct mad_stream *);");
+		
+	}
+	
 	public void testBug36247() throws Exception
 	{
 		Writer code = new StringWriter(); 

Back to the top