8044046: [asm] refresh internal ASM version to v5.0.3
authorksrini
Fri, 30 May 2014 13:37:35 -0700
changeset 24687 a5dfe74199ca
parent 24686 611fe7d9ba10
child 24688 b7543de25d78
8044046: [asm] refresh internal ASM version to v5.0.3 Reviewed-by: psandoz, sundar
jdk/src/share/classes/jdk/internal/org/objectweb/asm/ClassWriter.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/Frame.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/Item.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/Label.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/MethodWriter.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/Type.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/InstructionAdapter.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Method.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Remapper.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/SerialVersionUIDAdder.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/MethodNode.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/AnalyzerException.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckClassAdapter.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/Textifier.java
jdk/src/share/classes/jdk/internal/org/objectweb/asm/version.txt
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/ClassWriter.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/ClassWriter.java	Fri May 30 13:37:35 2014 -0700
@@ -785,11 +785,29 @@
         if (innerClasses == null) {
             innerClasses = new ByteVector();
         }
-        ++innerClassesCount;
-        innerClasses.putShort(name == null ? 0 : newClass(name));
-        innerClasses.putShort(outerName == null ? 0 : newClass(outerName));
-        innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName));
-        innerClasses.putShort(access);
+        // Sec. 4.7.6 of the JVMS states "Every CONSTANT_Class_info entry in the
+        // constant_pool table which represents a class or interface C that is
+        // not a package member must have exactly one corresponding entry in the
+        // classes array". To avoid duplicates we keep track in the intVal field
+        // of the Item of each CONSTANT_Class_info entry C whether an inner
+        // class entry has already been added for C (this field is unused for
+        // class entries, and changing its value does not change the hashcode
+        // and equality tests). If so we store the index of this inner class
+        // entry (plus one) in intVal. This hack allows duplicate detection in
+        // O(1) time.
+        Item nameItem = newClassItem(name);
+        if (nameItem.intVal == 0) {
+            ++innerClassesCount;
+            innerClasses.putShort(nameItem.index);
+            innerClasses.putShort(outerName == null ? 0 : newClass(outerName));
+            innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName));
+            innerClasses.putShort(access);
+            nameItem.intVal = innerClassesCount;
+        } else {
+            // Compare the inner classes entry nameItem.intVal - 1 with the
+            // arguments of this method and throw an exception if there is a
+            // difference?
+        }
     }
 
     @Override
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Frame.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Frame.java	Fri May 30 13:37:35 2014 -0700
@@ -1455,16 +1455,20 @@
                             | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
                 } else {
                     // if u and t are array types, but not with the same element
-                    // type, merge(u,t)=java/lang/Object
-                    v = OBJECT | cw.addType("java/lang/Object");
+                    // type, merge(u,t) = dim(u) - 1 | java/lang/Object
+                    int vdim = ELEMENT_OF + (u & DIM);
+                    v = vdim | OBJECT | cw.addType("java/lang/Object");
                 }
             } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) {
                 // if t is any other reference or array type, the merged type
-                // is Object, or min(dim(u), dim(t)) | java/lang/Object is u
-                // and t have different array dimensions
-                int tdim = t & DIM;
-                int udim = u & DIM;
-                v = (udim != tdim ? Math.min(tdim, udim) : 0) | OBJECT
+                // is min(udim, tdim) | java/lang/Object, where udim is the
+                // array dimension of u, minus 1 if u is an array type with a
+                // primitive element type (and similarly for tdim).
+                int tdim = (((t & DIM) == 0 || (t & BASE_KIND) == OBJECT) ? 0
+                        : ELEMENT_OF) + (t & DIM);
+                int udim = (((u & DIM) == 0 || (u & BASE_KIND) == OBJECT) ? 0
+                        : ELEMENT_OF) + (u & DIM);
+                v = Math.min(tdim, udim) | OBJECT
                         | cw.addType("java/lang/Object");
             } else {
                 // if t is any other type, merge(u,t)=TOP
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Item.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Item.java	Fri May 30 13:37:35 2014 -0700
@@ -237,9 +237,10 @@
         this.strVal2 = strVal2;
         this.strVal3 = strVal3;
         switch (type) {
+        case ClassWriter.CLASS:
+            this.intVal = 0;     // intVal of a class must be zero, see visitInnerClass
         case ClassWriter.UTF8:
         case ClassWriter.STR:
-        case ClassWriter.CLASS:
         case ClassWriter.MTYPE:
         case ClassWriter.TYPE_NORMAL:
             hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Label.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Label.java	Fri May 30 13:37:35 2014 -0700
@@ -502,7 +502,7 @@
     void addToSubroutine(final long id, final int nbSubroutines) {
         if ((status & VISITED) == 0) {
             status |= VISITED;
-            srcAndRefPositions = new int[(nbSubroutines - 1) / 32 + 1];
+            srcAndRefPositions = new int[nbSubroutines / 32 + 1];
         }
         srcAndRefPositions[(int) (id >>> 32)] |= (int) id;
     }
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/MethodWriter.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/MethodWriter.java	Fri May 30 13:37:35 2014 -0700
@@ -1430,6 +1430,14 @@
 
     @Override
     public void visitMaxs(final int maxStack, final int maxLocals) {
+        if (resize) {
+            // replaces the temporary jump opcodes introduced by Label.resolve.
+            if (ClassReader.RESIZE) {
+                resizeInstructions();
+            } else {
+                throw new RuntimeException("Method code too large!");
+            }
+        }
         if (ClassReader.FRAMES && compute == FRAMES) {
             // completes the control flow graph with exception handler blocks
             Handler handler = firstHandler;
@@ -1987,43 +1995,43 @@
                     stackMap.putByte(v);
                 }
             } else {
-                StringBuffer buf = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 d >>= 28;
                 while (d-- > 0) {
-                    buf.append('[');
+                    sb.append('[');
                 }
                 if ((t & Frame.BASE_KIND) == Frame.OBJECT) {
-                    buf.append('L');
-                    buf.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1);
-                    buf.append(';');
+                    sb.append('L');
+                    sb.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1);
+                    sb.append(';');
                 } else {
                     switch (t & 0xF) {
                     case 1:
-                        buf.append('I');
+                        sb.append('I');
                         break;
                     case 2:
-                        buf.append('F');
+                        sb.append('F');
                         break;
                     case 3:
-                        buf.append('D');
+                        sb.append('D');
                         break;
                     case 9:
-                        buf.append('Z');
+                        sb.append('Z');
                         break;
                     case 10:
-                        buf.append('B');
+                        sb.append('B');
                         break;
                     case 11:
-                        buf.append('C');
+                        sb.append('C');
                         break;
                     case 12:
-                        buf.append('S');
+                        sb.append('S');
                         break;
                     default:
-                        buf.append('J');
+                        sb.append('J');
                     }
                 }
-                stackMap.putByte(7).putShort(cw.newClass(buf.toString()));
+                stackMap.putByte(7).putShort(cw.newClass(sb.toString()));
             }
         }
     }
