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 <[email protected]> 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}'"
