http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ConstantDynamic.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ConstantDynamic.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ConstantDynamic.java
new file mode 100755
index 0000000..9ae46ca
--- /dev/null
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/ConstantDynamic.java
@@ -0,0 +1,178 @@
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+package org.apache.tapestry5.internal.plastic.asm;
+
+import java.util.Arrays;
+
+/**
+ * A constant whose value is computed at runtime, with a bootstrap method.
+ *
+ * @author Remi Forax
+ */
+public final class ConstantDynamic {
+
+  /** The constant name (can be arbitrary). */
+  private final String name;
+
+  /** The constant type (must be a field descriptor). */
+  private final String descriptor;
+
+  /** The bootstrap method to use to compute the constant value at runtime. */
+  private final Handle bootstrapMethod;
+
+  /**
+   * The arguments to pass to the bootstrap method, in order to compute the 
constant value at
+   * runtime.
+   */
+  private final Object[] bootstrapMethodArguments;
+
+  /**
+   * Constructs a new {@link ConstantDynamic}.
+   *
+   * @param name the constant name (can be arbitrary).
+   * @param descriptor the constant type (must be a field descriptor).
+   * @param bootstrapMethod the bootstrap method to use to compute the 
constant value at runtime.
+   * @param bootstrapMethodArguments the arguments to pass to the bootstrap 
method, in order to
+   *     compute the constant value at runtime.
+   */
+  public ConstantDynamic(
+      final String name,
+      final String descriptor,
+      final Handle bootstrapMethod,
+      final Object... bootstrapMethodArguments) {
+    this.name = name;
+    this.descriptor = descriptor;
+    this.bootstrapMethod = bootstrapMethod;
+    this.bootstrapMethodArguments = bootstrapMethodArguments;
+  }
+
+  /**
+   * Returns the name of this constant.
+   *
+   * @return the name of this constant.
+   */
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * Returns the type of this constant.
+   *
+   * @return the type of this constant, as a field descriptor.
+   */
+  public String getDescriptor() {
+    return descriptor;
+  }
+
+  /**
+   * Returns the bootstrap method used to compute the value of this constant.
+   *
+   * @return the bootstrap method used to compute the value of this constant.
+   */
+  public Handle getBootstrapMethod() {
+    return bootstrapMethod;
+  }
+
+  /**
+   * Returns the number of arguments passed to the bootstrap method, in order 
to compute the value
+   * of this constant.
+   *
+   * @return the number of arguments passed to the bootstrap method, in order 
to compute the value
+   *     of this constant.
+   */
+  public int getBootstrapMethodArgumentCount() {
+    return bootstrapMethodArguments.length;
+  }
+
+  /**
+   * Returns an argument passed to the bootstrap method, in order to compute 
the value of this
+   * constant.
+   *
+   * @param index an argument index, between 0 and {@link 
#getBootstrapMethodArgumentCount()}
+   *     (exclusive).
+   * @return the argument passed to the bootstrap method, with the given index.
+   */
+  public Object getBootstrapMethodArgument(final int index) {
+    return bootstrapMethodArguments[index];
+  }
+
+  /**
+   * Returns the arguments to pass to the bootstrap method, in order to 
compute the value of this
+   * constant. WARNING: this array must not be modified, and must not be 
returned to the user.
+   *
+   * @return the arguments to pass to the bootstrap method, in order to 
compute the value of this
+   *     constant.
+   */
+  Object[] getBootstrapMethodArgumentsUnsafe() {
+    return bootstrapMethodArguments;
+  }
+
+  /**
+   * Returns the size of this constant.
+   *
+   * @return the size of this constant, i.e., 2 for {@code long} and {@code 
double}, 1 otherwise.
+   */
+  public int getSize() {
+    char firstCharOfDescriptor = descriptor.charAt(0);
+    return (firstCharOfDescriptor == 'J' || firstCharOfDescriptor == 'D') ? 2 
: 1;
+  }
+
+  @Override
+  public boolean equals(final Object object) {
+    if (object == this) {
+      return true;
+    }
+    if (!(object instanceof ConstantDynamic)) {
+      return false;
+    }
+    ConstantDynamic constantDynamic = (ConstantDynamic) object;
+    return name.equals(constantDynamic.name)
+        && descriptor.equals(constantDynamic.descriptor)
+        && bootstrapMethod.equals(constantDynamic.bootstrapMethod)
+        && Arrays.equals(bootstrapMethodArguments, 
constantDynamic.bootstrapMethodArguments);
+  }
+
+  @Override
+  public int hashCode() {
+    return name.hashCode()
+        ^ Integer.rotateLeft(descriptor.hashCode(), 8)
+        ^ Integer.rotateLeft(bootstrapMethod.hashCode(), 16)
+        ^ Integer.rotateLeft(Arrays.hashCode(bootstrapMethodArguments), 24);
+  }
+
+  @Override
+  public String toString() {
+    return name
+        + " : "
+        + descriptor
+        + ' '
+        + bootstrapMethod
+        + ' '
+        + Arrays.toString(bootstrapMethodArguments);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
----------------------------------------------------------------------
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
new file mode 100755
index 0000000..7d99004
--- /dev/null
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Constants.java
@@ -0,0 +1,177 @@
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+package org.apache.tapestry5.internal.plastic.asm;
+
+/**
+ * Defines additional JVM opcodes, access flags and constants which are not 
part of the ASM public
+ * API.
+ *
+ * @see <a 
href="https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-6.html";>JVMS 
6</a>
+ * @author Eric Bruneton
+ */
+final class Constants implements Opcodes {
+
+  // The ClassFile attribute names, in the order they are defined in
+  // 
https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.7-300.
+
+  static final String CONSTANT_VALUE = "ConstantValue";
+  static final String CODE = "Code";
+  static final String STACK_MAP_TABLE = "StackMapTable";
+  static final String EXCEPTIONS = "Exceptions";
+  static final String INNER_CLASSES = "InnerClasses";
+  static final String ENCLOSING_METHOD = "EnclosingMethod";
+  static final String SYNTHETIC = "Synthetic";
+  static final String SIGNATURE = "Signature";
+  static final String SOURCE_FILE = "SourceFile";
+  static final String SOURCE_DEBUG_EXTENSION = "SourceDebugExtension";
+  static final String LINE_NUMBER_TABLE = "LineNumberTable";
+  static final String LOCAL_VARIABLE_TABLE = "LocalVariableTable";
+  static final String LOCAL_VARIABLE_TYPE_TABLE = "LocalVariableTypeTable";
+  static final String DEPRECATED = "Deprecated";
+  static final String RUNTIME_VISIBLE_ANNOTATIONS = 
"RuntimeVisibleAnnotations";
+  static final String RUNTIME_INVISIBLE_ANNOTATIONS = 
"RuntimeInvisibleAnnotations";
+  static final String RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 
"RuntimeVisibleParameterAnnotations";
+  static final String RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS =
+      "RuntimeInvisibleParameterAnnotations";
+  static final String RUNTIME_VISIBLE_TYPE_ANNOTATIONS = 
"RuntimeVisibleTypeAnnotations";
+  static final String RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = 
"RuntimeInvisibleTypeAnnotations";
+  static final String ANNOTATION_DEFAULT = "AnnotationDefault";
+  static final String BOOTSTRAP_METHODS = "BootstrapMethods";
+  static final String METHOD_PARAMETERS = "MethodParameters";
+  static final String MODULE = "Module";
+  static final String MODULE_PACKAGES = "ModulePackages";
+  static final String MODULE_MAIN_CLASS = "ModuleMainClass";
+  static final String NEST_HOST = "NestHost";
+  static final String NEST_MEMBERS = "NestMembers";
+
+  // ASM specific access flags.
+  // WARNING: the 16 least significant bits must NOT be used, to avoid 
conflicts with standard
+  // access flags, and also to make sure that these flags are automatically 
filtered out when
+  // written in class files (because access flags are stored using 16 bits 
only).
+
+  static final int ACC_CONSTRUCTOR = 0x40000; // method access flag.
+
+  // ASM specific stack map frame types, used in {@link 
ClassVisitor#visitFrame}.
+
+  /**
+   * A frame inserted between already existing frames. This internal stack map 
frame type (in
+   * addition to the ones declared in {@link Opcodes}) can only be used if the 
frame content can be
+   * computed from the previous existing frame and from the instructions 
between this existing frame
+   * and the inserted one, without any knowledge of the type hierarchy. This 
kind of frame is only
+   * used when an unconditional jump is inserted in a method while expanding 
an ASM specific
+   * instruction. Keep in sync with Opcodes.java.
+   */
+  static final int F_INSERT = 256;
+
+  // The JVM opcode values which are not part of the ASM public API.
+  // See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html.
+
+  static final int LDC_W = 19;
+  static final int LDC2_W = 20;
+  static final int ILOAD_0 = 26;
+  static final int ILOAD_1 = 27;
+  static final int ILOAD_2 = 28;
+  static final int ILOAD_3 = 29;
+  static final int LLOAD_0 = 30;
+  static final int LLOAD_1 = 31;
+  static final int LLOAD_2 = 32;
+  static final int LLOAD_3 = 33;
+  static final int FLOAD_0 = 34;
+  static final int FLOAD_1 = 35;
+  static final int FLOAD_2 = 36;
+  static final int FLOAD_3 = 37;
+  static final int DLOAD_0 = 38;
+  static final int DLOAD_1 = 39;
+  static final int DLOAD_2 = 40;
+  static final int DLOAD_3 = 41;
+  static final int ALOAD_0 = 42;
+  static final int ALOAD_1 = 43;
+  static final int ALOAD_2 = 44;
+  static final int ALOAD_3 = 45;
+  static final int ISTORE_0 = 59;
+  static final int ISTORE_1 = 60;
+  static final int ISTORE_2 = 61;
+  static final int ISTORE_3 = 62;
+  static final int LSTORE_0 = 63;
+  static final int LSTORE_1 = 64;
+  static final int LSTORE_2 = 65;
+  static final int LSTORE_3 = 66;
+  static final int FSTORE_0 = 67;
+  static final int FSTORE_1 = 68;
+  static final int FSTORE_2 = 69;
+  static final int FSTORE_3 = 70;
+  static final int DSTORE_0 = 71;
+  static final int DSTORE_1 = 72;
+  static final int DSTORE_2 = 73;
+  static final int DSTORE_3 = 74;
+  static final int ASTORE_0 = 75;
+  static final int ASTORE_1 = 76;
+  static final int ASTORE_2 = 77;
+  static final int ASTORE_3 = 78;
+  static final int WIDE = 196;
+  static final int GOTO_W = 200;
+  static final int JSR_W = 201;
+
+  // Constants to convert between normal and wide jump instructions.
+
+  // The delta between the GOTO_W and JSR_W opcodes and GOTO and JUMP.
+  static final int WIDE_JUMP_OPCODE_DELTA = GOTO_W - GOTO;
+
+  // Constants to convert JVM opcodes to the equivalent ASM specific opcodes, 
and vice versa.
+
+  // The delta between the ASM_IFEQ, ..., ASM_IF_ACMPNE, ASM_GOTO and ASM_JSR 
opcodes
+  // and IFEQ, ..., IF_ACMPNE, GOTO and JSR.
+  static final int ASM_OPCODE_DELTA = 49;
+
+  // The delta between the ASM_IFNULL and ASM_IFNONNULL opcodes and IFNULL and 
IFNONNULL.
+  static final int ASM_IFNULL_OPCODE_DELTA = 20;
+
+  // ASM specific opcodes, used for long forward jump instructions.
+
+  static final int ASM_IFEQ = IFEQ + ASM_OPCODE_DELTA;
+  static final int ASM_IFNE = IFNE + ASM_OPCODE_DELTA;
+  static final int ASM_IFLT = IFLT + ASM_OPCODE_DELTA;
+  static final int ASM_IFGE = IFGE + ASM_OPCODE_DELTA;
+  static final int ASM_IFGT = IFGT + ASM_OPCODE_DELTA;
+  static final int ASM_IFLE = IFLE + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPEQ = IF_ICMPEQ + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPNE = IF_ICMPNE + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPLT = IF_ICMPLT + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPGE = IF_ICMPGE + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPGT = IF_ICMPGT + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ICMPLE = IF_ICMPLE + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ACMPEQ = IF_ACMPEQ + ASM_OPCODE_DELTA;
+  static final int ASM_IF_ACMPNE = IF_ACMPNE + ASM_OPCODE_DELTA;
+  static final int ASM_GOTO = GOTO + ASM_OPCODE_DELTA;
+  static final int ASM_JSR = JSR + ASM_OPCODE_DELTA;
+  static final int ASM_IFNULL = IFNULL + ASM_IFNULL_OPCODE_DELTA;
+  static final int ASM_IFNONNULL = IFNONNULL + ASM_IFNULL_OPCODE_DELTA;
+  static final int ASM_GOTO_W = 220;
+
+  private Constants() {}
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Context.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Context.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Context.java
old mode 100644
new mode 100755
index 27983d6..35e7f0b
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Context.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Context.java
@@ -1,145 +1,137 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.apache.tapestry5.internal.plastic.asm;
-
-/**
- * Information about a class being parsed in a {@link ClassReader}.
- * 
- * @author Eric Bruneton
- */
-class Context {
-
-    /**
-     * Prototypes of the attributes that must be parsed for this class.
-     */
-    Attribute[] attrs;
-
-    /**
-     * The {@link ClassReader} option flags for the parsing of this class.
-     */
-    int flags;
-
-    /**
-     * The buffer used to read strings.
-     */
-    char[] buffer;
-
-    /**
-     * The start index of each bootstrap method.
-     */
-    int[] bootstrapMethods;
-
-    /**
-     * The access flags of the method currently being parsed.
-     */
-    int access;
-
-    /**
-     * The name of the method currently being parsed.
-     */
-    String name;
-
-    /**
-     * The descriptor of the method currently being parsed.
-     */
-    String desc;
-
-    /**
-     * The label objects, indexed by bytecode offset, of the method currently
-     * being parsed (only bytecode offsets for which a label is needed have a
-     * non null associated Label object).
-     */
-    Label[] labels;
-
-    /**
-     * The target of the type annotation currently being parsed.
-     */
-    int typeRef;
-
-    /**
-     * The path of the type annotation currently being parsed.
-     */
-    TypePath typePath;
-
-    /**
-     * The offset of the latest stack map frame that has been parsed.
-     */
-    int offset;
-
-    /**
-     * The labels corresponding to the start of the local variable ranges in 
the
-     * local variable type annotation currently being parsed.
-     */
-    Label[] start;
-
-    /**
-     * The labels corresponding to the end of the local variable ranges in the
-     * local variable type annotation currently being parsed.
-     */
-    Label[] end;
-
-    /**
-     * The local variable indices for each local variable range in the local
-     * variable type annotation currently being parsed.
-     */
-    int[] index;
-
-    /**
-     * The encoding of the latest stack map frame that has been parsed.
-     */
-    int mode;
-
-    /**
-     * The number of locals in the latest stack map frame that has been parsed.
-     */
-    int localCount;
-
-    /**
-     * The number locals in the latest stack map frame that has been parsed,
-     * minus the number of locals in the previous frame.
-     */
-    int localDiff;
-
-    /**
-     * The local values of the latest stack map frame that has been parsed.
-     */
-    Object[] local;
-
-    /**
-     * The stack size of the latest stack map frame that has been parsed.
-     */
-    int stackCount;
-
-    /**
-     * The stack values of the latest stack map frame that has been parsed.
-     */
-    Object[] stack;
-}
\ No newline at end of file
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.apache.tapestry5.internal.plastic.asm;
+
+/**
+ * Information about a class being parsed in a {@link ClassReader}.
+ *
+ * @author Eric Bruneton
+ */
+final class Context {
+
+  /** The prototypes of the attributes that must be parsed in this class. */
+  Attribute[] attributePrototypes;
+
+  /**
+   * The options used to parse this class. One or more of {@link 
ClassReader#SKIP_CODE}, {@link
+   * ClassReader#SKIP_DEBUG}, {@link ClassReader#SKIP_FRAMES}, {@link 
ClassReader#EXPAND_FRAMES} or
+   * {@link ClassReader#EXPAND_ASM_INSNS}.
+   */
+  int parsingOptions;
+
+  /** The buffer used to read strings in the constant pool. */
+  char[] charBuffer;
+
+  // Information about the current method, i.e. the one read in the current 
(or latest) call
+  // to {@link ClassReader#readMethod()}.
+
+  /** The access flags of the current method. */
+  int currentMethodAccessFlags;
+
+  /** The name of the current method. */
+  String currentMethodName;
+
+  /** The descriptor of the current method. */
+  String currentMethodDescriptor;
+
+  /**
+   * The labels of the current method, indexed by bytecode offset (only 
bytecode offsets for which a
+   * label is needed have a non null associated Label).
+   */
+  Label[] currentMethodLabels;
+
+  // Information about the current type annotation target, i.e. the one read 
in the current
+  // (or latest) call to {@link ClassReader#readAnnotationTarget()}.
+
+  /**
+   * The target_type and target_info of the current type annotation target, 
encoded as described in
+   * {@link TypeReference}.
+   */
+  int currentTypeAnnotationTarget;
+
+  /** The target_path of the current type annotation target. */
+  TypePath currentTypeAnnotationTargetPath;
+
+  /** The start of each local variable range in the current local variable 
annotation. */
+  Label[] currentLocalVariableAnnotationRangeStarts;
+
+  /** The end of each local variable range in the current local variable 
annotation. */
+  Label[] currentLocalVariableAnnotationRangeEnds;
+
+  /**
+   * The local variable index of each local variable range in the current 
local variable annotation.
+   */
+  int[] currentLocalVariableAnnotationRangeIndices;
+
+  // Information about the current stack map frame, i.e. the one read in the 
current (or latest)
+  // call to {@link ClassReader#readFrame()}.
+
+  /** The bytecode offset of the current stack map frame. */
+  int currentFrameOffset;
+
+  /**
+   * The type of the current stack map frame. One of {@link Opcodes#F_FULL}, 
{@link
+   * Opcodes#F_APPEND}, {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME} or 
{@link Opcodes#F_SAME1}.
+   */
+  int currentFrameType;
+
+  /**
+   * The number of local variable types in the current stack map frame. Each 
type is represented
+   * with a single array element (even long and double).
+   */
+  int currentFrameLocalCount;
+
+  /**
+   * The delta number of local variable types in the current stack map frame 
(each type is
+   * represented with a single array element - even long and double). This is 
the number of local
+   * variable types in this frame, minus the number of local variable types in 
the previous frame.
+   */
+  int currentFrameLocalCountDelta;
+
+  /**
+   * The types of the local variables in the current stack map frame. Each 
type is represented with
+   * a single array element (even long and double), using the format described 
in {@link
+   * MethodVisitor#visitFrame}. Depending on {@link #currentFrameType}, this 
contains the types of
+   * all the local variables, or only those of the additional ones (compared 
to the previous frame).
+   */
+  Object[] currentFrameLocalTypes;
+
+  /**
+   * The number stack element types in the current stack map frame. Each type 
is represented with a
+   * single array element (even long and double).
+   */
+  int currentFrameStackCount;
+
+  /**
+   * The types of the stack elements in the current stack map frame. Each type 
is represented with a
+   * single array element (even long and double), using the format described 
in {@link
+   * MethodVisitor#visitFrame}.
+   */
+  Object[] currentFrameStackTypes;
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/CurrentFrame.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/CurrentFrame.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/CurrentFrame.java
old mode 100644
new mode 100755
index 457a4eb..384a71f
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/CurrentFrame.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/CurrentFrame.java
@@ -1,56 +1,56 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.apache.tapestry5.internal.plastic.asm;
-
-/**
- * Information about the input stack map frame at the "current" instruction of 
a
- * method. This is implemented as a Frame subclass for a "basic block"
- * containing only one instruction.
- * 
- * @author Eric Bruneton
- */
-class CurrentFrame extends Frame {
- 
-    /**
-     * Sets this CurrentFrame to the input stack map frame of the next 
"current"
-     * instruction, i.e. the instruction just after the given one. It is 
assumed
-     * that the value of this object when this method is called is the stack 
map
-     * frame status just before the given instruction is executed.
-     */
-    @Override
-    void execute(int opcode, int arg, ClassWriter cw, Item item) {
-        super.execute(opcode, arg, cw, item);
-        Frame successor = new Frame();
-        merge(cw, successor, 0);
-        set(successor);
-        owner.inputStackTop = 0;
-    }
-}
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+
+package org.apache.tapestry5.internal.plastic.asm;
+
+/**
+ * Information about the input stack map frame at the "current" instruction of 
a method. This is
+ * implemented as a Frame subclass for a "basic block" containing only one 
instruction.
+ *
+ * @author Eric Bruneton
+ */
+final class CurrentFrame extends Frame {
+
+  CurrentFrame(final Label owner) {
+    super(owner);
+  }
+
+  /**
+   * Sets this CurrentFrame to the input stack map frame of the next "current" 
instruction, i.e. the
+   * instruction just after the given one. It is assumed that the value of 
this object when this
+   * method is called is the stack map frame status just before the given 
instruction is executed.
+   */
+  @Override
+  void execute(
+      final int opcode, final int arg, final Symbol symbolArg, final 
SymbolTable symbolTable) {
+    super.execute(opcode, arg, symbolArg, symbolTable);
+    Frame successor = new Frame(null);
+    merge(symbolTable, successor, 0);
+    copyFrom(successor);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Edge.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Edge.java 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Edge.java
old mode 100644
new mode 100755
index 9347888..c81f12b
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Edge.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/Edge.java
@@ -1,75 +1,91 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm;
 
 /**
- * An edge in the control flow graph of a method body. See {@link Label Label}.
- * 
+ * An edge in the control flow graph of a method. Each node of this graph is a 
basic block,
+ * represented with the Label corresponding to its first instruction. Each 
edge goes from one node
+ * to another, i.e. from one basic block to another (called the predecessor 
and successor blocks,
+ * respectively). An edge corresponds either to a jump or ret instruction or 
to an exception
+ * handler.
+ *
+ * @see Label
  * @author Eric Bruneton
  */
-class Edge {
+final class Edge {
+
+  /**
+   * A control flow graph edge corresponding to a jump or ret instruction. 
Only used with {@link
+   * ClassWriter#COMPUTE_FRAMES}.
+   */
+  static final int JUMP = 0;
 
-    /**
-     * Denotes a normal control flow graph edge.
-     */
-    static final int NORMAL = 0;
+  /**
+   * A control flow graph edge corresponding to an exception handler. Only 
used with {@link
+   * ClassWriter#COMPUTE_MAXS}.
+   */
+  static final int EXCEPTION = 0x7FFFFFFF;
 
-    /**
-     * Denotes a control flow graph edge corresponding to an exception handler.
-     * More precisely any {@link Edge} whose {@link #info} is strictly positive
-     * corresponds to an exception handler. The actual value of {@link #info} 
is
-     * the index, in the {@link ClassWriter} type table, of the exception that
-     * is catched.
-     */
-    static final int EXCEPTION = 0x7FFFFFFF;
+  /**
+   * Information about this control flow graph edge.
+   *
+   * <ul>
+   *   <li>If {@link ClassWriter#COMPUTE_MAXS} is used, this field contains 
either a stack size
+   *       delta (for an edge corresponding to a jump instruction), or the 
value EXCEPTION (for an
+   *       edge corresponding to an exception handler). The stack size delta 
is the stack size just
+   *       after the jump instruction, minus the stack size at the beginning 
of the predecessor
+   *       basic block, i.e. the one containing the jump instruction.
+   *   <li>If {@link ClassWriter#COMPUTE_FRAMES} is used, this field contains 
either the value JUMP
+   *       (for an edge corresponding to a jump instruction), or the index, in 
the {@link
+   *       ClassWriter} type table, of the exception type that is handled (for 
an edge corresponding
+   *       to an exception handler).
+   * </ul>
+   */
+  final int info;
 
-    /**
-     * Information about this control flow graph edge. If
-     * {@link ClassWriter#COMPUTE_MAXS} is used this field is the (relative)
-     * stack size in the basic block from which this edge originates. This size
-     * is equal to the stack size at the "jump" instruction to which this edge
-     * corresponds, relatively to the stack size at the beginning of the
-     * originating basic block. If {@link ClassWriter#COMPUTE_FRAMES} is used,
-     * this field is the kind of this control flow graph edge (i.e. NORMAL or
-     * EXCEPTION).
-     */
-    int info;
+  /** The successor block of this control flow graph edge. */
+  final Label successor;
 
-    /**
-     * The successor block of the basic block from which this edge originates.
-     */
-    Label successor;
+  /**
+   * The next edge in the list of outgoing edges of a basic block. See {@link 
Label#outgoingEdges}.
+   */
+  Edge nextEdge;
 
-    /**
-     * The next edge in the list of successors of the originating basic block.
-     * See {@link Label#successors successors}.
-     */
-    Edge next;
+  /**
+   * Constructs a new Edge.
+   *
+   * @param info see {@link #info}.
+   * @param successor see {@link #successor}.
+   * @param nextEdge see {@link #nextEdge}.
+   */
+  Edge(final int info, final Label successor, final Edge nextEdge) {
+    this.info = info;
+    this.successor = successor;
+    this.nextEdge = nextEdge;
+  }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldVisitor.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldVisitor.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldVisitor.java
old mode 100644
new mode 100755
index 9dbca0b..26b235d
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldVisitor.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldVisitor.java
@@ -1,150 +1,133 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm;
 
 /**
- * A visitor to visit a Java field. The methods of this class must be called in
- * the following order: ( <tt>visitAnnotation</tt> |
- * <tt>visitTypeAnnotation</tt> | <tt>visitAttribute</tt> )* <tt>visitEnd</tt>.
- * 
+ * A visitor to visit a Java field. The methods of this class must be called 
in the following order:
+ * ( {@code visitAnnotation} | {@code visitTypeAnnotation} | {@code 
visitAttribute} )* {@code
+ * visitEnd}.
+ *
  * @author Eric Bruneton
  */
 public abstract class FieldVisitor {
 
-    /**
-     * The ASM API version implemented by this visitor. The value of this field
-     * must be one of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link 
Opcodes#ASM6}.
-     */
-    protected final int api;
+  /**
+   * The ASM API version implemented by this visitor. The value of this field 
must be one of {@link
+   * Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link 
Opcodes#ASM7}.
+   */
+  protected final int api;
 
-    /**
-     * The field visitor to which this visitor must delegate method calls. May
-     * be null.
-     */
-    protected FieldVisitor fv;
+  /** The field visitor to which this visitor must delegate method calls. May 
be null. */
+  protected FieldVisitor fv;
 
-    /**
-     * Constructs a new {@link FieldVisitor}.
-     * 
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link 
Opcodes#ASM6}.
-     */
-    public FieldVisitor(final int api) {
-        this(api, null);
-    }
+  /**
+   * Constructs a new {@link FieldVisitor}.
+   *
+   * @param api the ASM API version implemented by this visitor. Must be one 
of {@link
+   *     Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link 
Opcodes#ASM7}.
+   */
+  public FieldVisitor(final int api) {
+    this(api, null);
+  }
 
-    /**
-     * Constructs a new {@link FieldVisitor}.
-     * 
-     * @param api
-     *            the ASM API version implemented by this visitor. Must be one
-     *            of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link 
Opcodes#ASM6}.
-     * @param fv
-     *            the field visitor to which this visitor must delegate method
-     *            calls. May be null.
-     */
-    public FieldVisitor(final int api, final FieldVisitor fv) {
-        if (api < Opcodes.ASM4 || api > Opcodes.ASM6) {
-            throw new IllegalArgumentException();
-        }
-        this.api = api;
-        this.fv = fv;
+  /**
+   * Constructs a new {@link FieldVisitor}.
+   *
+   * @param api the ASM API version implemented by this visitor. Must be one 
of {@link
+   *     Opcodes#ASM4}, {@link Opcodes#ASM5}, {@link Opcodes#ASM6} or {@link 
Opcodes#ASM7}.
+   * @param fieldVisitor the field visitor to which this visitor must delegate 
method calls. May be
+   *     null.
+   */
+  public FieldVisitor(final int api, final FieldVisitor fieldVisitor) {
+    if (api != Opcodes.ASM6 && api != Opcodes.ASM5 && api != Opcodes.ASM4 && 
api != Opcodes.ASM7) {
+      throw new IllegalArgumentException();
     }
+    this.api = api;
+    this.fv = fieldVisitor;
+  }
 
-    /**
-     * Visits an annotation of the field.
-     * 
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-        if (fv != null) {
-            return fv.visitAnnotation(desc, visible);
-        }
-        return null;
+  /**
+   * Visits an annotation of the field.
+   *
+   * @param descriptor the class descriptor of the annotation class.
+   * @param visible {@literal true} if the annotation is visible at runtime.
+   * @return a visitor to visit the annotation values, or {@literal null} if 
this visitor is not
+   *     interested in visiting this annotation.
+   */
+  public AnnotationVisitor visitAnnotation(final String descriptor, final 
boolean visible) {
+    if (fv != null) {
+      return fv.visitAnnotation(descriptor, visible);
     }
+    return null;
+  }
 
-    /**
-     * Visits an annotation on the type of the field.
-     * 
-     * @param typeRef
-     *            a reference to the annotated type. The sort of this type
-     *            reference must be {@link TypeReference#FIELD FIELD}. See
-     *            {@link TypeReference}.
-     * @param typePath
-     *            the path to the annotated type argument, wildcard bound, 
array
-     *            element type, or static inner type within 'typeRef'. May be
-     *            <tt>null</tt> if the annotation targets 'typeRef' as a whole.
-     * @param desc
-     *            the class descriptor of the annotation class.
-     * @param visible
-     *            <tt>true</tt> if the annotation is visible at runtime.
-     * @return a visitor to visit the annotation values, or <tt>null</tt> if
-     *         this visitor is not interested in visiting this annotation.
-     */
-    public AnnotationVisitor visitTypeAnnotation(int typeRef,
-            TypePath typePath, String desc, boolean visible) {
-        if (api < Opcodes.ASM5) {
-            throw new RuntimeException();
-        }
-        if (fv != null) {
-            return fv.visitTypeAnnotation(typeRef, typePath, desc, visible);
-        }
-        return null;
+  /**
+   * Visits an annotation on the type of the field.
+   *
+   * @param typeRef a reference to the annotated type. The sort of this type 
reference must be
+   *     {@link TypeReference#FIELD}. See {@link TypeReference}.
+   * @param typePath the path to the annotated type argument, wildcard bound, 
array element type, or
+   *     static inner type within 'typeRef'. May be {@literal null} if the 
annotation targets
+   *     'typeRef' as a whole.
+   * @param descriptor the class descriptor of the annotation class.
+   * @param visible {@literal true} if the annotation is visible at runtime.
+   * @return a visitor to visit the annotation values, or {@literal null} if 
this visitor is not
+   *     interested in visiting this annotation.
+   */
+  public AnnotationVisitor visitTypeAnnotation(
+      final int typeRef, final TypePath typePath, final String descriptor, 
final boolean visible) {
+    if (api < Opcodes.ASM5) {
+      throw new UnsupportedOperationException("This feature requires ASM5");
+    }
+    if (fv != null) {
+      return fv.visitTypeAnnotation(typeRef, typePath, descriptor, visible);
     }
+    return null;
+  }
 
-    /**
-     * Visits a non standard attribute of the field.
-     * 
-     * @param attr
-     *            an attribute.
-     */
-    public void visitAttribute(Attribute attr) {
-        if (fv != null) {
-            fv.visitAttribute(attr);
-        }
+  /**
+   * Visits a non standard attribute of the field.
+   *
+   * @param attribute an attribute.
+   */
+  public void visitAttribute(final Attribute attribute) {
+    if (fv != null) {
+      fv.visitAttribute(attribute);
     }
+  }
 
-    /**
-     * Visits the end of the field. This method, which is the last one to be
-     * called, is used to inform the visitor that all the annotations and
-     * attributes of the field have been visited.
-     */
-    public void visitEnd() {
-        if (fv != null) {
-            fv.visitEnd();
-        }
+  /**
+   * Visits the end of the field. This method, which is the last one to be 
called, is used to inform
+   * the visitor that all the annotations and attributes of the field have 
been visited.
+   */
+  public void visitEnd() {
+    if (fv != null) {
+      fv.visitEnd();
     }
+  }
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/1c71aec7/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldWriter.java
----------------------------------------------------------------------
diff --git 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldWriter.java
 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldWriter.java
old mode 100644
new mode 100755
index f7bbe98..008525c
--- 
a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldWriter.java
+++ 
b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/FieldWriter.java
@@ -1,323 +1,346 @@
-/***
- * ASM: a very small and fast Java bytecode manipulation framework
- * Copyright (c) 2000-2011 INRIA, France Telecom
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holders nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 package org.apache.tapestry5.internal.plastic.asm;
 
 /**
- * An {@link FieldVisitor} that generates Java fields in bytecode form.
- * 
+ * A {@link FieldVisitor} that generates a corresponding 'field_info' 
structure, as defined in the
+ * Java Virtual Machine Specification (JVMS).
+ *
+ * @see <a 
href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.5";>JVMS
+ *     4.5</a>
  * @author Eric Bruneton
  */
 final class FieldWriter extends FieldVisitor {
 
-    /**
-     * The class writer to which this field must be added.
-     */
-    private final ClassWriter cw;
+  /** Where the constants used in this FieldWriter must be stored. */
+  private final SymbolTable symbolTable;
+
+  // Note: fields are ordered as in the field_info structure, and those 
related to attributes are
+  // ordered as in Section 4.7 of the JVMS.
 
-    /**
-     * Access flags of this field.
-     */
-    private final int access;
+  /**
+   * The access_flags field of the field_info JVMS structure. This field can 
contain ASM specific
+   * access flags, such as {@link Opcodes#ACC_DEPRECATED}, which are removed 
when generating the
+   * ClassFile structure.
+   */
+  private final int accessFlags;
 
-    /**
-     * The index of the constant pool item that contains the name of this
-     * method.
-     */
-    private final int name;
+  /** The name_index field of the field_info JVMS structure. */
+  private final int nameIndex;
 
-    /**
-     * The index of the constant pool item that contains the descriptor of this
-     * field.
-     */
-    private final int desc;
+  /** The descriptor_index field of the field_info JVMS structure. */
+  private final int descriptorIndex;
 
-    /**
-     * The index of the constant pool item that contains the signature of this
-     * field.
-     */
-    private int signature;
+  /**
+   * The signature_index field of the Signature attribute of this field_info, 
or 0 if there is no
+   * Signature attribute.
+   */
+  private int signatureIndex;
 
-    /**
-     * The index of the constant pool item that contains the constant value of
-     * this field.
-     */
-    private int value;
+  /**
+   * The constantvalue_index field of the ConstantValue attribute of this 
field_info, or 0 if there
+   * is no ConstantValue attribute.
+   */
+  private int constantValueIndex;
 
-    /**
-     * The runtime visible annotations of this field. May be <tt>null</tt>.
-     */
-    private AnnotationWriter anns;
+  /**
+   * The last runtime visible annotation of this field. The previous ones can 
be accessed with the
+   * {@link AnnotationWriter#previousAnnotation} field. May be {@literal null}.
+   */
+  private AnnotationWriter lastRuntimeVisibleAnnotation;
 
-    /**
-     * The runtime invisible annotations of this field. May be <tt>null</tt>.
-     */
-    private AnnotationWriter ianns;
+  /**
+   * The last runtime invisible annotation of this field. The previous ones 
can be accessed with the
+   * {@link AnnotationWriter#previousAnnotation} field. May be {@literal null}.
+   */
+  private AnnotationWriter lastRuntimeInvisibleAnnotation;
 
-    /**
-     * The runtime visible type annotations of this field. May be 
<tt>null</tt>.
-     */
-    private AnnotationWriter tanns;
+  /**
+   * The last runtime visible type annotation of this field. The previous ones 
can be accessed with
+   * the {@link AnnotationWriter#previousAnnotation} field. May be {@literal 
null}.
+   */
+  private AnnotationWriter lastRuntimeVisibleTypeAnnotation;
 
-    /**
-     * The runtime invisible type annotations of this field. May be
-     * <tt>null</tt>.
-     */
-    private AnnotationWriter itanns;
+  /**
+   * The last runtime invisible type annotation of this field. The previous 
ones can be accessed
+   * with the {@link AnnotationWriter#previousAnnotation} field. May be 
{@literal null}.
+   */
+  private AnnotationWriter lastRuntimeInvisibleTypeAnnotation;
 
-    /**
-     * The non standard attributes of this field. May be <tt>null</tt>.
-     */
-    private Attribute attrs;
+  /**
+   * The first non standard attribute of this field. The next ones can be 
accessed with the {@link
+   * Attribute#nextAttribute} field. May be {@literal null}.
+   *
+   * <p><b>WARNING</b>: this list stores the attributes in the <i>reverse</i> 
order of their visit.
+   * firstAttribute is actually the last attribute visited in {@link 
#visitAttribute}. The {@link
+   * #putFieldInfo} method writes the attributes in the order defined by this 
list, i.e. in the
+   * reverse order specified by the user.
+   */
+  private Attribute firstAttribute;
 
-    // ------------------------------------------------------------------------
-    // Constructor
-    // ------------------------------------------------------------------------
+  // 
-----------------------------------------------------------------------------------------------
+  // Constructor
+  // 
-----------------------------------------------------------------------------------------------
 
-    /**
-     * Constructs a new {@link FieldWriter}.
-     * 
-     * @param cw
-     *            the class writer to which this field must be added.
-     * @param access
-     *            the field's access flags (see {@link Opcodes}).
-     * @param name
-     *            the field's name.
-     * @param desc
-     *            the field's descriptor (see {@link Type}).
-     * @param signature
-     *            the field's signature. May be <tt>null</tt>.
-     * @param value
-     *            the field's constant value. May be <tt>null</tt>.
-     */
-    FieldWriter(final ClassWriter cw, final int access, final String name,
-            final String desc, final String signature, final Object value) {
-        super(Opcodes.ASM6);
-        if (cw.firstField == null) {
-            cw.firstField = this;
-        } else {
-            cw.lastField.fv = this;
-        }
-        cw.lastField = this;
-        this.cw = cw;
-        this.access = access;
-        this.name = cw.newUTF8(name);
-        this.desc = cw.newUTF8(desc);
-        if (signature != null) {
-            this.signature = cw.newUTF8(signature);
-        }
-        if (value != null) {
-            this.value = cw.newConstItem(value).index;
-        }
+  /**
+   * Constructs a new {@link FieldWriter}.
+   *
+   * @param symbolTable where the constants used in this FieldWriter must be 
stored.
+   * @param access the field's access flags (see {@link Opcodes}).
+   * @param name the field's name.
+   * @param descriptor the field's descriptor (see {@link Type}).
+   * @param signature the field's signature. May be {@literal null}.
+   * @param constantValue the field's constant value. May be {@literal null}.
+   */
+  FieldWriter(
+      final SymbolTable symbolTable,
+      final int access,
+      final String name,
+      final String descriptor,
+      final String signature,
+      final Object constantValue) {
+    super(Opcodes.ASM7);
+    this.symbolTable = symbolTable;
+    this.accessFlags = access;
+    this.nameIndex = symbolTable.addConstantUtf8(name);
+    this.descriptorIndex = symbolTable.addConstantUtf8(descriptor);
+    if (signature != null) {
+      this.signatureIndex = symbolTable.addConstantUtf8(signature);
     }
+    if (constantValue != null) {
+      this.constantValueIndex = symbolTable.addConstant(constantValue).index;
+    }
+  }
 
-    // ------------------------------------------------------------------------
-    // Implementation of the FieldVisitor abstract class
-    // ------------------------------------------------------------------------
+  // 
-----------------------------------------------------------------------------------------------
+  // Implementation of the FieldVisitor abstract class
+  // 
-----------------------------------------------------------------------------------------------
 
-    @Override
-    public AnnotationVisitor visitAnnotation(final String desc,
-            final boolean visible) {
-        ByteVector bv = new ByteVector();
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv, 2);
-        if (visible) {
-            aw.next = anns;
-            anns = aw;
-        } else {
-            aw.next = ianns;
-            ianns = aw;
-        }
-        return aw;
+  @Override
+  public AnnotationVisitor visitAnnotation(final String descriptor, final 
boolean visible) {
+    // Create a ByteVector to hold an 'annotation' JVMS structure.
+    // See 
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.16.
+    ByteVector annotation = new ByteVector();
+    // Write type_index and reserve space for num_element_value_pairs.
+    annotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
+    if (visible) {
+      return lastRuntimeVisibleAnnotation =
+          new AnnotationWriter(symbolTable, annotation, 
lastRuntimeVisibleAnnotation);
+    } else {
+      return lastRuntimeInvisibleAnnotation =
+          new AnnotationWriter(symbolTable, annotation, 
lastRuntimeInvisibleAnnotation);
     }
+  }
 
-    @Override
-    public AnnotationVisitor visitTypeAnnotation(final int typeRef,
-            final TypePath typePath, final String desc, final boolean visible) 
{
-        ByteVector bv = new ByteVector();
-        // write target_type and target_info
-        AnnotationWriter.putTarget(typeRef, typePath, bv);
-        // write type, and reserve space for values count
-        bv.putShort(cw.newUTF8(desc)).putShort(0);
-        AnnotationWriter aw = new AnnotationWriter(cw, true, bv, bv,
-                bv.length - 2);
-        if (visible) {
-            aw.next = tanns;
-            tanns = aw;
-        } else {
-            aw.next = itanns;
-            itanns = aw;
-        }
-        return aw;
+  @Override
+  public AnnotationVisitor visitTypeAnnotation(
+      final int typeRef, final TypePath typePath, final String descriptor, 
final boolean visible) {
+    // Create a ByteVector to hold a 'type_annotation' JVMS structure.
+    // See 
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.20.
+    ByteVector typeAnnotation = new ByteVector();
+    // Write target_type, target_info, and target_path.
+    TypeReference.putTarget(typeRef, typeAnnotation);
+    TypePath.put(typePath, typeAnnotation);
+    // Write type_index and reserve space for num_element_value_pairs.
+    
typeAnnotation.putShort(symbolTable.addConstantUtf8(descriptor)).putShort(0);
+    if (visible) {
+      return lastRuntimeVisibleTypeAnnotation =
+          new AnnotationWriter(symbolTable, typeAnnotation, 
lastRuntimeVisibleTypeAnnotation);
+    } else {
+      return lastRuntimeInvisibleTypeAnnotation =
+          new AnnotationWriter(symbolTable, typeAnnotation, 
lastRuntimeInvisibleTypeAnnotation);
     }
+  }
 
-    @Override
-    public void visitAttribute(final Attribute attr) {
-        attr.next = attrs;
-        attrs = attr;
-    }
+  @Override
+  public void visitAttribute(final Attribute attribute) {
+    // Store the attributes in the <i>reverse</i> order of their visit by this 
method.
+    attribute.nextAttribute = firstAttribute;
+    firstAttribute = attribute;
+  }
 
-    @Override
-    public void visitEnd() {
-    }
+  @Override
+  public void visitEnd() {
+    // Nothing to do.
+  }
 
-    // ------------------------------------------------------------------------
-    // Utility methods
-    // ------------------------------------------------------------------------
+  // 
-----------------------------------------------------------------------------------------------
+  // Utility methods
+  // 
-----------------------------------------------------------------------------------------------
 
-    /**
-     * Returns the size of this field.
-     * 
-     * @return the size of this field.
-     */
-    int getSize() {
-        int size = 8;
-        if (value != 0) {
-            cw.newUTF8("ConstantValue");
-            size += 8;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                cw.newUTF8("Synthetic");
-                size += 6;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            cw.newUTF8("Deprecated");
-            size += 6;
-        }
-        if (signature != 0) {
-            cw.newUTF8("Signature");
-            size += 8;
-        }
-        if (anns != null) {
-            cw.newUTF8("RuntimeVisibleAnnotations");
-            size += 8 + anns.getSize();
-        }
-        if (ianns != null) {
-            cw.newUTF8("RuntimeInvisibleAnnotations");
-            size += 8 + ianns.getSize();
-        }
-        if (tanns != null) {
-            cw.newUTF8("RuntimeVisibleTypeAnnotations");
-            size += 8 + tanns.getSize();
-        }
-        if (itanns != null) {
-            cw.newUTF8("RuntimeInvisibleTypeAnnotations");
-            size += 8 + itanns.getSize();
-        }
-        if (attrs != null) {
-            size += attrs.getSize(cw, null, 0, -1, -1);
-        }
-        return size;
+  /**
+   * Returns the size of the field_info JVMS structure generated by this 
FieldWriter. Also adds the
+   * names of the attributes of this field in the constant pool.
+   *
+   * @return the size in bytes of the field_info JVMS structure.
+   */
+  int computeFieldInfoSize() {
+    // The access_flags, name_index, descriptor_index and attributes_count 
fields use 8 bytes.
+    int size = 8;
+    // For ease of reference, we use here the same attribute order as in 
Section 4.7 of the JVMS.
+    if (constantValueIndex != 0) {
+      // ConstantValue attributes always use 8 bytes.
+      symbolTable.addConstantUtf8(Constants.CONSTANT_VALUE);
+      size += 8;
+    }
+    // Before Java 1.5, synthetic fields are represented with a Synthetic 
attribute.
+    if ((accessFlags & Opcodes.ACC_SYNTHETIC) != 0
+        && symbolTable.getMajorVersion() < Opcodes.V1_5) {
+      // Synthetic attributes always use 6 bytes.
+      symbolTable.addConstantUtf8(Constants.SYNTHETIC);
+      size += 6;
     }
+    if (signatureIndex != 0) {
+      // Signature attributes always use 8 bytes.
+      symbolTable.addConstantUtf8(Constants.SIGNATURE);
+      size += 8;
+    }
+    // ACC_DEPRECATED is ASM specific, the ClassFile format uses a Deprecated 
attribute instead.
+    if ((accessFlags & Opcodes.ACC_DEPRECATED) != 0) {
+      // Deprecated attributes always use 6 bytes.
+      symbolTable.addConstantUtf8(Constants.DEPRECATED);
+      size += 6;
+    }
+    if (lastRuntimeVisibleAnnotation != null) {
+      size +=
+          lastRuntimeVisibleAnnotation.computeAnnotationsSize(
+              Constants.RUNTIME_VISIBLE_ANNOTATIONS);
+    }
+    if (lastRuntimeInvisibleAnnotation != null) {
+      size +=
+          lastRuntimeInvisibleAnnotation.computeAnnotationsSize(
+              Constants.RUNTIME_INVISIBLE_ANNOTATIONS);
+    }
+    if (lastRuntimeVisibleTypeAnnotation != null) {
+      size +=
+          lastRuntimeVisibleTypeAnnotation.computeAnnotationsSize(
+              Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS);
+    }
+    if (lastRuntimeInvisibleTypeAnnotation != null) {
+      size +=
+          lastRuntimeInvisibleTypeAnnotation.computeAnnotationsSize(
+              Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS);
+    }
+    if (firstAttribute != null) {
+      size += firstAttribute.computeAttributesSize(symbolTable);
+    }
+    return size;
+  }
 
-    /**
-     * Puts the content of this field into the given byte vector.
-     * 
-     * @param out
-     *            where the content of this field must be put.
-     */
-    void put(final ByteVector out) {
-        final int FACTOR = ClassWriter.TO_ACC_SYNTHETIC;
-        int mask = Opcodes.ACC_DEPRECATED | ClassWriter.ACC_SYNTHETIC_ATTRIBUTE
-                | ((access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) / FACTOR);
-        out.putShort(access & ~mask).putShort(name).putShort(desc);
-        int attributeCount = 0;
-        if (value != 0) {
-            ++attributeCount;
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                ++attributeCount;
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            ++attributeCount;
-        }
-        if (signature != 0) {
-            ++attributeCount;
-        }
-        if (anns != null) {
-            ++attributeCount;
-        }
-        if (ianns != null) {
-            ++attributeCount;
-        }
-        if (tanns != null) {
-            ++attributeCount;
-        }
-        if (itanns != null) {
-            ++attributeCount;
-        }
-        if (attrs != null) {
-            attributeCount += attrs.getCount();
-        }
-        out.putShort(attributeCount);
-        if (value != 0) {
-            out.putShort(cw.newUTF8("ConstantValue"));
-            out.putInt(2).putShort(value);
-        }
-        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
-            if ((cw.version & 0xFFFF) < Opcodes.V1_5
-                    || (access & ClassWriter.ACC_SYNTHETIC_ATTRIBUTE) != 0) {
-                out.putShort(cw.newUTF8("Synthetic")).putInt(0);
-            }
-        }
-        if ((access & Opcodes.ACC_DEPRECATED) != 0) {
-            out.putShort(cw.newUTF8("Deprecated")).putInt(0);
-        }
-        if (signature != 0) {
-            out.putShort(cw.newUTF8("Signature"));
-            out.putInt(2).putShort(signature);
-        }
-        if (anns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleAnnotations"));
-            anns.put(out);
-        }
-        if (ianns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleAnnotations"));
-            ianns.put(out);
-        }
-        if (tanns != null) {
-            out.putShort(cw.newUTF8("RuntimeVisibleTypeAnnotations"));
-            tanns.put(out);
-        }
-        if (itanns != null) {
-            out.putShort(cw.newUTF8("RuntimeInvisibleTypeAnnotations"));
-            itanns.put(out);
-        }
-        if (attrs != null) {
-            attrs.put(cw, null, 0, -1, -1, out);
-        }
+  /**
+   * Puts the content of the field_info JVMS structure generated by this 
FieldWriter into the given
+   * ByteVector.
+   *
+   * @param output where the field_info structure must be put.
+   */
+  void putFieldInfo(final ByteVector output) {
+    boolean useSyntheticAttribute = symbolTable.getMajorVersion() < 
Opcodes.V1_5;
+    // Put the access_flags, name_index and descriptor_index fields.
+    int mask = useSyntheticAttribute ? Opcodes.ACC_SYNTHETIC : 0;
+    output.putShort(accessFlags & 
~mask).putShort(nameIndex).putShort(descriptorIndex);
+    // Compute and put the attributes_count field.
+    // For ease of reference, we use here the same attribute order as in 
Section 4.7 of the JVMS.
+    int attributesCount = 0;
+    if (constantValueIndex != 0) {
+      ++attributesCount;
+    }
+    if ((accessFlags & Opcodes.ACC_SYNTHETIC) != 0 && useSyntheticAttribute) {
+      ++attributesCount;
     }
+    if (signatureIndex != 0) {
+      ++attributesCount;
+    }
+    if ((accessFlags & Opcodes.ACC_DEPRECATED) != 0) {
+      ++attributesCount;
+    }
+    if (lastRuntimeVisibleAnnotation != null) {
+      ++attributesCount;
+    }
+    if (lastRuntimeInvisibleAnnotation != null) {
+      ++attributesCount;
+    }
+    if (lastRuntimeVisibleTypeAnnotation != null) {
+      ++attributesCount;
+    }
+    if (lastRuntimeInvisibleTypeAnnotation != null) {
+      ++attributesCount;
+    }
+    if (firstAttribute != null) {
+      attributesCount += firstAttribute.getAttributeCount();
+    }
+    output.putShort(attributesCount);
+    // Put the field_info attributes.
+    // For ease of reference, we use here the same attribute order as in 
Section 4.7 of the JVMS.
+    if (constantValueIndex != 0) {
+      output
+          .putShort(symbolTable.addConstantUtf8(Constants.CONSTANT_VALUE))
+          .putInt(2)
+          .putShort(constantValueIndex);
+    }
+    if ((accessFlags & Opcodes.ACC_SYNTHETIC) != 0 && useSyntheticAttribute) {
+      
output.putShort(symbolTable.addConstantUtf8(Constants.SYNTHETIC)).putInt(0);
+    }
+    if (signatureIndex != 0) {
+      output
+          .putShort(symbolTable.addConstantUtf8(Constants.SIGNATURE))
+          .putInt(2)
+          .putShort(signatureIndex);
+    }
+    if ((accessFlags & Opcodes.ACC_DEPRECATED) != 0) {
+      
output.putShort(symbolTable.addConstantUtf8(Constants.DEPRECATED)).putInt(0);
+    }
+    if (lastRuntimeVisibleAnnotation != null) {
+      lastRuntimeVisibleAnnotation.putAnnotations(
+          symbolTable.addConstantUtf8(Constants.RUNTIME_VISIBLE_ANNOTATIONS), 
output);
+    }
+    if (lastRuntimeInvisibleAnnotation != null) {
+      lastRuntimeInvisibleAnnotation.putAnnotations(
+          
symbolTable.addConstantUtf8(Constants.RUNTIME_INVISIBLE_ANNOTATIONS), output);
+    }
+    if (lastRuntimeVisibleTypeAnnotation != null) {
+      lastRuntimeVisibleTypeAnnotation.putAnnotations(
+          
symbolTable.addConstantUtf8(Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS), 
output);
+    }
+    if (lastRuntimeInvisibleTypeAnnotation != null) {
+      lastRuntimeInvisibleTypeAnnotation.putAnnotations(
+          
symbolTable.addConstantUtf8(Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS), 
output);
+    }
+    if (firstAttribute != null) {
+      firstAttribute.putAttributes(symbolTable, output);
+    }
+  }
+
+  /**
+   * Collects the attributes of this field into the given set of attribute 
prototypes.
+   *
+   * @param attributePrototypes a set of attribute prototypes.
+   */
+  final void collectAttributePrototypes(final Attribute.Set 
attributePrototypes) {
+    attributePrototypes.addAttributes(firstAttribute);
+  }
 }

Reply via email to