You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by eb...@apache.org on 2015/02/19 10:55:24 UTC
svn commit: r1660822 - in /commons/proper/bcel/trunk: RELEASE-NOTES.txt
src/changes/changes.xml src/main/java/org/apache/bcel/classfile/Utility.java
src/test/java/org/apache/bcel/classfile/
src/test/java/org/apache/bcel/classfile/UtilityTestCase.java
Author: ebourg
Date: Thu Feb 19 09:55:24 2015
New Revision: 1660822
URL: http://svn.apache.org/r1660822
Log:
Add support for TypeVariables to Utility.signatureToString(). Thanks to Mark Roberts (BCEL-197)
Added:
commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/
commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java (with props)
Modified:
commons/proper/bcel/trunk/RELEASE-NOTES.txt
commons/proper/bcel/trunk/src/changes/changes.xml
commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java
Modified: commons/proper/bcel/trunk/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/RELEASE-NOTES.txt?rev=1660822&r1=1660821&r2=1660822&view=diff
==============================================================================
--- commons/proper/bcel/trunk/RELEASE-NOTES.txt (original)
+++ commons/proper/bcel/trunk/RELEASE-NOTES.txt Thu Feb 19 09:55:24 2015
@@ -97,6 +97,7 @@ Bug fixes from 5.2
[BCEL-177] MethodParameters should read 1 byte not two for parameter count
[BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams
[BCEL-194] LocalVariableGen hashCode() function is incorrrect
+[BCEL-197] Add support for TypeVariables to Utility.signatureToString()
Feedback
Modified: commons/proper/bcel/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/changes/changes.xml?rev=1660822&r1=1660821&r2=1660822&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/changes/changes.xml (original)
+++ commons/proper/bcel/trunk/src/changes/changes.xml Thu Feb 19 09:55:24 2015
@@ -63,6 +63,10 @@ The <action> type attribute can be add,u
<body>
<release version="6.0" date="TBA" description="Major release with Java 7 and 8 support">
+ <action issue="BCEL-197" type="fix" due-to="Mark Roberts">
+ Utility.signatureToString() no longer throws a ClassFormatException on TypeVariables
+ found in generic signatures.
+ </action>
<action issue="BCEL-194" type="fix" due-to="Mark Roberts">
Removed the 'index' variable from the LocalVariableGen's hash code.
</action>
Modified: commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java?rev=1660822&r1=1660821&r2=1660822&view=diff
==============================================================================
--- commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java (original)
+++ commons/proper/bcel/trunk/src/main/java/org/apache/bcel/classfile/Utility.java Thu Feb 19 09:55:24 2015
@@ -823,15 +823,72 @@ public abstract class Utility {
return "int";
case 'J':
return "long";
- case 'L': { // Full class name
+ case 'T': { // TypeVariableSignature
int index = signature.indexOf(';'); // Look for closing `;'
if (index < 0) {
throw new ClassFormatException("Invalid signature: " + signature);
}
//corrected concurrent private static field acess
- wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
+ wrap(consumed_chars, index + 1); // "Tblabla;" `T' and `;' are removed
return compactClassName(signature.substring(1, index), chopit);
}
+ case 'L': { // Full class name
+ int index = signature.indexOf(';'); // Look for closing `;'
+ if (index < 0) {
+ throw new ClassFormatException("Invalid signature: " + signature);
+ }
+ // check to see if there are any TypeArguments
+ int bracketIndex = signature.substring(0, index).indexOf('<');
+ if (bracketIndex < 0) {
+ // just a class identifier
+ wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed
+ return compactClassName(signature.substring(1, index), chopit);
+ }
+
+ // we have TypeArguments; build up partial result
+ // as we recurse for each TypeArgument
+ String type = compactClassName(signature.substring(1, bracketIndex), chopit) + "<";
+ int consumed_chars = bracketIndex + 1; // Shadows global var
+
+ // check for wildcards
+ if (signature.charAt(consumed_chars) == '+') {
+ type = type + "? extends ";
+ consumed_chars = ++consumed_chars;
+ } else if (signature.charAt(consumed_chars) == '-') {
+ type = type + "? super ";
+ consumed_chars = ++consumed_chars;
+ } else if (signature.charAt(consumed_chars) == '*') {
+ // must be at end of signature
+ if (signature.charAt(consumed_chars + 1) != '>') {
+ throw new ClassFormatException("Invalid signature: " + signature);
+ }
+ if (signature.charAt(consumed_chars + 2) != ';') {
+ throw new ClassFormatException("Invalid signature: " + signature);
+ }
+ wrap(Utility.consumed_chars, consumed_chars + 3); // remove final "*>;"
+ return type + "?>...";
+ }
+
+ // get the first TypeArgument
+ type = type + signatureToString(signature.substring(consumed_chars), chopit);
+ // update our consumed count by the number of characters the for type argument
+ consumed_chars = unwrap(Utility.consumed_chars) + consumed_chars;
+ wrap(Utility.consumed_chars, consumed_chars);
+
+ // are there more TypeArguments?
+ while (signature.charAt(consumed_chars) != '>') {
+ type = type + ", " + signatureToString(signature.substring(consumed_chars), chopit);
+ // update our consumed count by the number of characters the for type argument
+ consumed_chars = unwrap(Utility.consumed_chars) + consumed_chars;
+ wrap(Utility.consumed_chars, consumed_chars);
+ }
+
+ if (signature.charAt(consumed_chars + 1) != ';') {
+ throw new ClassFormatException("Invalid signature: " + signature);
+ }
+ wrap(Utility.consumed_chars, consumed_chars + 2); // remove final ">;"
+ return type + ">";
+ }
case 'S':
return "short";
case 'Z':
Added: commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java?rev=1660822&view=auto
==============================================================================
--- commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java (added)
+++ commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java Thu Feb 19 09:55:24 2015
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.bcel.classfile;
+
+import junit.framework.TestCase;
+
+public class UtilityTestCase extends TestCase {
+
+ public void testSignatureToStringWithGenerics() throws Exception {
+ assertEquals("generic signature", "java.util.Map<X, java.util.List<Y>>", Utility.signatureToString("Ljava/util/Map<TX;Ljava/util/List<TY;>;>;"));
+ assertEquals("generic signature", "java.util.Set<? extends java.nio.file.OpenOption>", Utility.signatureToString("Ljava/util/Set<+Ljava/nio/file/OpenOption;>;"));
+ assertEquals("generic signature", "java.nio.file.attribute.FileAttribute<?>...[]", Utility.signatureToString("[Ljava/nio/file/attribute/FileAttribute<*>;"));
+ }
+}
Propchange: commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/bcel/trunk/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL