Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 117439 Details for
Bug 253690
[scalability] Parser needs a lot of memory parsing large initializer expressions
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
follow up: fixes detection of names in designators
253690-initializers.txt (text/plain), 19.55 KB, created by
Markus Schorn
on 2008-11-10 10:11:06 EST
(
hide
)
Description:
follow up: fixes detection of names in designators
Filename:
MIME Type:
Creator:
Markus Schorn
Created:
2008-11-10 10:11:06 EST
Size:
19.55 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.cdt.core >Index: parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java,v >retrieving revision 1.2 >diff -u -r1.2 ASTQueries.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java 7 Nov 2008 09:58:46 -0000 1.2 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java 10 Nov 2008 14:43:59 -0000 >@@ -11,6 +11,7 @@ > package org.eclipse.cdt.internal.core.dom.parser; > > import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; >+import org.eclipse.cdt.core.dom.ast.IASTCastExpression; > import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression; > import org.eclipse.cdt.core.dom.ast.IASTExpression; > import org.eclipse.cdt.core.dom.ast.IASTExpressionList; >@@ -36,6 +37,8 @@ > return true; > if (expr instanceof IASTIdExpression) > return true; >+ if (expr instanceof IASTCastExpression) >+ return true; > > if (expr instanceof IASTUnaryExpression) { > IASTUnaryExpression uexpr= (IASTUnaryExpression) expr; >Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java,v >retrieving revision 1.124 >diff -u -r1.124 GNUCSourceParser.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java 7 Nov 2008 09:58:46 -0000 1.124 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java 10 Nov 2008 14:44:00 -0000 >@@ -159,93 +159,84 @@ > BacktrackException { > if (LT(1) == IToken.tASSIGN) { > consume(); >- final List<IASTNode> empty= Collections.emptyList(); >- return cInitializerClause(empty, false); >+ return cInitializerClause(false); > } > return null; > } > >- protected IASTInitializer cInitializerClause(List<IASTNode> designators, boolean inAggregateInitializer) >- throws EndOfFileException, BacktrackException { >- IToken la = LA(1); >- int startingOffset = la.getOffset(); >- la = null; >- if (LT(1) == IToken.tLBRACE) { >- consume(); >- IASTInitializerList result = createInitializerList(); >- ((ASTNode) result).setOffset(startingOffset); >- >- // bug 196468, gcc accepts empty braces. >- if (supportGCCStyleDesignators && LT(1) == (IToken.tRBRACE)) { >- int l = consume().getEndOffset(); >- ((ASTNode) result).setLength(l - startingOffset); >- return result; >- } >+ protected IASTInitializer cInitializerClause(boolean inAggregate) throws EndOfFileException, BacktrackException { >+ final int offset = LA(1).getOffset(); >+ if (LT(1) != IToken.tLBRACE) { >+ IASTExpression assignmentExpression= assignmentExpression(); >+ if (inAggregate && skipTrivialExpressionsInAggregateInitializers) { >+ if (!ASTQueries.canContainName(assignmentExpression)) >+ return null; >+ } >+ IASTInitializerExpression result= createInitializerExpression(); >+ result.setExpression(assignmentExpression); >+ setRange(result, assignmentExpression); >+ return result; > >- for (;;) { >- final IToken startToken= LA(1); >- // required at least one initializer list >- // get designator list >- List<IASTNode> newDesignators = designatorList(); >- if (newDesignators.size() != 0) >- if (LT(1) == IToken.tASSIGN) >- consume(); >- >- IASTInitializer initializer = cInitializerClause(newDesignators, true); >- >- // depending on value of skipTrivialItemsInCompoundInitializers initializer may be null >- if (initializer != null) { >- if (newDesignators.isEmpty()) { >- result.addInitializer(initializer); >- } else { >- ICASTDesignatedInitializer desigInitializer = createDesignatorInitializer(); >- ((ASTNode) desigInitializer).setOffsetAndLength( >- ((ASTNode) newDesignators.get(0)).getOffset(), >- ((ASTNode)initializer).getOffset() + ((ASTNode)initializer).getLength() - ((ASTNode) newDesignators.get(0)).getOffset()); >- for (int i = 0; i < newDesignators.size(); ++i) { >- ICASTDesignator d = (ICASTDesignator) newDesignators.get(i); >- desigInitializer.addDesignator(d); >- } >- desigInitializer.setOperandInitializer(initializer); >- result.addInitializer(desigInitializer); >- } >- } >- // can end with ", }" or "}" >- if (LT(1) == IToken.tCOMMA) >- consume(); >- if (LT(1) == IToken.tRBRACE) >- break; >- >- final IToken nextToken= LA(1); >- if (nextToken.getType() == IToken.tEOC) { >- return result; >- } >- if (nextToken == startToken) { >- throwBacktrack(startingOffset, nextToken.getEndOffset() - startingOffset); >- return null; >- } >+ } >+ >+ // it's an aggregate initializer >+ consume(IToken.tLBRACE); >+ IASTInitializerList result = createInitializerList(); >+ >+ // bug 196468, gcc accepts empty braces. >+ if (supportGCCStyleDesignators && LT(1) == IToken.tRBRACE) { >+ int endOffset= consume().getEndOffset(); >+ setRange(result, offset, endOffset); >+ return result; >+ } > >- // otherwise, its another initializer in the list >- } >- // consume the closing brace >- int lastOffset = consume(IToken.tRBRACE).getEndOffset(); >- ((ASTNode) result).setLength(lastOffset - startingOffset); >- return result; >+ for (;;) { >+ final int checkOffset= LA(1).getOffset(); >+ // required at least one initializer list >+ // get designator list >+ List<? extends ICASTDesignator> designator= designatorList(); >+ if (designator == null) { >+ IASTInitializer initializer= cInitializerClause(true); >+ // depending on value of skipTrivialItemsInCompoundInitializers initializer may be null >+ if (initializer != null) { >+ result.addInitializer(initializer); >+ } >+ } else { >+ if (LT(1) == IToken.tASSIGN) >+ consume(); >+ IASTInitializer initializer= cInitializerClause(false); >+ ICASTDesignatedInitializer desigInitializer = createDesignatorInitializer(); >+ setRange(desigInitializer, designator.get(0)); >+ adjustLength(desigInitializer, initializer); >+ >+ for (ICASTDesignator d : designator) { >+ desigInitializer.addDesignator(d); >+ } >+ desigInitializer.setOperandInitializer(initializer); >+ result.addInitializer(desigInitializer); >+ } >+ >+ // can end with ", }" or "}" >+ boolean canContinue= LT(1) == IToken.tCOMMA; >+ if (canContinue) >+ consume(); >+ >+ switch (LT(1)) { >+ case IToken.tRBRACE: >+ int lastOffset = consume().getEndOffset(); >+ setRange(result, offset, lastOffset); >+ return result; >+ >+ case IToken.tEOC: >+ setRange(result, offset, LA(1).getOffset()); >+ return result; >+ } >+ >+ if (!canContinue || LA(1).getOffset() == checkOffset) { >+ throwBacktrack(offset, LA(1).getEndOffset() - offset); >+ } > } >- // if we get this far, it means that we have not yet succeeded >- // try this now instead >- // assignmentExpression >- IASTExpression assignmentExpression = assignmentExpression(); >- if (inAggregateInitializer && skipTrivialExpressionsInAggregateInitializers) { >- if (!ASTQueries.canContainName(assignmentExpression)) >- return null; >- } >- IASTInitializerExpression result = createInitializerExpression(); >- result.setExpression(assignmentExpression); >- ((ASTNode) result).setOffsetAndLength( >- ((ASTNode) assignmentExpression).getOffset(), >- ((ASTNode) assignmentExpression).getLength()); >- return result; >+ // consume the closing brace > } > > protected ICASTDesignatedInitializer createDesignatorInitializer() { >@@ -260,102 +251,67 @@ > return new CASTInitializerExpression(); > } > >- protected List<IASTNode> designatorList() throws EndOfFileException, >- BacktrackException { >- // designated initializers for C >- List<IASTNode> designatorList= Collections.emptyList(); >- >- if (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { >- while (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { >- if (LT(1) == IToken.tDOT) { >+ private List<? extends ICASTDesignator> designatorList() throws EndOfFileException, BacktrackException { >+ final int lt1= LT(1); >+ if (lt1 == IToken.tDOT || lt1 == IToken.tLBRACKET) { >+ List<ICASTDesignator> designatorList= null; >+ while (true) { >+ switch (LT(1)) { >+ case IToken.tDOT: > int offset = consume().getOffset(); > IToken id = identifier(); >- ICASTFieldDesignator designator = createFieldDesignator(); >- ((ASTNode) designator).setOffsetAndLength(offset, id.getEndOffset() - offset); > IASTName n = createName(id); >- designator.setName(n); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >- designatorList.add(designator); >- } else if (LT(1) == IToken.tLBRACKET) { >- IToken mark = consume(); >- int offset = mark.getOffset(); >+ ICASTFieldDesignator fieldDesignator = createFieldDesignator(); >+ setRange(fieldDesignator, offset, id.getEndOffset()); >+ fieldDesignator.setName(n); >+ if (designatorList == null) >+ designatorList = new ArrayList<ICASTDesignator>(DEFAULT_DESIGNATOR_LIST_SIZE); >+ designatorList.add(fieldDesignator); >+ break; >+ >+ case IToken.tLBRACKET: >+ offset = consume().getOffset(); > IASTExpression constantExpression = expression(); >- if (LT(1) == IToken.tRBRACKET) { >- int lastOffset = consume().getEndOffset(); >+ if (supportGCCStyleDesignators && LT(1) == IToken.tELLIPSIS) { >+ consume(IToken.tELLIPSIS); >+ IASTExpression constantExpression2 = expression(); >+ int lastOffset = consume(IToken.tRBRACKET).getEndOffset(); >+ IGCCASTArrayRangeDesignator designator = createArrayRangeDesignator(); >+ setRange(designator, offset, lastOffset); >+ designator.setRangeFloor(constantExpression); >+ designator.setRangeCeiling(constantExpression2); >+ if (designatorList == null) >+ designatorList = new ArrayList<ICASTDesignator>(DEFAULT_DESIGNATOR_LIST_SIZE); >+ designatorList.add(designator); >+ } else { >+ int lastOffset = consume(IToken.tRBRACKET).getEndOffset(); > ICASTArrayDesignator designator = createArrayDesignator(); >- ((ASTNode) designator).setOffsetAndLength(offset, lastOffset - offset); >+ setRange(designator, offset, lastOffset); > designator.setSubscriptExpression(constantExpression); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >- designatorList.add(designator); >- continue; >- } >- backup(mark); >- if (supportGCCStyleDesignators) { >- int startOffset = consume(IToken.tLBRACKET).getOffset(); >- IASTExpression constantExpression1 = expression(); >- consume(IToken.tELLIPSIS); >- IASTExpression constantExpression2 = expression(); >- int lastOffset = consume(IToken.tRBRACKET).getEndOffset(); >- IGCCASTArrayRangeDesignator designator = createArrayRangeDesignator(); >- ((ASTNode) designator).setOffsetAndLength(startOffset, lastOffset - startOffset); >- designator.setRangeFloor(constantExpression1); >- designator.setRangeCeiling(constantExpression2); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >+ if (designatorList == null) >+ designatorList = new ArrayList<ICASTDesignator>(DEFAULT_DESIGNATOR_LIST_SIZE); > designatorList.add(designator); > } >- } else if (supportGCCStyleDesignators >- && LT(1) == IToken.tIDENTIFIER) { >- IToken identifier = identifier(); >- int lastOffset = consume(IToken.tCOLON).getEndOffset(); >- ICASTFieldDesignator designator = createFieldDesignator(); >- ((ASTNode) designator).setOffsetAndLength(identifier >- .getOffset(), lastOffset - identifier.getOffset()); >- IASTName n = createName(identifier); >- designator.setName(n); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >- designatorList.add(designator); >- } >- } >- } else { >- if (supportGCCStyleDesignators >- && (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tLBRACKET)) { >- >- if (LT(1) == IToken.tIDENTIFIER) { >- // fix for 84176: if reach identifier and it's not a designator then return empty designator list >- if (LT(2) != IToken.tCOLON) >- return designatorList; >- >- IToken identifier = identifier(); >- int lastOffset = consume(IToken.tCOLON).getEndOffset(); >- ICASTFieldDesignator designator = createFieldDesignator(); >- ((ASTNode) designator).setOffsetAndLength(identifier >- .getOffset(), lastOffset - identifier.getOffset()); >- IASTName n = createName(identifier); >- designator.setName(n); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >- designatorList.add(designator); >- } else if (LT(1) == IToken.tLBRACKET) { >- int startOffset = consume().getOffset(); >- IASTExpression constantExpression1 = expression(); >- consume(IToken.tELLIPSIS); >- IASTExpression constantExpression2 = expression(); >- int lastOffset = consume(IToken.tRBRACKET).getEndOffset(); >- IGCCASTArrayRangeDesignator designator = createArrayRangeDesignator(); >- ((ASTNode) designator).setOffsetAndLength(startOffset, lastOffset - startOffset); >- designator.setRangeFloor(constantExpression1); >- designator.setRangeCeiling(constantExpression2); >- if (designatorList == Collections.EMPTY_LIST) >- designatorList = new ArrayList<IASTNode>(DEFAULT_DESIGNATOR_LIST_SIZE); >- designatorList.add(designator); >+ break; >+ >+ default: >+ return designatorList; > } > } >- } >- return designatorList; >+ } >+ >+ // fix for 84176: if reach identifier and it's not a designator then return empty designator list >+ if (supportGCCStyleDesignators && lt1 == IToken.tIDENTIFIER && LT(2) == IToken.tCOLON) { >+ IToken identifier = identifier(); >+ int lastOffset = consume(IToken.tCOLON).getEndOffset(); >+ ICASTFieldDesignator designator = createFieldDesignator(); >+ ((ASTNode) designator).setOffsetAndLength(identifier.getOffset(), lastOffset - identifier.getOffset()); >+ IASTName n = createName(identifier); >+ designator.setName(n); >+ return Collections.singletonList(designator); >+ } >+ >+ return null; > } > > protected IGCCASTArrayRangeDesignator createArrayRangeDesignator() { >@@ -689,8 +645,7 @@ > if (t != null) { > consume(IToken.tRPAREN).getEndOffset(); > if (LT(1) == IToken.tLBRACE) { >- final List<IASTNode> emptyList = Collections.emptyList(); >- IASTInitializer i = cInitializerClause(emptyList, false); >+ IASTInitializer i = cInitializerClause(false); > firstExpression = buildTypeIdInitializerExpression(t, i, offset, calculateEndOffset(i)); > break; > } >#P org.eclipse.cdt.core.tests >Index: parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java,v >retrieving revision 1.70 >diff -u -r1.70 IndexBugsTests.java >--- parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java 10 Nov 2008 05:54:38 -0000 1.70 >+++ parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java 10 Nov 2008 14:44:02 -0000 >@@ -1550,4 +1550,21 @@ > } > } > >+ // struct s {int a;}; >+ // struct s x[]= {{.a=1,},{.a=2}}; >+ public void testReferencesInDesignators_Bug253690() throws Exception { >+ String code= getContentsForTest(1)[0]; >+ final IIndexManager indexManager = CCorePlugin.getIndexManager(); >+ IFile file= TestSourceReader.createFile(fCProject.getProject(), "test.c", code); >+ waitUntilFileIsIndexed(file, 4000); >+ fIndex.acquireReadLock(); >+ try { >+ IIndexBinding[] bindings = fIndex.findBindings("a".toCharArray(), false, IndexFilter.ALL_DECLARED, NPM); >+ assertEquals(1, bindings.length); >+ IIndexName[] refs = fIndex.findNames(bindings[0], IIndex.FIND_REFERENCES); >+ assertEquals(2, refs.length); >+ } finally { >+ fIndex.releaseReadLock(); >+ } >+ } > } >\ No newline at end of file
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 253690
:
116932
|
117176
|
117193
|
117194
|
117293
|
117297
| 117439