[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