[Git][java-team/asm][upstream] New upstream version 9.8
Emmanuel Bourg (@ebourg)
gitlab at salsa.debian.org
Wed Apr 16 13:16:30 BST 2025
Emmanuel Bourg pushed to branch upstream at Debian Java Maintainers / asm
Commits:
6493817e by Emmanuel Bourg at 2025-04-16T14:14:18+02:00
New upstream version 9.8
- - - - -
10 changed files:
- asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Frame.java
- asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java
- asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java
- asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java
- asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java
- asm/src/main/java/org/objectweb/asm/ClassReader.java
- asm/src/main/java/org/objectweb/asm/MethodVisitor.java
- asm/src/main/java/org/objectweb/asm/Opcodes.java
- asm/src/test/java/org/objectweb/asm/ConstantsTest.java
- build.gradle
Changes:
=====================================
asm-analysis/src/main/java/org/objectweb/asm/tree/analysis/Frame.java
=====================================
@@ -402,7 +402,7 @@ public class Frame<V extends Value> {
break;
}
} else {
- push(value1);
+ push(interpreter.copyOperation(insn, value1));
push(interpreter.copyOperation(insn, value1));
break;
}
=====================================
asm-commons/src/test/java/org/objectweb/asm/commons/ClassRemapperTest.java
=====================================
@@ -34,11 +34,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Arrays;
import java.util.Locale;
+import java.util.Map;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
@@ -270,6 +272,56 @@ class ClassRemapperTest extends AsmTest {
assertEquals("demo", invokeDynamic.bsm.getName());
}
+ /** Tests that classes transformed with an empty ClassRemapper are unchanged. */
+ @ParameterizedTest
+ @MethodSource(ALL_CLASSES_AND_ALL_APIS)
+ void testEmptyClassRemapper_precompiledClass(
+ final PrecompiledClass classParameter, final Api apiParameter) {
+ byte[] classFile = classParameter.getBytes();
+ ClassReader classReader = new ClassReader(classFile);
+ ClassWriter classWriter = new ClassWriter(0);
+ ClassRemapper classRemapper =
+ newClassRemapper(apiParameter.value(), classWriter, new SimpleRemapper(Map.of()));
+
+ Executable accept =
+ () -> classReader.accept(classRemapper, new Attribute[] {new CodeComment()}, 0);
+
+ if (classParameter.isMoreRecentThan(apiParameter)) {
+ Exception exception = assertThrows(UnsupportedOperationException.class, accept);
+ assertTrue(exception.getMessage().matches(UNSUPPORTED_OPERATION_MESSAGE_PATTERN));
+ } else {
+ assertDoesNotThrow(accept);
+ assertEquals(new ClassFile(classFile), new ClassFile(classWriter.toByteArray()));
+ }
+ }
+
+ /** Tests that inner class names are unchanged with by an empty ClassRemapper. */
+ @Test
+ void testEmptyClassRemapper_innerClassNames() {
+ ClassWriter classFileWriter = new ClassWriter(0);
+ classFileWriter.visit(
+ Opcodes.V1_8,
+ Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
+ "Outer",
+ null,
+ "java/lang/Object",
+ null);
+ classFileWriter.visitInnerClass(
+ "Outer$$Inner",
+ "Outer",
+ "$Inner",
+ Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE);
+ classFileWriter.visitEnd();
+ byte[] classFile = classFileWriter.toByteArray();
+ ClassReader classReader = new ClassReader(classFile);
+ ClassWriter classWriter = new ClassWriter(0);
+ ClassRemapper classRemapper = new ClassRemapper(classWriter, new SimpleRemapper(Map.of()));
+
+ classReader.accept(classRemapper, new Attribute[] {new CodeComment()}, 0);
+
+ assertEquals(new ClassFile(classFile), new ClassFile(classWriter.toByteArray()));
+ }
+
/** Tests that classes transformed with a ClassRemapper can be loaded and instantiated. */
@ParameterizedTest
@MethodSource(ALL_CLASSES_AND_ALL_APIS)
=====================================
asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java
=====================================
@@ -114,6 +114,7 @@ public class ASMifier extends Printer {
classVersions.put(Opcodes.V22, "V22");
classVersions.put(Opcodes.V23, "V23");
classVersions.put(Opcodes.V24, "V24");
+ classVersions.put(Opcodes.V25, "V25");
CLASS_VERSIONS = Collections.unmodifiableMap(classVersions);
}
@@ -1474,24 +1475,24 @@ public class ASMifier extends Printer {
}
stringBuilder.append("})");
} else if (value instanceof Byte) {
- stringBuilder.append("new Byte((byte)").append(value).append(')');
+ stringBuilder.append("Byte.valueOf((byte)").append(value).append(')');
} else if (value instanceof Boolean) {
stringBuilder.append(((Boolean) value).booleanValue() ? "Boolean.TRUE" : "Boolean.FALSE");
} else if (value instanceof Short) {
- stringBuilder.append("new Short((short)").append(value).append(')');
+ stringBuilder.append("Short.valueOf((short)").append(value).append(')');
} else if (value instanceof Character) {
stringBuilder
- .append("new Character((char)")
+ .append("Character.valueOf((char)")
.append((int) ((Character) value).charValue())
.append(')');
} else if (value instanceof Integer) {
- stringBuilder.append("new Integer(").append(value).append(')');
+ stringBuilder.append("Integer.valueOf(").append(value).append(')');
} else if (value instanceof Float) {
- stringBuilder.append("new Float(\"").append(value).append("\")");
+ stringBuilder.append("Float.valueOf(\"").append(value).append("\")");
} else if (value instanceof Long) {
- stringBuilder.append("new Long(").append(value).append("L)");
+ stringBuilder.append("Long.valueOf(").append(value).append("L)");
} else if (value instanceof Double) {
- stringBuilder.append("new Double(\"").append(value).append("\")");
+ stringBuilder.append("Double.valueOf(\"").append(value).append("\")");
} else if (value instanceof byte[]) {
byte[] byteArray = (byte[]) value;
stringBuilder.append("new byte[] {");
=====================================
asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java
=====================================
@@ -851,6 +851,11 @@ public class CheckMethodAdapter extends MethodVisitor {
if (keys == null || labels == null || keys.length != labels.length) {
throw new IllegalArgumentException("There must be the same number of keys and labels");
}
+ for (int i = 1; i < keys.length; ++i) {
+ if (keys[i] < keys[i - 1]) {
+ throw new IllegalArgumentException("The keys must be sorted in increasing order");
+ }
+ }
for (int i = 0; i < labels.length; ++i) {
checkLabel(labels[i], /* checkVisited= */ false, "label at index " + i);
}
=====================================
asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java
=====================================
@@ -776,6 +776,21 @@ class CheckMethodAdapterTest extends AsmTest implements Opcodes {
assertEquals("There must be the same number of keys and labels", exception.getMessage());
}
+ @Test
+ void testVisitLookupSwitchInsn_nonSortedKeys() {
+ Label label0 = new Label();
+ Label label1 = new Label();
+ checkMethodAdapter.visitCode();
+
+ Executable visitLookupSwitchInsn =
+ () ->
+ checkMethodAdapter.visitLookupSwitchInsn(
+ new Label(), new int[] {2, 1}, new Label[] {label0, label1});
+
+ Exception exception = assertThrows(IllegalArgumentException.class, visitLookupSwitchInsn);
+ assertEquals("The keys must be sorted in increasing order", exception.getMessage());
+ }
+
@Test
void testVisitMultiANewArrayInsn_invalidDescriptor() {
checkMethodAdapter.visitCode();
=====================================
asm/src/main/java/org/objectweb/asm/ClassReader.java
=====================================
@@ -195,7 +195,7 @@ public class ClassReader {
this.b = classFileBuffer;
// Check the class' major_version. This field is after the magic and minor_version fields, which
// use 4 and 2 bytes respectively.
- if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V24) {
+ if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V25) {
throw new IllegalArgumentException(
"Unsupported class file major version " + readShort(classFileOffset + 6));
}
=====================================
asm/src/main/java/org/objectweb/asm/MethodVisitor.java
=====================================
@@ -596,7 +596,7 @@ public abstract class MethodVisitor {
* Visits a LOOKUPSWITCH instruction.
*
* @param dflt beginning of the default handler block.
- * @param keys the values of the keys.
+ * @param keys the values of the keys. Keys must be sorted in increasing order.
* @param labels beginnings of the handler blocks. {@code labels[i]} is the beginning of the
* handler block for the {@code keys[i]} key.
*/
=====================================
asm/src/main/java/org/objectweb/asm/Opcodes.java
=====================================
@@ -290,6 +290,7 @@ public interface Opcodes {
int V22 = 0 << 16 | 66;
int V23 = 0 << 16 | 67;
int V24 = 0 << 16 | 68;
+ int V25 = 0 << 16 | 69;
/**
* Version flag indicating that the class is using 'preview' features.
=====================================
asm/src/test/java/org/objectweb/asm/ConstantsTest.java
=====================================
@@ -257,6 +257,7 @@ class ConstantsTest {
case "V22":
case "V23":
case "V24":
+ case "V25":
return ConstantType.CLASS_VERSION;
case "ACC_PUBLIC":
case "ACC_PRIVATE":
=====================================
build.gradle
=====================================
@@ -47,7 +47,7 @@ dependencies {
allprojects {
group = 'org.ow2.asm'
- version = '9.7.1' + (rootProject.hasProperty('release') ? '' : '-SNAPSHOT')
+ version = '9.8' + (rootProject.hasProperty('release') ? '' : '-SNAPSHOT')
}
subprojects {
View it on GitLab: https://salsa.debian.org/java-team/asm/-/commit/6493817e349fee5cfe438e57fe7e171f092f7059
--
View it on GitLab: https://salsa.debian.org/java-team/asm/-/commit/6493817e349fee5cfe438e57fe7e171f092f7059
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20250416/cd557b74/attachment.htm>
More information about the pkg-java-commits
mailing list