@@ -2051,14 +2059,6 @@
         if (classReaderOffset != 0) {
             return 6 + classReaderLength;
         }
-        if (resize) {
-            // replaces the temporary jump opcodes introduced by Label.resolve.
-            if (ClassReader.RESIZE) {
-                resizeInstructions();
-            } else {
-                throw new RuntimeException("Method code too large!");
-            }
-        }
         int size = 8;
         if (code.length > 0) {
             if (code.length > 65536) {
@@ -2715,49 +2715,50 @@
             }
         }
 
-        // recomputes the stack map frames
-        if (frameCount > 0) {
-            if (compute == FRAMES) {
-                frameCount = 0;
-                stackMap = null;
-                previousFrame = null;
-                frame = null;
-                Frame f = new Frame();
-                f.owner = labels;
-                Type[] args = Type.getArgumentTypes(descriptor);
-                f.initInputFrame(cw, access, args, maxLocals);
-                visitFrame(f);
-                Label l = labels;
-                while (l != null) {
-                    /*
-                     * here we need the original label position. getNewOffset
-                     * must therefore never have been called for this label.
-                     */
-                    u = l.position - 3;
-                    if ((l.status & Label.STORE) != 0 || (u >= 0 && resize[u])) {
-                        getNewOffset(allIndexes, allSizes, l);
-                        // TODO update offsets in UNINITIALIZED values
-                        visitFrame(l.frame);
-                    }
-                    l = l.successor;
+        // updates the stack map frame labels
+        if (compute == FRAMES) {
+            Label l = labels;
+            while (l != null) {
+                /*
+                 * Detects the labels that are just after an IF instruction that
+                 * has been resized with the IFNOT GOTO_W pattern. These labels
+                 * are now the target of a jump instruction (the IFNOT
+                 * instruction). Note that we need the original label position
+                 * here. getNewOffset must therefore never have been called for
+                 * this label.
+                 */
+                u = l.position - 3;
+                if (u >= 0 && resize[u]) {
+                    l.status |= Label.TARGET;
                 }
-            } else {
-                /*
-                 * Resizing an existing stack map frame table is really hard.
-                 * Not only the table must be parsed to update the offets, but
-                 * new frames may be needed for jump instructions that were
-                 * inserted by this method. And updating the offsets or
-                 * inserting frames can change the format of the following
-                 * frames, in case of packed frames. In practice the whole table
-                 * must be recomputed. For this the frames are marked as
-                 * potentially invalid. This will cause the whole class to be
-                 * reread and rewritten with the COMPUTE_FRAMES option (see the
-                 * ClassWriter.toByteArray method). This is not very efficient
-                 * but is much easier and requires much less code than any other
-                 * method I can think of.
-                 */
-                cw.invalidFrames = true;
+                getNewOffset(allIndexes, allSizes, l);
+                l = l.successor;
+            }
+            // Update the offsets in the uninitialized types
+            for (i = 0; i < cw.typeTable.length; ++i) {
+                Item item = cw.typeTable[i];
+                if (item != null && item.type == ClassWriter.TYPE_UNINIT) {
+                    item.intVal = getNewOffset(allIndexes, allSizes, 0,
+                            item.intVal);
+                }
             }
+            // The stack map frames are not serialized yet, so we don't need
+            // to update them. They will be serialized in visitMaxs.
+        } else if (frameCount > 0) {
+            /*
+             * Resizing an existing stack map frame table is really hard. Not
+             * only the table must be parsed to update the offets, but new
+             * frames may be needed for jump instructions that were inserted by
+             * this method. And updating the offsets or inserting frames can
+             * change the format of the following frames, in case of packed
+             * frames. In practice the whole table must be recomputed. For this
+             * the frames are marked as potentially invalid. This will cause the
+             * whole class to be reread and rewritten with the COMPUTE_FRAMES
+             * option (see the ClassWriter.toByteArray method). This is not very
+             * efficient but is much easier and requires much less code than any
+             * other method I can think of.
+             */
+            cw.invalidFrames = true;
         }
         // updates the exception handler block labels
         Handler h = firstHandler;
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Type.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/Type.java	Fri May 30 13:37:35 2014 -0700
@@ -585,11 +585,11 @@
         case DOUBLE:
             return "double";
         case ARRAY:
-            StringBuffer b = new StringBuffer(getElementType().getClassName());
+            StringBuilder sb = new StringBuilder(getElementType().getClassName());
             for (int i = getDimensions(); i > 0; --i) {
-                b.append("[]");
+                sb.append("[]");
             }
-            return b.toString();
+            return sb.toString();
         case OBJECT:
             return new String(buf, off, len).replace('/', '.');
         default:
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/InstructionAdapter.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/InstructionAdapter.java	Fri May 30 13:37:35 2014 -0700
@@ -1089,7 +1089,7 @@
     @Deprecated
     public void invokestatic(final String owner, final String name,
             final String desc) {
-        if (api < Opcodes.ASM5) {
+        if (api >= Opcodes.ASM5) {
             invokestatic(owner, name, desc, false);
             return;
         }
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Method.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Method.java	Fri May 30 13:37:35 2014 -0700
@@ -205,7 +205,7 @@
         }
         String returnType = method.substring(0, space);
         String methodName = method.substring(space + 1, start - 1).trim();
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append('(');
         int p;
         do {
@@ -229,7 +229,7 @@
             return type;
         }
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         int index = 0;
         while ((index = type.indexOf("[]", index) + 1) > 0) {
             sb.append('[');
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Remapper.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Remapper.java	Fri May 30 13:37:35 2014 -0700
@@ -147,17 +147,17 @@
         }
 
         Type[] args = Type.getArgumentTypes(desc);
-        StringBuffer s = new StringBuffer("(");
+        StringBuilder sb = new StringBuilder("(");
         for (int i = 0; i < args.length; i++) {
-            s.append(mapDesc(args[i].getDescriptor()));
+            sb.append(mapDesc(args[i].getDescriptor()));
         }
         Type returnType = Type.getReturnType(desc);
         if (returnType == Type.VOID_TYPE) {
-            s.append(")V");
-            return s.toString();
+            sb.append(")V");
+            return sb.toString();
         }
-        s.append(')').append(mapDesc(returnType.getDescriptor()));
-        return s.toString();
+        sb.append(')').append(mapDesc(returnType.getDescriptor()));
+        return sb.toString();
     }
 
     public Object mapValue(Object value) {
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/SerialVersionUIDAdder.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/SerialVersionUIDAdder.java	Fri May 30 13:37:35 2014 -0700
@@ -239,7 +239,9 @@
         if (computeSVUID) {
             this.name = name;
             this.access = access;
-            this.interfaces = Arrays.copyOf(interfaces, interfaces.length);
+            this.interfaces = new String[interfaces.length];
+            System.arraycopy(interfaces, 0, this.interfaces, 0,
+                    interfaces.length);
         }
 
         super.visit(version, access, name, signature, superName, interfaces);
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/MethodNode.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/MethodNode.java	Fri May 30 13:37:35 2014 -0700
@@ -351,7 +351,7 @@
     }
 
     @Override
-    @SuppressWarnings("serial") // Anonymous class
+    @SuppressWarnings("serial")
     public AnnotationVisitor visitAnnotationDefault() {
         return new AnnotationNode(new ArrayList<Object>(0) {
             @Override
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/AnalyzerException.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/AnalyzerException.java	Fri May 30 13:37:35 2014 -0700
@@ -66,7 +66,7 @@
  * @author Bing Ran
  * @author Eric Bruneton
  */
-@SuppressWarnings("serial") // implementation class
+@SuppressWarnings("serial")
 public class AnalyzerException extends Exception {
 
     public final AbstractInsnNode node;
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java	Fri May 30 13:37:35 2014 -0700
@@ -754,14 +754,14 @@
      */
     @Override
     public String toString() {
-        StringBuffer b = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < getLocals(); ++i) {
-            b.append(getLocal(i));
+            sb.append(getLocal(i));
         }
-        b.append(' ');
+        sb.append(' ');
         for (int i = 0; i < getStackSize(); ++i) {
-            b.append(getStack(i).toString());
+            sb.append(getStack(i).toString());
         }
-        return b.toString();
+        return sb.toString();
     }
 }
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java	Fri May 30 13:37:35 2014 -0700
@@ -206,7 +206,6 @@
         }
         text.add("import java.util.*;\n");
         text.add("import jdk.internal.org.objectweb.asm.*;\n");
-        text.add("import jdk.internal.org.objectweb.asm.attrs.*;\n");
         text.add("public class " + simpleName + "Dump implements Opcodes {\n\n");
         text.add("public static byte[] dump () throws Exception {\n\n");
         text.add("ClassWriter cw = new ClassWriter(0);\n");
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckClassAdapter.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckClassAdapter.java	Fri May 30 13:37:35 2014 -0700
@@ -298,26 +298,26 @@
         for (int j = 0; j < method.instructions.size(); ++j) {
             method.instructions.get(j).accept(mv);
 
-            StringBuffer s = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
             Frame<BasicValue> f = frames[j];
             if (f == null) {
-                s.append('?');
+                sb.append('?');
             } else {
                 for (int k = 0; k < f.getLocals(); ++k) {
-                    s.append(getShortName(f.getLocal(k).toString()))
+                    sb.append(getShortName(f.getLocal(k).toString()))
                             .append(' ');
                 }
-                s.append(" : ");
+                sb.append(" : ");
                 for (int k = 0; k < f.getStackSize(); ++k) {
-                    s.append(getShortName(f.getStack(k).toString()))
+                    sb.append(getShortName(f.getStack(k).toString()))
                             .append(' ');
                 }
             }
-            while (s.length() < method.maxStack + method.maxLocals + 1) {
-                s.append(' ');
+            while (sb.length() < method.maxStack + method.maxLocals + 1) {
+                sb.append(' ');
             }
             pw.print(Integer.toString(j + 100000).substring(1));
-            pw.print(" " + s + " : " + t.text.get(t.text.size() - 1));
+            pw.print(" " + sb + " : " + t.text.get(t.text.size() - 1));
         }
         for (int j = 0; j < method.tryCatchBlocks.size(); ++j) {
             method.tryCatchBlocks.get(j).accept(mv);
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/Textifier.java	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/Textifier.java	Fri May 30 13:37:35 2014 -0700
@@ -443,7 +443,7 @@
         }
 
         buf.append(tab);
-        appendAccess(access);
+        appendAccess(access & ~Opcodes.ACC_VOLATILE);
         if ((access & Opcodes.ACC_NATIVE) != 0) {
             buf.append("native ");
         }
--- a/jdk/src/share/classes/jdk/internal/org/objectweb/asm/version.txt	Fri May 30 09:25:18 2014 -0700
+++ b/jdk/src/share/classes/jdk/internal/org/objectweb/asm/version.txt	Fri May 30 13:37:35 2014 -0700
@@ -1,12 +1,12 @@
 Path: .
-Working Copy Root Path: /hudson/jobs/objectweb-pull/workspace/asm-svn-2014-03-12
+Working Copy Root Path: /hudson/jobs/objectweb-pull/workspace/asm-svn-2014-05-27
 URL: file:///svnroot/asm/trunk/asm
 Repository Root: file:///svnroot/asm
 Repository UUID: 271bd773-ee82-43a6-9b2b-1890ed8ce7f9
-Revision: 1721
+Revision: 1748
 Node Kind: directory
 Schedule: normal
 Last Changed Author: ebruneton
-Last Changed Rev: 1721
-Last Changed Date: 2014-03-02 17:25:35 +0100 (Sun, 02 Mar 2014)
+Last Changed Rev: 1747
+Last Changed Date: 2014-05-24 10:22:13 +0200 (Sat, 24 May 2014)