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 162425 Details for
Bug 209479
infinite loop in BindingKey when signatures are invalid
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Proposed fix + regression test
patch_209479.txt (text/plain), 8.70 KB, created by
Olivier Thomann
on 2010-03-18 11:35:46 EDT
(
hide
)
Description:
Proposed fix + regression test
Filename:
MIME Type:
Creator:
Olivier Thomann
Created:
2010-03-18 11:35:46 EDT
Size:
8.70 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jdt.core >Index: model/org/eclipse/jdt/internal/core/util/BindingKeyParser.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/BindingKeyParser.java,v >retrieving revision 1.40 >diff -u -r1.40 BindingKeyParser.java >--- model/org/eclipse/jdt/internal/core/util/BindingKeyParser.java 7 Mar 2009 00:58:55 -0000 1.40 >+++ model/org/eclipse/jdt/internal/core/util/BindingKeyParser.java 18 Mar 2010 15:35:08 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2005, 2009 IBM Corporation and others. >+ * Copyright (c) 2005, 2010 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -444,6 +444,8 @@ > > private boolean hasTypeName = true; > >+ private boolean isMalformed; >+ > public BindingKeyParser(BindingKeyParser parser) { > this(""); //$NON-NLS-1$ > this.scanner = parser.scanner; >@@ -577,7 +579,7 @@ > } > > public void malformedKey() { >- // default is to do nothing >+ this.isMalformed = true; > } > > public BindingKeyParser newParser() { >@@ -684,38 +686,38 @@ > consumeBaseType(this.scanner.getTokenSource()); > this.hasTypeName = false; > break; >- case Scanner.ARRAY: >- this.keyStart = this.scanner.start; >- consumeArrayDimension(this.scanner.getTokenSource()); >- switch (this.scanner.nextToken()) { >- case Scanner.TYPE: >- consumeFullyQualifiedName(this.scanner.getTokenSource()); >- break; >- case Scanner.BASE_TYPE: >- consumeBaseType(this.scanner.getTokenSource()); >- this.hasTypeName = false; >- break; >- default: >+ case Scanner.ARRAY: >+ this.keyStart = this.scanner.start; >+ consumeArrayDimension(this.scanner.getTokenSource()); >+ switch (this.scanner.nextToken()) { >+ case Scanner.TYPE: >+ consumeFullyQualifiedName(this.scanner.getTokenSource()); >+ break; >+ case Scanner.BASE_TYPE: >+ consumeBaseType(this.scanner.getTokenSource()); >+ this.hasTypeName = false; >+ break; >+ default: > malformedKey(); > return; > } > break; > default: >- malformedKey(); >+ malformedKey(); > return; > } > } > > private void parseParameterizedMethod() { > this.scanner.skipParametersStart(); >- while (!this.scanner.isAtParametersEnd()) { >+ while (!this.scanner.isAtParametersEnd() && !this.isMalformed) { > parseTypeArgument(); > } > consumeParameterizedGenericMethod(); > } > > private void parseGenericType() { >- while (!this.scanner.isAtParametersEnd()) { >+ while (!this.scanner.isAtParametersEnd() && !this.isMalformed) { > if (this.scanner.nextToken() != Scanner.TYPE) { > malformedKey(); > return; >@@ -729,17 +731,17 @@ > if (!this.scanner.isAtMemberTypeStart() || this.scanner.nextToken() != Scanner.TYPE) > return; > char[] typeName = this.scanner.getTokenSource(); >- if (Character.isDigit(typeName[0])) { >- // anonymous or local type >- int nextToken = Scanner.TYPE; >- while (this.scanner.isAtMemberTypeStart()) >- nextToken = this.scanner.nextToken(); >- typeName = nextToken == Scanner.END ? this.scanner.source : CharOperation.subarray(this.scanner.source, this.keyStart, this.scanner.index+1); >- consumeLocalType(typeName); >- } else { >+ if (Character.isDigit(typeName[0])) { >+ // anonymous or local type >+ int nextToken = Scanner.TYPE; >+ while (this.scanner.isAtMemberTypeStart() && !this.isMalformed) >+ nextToken = this.scanner.nextToken(); >+ typeName = nextToken == Scanner.END ? this.scanner.source : CharOperation.subarray(this.scanner.source, this.keyStart, this.scanner.index+1); >+ consumeLocalType(typeName); >+ } else { > consumeMemberType(typeName); > parseInnerType(); >- } >+ } > } > > private void parseLocalVariable() { >@@ -792,16 +794,17 @@ > parser.parse(); > consumeParser(parser); > consumeAnnotation(); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > > private void parseCapture() { > if (this.scanner.nextToken() != Scanner.CAPTURE) return; >- parseCaptureWildcard(); >+ parseCaptureWildcard(); > if (this.scanner.nextToken() != Scanner.TYPE) { >- malformedKey(); >+ malformedKey(); > return; >- } >+ } > char[] positionChars = this.scanner.getTokenSource(); > int position = Integer.parseInt(new String(positionChars)); > consumeCapture(position); >@@ -817,6 +820,7 @@ > BindingKeyParser parser = newParser(); > parser.parse(); > consumeParser(parser); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > >@@ -832,19 +836,20 @@ > * See bug 264443 > */ > int token = this.scanner.token; >- while (this.scanner.isAtThrownStart()) { >+ while (this.scanner.isAtThrownStart() && !this.isMalformed) { > this.scanner.skipThrownStart(); > BindingKeyParser parser = newParser(); > parser.parse(); > consumeParser(parser); > consumeException(); >+ this.isMalformed = parser.isMalformed; > } > this.scanner.token = token; > } > > private void parseParameterizedType(char[] typeName, boolean isRaw) { > if (!isRaw) { >- while (!this.scanner.isAtParametersEnd()) { >+ while (!this.scanner.isAtParametersEnd() && !this.isMalformed) { > parseTypeArgument(); > } > } >@@ -886,6 +891,7 @@ > BindingKeyParser parser = newParser(); > parser.parse(); > consumeParser(parser); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > >@@ -903,6 +909,7 @@ > BindingKeyParser parser = newParser(); > parser.parse(); > consumeParser(parser); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > >@@ -917,6 +924,7 @@ > parser.parse(); > consumeParser(parser); > consumeTypeWithCapture(); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > >@@ -942,30 +950,30 @@ > private void parseWildcard() { > parseWildcardRank(); > if (this.scanner.nextToken() != Scanner.WILDCARD) return; >- char[] source = this.scanner.getTokenSource(); >- if (source.length == 0) { >- malformedKey(); >- return; >- } >- int kind = -1; >- switch (source[0]) { >- case '*': >- kind = Wildcard.UNBOUND; >- break; >- case '+': >- kind = Wildcard.EXTENDS; >- break; >- case '-': >- kind = Wildcard.SUPER; >- break; >- } >- if (kind == -1) { >- malformedKey(); >- return; >- } >- if (kind != Wildcard.UNBOUND) >- parseWildcardBound(); >- consumeWildCard(kind); >+ char[] source = this.scanner.getTokenSource(); >+ if (source.length == 0) { >+ malformedKey(); >+ return; >+ } >+ int kind = -1; >+ switch (source[0]) { >+ case '*': >+ kind = Wildcard.UNBOUND; >+ break; >+ case '+': >+ kind = Wildcard.EXTENDS; >+ break; >+ case '-': >+ kind = Wildcard.SUPER; >+ break; >+ } >+ if (kind == -1) { >+ malformedKey(); >+ return; >+ } >+ if (kind != Wildcard.UNBOUND) >+ parseWildcardBound(); >+ consumeWildCard(kind); > } > > private void parseWildcardRank() { >@@ -985,6 +993,7 @@ > BindingKeyParser parser = newParser(); > parser.parse(); > consumeParser(parser); >+ this.isMalformed = parser.isMalformed; > this.scanner.token = token; > } > >#P org.eclipse.jdt.core.tests.model >Index: src/org/eclipse/jdt/core/tests/model/BindingKeyTests.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/BindingKeyTests.java,v >retrieving revision 1.42 >diff -u -r1.42 BindingKeyTests.java >--- src/org/eclipse/jdt/core/tests/model/BindingKeyTests.java 28 Apr 2009 17:46:10 -0000 1.42 >+++ src/org/eclipse/jdt/core/tests/model/BindingKeyTests.java 18 Mar 2010 15:35:08 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2005, 2009 IBM Corporation and others. >+ * Copyright (c) 2005, 2010 IBM Corporation and others. > * All rights reserved. This program and the accompanying materials > * are made available under the terms of the Eclipse Public License v1.0 > * which accompanies this distribution, and is available at >@@ -621,4 +621,11 @@ > "LX;&LX~Box<!LX~Box;{0}*232;!LX~Box;{1}*232;>;.value)!LX~Box;{0}*232;" > ); > } >+ >+ /* >+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=209479 >+ */ >+ public void test055() { >+ assertFalse("Should not be a raw type", new BindingKey("Ltest/ZZ<Ljava/lang/Object>;").isRawType()); >+ } > }
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 209479
: 162425