From 809934b9212e05d7ef75442847d9e6d76faa8cb0 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Fri, 23 Apr 2004 17:43:47 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=59768 --- .../core/parser/tests/ScannerTestCase.java | 10 ++++++ .../cdt/core/parser/IMacroDescriptor.java | 5 +++ .../internal/core/parser/ast/ASTMacro.java | 6 ++++ .../scanner/DynamicMacroDescriptor.java | 6 ++++ .../scanner/FunctionMacroDescriptor.java | 26 +++++++++++++- .../parser/scanner/ObjectMacroDescriptor.java | 35 +++++++++++++++++-- .../internal/core/parser/scanner/Scanner.java | 7 ++-- 7 files changed, 87 insertions(+), 8 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java index adfc71eb558..ec62cc743e4 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.parser.ParserFactoryError; import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ScannerException; import org.eclipse.cdt.core.parser.ast.IASTInclusion; +import org.eclipse.cdt.core.parser.ast.IASTMacro; import org.eclipse.cdt.internal.core.parser.token.SimpleToken; /** @@ -1542,4 +1543,13 @@ public class ScannerTestCase extends BaseScannerTest validateToken( IGCCToken.tMAX ); validateEOF(); } + + public void testBug59768() throws Exception + { + initializeScanner( "#define A A\nA"); + validateIdentifier( "A"); + validateEOF(); + IMacroDescriptor d = scanner.getDefinition( "A"); + assertTrue( d.isCircular() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IMacroDescriptor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IMacroDescriptor.java index 47327ca0714..615120bcb8e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IMacroDescriptor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IMacroDescriptor.java @@ -58,4 +58,9 @@ public interface IMacroDescriptor { // similar to equals() but according to the C99 & C++98 public boolean compatible(IMacroDescriptor descriptor); + + /** + * @return + */ + public boolean isCircular(); } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java index c233ad69f4b..ec712845788 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTMacro.java @@ -180,4 +180,10 @@ public class ASTMacro implements IASTMacro { public int getNameLineNumber() { return nameLineNumber; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.IMacroDescriptor#isCircular() + */ + public boolean isCircular() { + return innerMacro.isCircular(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/DynamicMacroDescriptor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/DynamicMacroDescriptor.java index ae21914898d..af6c8657490 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/DynamicMacroDescriptor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/DynamicMacroDescriptor.java @@ -82,5 +82,11 @@ public class DynamicMacroDescriptor implements IMacroDescriptor { if( !name.equals( descriptor.getName() )) return false; return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.IMacroDescriptor#isCircular() + */ + public boolean isCircular() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FunctionMacroDescriptor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FunctionMacroDescriptor.java index aec0d859cfa..0d58931b8d1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FunctionMacroDescriptor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FunctionMacroDescriptor.java @@ -38,7 +38,8 @@ public class FunctionMacroDescriptor implements IMacroDescriptor { private String name; private List identifierParameters; private List tokenizedExpansion; - private String expansionSignature; + private String expansionSignature; + private Boolean isCircular = null; /** * Returns the identifiers. * @return List @@ -147,4 +148,27 @@ public class FunctionMacroDescriptor implements IMacroDescriptor { return expansionSignature; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.IMacroDescriptor#isCircular() + */ + public boolean isCircular() { + if( isCircular == null ) + isCircular = new Boolean( checkIsCircular() ); + return isCircular.booleanValue(); + } + + /** + * @return + */ + protected boolean checkIsCircular() { + Iterator i = getTokenizedExpansion().iterator(); + while( i.hasNext() ) + { + IToken t = (IToken) i.next(); + if( t.getType() == IToken.tIDENTIFIER && t.getImage().equals(getName())) + return true; + } + return false; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ObjectMacroDescriptor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ObjectMacroDescriptor.java index fdadb7b8ad9..7c538638261 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ObjectMacroDescriptor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ObjectMacroDescriptor.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.parser.scanner; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.eclipse.cdt.core.parser.IMacroDescriptor; @@ -25,6 +26,8 @@ public class ObjectMacroDescriptor implements IMacroDescriptor { private final String expansionSignature; private final String name; private final IToken token; + private Boolean isCircular = null; + private List tokenizedExpansion = null; public ObjectMacroDescriptor( String name, String expansionSignature ) { @@ -58,9 +61,13 @@ public class ObjectMacroDescriptor implements IMacroDescriptor { * @see org.eclipse.cdt.core.parser.IMacroDescriptor#getTokenizedExpansion() */ public List getTokenizedExpansion() { - ArrayList x = new ArrayList(); - x.add(token); - return x; + if( token == null ) return EMPTY_LIST; + if( tokenizedExpansion == null ) + { + tokenizedExpansion = new ArrayList(1); + tokenizedExpansion.add(token); + } + return tokenizedExpansion; } /* (non-Javadoc) @@ -105,4 +112,26 @@ public class ObjectMacroDescriptor implements IMacroDescriptor { return expansionSignature; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.IMacroDescriptor#isCircular() + */ + public boolean isCircular() { + if( isCircular == null ) + isCircular = new Boolean( checkIsCircular() ); + return isCircular.booleanValue(); + } + + /** + * @return + */ + protected boolean checkIsCircular() { + Iterator i = getTokenizedExpansion().iterator(); + while( i.hasNext() ) + { + IToken t = (IToken) i.next(); + if( t.getType() == IToken.tIDENTIFIER && t.getImage().equals(getName())) + return true; + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java index b1a61eb30a0..e0113115dad 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java @@ -144,6 +144,7 @@ public class Scanner implements IScanner { Object value = m.get( symbolName ); if( value instanceof String ) { + //TODO add in check here for '(' and ')' addDefinition( symbolName, scannerExtension.initializeMacroValue(scannerData, (String) value)); TraceUtil.outputTrace(log, "\t\tNAME = ", symbolName, " VALUE = ", value.toString() ); //$NON-NLS-1$ //$NON-NLS-2$ ++numberOfSymbolsLogged; @@ -327,9 +328,7 @@ public class Scanner implements IScanner { } public void addDefinition(String key, String value) { - addDefinition(key, - new ObjectMacroDescriptor( key, - value )); + addDefinition(key, new ObjectMacroDescriptor( key, value )); } public final IMacroDescriptor getDefinition(String key) { @@ -1520,7 +1519,7 @@ public class Scanner implements IScanner { IMacroDescriptor mapping = getDefinition(ident); - if (mapping != null && !isLimitReached()) + if (mapping != null && !isLimitReached() && !mapping.isCircular() ) if( scannerData.getContextStack().shouldExpandDefinition( ident ) ) { expandDefinition(ident, mapping, baseOffset); return null;