From 7877db6d693f3ebcb5350f54d5f376779d7ce467 Mon Sep 17 00:00:00 2001 From: James Hamilton Date: Tue, 20 Aug 2024 11:46:22 +0200 Subject: [PATCH] Update maximum supported Java class version to 67.65535 (Java 23) --- .../classfile/JavaVersionConstants.java | 1 + .../proguard/classfile/VersionConstants.java | 6 +- .../proguard/classfile/util/ClassUtil.java | 149 +++++++----------- .../proguard/classfile/util/ClassUtilTest.kt | 19 +++ docs/md/releasenotes.md | 4 + 5 files changed, 86 insertions(+), 93 deletions(-) diff --git a/base/src/main/java/proguard/classfile/JavaVersionConstants.java b/base/src/main/java/proguard/classfile/JavaVersionConstants.java index 07e2d7c7e..38978d56b 100644 --- a/base/src/main/java/proguard/classfile/JavaVersionConstants.java +++ b/base/src/main/java/proguard/classfile/JavaVersionConstants.java @@ -52,4 +52,5 @@ public class JavaVersionConstants { public static final String CLASS_VERSION_20 = "20"; public static final String CLASS_VERSION_21 = "21"; public static final String CLASS_VERSION_22 = "22"; + public static final String CLASS_VERSION_23 = "23"; } diff --git a/base/src/main/java/proguard/classfile/VersionConstants.java b/base/src/main/java/proguard/classfile/VersionConstants.java index a62c76c2d..bbbecb138 100644 --- a/base/src/main/java/proguard/classfile/VersionConstants.java +++ b/base/src/main/java/proguard/classfile/VersionConstants.java @@ -69,6 +69,8 @@ public class VersionConstants { public static final int CLASS_VERSION_21_MINOR = 0; public static final int CLASS_VERSION_22_MAJOR = 66; public static final int CLASS_VERSION_22_MINOR = 0; + public static final int CLASS_VERSION_23_MAJOR = 67; + public static final int CLASS_VERSION_23_MINOR = 0; public static final int PREVIEW_VERSION_MINOR = 65535; public static final int CLASS_VERSION_1_0 = @@ -115,7 +117,9 @@ public class VersionConstants { (CLASS_VERSION_21_MAJOR << 16) | CLASS_VERSION_21_MINOR; public static final int CLASS_VERSION_22 = (CLASS_VERSION_22_MAJOR << 16) | CLASS_VERSION_22_MINOR; + public static final int CLASS_VERSION_23 = + (CLASS_VERSION_23_MAJOR << 16) | CLASS_VERSION_23_MINOR; public static final int MAX_SUPPORTED_VERSION = - (CLASS_VERSION_22_MAJOR << 16) | PREVIEW_VERSION_MINOR; + (CLASS_VERSION_23_MAJOR << 16) | PREVIEW_VERSION_MINOR; } diff --git a/base/src/main/java/proguard/classfile/util/ClassUtil.java b/base/src/main/java/proguard/classfile/util/ClassUtil.java index a2a77c898..06aefb701 100644 --- a/base/src/main/java/proguard/classfile/util/ClassUtil.java +++ b/base/src/main/java/proguard/classfile/util/ClassUtil.java @@ -94,98 +94,61 @@ public static int internalMinorClassVersion(int internalClassVersion) { * @return the internal class version number. */ public static int internalClassVersion(String externalClassVersion) { - return externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_0) - || externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_1) - ? VersionConstants.CLASS_VERSION_1_0 - : externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_2) - ? VersionConstants.CLASS_VERSION_1_2 - : externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_3) - ? VersionConstants.CLASS_VERSION_1_3 - : externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_4) - ? VersionConstants.CLASS_VERSION_1_4 - : externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_5_ALIAS) - || externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_5) - ? VersionConstants.CLASS_VERSION_1_5 - : externalClassVersion.equals(JavaVersionConstants.CLASS_VERSION_1_6_ALIAS) - || externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_6) - ? VersionConstants.CLASS_VERSION_1_6 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_7_ALIAS) - || externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_7) - ? VersionConstants.CLASS_VERSION_1_7 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_8_ALIAS) - || externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_8) - ? VersionConstants.CLASS_VERSION_1_8 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_9_ALIAS) - || externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_1_9) - ? VersionConstants.CLASS_VERSION_1_9 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_10) - ? VersionConstants.CLASS_VERSION_10 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_11) - ? VersionConstants.CLASS_VERSION_11 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_12) - ? VersionConstants.CLASS_VERSION_12 - : externalClassVersion.equals( - JavaVersionConstants.CLASS_VERSION_13) - ? VersionConstants.CLASS_VERSION_13 - : externalClassVersion.equals( - JavaVersionConstants - .CLASS_VERSION_14) - ? VersionConstants.CLASS_VERSION_14 - : externalClassVersion.equals( - JavaVersionConstants - .CLASS_VERSION_15) - ? VersionConstants.CLASS_VERSION_15 - : externalClassVersion.equals( - JavaVersionConstants - .CLASS_VERSION_16) - ? VersionConstants - .CLASS_VERSION_16 - : externalClassVersion.equals( - JavaVersionConstants - .CLASS_VERSION_17) - ? VersionConstants - .CLASS_VERSION_17 - : externalClassVersion - .equals( - JavaVersionConstants - .CLASS_VERSION_18) - ? VersionConstants - .CLASS_VERSION_18 - : externalClassVersion - .equals( - JavaVersionConstants - .CLASS_VERSION_19) - ? VersionConstants - .CLASS_VERSION_19 - : externalClassVersion - .equals( - JavaVersionConstants - .CLASS_VERSION_20) - ? VersionConstants - .CLASS_VERSION_20 - : externalClassVersion - .equals( - JavaVersionConstants - .CLASS_VERSION_21) - ? VersionConstants - .CLASS_VERSION_21 - : externalClassVersion - .equals( - JavaVersionConstants - .CLASS_VERSION_22) - ? VersionConstants - .CLASS_VERSION_22 - : 0; + switch (externalClassVersion) { + case JavaVersionConstants.CLASS_VERSION_1_0: + case JavaVersionConstants.CLASS_VERSION_1_1: + return VersionConstants.CLASS_VERSION_1_0; + case JavaVersionConstants.CLASS_VERSION_1_2: + return VersionConstants.CLASS_VERSION_1_2; + case JavaVersionConstants.CLASS_VERSION_1_3: + return VersionConstants.CLASS_VERSION_1_3; + case JavaVersionConstants.CLASS_VERSION_1_4: + return VersionConstants.CLASS_VERSION_1_4; + case JavaVersionConstants.CLASS_VERSION_1_5_ALIAS: + case JavaVersionConstants.CLASS_VERSION_1_5: + return VersionConstants.CLASS_VERSION_1_5; + case JavaVersionConstants.CLASS_VERSION_1_6_ALIAS: + case JavaVersionConstants.CLASS_VERSION_1_6: + return VersionConstants.CLASS_VERSION_1_6; + case JavaVersionConstants.CLASS_VERSION_1_7_ALIAS: + case JavaVersionConstants.CLASS_VERSION_1_7: + return VersionConstants.CLASS_VERSION_1_7; + case JavaVersionConstants.CLASS_VERSION_1_8_ALIAS: + case JavaVersionConstants.CLASS_VERSION_1_8: + return VersionConstants.CLASS_VERSION_1_8; + case JavaVersionConstants.CLASS_VERSION_1_9_ALIAS: + case JavaVersionConstants.CLASS_VERSION_1_9: + return VersionConstants.CLASS_VERSION_1_9; + case JavaVersionConstants.CLASS_VERSION_10: + return VersionConstants.CLASS_VERSION_10; + case JavaVersionConstants.CLASS_VERSION_11: + return VersionConstants.CLASS_VERSION_11; + case JavaVersionConstants.CLASS_VERSION_12: + return VersionConstants.CLASS_VERSION_12; + case JavaVersionConstants.CLASS_VERSION_13: + return VersionConstants.CLASS_VERSION_13; + case JavaVersionConstants.CLASS_VERSION_14: + return VersionConstants.CLASS_VERSION_14; + case JavaVersionConstants.CLASS_VERSION_15: + return VersionConstants.CLASS_VERSION_15; + case JavaVersionConstants.CLASS_VERSION_16: + return VersionConstants.CLASS_VERSION_16; + case JavaVersionConstants.CLASS_VERSION_17: + return VersionConstants.CLASS_VERSION_17; + case JavaVersionConstants.CLASS_VERSION_18: + return VersionConstants.CLASS_VERSION_18; + case JavaVersionConstants.CLASS_VERSION_19: + return VersionConstants.CLASS_VERSION_19; + case JavaVersionConstants.CLASS_VERSION_20: + return VersionConstants.CLASS_VERSION_20; + case JavaVersionConstants.CLASS_VERSION_21: + return VersionConstants.CLASS_VERSION_21; + case JavaVersionConstants.CLASS_VERSION_22: + return VersionConstants.CLASS_VERSION_22; + case JavaVersionConstants.CLASS_VERSION_23: + return VersionConstants.CLASS_VERSION_23; + } + return 0; } /** @@ -240,6 +203,8 @@ public static String externalClassVersion(int internalClassVersion) { return JavaVersionConstants.CLASS_VERSION_21; case VersionConstants.CLASS_VERSION_22: return JavaVersionConstants.CLASS_VERSION_22; + case VersionConstants.CLASS_VERSION_23: + return JavaVersionConstants.CLASS_VERSION_23; default: return null; } diff --git a/base/src/test/kotlin/proguard/classfile/util/ClassUtilTest.kt b/base/src/test/kotlin/proguard/classfile/util/ClassUtilTest.kt index 717c295bb..bf68125ba 100644 --- a/base/src/test/kotlin/proguard/classfile/util/ClassUtilTest.kt +++ b/base/src/test/kotlin/proguard/classfile/util/ClassUtilTest.kt @@ -29,6 +29,25 @@ class ClassUtilTest : BehaviorSpec({ } } + Given("Class file version 23") { + val version = 67 shl 16 + Then("The external version should be 23") { + externalClassVersion(version) shouldBe "23" + } + + And("Given a class file with version 23") { + val programClass = ClassBuilder( + version, + PUBLIC, + "Test", + "java/lang/Object", + ).programClass + Then("The internal version should be 23") { + programClass.u4version shouldBe internalClassVersion("23") + } + } + } + Given("A valid magic number") { Then("No exception should be thrown") { shouldNotThrowAny { diff --git a/docs/md/releasenotes.md b/docs/md/releasenotes.md index b63b38a5c..4fcd0fb55 100644 --- a/docs/md/releasenotes.md +++ b/docs/md/releasenotes.md @@ -1,5 +1,9 @@ ## Version 9.1.6 +### Java support + +- Update maximum supported Java class version to 67.65535 (Java 23). + ### API changes - Make `CallGraph` reconstruction/traversal methods generic in that they now take a `Set` to determine when to stop exploration