You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by be...@apache.org on 2026/05/26 05:34:47 UTC
(tapestry-5) 02/02: TAP5-2830: Automate ASM vendoring, update to 9.9.1
This is an automated email from the ASF dual-hosted git repository.
benweidig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit e873e175d62d4aa00c34e966792123ca3b158642
Author: Ben Weidig <be...@netzgut.net>
AuthorDate: Tue May 26 07:33:15 2026 +0200
TAP5-2830: Automate ASM vendoring, update to 9.9.1
---
justfile | 4 +
.../{LICENSE-ASM-9_2.txt => LICENSE-ASM_9_9_1.txt} | 0
plastic/NOTICE.txt | 4 +-
.../tapestry5/internal/plastic/asm/Attribute.java | 3 +-
.../internal/plastic/asm/ClassReader.java | 5 +-
.../internal/plastic/asm/ClassWriter.java | 2 +-
.../tapestry5/internal/plastic/asm/Constants.java | 6 +-
.../tapestry5/internal/plastic/asm/Handle.java | 2 +-
.../internal/plastic/asm/MethodVisitor.java | 2 +-
.../tapestry5/internal/plastic/asm/Opcodes.java | 3 +-
.../plastic/asm/commons/AnnotationRemapper.java | 6 +-
.../plastic/asm/commons/ClassRemapper.java | 2 +-
.../plastic/asm/commons/FieldRemapper.java | 2 +-
.../plastic/asm/commons/InstructionAdapter.java | 6 +-
.../plastic/asm/commons/MethodRemapper.java | 2 +-
.../asm/commons/RecordComponentRemapper.java | 2 +-
.../internal/plastic/asm/commons/Remapper.java | 128 ++++++++++++++++++--
.../plastic/asm/commons/SimpleRemapper.java | 15 ++-
.../internal/plastic/asm/commons/package.html | 2 +-
.../tapestry5/internal/plastic/asm/package.html | 28 ++---
.../internal/plastic/asm/signature/package.html | 2 +-
.../plastic/asm/tree/analysis/package.html | 2 +-
.../internal/plastic/asm/tree/package.html | 2 +-
.../plastic/asm/util/CheckMethodAdapter.java | 7 +-
.../internal/plastic/asm/util/Printer.java | 2 +-
.../internal/plastic/asm/util/Textifier.java | 8 +-
.../internal/plastic/asm/util/package.html | 2 +-
.../apache/tapestry5/plastic/PlasticConstants.java | 2 +-
plastic/vendor-asm.sh | 130 +++++++++++++++++++++
29 files changed, 321 insertions(+), 60 deletions(-)
diff --git a/justfile b/justfile
index bee48c574..5eec21126 100644
--- a/justfile
+++ b/justfile
@@ -55,3 +55,7 @@ clean-build:
# Compiles and generates all JavaScript files from CoffeeScript
generate-javascript:
./gradlew tapestry-core:compileCoffeeScript tapestry-core:compileProcessedCoffeeScript tapestry-core:compileTestCoffeeScript
+
+# Vendors ASM based on Git tag, no tag lists the available ones
+vendor-asm tag="":
+ ./plastic/vendor-asm.sh {{tag}}
diff --git a/plastic/LICENSE-ASM-9_2.txt b/plastic/LICENSE-ASM_9_9_1.txt
old mode 100755
new mode 100644
similarity index 100%
rename from plastic/LICENSE-ASM-9_2.txt
rename to plastic/LICENSE-ASM_9_9_1.txt
diff --git a/plastic/NOTICE.txt b/plastic/NOTICE.txt
index beec8e08f..9718bb6e2 100644
--- a/plastic/NOTICE.txt
+++ b/plastic/NOTICE.txt
@@ -1,6 +1,6 @@
This product includes software developed by
The Apache Software Foundation (http://www.apache.org/).
-This product imports and repackages ASM 5.0.1 code which is
+This product imports and repackages ASM 9.9.1 code which is
released under a BSD style License
-http://asm.ow2.org/license.html
+https://asm.ow2.io/license.html
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
index f43940e23..85dcfd0e2 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Attribute.java
@@ -95,7 +95,7 @@ public class Attribute {
* a Code attribute that contains labels.
* @deprecated no longer used by ASM.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected Label[] getLabels() {
return new Label[0];
}
@@ -174,6 +174,7 @@ public class Attribute {
* ClassReader overrides {@link ClassReader#readLabel}. Hence {@link #read(ClassReader, int, int,
* char[], int, Label[])} must not manually create {@link Label} instances.
*
+ * @param classReader the class that contains the attribute to be read.
* @param bytecodeOffset a bytecode offset in a method.
* @param labels the already created labels, indexed by their offset. If a label already exists
* for bytecodeOffset this method does not create a new one. Otherwise it stores the new label
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
index c6da5be30..12b1113c4 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassReader.java
@@ -100,7 +100,7 @@ public class ClassReader {
* @deprecated Use {@link #readByte(int)} and the other read methods instead. This field will
* eventually be deleted.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
// DontCheck(MemberName): can't be renamed (for backward binary compatibility).
public final byte[] b;
@@ -3539,6 +3539,9 @@ public class ClassReader {
final char[] charBuffer,
final int codeAttributeOffset,
final Label[] labels) {
+ if (length > classFileBuffer.length - offset) {
+ throw new IllegalArgumentException();
+ }
for (Attribute attributePrototype : attributePrototypes) {
if (attributePrototype.type.equals(type)) {
return attributePrototype.read(
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
index 7b9d94928..7af51d386 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ClassWriter.java
@@ -897,7 +897,7 @@ public class ClassWriter extends ClassVisitor {
* @deprecated this method is superseded by {@link #newHandle(int, String, String, String,
* boolean)}.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public int newHandle(
final int tag, final String owner, final String name, final String descriptor) {
return newHandle(tag, owner, name, descriptor, tag == Opcodes.H_INVOKEINTERFACE);
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
index ee9ed838d..bf9361d5b 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
@@ -191,15 +191,15 @@ final class Constants {
}
static boolean isWhitelisted(final String internalName) {
- if (!internalName.startsWith("org/objectweb/asm/")) {
+ if (!internalName.startsWith("org/apache/tapestry5/internal/plastic/asm/")) {
return false;
}
String member = "(Annotation|Class|Field|Method|Module|RecordComponent|Signature)";
return internalName.contains("Test$")
|| Pattern.matches(
- "org/objectweb/asm/util/Trace" + member + "Visitor(\\$.*)?", internalName)
+ "org/apache/tapestry5/internal/plastic/asm/util/Trace" + member + "Visitor(\\$.*)?", internalName)
|| Pattern.matches(
- "org/objectweb/asm/util/Check" + member + "Adapter(\\$.*)?", internalName);
+ "org/apache/tapestry5/internal/plastic/asm/util/Check" + member + "Adapter(\\$.*)?", internalName);
}
static void checkIsPreview(final InputStream classInputStream) {
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
index 9536e2848..ef17aa3d5 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Handle.java
@@ -71,7 +71,7 @@ public final class Handle {
* @deprecated this constructor has been superseded by {@link #Handle(int, String, String, String,
* boolean)}.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public Handle(final int tag, final String owner, final String name, final String descriptor) {
this(tag, owner, name, descriptor, tag == Opcodes.H_INVOKEINTERFACE);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
index ae2bb34ee..393fa6c3f 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/MethodVisitor.java
@@ -416,7 +416,7 @@ public abstract class MethodVisitor {
* @param descriptor the method's descriptor (see {@link Type}).
* @deprecated use {@link #visitMethodInsn(int, String, String, String, boolean)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public void visitMethodInsn(
final int opcode, final String owner, final String name, final String descriptor) {
int opcodeAndSource = opcode | (api < Opcodes.ASM5 ? Opcodes.SOURCE_DEPRECATED : 0);
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
index 42cf12956..f60dac661 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Opcodes.java
@@ -56,7 +56,8 @@ public interface Opcodes {
*
* @deprecated This API is experimental.
*/
- @Deprecated int ASM10_EXPERIMENTAL = 1 << 24 | 10 << 16 | 0 << 8;
+ @Deprecated(forRemoval = false)
+ int ASM10_EXPERIMENTAL = 1 << 24 | 10 << 16 | 0 << 8;
/*
* Internal flags used to redirect calls to deprecated methods. For instance, if a visitOldStuff
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
index b8eabc06f..0a40d3a0e 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/AnnotationRemapper.java
@@ -55,7 +55,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
* @param remapper the remapper to use to remap the types in the visited annotation.
* @deprecated use {@link #AnnotationRemapper(String, AnnotationVisitor, Remapper)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public AnnotationRemapper(final AnnotationVisitor annotationVisitor, final Remapper remapper) {
this(/* descriptor= */ null, annotationVisitor, remapper);
}
@@ -83,7 +83,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
* @param remapper the remapper to use to remap the types in the visited annotation.
* @deprecated use {@link #AnnotationRemapper(int, String, AnnotationVisitor, Remapper)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationRemapper(
final int api, final AnnotationVisitor annotationVisitor, final Remapper remapper) {
this(api, /* descriptor= */ null, annotationVisitor, remapper);
@@ -151,7 +151,7 @@ public class AnnotationRemapper extends AnnotationVisitor {
* @return the newly created remapper.
* @deprecated use {@link #createAnnotationRemapper(String, AnnotationVisitor)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor annotationVisitor) {
return new AnnotationRemapper(api, /* descriptor= */ null, annotationVisitor, remapper);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
index ed3555736..0f601f99e 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/ClassRemapper.java
@@ -256,7 +256,7 @@ public class ClassRemapper extends ClassVisitor {
* @return the newly created remapper.
* @deprecated use {@link #createAnnotationRemapper(String, AnnotationVisitor)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor annotationVisitor) {
return new AnnotationRemapper(api, /* descriptor= */ null, annotationVisitor, remapper);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
index 37065d76a..03fd95200 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/FieldRemapper.java
@@ -94,7 +94,7 @@ public class FieldRemapper extends FieldVisitor {
* @return the newly created remapper.
* @deprecated use {@link #createAnnotationRemapper(String, AnnotationVisitor)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor annotationVisitor) {
return new AnnotationRemapper(api, /* descriptor= */ null, annotationVisitor, remapper);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
index 88b0177ea..3bded9115 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/InstructionAdapter.java
@@ -1072,7 +1072,7 @@ public class InstructionAdapter extends MethodVisitor {
* @param descriptor the method's descriptor (see {@link Type}).
* @deprecated use {@link #invokevirtual(String, String, String, boolean)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public void invokevirtual(final String owner, final String name, final String descriptor) {
if (api >= Opcodes.ASM5) {
invokevirtual(owner, name, descriptor, false);
@@ -1111,7 +1111,7 @@ public class InstructionAdapter extends MethodVisitor {
* @param descriptor the method's descriptor (see {@link Type}).
* @deprecated use {@link #invokespecial(String, String, String, boolean)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public void invokespecial(final String owner, final String name, final String descriptor) {
if (api >= Opcodes.ASM5) {
invokespecial(owner, name, descriptor, false);
@@ -1150,7 +1150,7 @@ public class InstructionAdapter extends MethodVisitor {
* @param descriptor the method's descriptor (see {@link Type}).
* @deprecated use {@link #invokestatic(String, String, String, boolean)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public void invokestatic(final String owner, final String name, final String descriptor) {
if (api >= Opcodes.ASM5) {
invokestatic(owner, name, descriptor, false);
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
index 3a4d20f23..0668d0046 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/MethodRemapper.java
@@ -278,7 +278,7 @@ public class MethodRemapper extends MethodVisitor {
* @return the newly created remapper.
* @deprecated use {@link #createAnnotationRemapper(String, AnnotationVisitor)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor annotationVisitor) {
return new AnnotationRemapper(api, /* descriptor= */ null, annotationVisitor, remapper);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
index d45b48103..423f9e195 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/RecordComponentRemapper.java
@@ -97,7 +97,7 @@ public class RecordComponentRemapper extends RecordComponentVisitor {
* @return the newly created remapper.
* @deprecated use {@link #createAnnotationRemapper(String, AnnotationVisitor)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected AnnotationVisitor createAnnotationRemapper(final AnnotationVisitor annotationVisitor) {
return new AnnotationRemapper(api, /* descriptor= */ null, annotationVisitor, remapper);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
index 27c3fa880..3189076a2 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/Remapper.java
@@ -43,6 +43,20 @@ import org.apache.tapestry5.internal.plastic.asm.signature.SignatureWriter;
*/
public abstract class Remapper {
+ // The class name of LambdaMetafactory.
+ private static final String LAMBDA_FACTORY_CLASSNAME = "java/lang/invoke/LambdaMetafactory";
+
+ // The method signature of LambdaMetafactory.metafactory(...).
+ private static final String LAMBDA_FACTORY_METAFACTORY =
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;"
+ + "Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;"
+ + "Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;";
+
+ // The method signature of LambdaMetafactory.altMetafactory(...).
+ private static final String LAMBDA_FACTORY_ALTMETAFACTORY =
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;"
+ + "[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;";
+
/**
* The ASM API version supported by this remapper, or 0 for instances created with the deprecated
* constructor.
@@ -54,8 +68,8 @@ public abstract class Remapper {
*
* @deprecated use {@link #Remapper(int)} instead.
*/
- @Deprecated
- public Remapper() {
+ @Deprecated(forRemoval = false)
+ protected Remapper() {
this.api = 0;
}
@@ -65,7 +79,7 @@ public abstract class Remapper {
* @param api the ASM API version supported by this remapper. Must be one of the {@code
* ASM}<i>x</i> values in {@link Opcodes}.
*/
- public Remapper(final int api) {
+ protected Remapper(final int api) {
if (api != Opcodes.ASM9
&& api != Opcodes.ASM8
&& api != Opcodes.ASM7
@@ -269,7 +283,7 @@ public abstract class Remapper {
* @return the newly created remapper.
* @deprecated use {@link #createSignatureRemapper} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
protected SignatureVisitor createRemappingSignatureAdapter(
final SignatureVisitor signatureVisitor) {
return createSignatureRemapper(signatureVisitor);
@@ -319,11 +333,11 @@ public abstract class Remapper {
} else {
int originSplit = name.lastIndexOf('/');
int remappedSplit = remappedInnerName.lastIndexOf('/');
- if (originSplit != -1 && remappedSplit != -1) {
- if (name.substring(originSplit).equals(remappedInnerName.substring(remappedSplit))) {
- // class name not changed
- return innerName;
- }
+ if (originSplit != -1
+ && remappedSplit != -1
+ && name.substring(originSplit).equals(remappedInnerName.substring(remappedSplit))) {
+ // class name not changed
+ return innerName;
}
}
@@ -362,11 +376,103 @@ public abstract class Remapper {
* @return the new name of the method.
* @deprecated use {@link #mapInvokeDynamicMethodName(String, String, Handle, Object...)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public String mapInvokeDynamicMethodName(final String name, final String descriptor) {
return name;
}
+ /**
+ * Maps an invokedynamic or a constant dynamic method name to its new name. Subclasses can
+ * override.
+ *
+ * <p>The default implementation of this method first performs well-known rule checks (calling
+ * {@link #mapWellKnownInvokeDynamicMethodName(String, String, Handle, Object...)}) and then
+ * performs basic remapping (calling {@link #mapBasicInvokeDynamicMethodName(String, String,
+ * Handle, Object...)}).
+ *
+ * <p>For most users, only {@link #mapBasicInvokeDynamicMethodName(String, String, Handle,
+ * Object...)} needs to be overridden.
+ *
+ * @param name the name of the method.
+ * @param descriptor the descriptor of the method.
+ * @param bootstrapMethodHandle the bootstrap method.
+ * @param bootstrapMethodArguments the bootstrap method constant arguments. Each argument must be
+ * an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String}, {@link
+ * Type}, {@link Handle} or {@link ConstantDynamic} value. This method is allowed to modify
+ * the content of the array so a caller should expect that this array may change.
+ * @return the new name of the method.
+ */
+ public String mapInvokeDynamicMethodName(
+ final String name,
+ final String descriptor,
+ final Handle bootstrapMethodHandle,
+ final Object... bootstrapMethodArguments) {
+ String mappedWellKnownName =
+ mapWellKnownInvokeDynamicMethodName(
+ name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+ if (mappedWellKnownName != null) {
+ return mappedWellKnownName;
+ }
+ return mapBasicInvokeDynamicMethodName(
+ name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+ }
+
+ /**
+ * Maps well-known invokedynamic (e.g. lambda creation) or const dynamic method names to their new
+ * names. This method detects specific invokedynamic method rules and remaps using the
+ * corresponding rules. When no rule is matched, returns {@literal null}. When non-null is
+ * returned, it means that this invokedynamic method name matches a rule and has been remapped
+ * with the relevant rule. Subclasses can override.
+ *
+ * @param name the name of the method.
+ * @param descriptor the descriptor of the method.
+ * @param bootstrapMethodHandle the bootstrap method.
+ * @param bootstrapMethodArguments the bootstrap method constant arguments. Each argument must be
+ * an {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String}, {@link
+ * Type}, {@link Handle} or {@link ConstantDynamic} value. This method is allowed to modify
+ * the content of the array so a caller should expect that this array may change.
+ * @return the new name of the method, or null if no special rule is matched.
+ */
+ public String mapWellKnownInvokeDynamicMethodName(
+ final String name,
+ final String descriptor,
+ final Handle bootstrapMethodHandle,
+ final Object... bootstrapMethodArguments) {
+
+ if (LAMBDA_FACTORY_CLASSNAME.equals(bootstrapMethodHandle.getOwner())
+ && bootstrapMethodHandle.getTag() == Opcodes.H_INVOKESTATIC) {
+ // This is a lambda creation.
+ // Note: **if** is reserved for future JDK changes.
+ boolean isMetafactory = false;
+ isMetafactory |=
+ "metafactory".equals(bootstrapMethodHandle.getName())
+ && LAMBDA_FACTORY_METAFACTORY.equals(bootstrapMethodHandle.getDesc());
+ isMetafactory |=
+ "altMetafactory".equals(bootstrapMethodHandle.getName())
+ && LAMBDA_FACTORY_ALTMETAFACTORY.equals(bootstrapMethodHandle.getDesc());
+
+ if (isMetafactory) {
+ // Note:
+ // Java lambda instances are created by LambdaMetafactory.metafactory() and
+ // LambdaMetafactory.altMetafactory().
+ // The specification can be found in the LambdaMetafactory javadoc:
+ // https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/invoke/LambdaMetafactory.html
+ //
+ // In short, all the necessary parameters can be obtained from this invokedynamic, including
+ // the following three:
+ // - Class name: From return type of method descriptor.
+ // - Method name: Same as the name of invokedynamic.
+ // - Method descriptor: From the first bootstrap argument.
+ return mapMethodName(
+ Type.getReturnType(descriptor).getInternalName(),
+ name,
+ bootstrapMethodArguments[0].toString());
+ }
+ }
+
+ return null;
+ }
+
/**
* Maps an invokedynamic or a constant dynamic method name to its new name. The default
* implementation of this method returns the given name, unchanged. Subclasses can override.
@@ -380,7 +486,7 @@ public abstract class Remapper {
* the content of the array so a caller should expect that this array may change.
* @return the new name of the method.
*/
- public String mapInvokeDynamicMethodName(
+ public String mapBasicInvokeDynamicMethodName(
final String name,
final String descriptor,
final Handle bootstrapMethodHandle,
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
index a3fc44570..bdebaeee4 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SimpleRemapper.java
@@ -63,7 +63,7 @@ public class SimpleRemapper extends Remapper {
*
* @deprecated use {@link #SimpleRemapper(int, Map)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public SimpleRemapper(final Map<String, String> mapping) {
this.mapping = mapping;
}
@@ -103,7 +103,7 @@ public class SimpleRemapper extends Remapper {
* org.apache.tapestry5.internal.plastic.asm.Type#getInternalName()}).
* @deprecated use {@link #SimpleRemapper(int, String, String)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public SimpleRemapper(final String oldName, final String newName) {
this.mapping = Collections.singletonMap(oldName, newName);
}
@@ -129,14 +129,23 @@ public class SimpleRemapper extends Remapper {
return remappedName == null ? name : remappedName;
}
+ /**
+ * Maps an invokedynamic or a constant dynamic method name to its new name.
+ *
+ * @param name the name of the method.
+ * @param descriptor the descriptor of the method.
+ * @return the new name of the method.
+ * @deprecated use {@link #mapInvokeDynamicMethodName(String, String, Handle, Object...)} instead.
+ */
@Override
+ @Deprecated(forRemoval = false)
public String mapInvokeDynamicMethodName(final String name, final String descriptor) {
String remappedName = map('.' + name + descriptor);
return remappedName == null ? name : remappedName;
}
@Override
- public String mapInvokeDynamicMethodName(
+ public String mapBasicInvokeDynamicMethodName(
final String name,
final String descriptor,
final Handle bootstrapMethodHandle,
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
index f24ae4faa..de52b68f4 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/package.html
@@ -30,7 +30,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm.commons</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm.commons</title>
</head>
<body>
Provides some useful class and method adapters. <em>The preferred way of using
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
index db0d8a2e4..ba396bf78 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/package.html
@@ -30,46 +30,46 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm</title>
</head>
<body>
Provides a small and fast bytecode manipulation framework.
<p>
The <a href="http://asm.ow2.org/">ASM</a> framework is organized
-around the {@link org.objectweb.asm.ClassVisitor ClassVisitor},
-{@link org.objectweb.asm.FieldVisitor FieldVisitor},
-{@link org.objectweb.asm.MethodVisitor MethodVisitor} and
-{@link org.objectweb.asm.AnnotationVisitor AnnotationVisitor} abstract classes,
+around the {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor ClassVisitor},
+{@link org.apache.tapestry5.internal.plastic.asm.FieldVisitor FieldVisitor},
+{@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor MethodVisitor} and
+{@link org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor AnnotationVisitor} abstract classes,
which allow one to visit the fields, methods and annotations of a class,
including the bytecode instructions of each method.
<p>
In addition to these main abstract classes, ASM provides a {@link
-org.objectweb.asm.ClassReader ClassReader} class, that can parse an
+org.apache.tapestry5.internal.plastic.asm.ClassReader ClassReader} class, that can parse an
existing class and make a given visitor visit it. ASM also provides
-a {@link org.objectweb.asm.ClassWriter ClassWriter} class, which is
+a {@link org.apache.tapestry5.internal.plastic.asm.ClassWriter ClassWriter} class, which is
a visitor that generates Java class files.
<p>
In order to generate a class from scratch, only the {@link
-org.objectweb.asm.ClassWriter ClassWriter} class is necessary. Indeed,
+org.apache.tapestry5.internal.plastic.asm.ClassWriter ClassWriter} class is necessary. Indeed,
in order to generate a class, one must just call its visit<em>Xxx</em>
methods with the appropriate arguments to generate the desired fields
and methods.
<p>
In order to modify existing classes, one must use a {@link
-org.objectweb.asm.ClassReader ClassReader} class to analyze
-the original class, a class modifier, and a {@link org.objectweb.asm.ClassWriter
+org.apache.tapestry5.internal.plastic.asm.ClassReader ClassReader} class to analyze
+the original class, a class modifier, and a {@link org.apache.tapestry5.internal.plastic.asm.ClassWriter
ClassWriter} to construct the modified class. The class modifier
-is just a {@link org.objectweb.asm.ClassVisitor ClassVisitor}
-that delegates most of the work to another {@link org.objectweb.asm.ClassVisitor
+is just a {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor ClassVisitor}
+that delegates most of the work to another {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor
ClassVisitor}, but that sometimes changes some parameter values,
or call additional methods, in order to implement the desired
modification process. In order to make it easier to implement such
-class modifiers, the {@link org.objectweb.asm.ClassVisitor
-ClassVisitor} and {@link org.objectweb.asm.MethodVisitor MethodVisitor}
+class modifiers, the {@link org.apache.tapestry5.internal.plastic.asm.ClassVisitor
+ClassVisitor} and {@link org.apache.tapestry5.internal.plastic.asm.MethodVisitor MethodVisitor}
classes delegate by default all the method calls they receive to an
optional visitor.
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
index d1657d41a..4cd88ef7a 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/signature/package.html
@@ -30,7 +30,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm.signature</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm.signature</title>
</head>
<body>
Provides support for type signatures.
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
index 05624f6a1..621f8c0b6 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/analysis/package.html
@@ -30,7 +30,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm.tree.analysis</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm.tree.analysis</title>
</head>
<body>
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
index 9e7cd7a9a..1221b6398 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/tree/package.html
@@ -30,7 +30,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm.tree</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm.tree</title>
</head>
<body>
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
index 5fa02108b..ed4a1180b 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/CheckMethodAdapter.java
@@ -290,6 +290,7 @@ public class CheckMethodAdapter extends MethodVisitor {
private static final String MUST_NOT_BE_NULL_OR_EMPTY = " (must not be null or empty)";
private static final String START_LABEL = "start label";
private static final String END_LABEL = "end label";
+ private static final String LABEL = "label";
/** The class version number. */
public int version;
@@ -787,7 +788,7 @@ public class CheckMethodAdapter extends MethodVisitor {
checkVisitCodeCalled();
checkVisitMaxsNotCalled();
checkOpcodeMethod(opcode, Method.VISIT_JUMP_INSN);
- checkLabel(label, /* checkVisited= */ false, "label");
+ checkLabel(label, /* checkVisited= */ false, LABEL);
super.visitJumpInsn(opcode, label);
++insnCount;
}
@@ -796,7 +797,7 @@ public class CheckMethodAdapter extends MethodVisitor {
public void visitLabel(final Label label) {
checkVisitCodeCalled();
checkVisitMaxsNotCalled();
- checkLabel(label, /* checkVisited= */ false, "label");
+ checkLabel(label, /* checkVisited= */ false, LABEL);
if (labelInsnIndices.get(label) != null) {
throw new IllegalStateException("Already visited label");
}
@@ -1093,7 +1094,7 @@ public class CheckMethodAdapter extends MethodVisitor {
if (value instanceof String) {
checkInternalName(version, (String) value, "Invalid stack frame value");
} else if (value instanceof Label) {
- checkLabel((Label) value, /* checkVisited= */ false, "label");
+ checkLabel((Label) value, /* checkVisited= */ false, LABEL);
} else {
throw new IllegalArgumentException("Invalid stack frame value: " + value);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
index e6fe7f0ab..b171d706d 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Printer.java
@@ -953,7 +953,7 @@ public abstract class Printer {
* @param descriptor the method's descriptor (see {@link Type}).
* @deprecated use {@link #visitMethodInsn(int, String, String, String, boolean)} instead.
*/
- @Deprecated
+ @Deprecated(forRemoval = false)
public void visitMethodInsn(
final int opcode, final String owner, final String name, final String descriptor) {
// This method was abstract before ASM5, and was therefore always overridden (without any
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
index b592901cd..0edc09d2e 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/Textifier.java
@@ -1443,7 +1443,13 @@ public class Textifier extends Printer {
stringBuilder.append(name);
}
- @Deprecated
+ /**
+ * Appends a string representation of the given handle to {@link #stringBuilder}.
+ *
+ * @param handle a handle.
+ * @deprecated use {@link #appendHandle(Handle, String)} instead.
+ */
+ @Deprecated(forRemoval = false)
protected void appendHandle(final Handle handle) {
appendHandle(handle, tab3);
}
diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
index d2fed34c1..9c9f48cb7 100644
--- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
+++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/util/package.html
@@ -30,7 +30,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
-->
<head>
- <title>Package org.objectweb.asm.util</title>
+ <title>Package org.apache.tapestry5.internal.plastic.asm.util</title>
</head>
<body>
Provides ASM visitors that can be useful for programming and
diff --git a/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java b/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
index 192c0a522..d71346b30 100644
--- a/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
+++ b/plastic/src/main/java/org/apache/tapestry5/plastic/PlasticConstants.java
@@ -20,7 +20,7 @@ public final class PlasticConstants
/**
* The minimum Java version we support
*/
- public static final int DEFAULT_VERSION_OPCODE = Opcodes.V1_6;
+ public static final int DEFAULT_VERSION_OPCODE = Opcodes.V11;
private PlasticConstants()
{
diff --git a/plastic/vendor-asm.sh b/plastic/vendor-asm.sh
new file mode 100755
index 000000000..401ed0142
--- /dev/null
+++ b/plastic/vendor-asm.sh
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+
+# ##############################################################################
+#
+# Vendors ASM source from gitlab.ow2.org into Apache Tapestry's internal plastic package.
+# Combines asm, asm-commons, asm-tree, and asm-util into a single source tree
+# and rewrites the package from: org.objectweb.asm -> org.apache.tapestry5.internal.plastic.asm
+#
+# Usage: ./vendor-asm.sh <TAG>
+# TAG : ASM git tag, e.g. ASM_9_10
+#
+# Run without arguments to list available tags.
+#
+# ##############################################################################
+
+set -euo pipefail
+
+ASM_REPO="https://gitlab.ow2.org/asm/asm.git"
+SRC_PKG="org.objectweb.asm"
+DST_PKG="org.apache.tapestry5.internal.plastic.asm"
+SRC_PATH="org/objectweb/asm"
+
+DST_PATH="./src/external/java/org/apache/tapestry5/internal/plastic/asm"
+
+MODULES=(
+ asm
+ asm-analysis
+ asm-commons
+ asm-tree
+ asm-util
+)
+
+TAG="${1:-}"
+
+if [[ -z "$TAG" ]]; then
+ echo "Usage: $0 <TAG>"
+ echo " Example: $0 ASM_9_10"
+ echo ""
+ echo "Available tags (fetched from remote):"
+ git ls-remote --tags "$ASM_REPO" | grep -o 'ASM_[0-9_]*$' | sort -V
+ exit 0
+fi
+
+# ##############################################################################
+
+echo "=> Cleaning '${DST_PATH}' and preparing clone desitnation"
+
+# Make sure we are in the correct directory
+cd "$(dirname "${BASH_SOURCE[0]}")"
+
+# Wipe the destination so removed or renamed files from a previous run don't linger and break things
+rm -rf -- "${DST_PATH}"
+mkdir -p -- "${DST_PATH}"
+
+# Using temp directory so we never touch the working tree
+# and trap a cleanup step if the script fails partway through.
+WORK_DIR="$(mktemp -d)"
+trap 'rm -rf -- "${WORK_DIR}"' EXIT
+
+# ##############################################################################
+
+echo "=> Cloning ASM '${TAG}' ..."
+
+git clone --depth 1 --branch "${TAG}" "${ASM_REPO}" "${WORK_DIR}/asm-src" --quiet
+
+# ##############################################################################
+
+echo "=> Copying sources from modules: ${MODULES[*]} ..."
+
+for MODULE in "${MODULES[@]}"; do
+ SRC_ROOT="${WORK_DIR}/asm-src/${MODULE}/src/main/java/${SRC_PATH}"
+
+ if [[ ! -d "${SRC_ROOT}" ]]; then
+ echo " WARNING: ${MODULE} has no sources at expected path, skipping."
+ continue
+ fi
+
+ # SRC_ROOT ends at org/objectweb/asm, so the path stripped from each file
+ # naturally includes any subpackage directory (commons/, tree/, util/).
+ # This means all modules land under the same $DST_PATH without extra nesting.
+ # Both .java and .html (package.html Javadoc) files are included.
+ find "${SRC_ROOT}" \( -name "*.java" -o -name "*.html" \) | while read -r FILE; do
+ REL="${FILE#"${SRC_ROOT}"/}"
+ DEST_FILE="${DST_PATH}/${REL}"
+ mkdir -p "$(dirname "${DEST_FILE}")"
+ cp "${FILE}" "${DEST_FILE}"
+ done
+
+ COUNT=$(find "${SRC_ROOT}" -name "*.java" | wc -l | tr -d ' ')
+ echo " ${MODULE}: ${COUNT} files -> ${DST_PATH}"
+done
+
+# ##############################################################################
+
+echo "=> Rewriting package references ..."
+
+# Rewrite all occurrences of the old package to the new one
+#
+# Two forms must be handled:
+#
+# Dot Used in package/import declarations and Javadoc. The
+# (org.objectweb.asm) dots in the sed pattern are escaped so they match
+# literally, not as regex wildcards, which would
+# otherwise also match org/objectweb/asm.
+#
+# Slash Used in runtime class-name strings, like ASM's
+# (org/objectweb/asm) Constants#checkAsmExperimental converts class names
+# via getName().replace('.','/') and then checks them
+# against the original location. Since the vendored
+# classes live in the new package at runtime, the
+# slash-form strings must match it too.
+
+SRC_PKG_ESCAPED="${SRC_PKG//./\\.}" # org\.objectweb\.asm (literal dots for sed)
+SRC_PATH_SLASHED="${SRC_PKG//./\/}" # org/objectweb/asm (slash-form to find)
+DST_PATH_SLASHED="${DST_PKG//./\/}" # org/apache/tapestry5/... (slash-form replacement)
+
+find "${DST_PATH}" \( -name "*.java" -o -name "*.html" \) | while read -r FILE; do
+ sed -i '' "s|${SRC_PKG_ESCAPED}|${DST_PKG}|g" "${FILE}"
+ sed -i '' "s|${SRC_PATH_SLASHED}|${DST_PATH_SLASHED}|g" "${FILE}"
+done
+
+# ##############################################################################
+
+echo "=> Copying LICENSE.txt as LICENSE-${TAG}.txt ..."
+
+cp -- "${WORK_DIR}/asm-src/LICENSE.txt" "./LICENSE-${TAG}.txt"
+
+# ##############################################################################
+
+echo "=> DONE! Please update the NOTICE.txt to mention '${TAG}'"