src/java.base/share/classes/jdk/internal/org/objectweb/asm/ClassReader.java
author darcy
Tue, 11 Jun 2019 16:45:20 -0700
changeset 55382 30b1b7b4dd86
parent 53023 6879069d9d94
permissions -rw-r--r--
8214546: Start of release updates for JDK 14 8214547: Add SourceVersion.RELEASE_14 8214548: Add source 14 and target 14 to javac 8214549: Bump maximum recognized class file version to 58 for JDK 14 Reviewed-by: jjg, mikael, erikj, jlahoda, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     1
/*
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     3
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     6
 * published by the Free Software Foundation.  Oracle designates this
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     7
 * particular file as subject to the "Classpath" exception as provided
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     8
 * by Oracle in the LICENSE file that accompanied this code.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
     9
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    14
 * accompanied this code).
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    15
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    19
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    22
 * questions.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    23
 */
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    24
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    25
/*
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    26
 * This file is available under and governed by the GNU General Public
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    27
 * License version 2 only, as published by the Free Software Foundation.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    28
 * However, the following notice accompanied the original version of this
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    29
 * file:
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    30
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    31
 * ASM: a very small and fast Java bytecode manipulation framework
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    32
 * Copyright (c) 2000-2011 INRIA, France Telecom
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    33
 * All rights reserved.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    34
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    35
 * Redistribution and use in source and binary forms, with or without
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    36
 * modification, are permitted provided that the following conditions
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    37
 * are met:
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    38
 * 1. Redistributions of source code must retain the above copyright
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    39
 *    notice, this list of conditions and the following disclaimer.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    40
 * 2. Redistributions in binary form must reproduce the above copyright
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    41
 *    notice, this list of conditions and the following disclaimer in the
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    42
 *    documentation and/or other materials provided with the distribution.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    43
 * 3. Neither the name of the copyright holders nor the names of its
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    44
 *    contributors may be used to endorse or promote products derived from
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    45
 *    this software without specific prior written permission.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    46
 *
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    47
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    48
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    49
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    50
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    51
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    52
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    53
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    54
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    55
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    56
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    57
 * THE POSSIBILITY OF SUCH DAMAGE.
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    58
 */
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    59
package jdk.internal.org.objectweb.asm;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    60
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    61
import java.io.ByteArrayOutputStream;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    62
import java.io.IOException;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    63
import java.io.InputStream;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    64
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    65
/**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    66
 * A parser to make a {@link ClassVisitor} visit a ClassFile structure, as defined in the Java
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    67
 * Virtual Machine Specification (JVMS). This class parses the ClassFile content and calls the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    68
 * appropriate visit methods of a given {@link ClassVisitor} for each field, method and bytecode
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    69
 * instruction encountered.
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    70
 *
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    71
 * @see <a href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html">JVMS 4</a>
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    72
 * @author Eric Bruneton
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    73
 * @author Eugene Kuleshov
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    74
 */
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    75
public class ClassReader {
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    76
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    77
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    78
      * A flag to skip the Code attributes. If this flag is set the Code attributes are neither parsed
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    79
      * nor visited.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    80
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    81
    public static final int SKIP_CODE = 1;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    82
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    83
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    84
      * A flag to skip the SourceFile, SourceDebugExtension, LocalVariableTable, LocalVariableTypeTable
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    85
      * and LineNumberTable attributes. If this flag is set these attributes are neither parsed nor
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    86
      * visited (i.e. {@link ClassVisitor#visitSource}, {@link MethodVisitor#visitLocalVariable} and
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    87
      * {@link MethodVisitor#visitLineNumber} are not called).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    88
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    89
    public static final int SKIP_DEBUG = 2;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    90
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    91
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    92
      * A flag to skip the StackMap and StackMapTable attributes. If this flag is set these attributes
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    93
      * are neither parsed nor visited (i.e. {@link MethodVisitor#visitFrame} is not called). This flag
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    94
      * is useful when the {@link ClassWriter#COMPUTE_FRAMES} option is used: it avoids visiting frames
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    95
      * that will be ignored and recomputed from scratch.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
    96
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    97
    public static final int SKIP_FRAMES = 4;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    98
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
    99
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   100
      * A flag to expand the stack map frames. By default stack map frames are visited in their
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   101
      * original format (i.e. "expanded" for classes whose version is less than V1_6, and "compressed"
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   102
      * for the other classes). If this flag is set, stack map frames are always visited in expanded
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   103
      * format (this option adds a decompression/compression step in ClassReader and ClassWriter which
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   104
      * degrades performance quite a lot).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   105
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   106
    public static final int EXPAND_FRAMES = 8;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   107
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   108
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   109
      * A flag to expand the ASM specific instructions into an equivalent sequence of standard bytecode
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   110
      * instructions. When resolving a forward jump it may happen that the signed 2 bytes offset
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   111
      * reserved for it is not sufficient to store the bytecode offset. In this case the jump
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   112
      * instruction is replaced with a temporary ASM specific instruction using an unsigned 2 bytes
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   113
      * offset (see {@link Label#resolve}). This internal flag is used to re-read classes containing
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   114
      * such instructions, in order to replace them with standard instructions. In addition, when this
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   115
      * flag is used, goto_w and jsr_w are <i>not</i> converted into goto and jsr, to make sure that
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   116
      * infinite loops where a goto_w is replaced with a goto in ClassReader and converted back to a
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   117
      * goto_w in ClassWriter cannot occur.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   118
      */
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
   119
    static final int EXPAND_ASM_INSNS = 256;
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
   120
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   121
    /** The size of the temporary byte array used to read class input streams chunk by chunk. */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   122
    private static final int INPUT_STREAM_DATA_CHUNK_SIZE = 4096;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   123
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
   124
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   125
      * A byte array containing the JVMS ClassFile structure to be parsed. <i>The content of this array
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   126
      * must not be modified. This field is intended for {@link Attribute} sub classes, and is normally
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   127
      * not needed by class visitors.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   128
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   129
      * <p>NOTE: the ClassFile structure can start at any offset within this array, i.e. it does not
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   130
      * necessarily start at offset 0. Use {@link #getItem} and {@link #header} to get correct
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   131
      * ClassFile element offsets within this byte array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   132
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   133
    // DontCheck(MemberName): can't be renamed (for backward binary compatibility).
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   134
    public final byte[] b;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   135
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   136
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   137
      * The offset in bytes, in {@link #b}, of each cp_info entry of the ClassFile's constant_pool
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   138
      * array, <i>plus one</i>. In other words, the offset of constant pool entry i is given by
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   139
      * cpInfoOffsets[i] - 1, i.e. its cp_info's tag field is given by b[cpInfoOffsets[i] - 1].
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   140
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   141
    private final int[] cpInfoOffsets;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   142
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   143
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   144
      * The String objects corresponding to the CONSTANT_Utf8 constant pool items. This cache avoids
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   145
      * multiple parsing of a given CONSTANT_Utf8 constant pool item.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   146
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   147
    private final String[] constantUtf8Values;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   148
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   149
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   150
      * The ConstantDynamic objects corresponding to the CONSTANT_Dynamic constant pool items. This
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   151
      * cache avoids multiple parsing of a given CONSTANT_Dynamic constant pool item.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   152
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   153
    private final ConstantDynamic[] constantDynamicValues;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   154
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   155
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   156
      * The start offsets in {@link #b} of each element of the bootstrap_methods array (in the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   157
      * BootstrapMethods attribute).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   158
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   159
      * @see <a href="https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.23">JVMS
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   160
      *     4.7.23</a>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   161
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   162
    private final int[] bootstrapMethodOffsets;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   163
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   164
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   165
      * A conservative estimate of the maximum length of the strings contained in the constant pool of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   166
      * the class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   167
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   168
    private final int maxStringLength;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   169
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   170
    /** The offset in bytes, in {@link #b}, of the ClassFile's access_flags field. */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   171
    public final int header;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   172
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   173
    // -----------------------------------------------------------------------------------------------
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   174
    // Constructors
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   175
    // -----------------------------------------------------------------------------------------------
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   176
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   177
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   178
      * Constructs a new {@link ClassReader} object.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   179
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   180
      * @param classFile the JVMS ClassFile structure to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   181
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   182
    public ClassReader(final byte[] classFile) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   183
        this(classFile, 0, classFile.length);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   184
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   185
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   186
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   187
      * Constructs a new {@link ClassReader} object.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   188
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   189
      * @param classFileBuffer a byte array containing the JVMS ClassFile structure to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   190
      * @param classFileOffset the offset in byteBuffer of the first byte of the ClassFile to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   191
      * @param classFileLength the length in bytes of the ClassFile to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   192
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   193
    public ClassReader(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   194
            final byte[] classFileBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   195
            final int classFileOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   196
            final int classFileLength) { // NOPMD(UnusedFormalParameter) used for backward compatibility.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   197
        this(classFileBuffer, classFileOffset, /* checkClassVersion = */ true);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   198
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   199
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   200
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   201
      * Constructs a new {@link ClassReader} object. <i>This internal constructor must not be exposed
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   202
      * as a public API</i>.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   203
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   204
      * @param classFileBuffer a byte array containing the JVMS ClassFile structure to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   205
      * @param classFileOffset the offset in byteBuffer of the first byte of the ClassFile to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   206
      * @param checkClassVersion whether to check the class version or not.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   207
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   208
    ClassReader(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   209
            final byte[] classFileBuffer, final int classFileOffset, final boolean checkClassVersion) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   210
        b = classFileBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   211
        // Check the class' major_version. This field is after the magic and minor_version fields, which
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   212
        // use 4 and 2 bytes respectively.
55382
30b1b7b4dd86 8214546: Start of release updates for JDK 14
darcy
parents: 53023
diff changeset
   213
        if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V14) {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   214
            throw new IllegalArgumentException(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   215
                    "Unsupported class file major version " + readShort(classFileOffset + 6));
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   216
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   217
        // Create the constant pool arrays. The constant_pool_count field is after the magic,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   218
        // minor_version and major_version fields, which use 4, 2 and 2 bytes respectively.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   219
        int constantPoolCount = readUnsignedShort(classFileOffset + 8);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   220
        cpInfoOffsets = new int[constantPoolCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   221
        constantUtf8Values = new String[constantPoolCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   222
        // Compute the offset of each constant pool entry, as well as a conservative estimate of the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   223
        // maximum length of the constant pool strings. The first constant pool entry is after the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   224
        // magic, minor_version, major_version and constant_pool_count fields, which use 4, 2, 2 and 2
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   225
        // bytes respectively.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   226
        int currentCpInfoIndex = 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   227
        int currentCpInfoOffset = classFileOffset + 10;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   228
        int currentMaxStringLength = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   229
        boolean hasConstantDynamic = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   230
        boolean hasConstantInvokeDynamic = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   231
        // The offset of the other entries depend on the total size of all the previous entries.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   232
        while (currentCpInfoIndex < constantPoolCount) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   233
            cpInfoOffsets[currentCpInfoIndex++] = currentCpInfoOffset + 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   234
            int cpInfoSize;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   235
            switch (classFileBuffer[currentCpInfoOffset]) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   236
                case Symbol.CONSTANT_FIELDREF_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   237
                case Symbol.CONSTANT_METHODREF_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   238
                case Symbol.CONSTANT_INTERFACE_METHODREF_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   239
                case Symbol.CONSTANT_INTEGER_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   240
                case Symbol.CONSTANT_FLOAT_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   241
                case Symbol.CONSTANT_NAME_AND_TYPE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   242
                    cpInfoSize = 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   243
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   244
                case Symbol.CONSTANT_DYNAMIC_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   245
                    cpInfoSize = 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   246
                    hasConstantDynamic = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   247
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   248
                case Symbol.CONSTANT_INVOKE_DYNAMIC_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   249
                    cpInfoSize = 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   250
                    hasConstantInvokeDynamic = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   251
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   252
                case Symbol.CONSTANT_LONG_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   253
                case Symbol.CONSTANT_DOUBLE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   254
                    cpInfoSize = 9;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   255
                    currentCpInfoIndex++;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   256
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   257
                case Symbol.CONSTANT_UTF8_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   258
                    cpInfoSize = 3 + readUnsignedShort(currentCpInfoOffset + 1);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   259
                    if (cpInfoSize > currentMaxStringLength) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   260
                        // The size in bytes of this CONSTANT_Utf8 structure provides a conservative estimate
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   261
                        // of the length in characters of the corresponding string, and is much cheaper to
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   262
                        // compute than this exact length.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   263
                        currentMaxStringLength = cpInfoSize;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   264
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   265
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   266
                case Symbol.CONSTANT_METHOD_HANDLE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   267
                    cpInfoSize = 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   268
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   269
                case Symbol.CONSTANT_CLASS_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   270
                case Symbol.CONSTANT_STRING_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   271
                case Symbol.CONSTANT_METHOD_TYPE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   272
                case Symbol.CONSTANT_PACKAGE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   273
                case Symbol.CONSTANT_MODULE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   274
                    cpInfoSize = 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   275
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   276
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   277
                    throw new IllegalArgumentException();
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   278
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   279
            currentCpInfoOffset += cpInfoSize;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   280
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   281
        maxStringLength = currentMaxStringLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   282
        // The Classfile's access_flags field is just after the last constant pool entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   283
        header = currentCpInfoOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   284
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   285
        // Allocate the cache of ConstantDynamic values, if there is at least one.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   286
        constantDynamicValues = hasConstantDynamic ? new ConstantDynamic[constantPoolCount] : null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   287
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   288
        // Read the BootstrapMethods attribute, if any (only get the offset of each method).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   289
        bootstrapMethodOffsets =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   290
                (hasConstantDynamic | hasConstantInvokeDynamic)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   291
                        ? readBootstrapMethodsAttribute(currentMaxStringLength)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   292
                        : null;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   293
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   294
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   295
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   296
      * Constructs a new {@link ClassReader} object.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   297
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   298
      * @param inputStream an input stream of the JVMS ClassFile structure to be read. This input
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   299
      *     stream must contain nothing more than the ClassFile structure itself. It is read from its
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   300
      *     current position to its end.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   301
      * @throws IOException if a problem occurs during reading.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   302
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   303
    public ClassReader(final InputStream inputStream) throws IOException {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   304
        this(readStream(inputStream, false));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   305
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   306
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   307
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   308
      * Constructs a new {@link ClassReader} object.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   309
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   310
      * @param className the fully qualified name of the class to be read. The ClassFile structure is
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   311
      *     retrieved with the current class loader's {@link ClassLoader#getSystemResourceAsStream}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   312
      * @throws IOException if an exception occurs during reading.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   313
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   314
    public ClassReader(final String className) throws IOException {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   315
        this(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   316
                readStream(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   317
                        ClassLoader.getSystemResourceAsStream(className.replace('.', '/') + ".class"), true));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   318
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   319
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   320
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   321
      * Reads the given input stream and returns its content as a byte array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   322
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   323
      * @param inputStream an input stream.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   324
      * @param close true to close the input stream after reading.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   325
      * @return the content of the given input stream.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   326
      * @throws IOException if a problem occurs during reading.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   327
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   328
    private static byte[] readStream(final InputStream inputStream, final boolean close)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   329
            throws IOException {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   330
        if (inputStream == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   331
            throw new IOException("Class not found");
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   332
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   333
        try {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   334
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   335
            byte[] data = new byte[INPUT_STREAM_DATA_CHUNK_SIZE];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   336
            int bytesRead;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   337
            while ((bytesRead = inputStream.read(data, 0, data.length)) != -1) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   338
                outputStream.write(data, 0, bytesRead);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   339
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   340
            outputStream.flush();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   341
            return outputStream.toByteArray();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   342
        } finally {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   343
            if (close) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   344
                inputStream.close();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   345
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   346
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   347
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   348
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   349
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   350
    // Accessors
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   351
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   352
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   353
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   354
      * Returns the class's access flags (see {@link Opcodes}). This value may not reflect Deprecated
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   355
      * and Synthetic flags when bytecode is before 1.5 and those flags are represented by attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   356
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   357
      * @return the class access flags.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   358
      * @see ClassVisitor#visit(int, int, String, String, String, String[])
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   359
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   360
    public int getAccess() {
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   361
        return readUnsignedShort(header);
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   362
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   363
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   364
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   365
      * Returns the internal name of the class (see {@link Type#getInternalName()}).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   366
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   367
      * @return the internal class name.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   368
      * @see ClassVisitor#visit(int, int, String, String, String, String[])
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   369
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   370
    public String getClassName() {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   371
        // this_class is just after the access_flags field (using 2 bytes).
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   372
        return readClass(header + 2, new char[maxStringLength]);
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   373
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   374
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   375
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   376
      * Returns the internal of name of the super class (see {@link Type#getInternalName()}). For
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   377
      * interfaces, the super class is {@link Object}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   378
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   379
      * @return the internal name of the super class, or {@literal null} for {@link Object} class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   380
      * @see ClassVisitor#visit(int, int, String, String, String, String[])
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   381
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   382
    public String getSuperName() {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   383
        // super_class is after the access_flags and this_class fields (2 bytes each).
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
   384
        return readClass(header + 4, new char[maxStringLength]);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   385
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   386
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   387
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   388
      * Returns the internal names of the implemented interfaces (see {@link Type#getInternalName()}).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   389
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   390
      * @return the internal names of the directly implemented interfaces. Inherited implemented
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   391
      *     interfaces are not returned.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   392
      * @see ClassVisitor#visit(int, int, String, String, String, String[])
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   393
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   394
    public String[] getInterfaces() {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   395
        // interfaces_count is after the access_flags, this_class and super_class fields (2 bytes each).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   396
        int currentOffset = header + 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   397
        int interfacesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   398
        String[] interfaces = new String[interfacesCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   399
        if (interfacesCount > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   400
            char[] charBuffer = new char[maxStringLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   401
            for (int i = 0; i < interfacesCount; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   402
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   403
                interfaces[i] = readClass(currentOffset, charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   404
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   405
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   406
        return interfaces;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   407
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   408
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   409
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   410
    // Public methods
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   411
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   412
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   413
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   414
      * Makes the given visitor visit the JVMS ClassFile structure passed to the constructor of this
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   415
      * {@link ClassReader}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   416
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   417
      * @param classVisitor the visitor that must visit this class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   418
      * @param parsingOptions the options to use to parse this class. One or more of {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   419
      *     #SKIP_CODE}, {@link #SKIP_DEBUG}, {@link #SKIP_FRAMES} or {@link #EXPAND_FRAMES}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   420
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   421
    public void accept(final ClassVisitor classVisitor, final int parsingOptions) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   422
        accept(classVisitor, new Attribute[0], parsingOptions);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   423
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   424
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
   425
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   426
      * Makes the given visitor visit the JVMS ClassFile structure passed to the constructor of this
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   427
      * {@link ClassReader}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   428
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   429
      * @param classVisitor the visitor that must visit this class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   430
      * @param attributePrototypes prototypes of the attributes that must be parsed during the visit of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   431
      *     the class. Any attribute whose type is not equal to the type of one the prototypes will not
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   432
      *     be parsed: its byte array value will be passed unchanged to the ClassWriter. <i>This may
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   433
      *     corrupt it if this value contains references to the constant pool, or has syntactic or
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   434
      *     semantic links with a class element that has been transformed by a class adapter between
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   435
      *     the reader and the writer</i>.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   436
      * @param parsingOptions the options to use to parse this class. One or more of {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   437
      *     #SKIP_CODE}, {@link #SKIP_DEBUG}, {@link #SKIP_FRAMES} or {@link #EXPAND_FRAMES}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   438
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   439
    public void accept(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   440
            final ClassVisitor classVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   441
            final Attribute[] attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   442
            final int parsingOptions) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   443
        Context context = new Context();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   444
        context.attributePrototypes = attributePrototypes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   445
        context.parsingOptions = parsingOptions;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   446
        context.charBuffer = new char[maxStringLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   447
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   448
        // Read the access_flags, this_class, super_class, interface_count and interfaces fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   449
        char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   450
        int currentOffset = header;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   451
        int accessFlags = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   452
        String thisClass = readClass(currentOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   453
        String superClass = readClass(currentOffset + 4, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   454
        String[] interfaces = new String[readUnsignedShort(currentOffset + 6)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   455
        currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   456
        for (int i = 0; i < interfaces.length; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   457
            interfaces[i] = readClass(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   458
            currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   459
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   460
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   461
        // Read the class attributes (the variables are ordered as in Section 4.7 of the JVMS).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   462
        // Attribute offsets exclude the attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   463
        // - The offset of the InnerClasses attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   464
        int innerClassesOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   465
        // - The offset of the EnclosingMethod attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   466
        int enclosingMethodOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   467
        // - The string corresponding to the Signature attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   468
        String signature = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   469
        // - The string corresponding to the SourceFile attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   470
        String sourceFile = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   471
        // - The string corresponding to the SourceDebugExtension attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   472
        String sourceDebugExtension = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   473
        // - The offset of the RuntimeVisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   474
        int runtimeVisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   475
        // - The offset of the RuntimeInvisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   476
        int runtimeInvisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   477
        // - The offset of the RuntimeVisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   478
        int runtimeVisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   479
        // - The offset of the RuntimeInvisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   480
        int runtimeInvisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   481
        // - The offset of the Module attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   482
        int moduleOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   483
        // - The offset of the ModulePackages attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   484
        int modulePackagesOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   485
        // - The string corresponding to the ModuleMainClass attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   486
        String moduleMainClass = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   487
        // - The string corresponding to the NestHost attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   488
        String nestHostClass = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   489
        // - The offset of the NestMembers attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   490
        int nestMembersOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   491
        // - The non standard attributes (linked with their {@link Attribute#nextAttribute} field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   492
        //   This list in the <i>reverse order</i> or their order in the ClassFile structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   493
        Attribute attributes = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   494
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   495
        int currentAttributeOffset = getFirstAttributeOffset();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   496
        for (int i = readUnsignedShort(currentAttributeOffset - 2); i > 0; --i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   497
            // Read the attribute_info's attribute_name and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   498
            String attributeName = readUTF8(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   499
            int attributeLength = readInt(currentAttributeOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   500
            currentAttributeOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   501
            // The tests are sorted in decreasing frequency order (based on frequencies observed on
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   502
            // typical classes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   503
            if (Constants.SOURCE_FILE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   504
                sourceFile = readUTF8(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   505
            } else if (Constants.INNER_CLASSES.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   506
                innerClassesOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   507
            } else if (Constants.ENCLOSING_METHOD.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   508
                enclosingMethodOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   509
            } else if (Constants.NEST_HOST.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   510
                nestHostClass = readClass(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   511
            } else if (Constants.NEST_MEMBERS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   512
                nestMembersOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   513
            } else if (Constants.SIGNATURE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   514
                signature = readUTF8(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   515
            } else if (Constants.RUNTIME_VISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   516
                runtimeVisibleAnnotationsOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   517
            } else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   518
                runtimeVisibleTypeAnnotationsOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   519
            } else if (Constants.DEPRECATED.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   520
                accessFlags |= Opcodes.ACC_DEPRECATED;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   521
            } else if (Constants.SYNTHETIC.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   522
                accessFlags |= Opcodes.ACC_SYNTHETIC;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   523
            } else if (Constants.SOURCE_DEBUG_EXTENSION.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   524
                sourceDebugExtension =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   525
                        readUtf(currentAttributeOffset, attributeLength, new char[attributeLength]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   526
            } else if (Constants.RUNTIME_INVISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   527
                runtimeInvisibleAnnotationsOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   528
            } else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   529
                runtimeInvisibleTypeAnnotationsOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   530
            } else if (Constants.MODULE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   531
                moduleOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   532
            } else if (Constants.MODULE_MAIN_CLASS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   533
                moduleMainClass = readClass(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   534
            } else if (Constants.MODULE_PACKAGES.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   535
                modulePackagesOffset = currentAttributeOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   536
            } else if (!Constants.BOOTSTRAP_METHODS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   537
                // The BootstrapMethods attribute is read in the constructor.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   538
                Attribute attribute =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   539
                        readAttribute(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   540
                                attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   541
                                attributeName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   542
                                currentAttributeOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   543
                                attributeLength,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   544
                                charBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   545
                                -1,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   546
                                null);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   547
                attribute.nextAttribute = attributes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   548
                attributes = attribute;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   549
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   550
            currentAttributeOffset += attributeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   551
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   552
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   553
        // Visit the class declaration. The minor_version and major_version fields start 6 bytes before
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   554
        // the first constant pool entry, which itself starts at cpInfoOffsets[1] - 1 (by definition).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   555
        classVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   556
                readInt(cpInfoOffsets[1] - 7), accessFlags, thisClass, signature, superClass, interfaces);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   557
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   558
        // Visit the SourceFile and SourceDebugExtenstion attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   559
        if ((parsingOptions & SKIP_DEBUG) == 0
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   560
                && (sourceFile != null || sourceDebugExtension != null)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   561
            classVisitor.visitSource(sourceFile, sourceDebugExtension);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   562
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   563
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   564
        // Visit the Module, ModulePackages and ModuleMainClass attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   565
        if (moduleOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   566
            readModuleAttributes(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   567
                    classVisitor, context, moduleOffset, modulePackagesOffset, moduleMainClass);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   568
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   569
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   570
        // Visit the NestHost attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   571
        if (nestHostClass != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   572
            classVisitor.visitNestHost(nestHostClass);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   573
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   574
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   575
        // Visit the EnclosingMethod attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   576
        if (enclosingMethodOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   577
            String className = readClass(enclosingMethodOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   578
            int methodIndex = readUnsignedShort(enclosingMethodOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   579
            String name = methodIndex == 0 ? null : readUTF8(cpInfoOffsets[methodIndex], charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   580
            String type = methodIndex == 0 ? null : readUTF8(cpInfoOffsets[methodIndex] + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   581
            classVisitor.visitOuterClass(className, name, type);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   582
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   583
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   584
        // Visit the RuntimeVisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   585
        if (runtimeVisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   586
            int numAnnotations = readUnsignedShort(runtimeVisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   587
            int currentAnnotationOffset = runtimeVisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   588
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   589
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   590
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   591
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   592
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   593
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   594
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   595
                                classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   596
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   597
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   598
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   599
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   600
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   601
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   602
        // Visit the RuntimeInvisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   603
        if (runtimeInvisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   604
            int numAnnotations = readUnsignedShort(runtimeInvisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   605
            int currentAnnotationOffset = runtimeInvisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   606
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   607
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   608
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   609
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   610
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   611
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   612
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   613
                                classVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   614
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   615
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   616
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   617
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   618
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   619
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   620
        // Visit the RuntimeVisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   621
        if (runtimeVisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   622
            int numAnnotations = readUnsignedShort(runtimeVisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   623
            int currentAnnotationOffset = runtimeVisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   624
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   625
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   626
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   627
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   628
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   629
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   630
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   631
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   632
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   633
                                classVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   634
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   635
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   636
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   637
                                        /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   638
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   639
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   640
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   641
            }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   642
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   643
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   644
        // Visit the RuntimeInvisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   645
        if (runtimeInvisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   646
            int numAnnotations = readUnsignedShort(runtimeInvisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   647
            int currentAnnotationOffset = runtimeInvisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   648
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   649
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   650
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   651
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   652
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   653
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   654
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   655
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   656
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   657
                                classVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   658
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   659
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   660
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   661
                                        /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   662
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   663
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   664
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   665
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   666
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   667
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   668
        // Visit the non standard attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   669
        while (attributes != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   670
            // Copy and reset the nextAttribute field so that it can also be used in ClassWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   671
            Attribute nextAttribute = attributes.nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   672
            attributes.nextAttribute = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   673
            classVisitor.visitAttribute(attributes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   674
            attributes = nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   675
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   676
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   677
        // Visit the NestedMembers attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   678
        if (nestMembersOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   679
            int numberOfNestMembers = readUnsignedShort(nestMembersOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   680
            int currentNestMemberOffset = nestMembersOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   681
            while (numberOfNestMembers-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   682
                classVisitor.visitNestMember(readClass(currentNestMemberOffset, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   683
                currentNestMemberOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   684
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   685
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   686
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   687
        // Visit the InnerClasses attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   688
        if (innerClassesOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   689
            int numberOfClasses = readUnsignedShort(innerClassesOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   690
            int currentClassesOffset = innerClassesOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   691
            while (numberOfClasses-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   692
                classVisitor.visitInnerClass(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   693
                        readClass(currentClassesOffset, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   694
                        readClass(currentClassesOffset + 2, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   695
                        readUTF8(currentClassesOffset + 4, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   696
                        readUnsignedShort(currentClassesOffset + 6));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   697
                currentClassesOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   698
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   699
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   700
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   701
        // Visit the fields and methods.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   702
        int fieldsCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   703
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   704
        while (fieldsCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   705
            currentOffset = readField(classVisitor, context, currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   706
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   707
        int methodsCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   708
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   709
        while (methodsCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   710
            currentOffset = readMethod(classVisitor, context, currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   711
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   712
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   713
        // Visit the end of the class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   714
        classVisitor.visitEnd();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   715
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   716
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   717
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   718
    // Methods to parse modules, fields and methods
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   719
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   720
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   721
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   722
      * Reads the Module, ModulePackages and ModuleMainClass attributes and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   723
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   724
      * @param classVisitor the current class visitor
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   725
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   726
      * @param moduleOffset the offset of the Module attribute (excluding the attribute_info's
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   727
      *     attribute_name_index and attribute_length fields).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   728
      * @param modulePackagesOffset the offset of the ModulePackages attribute (excluding the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   729
      *     attribute_info's attribute_name_index and attribute_length fields), or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   730
      * @param moduleMainClass the string corresponding to the ModuleMainClass attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   731
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   732
    private void readModuleAttributes(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   733
            final ClassVisitor classVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   734
            final Context context,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   735
            final int moduleOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   736
            final int modulePackagesOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   737
            final String moduleMainClass) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   738
        char[] buffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   739
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   740
        // Read the module_name_index, module_flags and module_version_index fields and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   741
        int currentOffset = moduleOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   742
        String moduleName = readModule(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   743
        int moduleFlags = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   744
        String moduleVersion = readUTF8(currentOffset + 4, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   745
        currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   746
        ModuleVisitor moduleVisitor = classVisitor.visitModule(moduleName, moduleFlags, moduleVersion);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   747
        if (moduleVisitor == null) {
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
   748
            return;
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
   749
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   750
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   751
        // Visit the ModuleMainClass attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   752
        if (moduleMainClass != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   753
            moduleVisitor.visitMainClass(moduleMainClass);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   754
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   755
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   756
        // Visit the ModulePackages attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   757
        if (modulePackagesOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   758
            int packageCount = readUnsignedShort(modulePackagesOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   759
            int currentPackageOffset = modulePackagesOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   760
            while (packageCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   761
                moduleVisitor.visitPackage(readPackage(currentPackageOffset, buffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   762
                currentPackageOffset += 2;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   763
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   764
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   765
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   766
        // Read the 'requires_count' and 'requires' fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   767
        int requiresCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   768
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   769
        while (requiresCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   770
            // Read the requires_index, requires_flags and requires_version fields and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   771
            String requires = readModule(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   772
            int requiresFlags = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   773
            String requiresVersion = readUTF8(currentOffset + 4, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   774
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   775
            moduleVisitor.visitRequire(requires, requiresFlags, requiresVersion);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   776
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   777
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   778
        // Read the 'exports_count' and 'exports' fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   779
        int exportsCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   780
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   781
        while (exportsCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   782
            // Read the exports_index, exports_flags, exports_to_count and exports_to_index fields
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   783
            // and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   784
            String exports = readPackage(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   785
            int exportsFlags = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   786
            int exportsToCount = readUnsignedShort(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   787
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   788
            String[] exportsTo = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   789
            if (exportsToCount != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   790
                exportsTo = new String[exportsToCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   791
                for (int i = 0; i < exportsToCount; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   792
                    exportsTo[i] = readModule(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   793
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   794
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   795
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   796
            moduleVisitor.visitExport(exports, exportsFlags, exportsTo);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   797
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   798
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   799
        // Reads the 'opens_count' and 'opens' fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   800
        int opensCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   801
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   802
        while (opensCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   803
            // Read the opens_index, opens_flags, opens_to_count and opens_to_index fields and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   804
            String opens = readPackage(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   805
            int opensFlags = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   806
            int opensToCount = readUnsignedShort(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   807
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   808
            String[] opensTo = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   809
            if (opensToCount != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   810
                opensTo = new String[opensToCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   811
                for (int i = 0; i < opensToCount; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   812
                    opensTo[i] = readModule(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   813
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   814
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   815
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   816
            moduleVisitor.visitOpen(opens, opensFlags, opensTo);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   817
        }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   818
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   819
        // Read the 'uses_count' and 'uses' fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   820
        int usesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   821
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   822
        while (usesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   823
            moduleVisitor.visitUse(readClass(currentOffset, buffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   824
            currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   825
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   826
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   827
        // Read the  'provides_count' and 'provides' fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   828
        int providesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   829
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   830
        while (providesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   831
            // Read the provides_index, provides_with_count and provides_with_index fields and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   832
            String provides = readClass(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   833
            int providesWithCount = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   834
            currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   835
            String[] providesWith = new String[providesWithCount];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   836
            for (int i = 0; i < providesWithCount; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   837
                providesWith[i] = readClass(currentOffset, buffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   838
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   839
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   840
            moduleVisitor.visitProvide(provides, providesWith);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   841
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   842
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   843
        // Visit the end of the module attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   844
        moduleVisitor.visitEnd();
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   845
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   846
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   847
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   848
      * Reads a JVMS field_info structure and makes the given visitor visit it.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   849
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   850
      * @param classVisitor the visitor that must visit the field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   851
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   852
      * @param fieldInfoOffset the start offset of the field_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   853
      * @return the offset of the first byte following the field_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   854
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   855
    private int readField(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   856
            final ClassVisitor classVisitor, final Context context, final int fieldInfoOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   857
        char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   858
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   859
        // Read the access_flags, name_index and descriptor_index fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   860
        int currentOffset = fieldInfoOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   861
        int accessFlags = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   862
        String name = readUTF8(currentOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   863
        String descriptor = readUTF8(currentOffset + 4, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   864
        currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   865
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   866
        // Read the field attributes (the variables are ordered as in Section 4.7 of the JVMS).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   867
        // Attribute offsets exclude the attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   868
        // - The value corresponding to the ConstantValue attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   869
        Object constantValue = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   870
        // - The string corresponding to the Signature attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   871
        String signature = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   872
        // - The offset of the RuntimeVisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   873
        int runtimeVisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   874
        // - The offset of the RuntimeInvisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   875
        int runtimeInvisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   876
        // - The offset of the RuntimeVisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   877
        int runtimeVisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   878
        // - The offset of the RuntimeInvisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   879
        int runtimeInvisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   880
        // - The non standard attributes (linked with their {@link Attribute#nextAttribute} field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   881
        //   This list in the <i>reverse order</i> or their order in the ClassFile structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   882
        Attribute attributes = null;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   883
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   884
        int attributesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   885
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   886
        while (attributesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   887
            // Read the attribute_info's attribute_name and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   888
            String attributeName = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   889
            int attributeLength = readInt(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   890
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   891
            // The tests are sorted in decreasing frequency order (based on frequencies observed on
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   892
            // typical classes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   893
            if (Constants.CONSTANT_VALUE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   894
                int constantvalueIndex = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   895
                constantValue = constantvalueIndex == 0 ? null : readConst(constantvalueIndex, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   896
            } else if (Constants.SIGNATURE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   897
                signature = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   898
            } else if (Constants.DEPRECATED.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   899
                accessFlags |= Opcodes.ACC_DEPRECATED;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   900
            } else if (Constants.SYNTHETIC.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   901
                accessFlags |= Opcodes.ACC_SYNTHETIC;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   902
            } else if (Constants.RUNTIME_VISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   903
                runtimeVisibleAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   904
            } else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   905
                runtimeVisibleTypeAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   906
            } else if (Constants.RUNTIME_INVISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   907
                runtimeInvisibleAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   908
            } else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   909
                runtimeInvisibleTypeAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   910
            } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   911
                Attribute attribute =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   912
                        readAttribute(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   913
                                context.attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   914
                                attributeName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   915
                                currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   916
                                attributeLength,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   917
                                charBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   918
                                -1,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   919
                                null);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   920
                attribute.nextAttribute = attributes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   921
                attributes = attribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   922
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   923
            currentOffset += attributeLength;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   924
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   925
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   926
        // Visit the field declaration.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   927
        FieldVisitor fieldVisitor =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   928
                classVisitor.visitField(accessFlags, name, descriptor, signature, constantValue);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   929
        if (fieldVisitor == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   930
            return currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   931
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   932
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   933
        // Visit the RuntimeVisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   934
        if (runtimeVisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   935
            int numAnnotations = readUnsignedShort(runtimeVisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   936
            int currentAnnotationOffset = runtimeVisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   937
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   938
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   939
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   940
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   941
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   942
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   943
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   944
                                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   945
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   946
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   947
                                charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   948
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   949
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   950
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   951
        // Visit the RuntimeInvisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   952
        if (runtimeInvisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   953
            int numAnnotations = readUnsignedShort(runtimeInvisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   954
            int currentAnnotationOffset = runtimeInvisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   955
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   956
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   957
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   958
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   959
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   960
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   961
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   962
                                fieldVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   963
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   964
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   965
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   966
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   967
        }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
   968
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   969
        // Visit the RuntimeVisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   970
        if (runtimeVisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   971
            int numAnnotations = readUnsignedShort(runtimeVisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   972
            int currentAnnotationOffset = runtimeVisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   973
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   974
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   975
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   976
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   977
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   978
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   979
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   980
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   981
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   982
                                fieldVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   983
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   984
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   985
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   986
                                        /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   987
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   988
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   989
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   990
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   991
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   992
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   993
        // Visit the RuntimeInvisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   994
        if (runtimeInvisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   995
            int numAnnotations = readUnsignedShort(runtimeInvisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   996
            int currentAnnotationOffset = runtimeInvisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   997
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   998
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
   999
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1000
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1001
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1002
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1003
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1004
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1005
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1006
                                fieldVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1007
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1008
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1009
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1010
                                        /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1011
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1012
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1013
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1014
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1015
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1016
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1017
        // Visit the non standard attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1018
        while (attributes != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1019
            // Copy and reset the nextAttribute field so that it can also be used in FieldWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1020
            Attribute nextAttribute = attributes.nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1021
            attributes.nextAttribute = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1022
            fieldVisitor.visitAttribute(attributes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1023
            attributes = nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1024
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1025
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1026
        // Visit the end of the field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1027
        fieldVisitor.visitEnd();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1028
        return currentOffset;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1029
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1030
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1031
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1032
      * Reads a JVMS method_info structure and makes the given visitor visit it.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1033
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1034
      * @param classVisitor the visitor that must visit the method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1035
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1036
      * @param methodInfoOffset the start offset of the method_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1037
      * @return the offset of the first byte following the method_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1038
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1039
    private int readMethod(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1040
            final ClassVisitor classVisitor, final Context context, final int methodInfoOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1041
        char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1042
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1043
        // Read the access_flags, name_index and descriptor_index fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1044
        int currentOffset = methodInfoOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1045
        context.currentMethodAccessFlags = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1046
        context.currentMethodName = readUTF8(currentOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1047
        context.currentMethodDescriptor = readUTF8(currentOffset + 4, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1048
        currentOffset += 6;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1049
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1050
        // Read the method attributes (the variables are ordered as in Section 4.7 of the JVMS).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1051
        // Attribute offsets exclude the attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1052
        // - The offset of the Code attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1053
        int codeOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1054
        // - The offset of the Exceptions attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1055
        int exceptionsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1056
        // - The strings corresponding to the Exceptions attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1057
        String[] exceptions = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1058
        // - Whether the method has a Synthetic attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1059
        boolean synthetic = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1060
        // - The constant pool index contained in the Signature attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1061
        int signatureIndex = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1062
        // - The offset of the RuntimeVisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1063
        int runtimeVisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1064
        // - The offset of the RuntimeInvisibleAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1065
        int runtimeInvisibleAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1066
        // - The offset of the RuntimeVisibleParameterAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1067
        int runtimeVisibleParameterAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1068
        // - The offset of the RuntimeInvisibleParameterAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1069
        int runtimeInvisibleParameterAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1070
        // - The offset of the RuntimeVisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1071
        int runtimeVisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1072
        // - The offset of the RuntimeInvisibleTypeAnnotations attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1073
        int runtimeInvisibleTypeAnnotationsOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1074
        // - The offset of the AnnotationDefault attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1075
        int annotationDefaultOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1076
        // - The offset of the MethodParameters attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1077
        int methodParametersOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1078
        // - The non standard attributes (linked with their {@link Attribute#nextAttribute} field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1079
        //   This list in the <i>reverse order</i> or their order in the ClassFile structure.
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1080
        Attribute attributes = null;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1081
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1082
        int attributesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1083
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1084
        while (attributesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1085
            // Read the attribute_info's attribute_name and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1086
            String attributeName = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1087
            int attributeLength = readInt(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1088
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1089
            // The tests are sorted in decreasing frequency order (based on frequencies observed on
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1090
            // typical classes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1091
            if (Constants.CODE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1092
                if ((context.parsingOptions & SKIP_CODE) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1093
                    codeOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1094
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1095
            } else if (Constants.EXCEPTIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1096
                exceptionsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1097
                exceptions = new String[readUnsignedShort(exceptionsOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1098
                int currentExceptionOffset = exceptionsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1099
                for (int i = 0; i < exceptions.length; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1100
                    exceptions[i] = readClass(currentExceptionOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1101
                    currentExceptionOffset += 2;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1102
                }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1103
            } else if (Constants.SIGNATURE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1104
                signatureIndex = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1105
            } else if (Constants.DEPRECATED.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1106
                context.currentMethodAccessFlags |= Opcodes.ACC_DEPRECATED;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1107
            } else if (Constants.RUNTIME_VISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1108
                runtimeVisibleAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1109
            } else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1110
                runtimeVisibleTypeAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1111
            } else if (Constants.ANNOTATION_DEFAULT.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1112
                annotationDefaultOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1113
            } else if (Constants.SYNTHETIC.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1114
                synthetic = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1115
                context.currentMethodAccessFlags |= Opcodes.ACC_SYNTHETIC;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1116
            } else if (Constants.RUNTIME_INVISIBLE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1117
                runtimeInvisibleAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1118
            } else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1119
                runtimeInvisibleTypeAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1120
            } else if (Constants.RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1121
                runtimeVisibleParameterAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1122
            } else if (Constants.RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1123
                runtimeInvisibleParameterAnnotationsOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1124
            } else if (Constants.METHOD_PARAMETERS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1125
                methodParametersOffset = currentOffset;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1126
            } else {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1127
                Attribute attribute =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1128
                        readAttribute(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1129
                                context.attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1130
                                attributeName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1131
                                currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1132
                                attributeLength,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1133
                                charBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1134
                                -1,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1135
                                null);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1136
                attribute.nextAttribute = attributes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1137
                attributes = attribute;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1138
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1139
            currentOffset += attributeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1140
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1141
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1142
        // Visit the method declaration.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1143
        MethodVisitor methodVisitor =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1144
                classVisitor.visitMethod(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1145
                        context.currentMethodAccessFlags,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1146
                        context.currentMethodName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1147
                        context.currentMethodDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1148
                        signatureIndex == 0 ? null : readUtf(signatureIndex, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1149
                        exceptions);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1150
        if (methodVisitor == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1151
            return currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1152
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1153
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1154
        // If the returned MethodVisitor is in fact a MethodWriter, it means there is no method
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1155
        // adapter between the reader and the writer. In this case, it might be possible to copy
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1156
        // the method attributes directly into the writer. If so, return early without visiting
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1157
        // the content of these attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1158
        if (methodVisitor instanceof MethodWriter) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1159
            MethodWriter methodWriter = (MethodWriter) methodVisitor;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1160
            if (methodWriter.canCopyMethodAttributes(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1161
                    this,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1162
                    methodInfoOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1163
                    currentOffset - methodInfoOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1164
                    synthetic,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1165
                    (context.currentMethodAccessFlags & Opcodes.ACC_DEPRECATED) != 0,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1166
                    readUnsignedShort(methodInfoOffset + 4),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1167
                    signatureIndex,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1168
                    exceptionsOffset)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1169
                return currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1170
            }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1171
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1172
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1173
        // Visit the MethodParameters attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1174
        if (methodParametersOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1175
            int parametersCount = readByte(methodParametersOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1176
            int currentParameterOffset = methodParametersOffset + 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1177
            while (parametersCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1178
                // Read the name_index and access_flags fields and visit them.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1179
                methodVisitor.visitParameter(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1180
                        readUTF8(currentParameterOffset, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1181
                        readUnsignedShort(currentParameterOffset + 2));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1182
                currentParameterOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1183
            }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1184
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1185
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1186
        // Visit the AnnotationDefault attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1187
        if (annotationDefaultOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1188
            AnnotationVisitor annotationVisitor = methodVisitor.visitAnnotationDefault();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1189
            readElementValue(annotationVisitor, annotationDefaultOffset, null, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1190
            if (annotationVisitor != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1191
                annotationVisitor.visitEnd();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1192
            }
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1193
        }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1194
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1195
        // Visit the RuntimeVisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1196
        if (runtimeVisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1197
            int numAnnotations = readUnsignedShort(runtimeVisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1198
            int currentAnnotationOffset = runtimeVisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1199
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1200
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1201
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1202
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1203
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1204
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1205
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1206
                                methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1207
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1208
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1209
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1210
            }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1211
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1212
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1213
        // Visit the RuntimeInvisibleAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1214
        if (runtimeInvisibleAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1215
            int numAnnotations = readUnsignedShort(runtimeInvisibleAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1216
            int currentAnnotationOffset = runtimeInvisibleAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1217
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1218
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1219
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1220
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1221
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1222
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1223
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1224
                                methodVisitor.visitAnnotation(annotationDescriptor, /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1225
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1226
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1227
                                charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1228
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1229
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1230
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1231
        // Visit the RuntimeVisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1232
        if (runtimeVisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1233
            int numAnnotations = readUnsignedShort(runtimeVisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1234
            int currentAnnotationOffset = runtimeVisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1235
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1236
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1237
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1238
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1239
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1240
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1241
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1242
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1243
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1244
                                methodVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1245
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1246
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1247
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1248
                                        /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1249
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1250
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1251
                                charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1252
            }
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1253
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1254
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1255
        // Visit the RuntimeInvisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1256
        if (runtimeInvisibleTypeAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1257
            int numAnnotations = readUnsignedShort(runtimeInvisibleTypeAnnotationsOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1258
            int currentAnnotationOffset = runtimeInvisibleTypeAnnotationsOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1259
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1260
                // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1261
                currentAnnotationOffset = readTypeAnnotationTarget(context, currentAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1262
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1263
                String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1264
                currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1265
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1266
                currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1267
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1268
                                methodVisitor.visitTypeAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1269
                                        context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1270
                                        context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1271
                                        annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1272
                                        /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1273
                                currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1274
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1275
                                charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1276
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1277
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1278
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1279
        // Visit the RuntimeVisibleParameterAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1280
        if (runtimeVisibleParameterAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1281
            readParameterAnnotations(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1282
                    methodVisitor, context, runtimeVisibleParameterAnnotationsOffset, /* visible = */ true);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1283
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1284
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1285
        // Visit the RuntimeInvisibleParameterAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1286
        if (runtimeInvisibleParameterAnnotationsOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1287
            readParameterAnnotations(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1288
                    methodVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1289
                    context,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1290
                    runtimeInvisibleParameterAnnotationsOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1291
                    /* visible = */ false);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1292
        }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1293
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1294
        // Visit the non standard attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1295
        while (attributes != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1296
            // Copy and reset the nextAttribute field so that it can also be used in MethodWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1297
            Attribute nextAttribute = attributes.nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1298
            attributes.nextAttribute = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1299
            methodVisitor.visitAttribute(attributes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1300
            attributes = nextAttribute;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1301
        }
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1302
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1303
        // Visit the Code attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1304
        if (codeOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1305
            methodVisitor.visitCode();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1306
            readCode(methodVisitor, context, codeOffset);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1307
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1308
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1309
        // Visit the end of the method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1310
        methodVisitor.visitEnd();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1311
        return currentOffset;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1312
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1313
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1314
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1315
    // Methods to parse a Code attribute
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1316
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1317
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  1318
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1319
      * Reads a JVMS 'Code' attribute and makes the given visitor visit it.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1320
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1321
      * @param methodVisitor the visitor that must visit the Code attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1322
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1323
      * @param codeOffset the start offset in {@link #b} of the Code attribute, excluding its
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1324
      *     attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1325
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1326
    private void readCode(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1327
            final MethodVisitor methodVisitor, final Context context, final int codeOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1328
        int currentOffset = codeOffset;
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1329
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1330
        // Read the max_stack, max_locals and code_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1331
        final byte[] classFileBuffer = b;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1332
        final char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1333
        final int maxStack = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1334
        final int maxLocals = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1335
        final int codeLength = readInt(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1336
        currentOffset += 8;
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1337
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1338
        // Read the bytecode 'code' array to create a label for each referenced instruction.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1339
        final int bytecodeStartOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1340
        final int bytecodeEndOffset = currentOffset + codeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1341
        final Label[] labels = context.currentMethodLabels = new Label[codeLength + 1];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1342
        while (currentOffset < bytecodeEndOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1343
            final int bytecodeOffset = currentOffset - bytecodeStartOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1344
            final int opcode = classFileBuffer[currentOffset] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1345
            switch (opcode) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1346
                case Constants.NOP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1347
                case Constants.ACONST_NULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1348
                case Constants.ICONST_M1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1349
                case Constants.ICONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1350
                case Constants.ICONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1351
                case Constants.ICONST_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1352
                case Constants.ICONST_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1353
                case Constants.ICONST_4:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1354
                case Constants.ICONST_5:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1355
                case Constants.LCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1356
                case Constants.LCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1357
                case Constants.FCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1358
                case Constants.FCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1359
                case Constants.FCONST_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1360
                case Constants.DCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1361
                case Constants.DCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1362
                case Constants.IALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1363
                case Constants.LALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1364
                case Constants.FALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1365
                case Constants.DALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1366
                case Constants.AALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1367
                case Constants.BALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1368
                case Constants.CALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1369
                case Constants.SALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1370
                case Constants.IASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1371
                case Constants.LASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1372
                case Constants.FASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1373
                case Constants.DASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1374
                case Constants.AASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1375
                case Constants.BASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1376
                case Constants.CASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1377
                case Constants.SASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1378
                case Constants.POP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1379
                case Constants.POP2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1380
                case Constants.DUP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1381
                case Constants.DUP_X1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1382
                case Constants.DUP_X2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1383
                case Constants.DUP2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1384
                case Constants.DUP2_X1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1385
                case Constants.DUP2_X2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1386
                case Constants.SWAP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1387
                case Constants.IADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1388
                case Constants.LADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1389
                case Constants.FADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1390
                case Constants.DADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1391
                case Constants.ISUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1392
                case Constants.LSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1393
                case Constants.FSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1394
                case Constants.DSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1395
                case Constants.IMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1396
                case Constants.LMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1397
                case Constants.FMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1398
                case Constants.DMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1399
                case Constants.IDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1400
                case Constants.LDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1401
                case Constants.FDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1402
                case Constants.DDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1403
                case Constants.IREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1404
                case Constants.LREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1405
                case Constants.FREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1406
                case Constants.DREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1407
                case Constants.INEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1408
                case Constants.LNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1409
                case Constants.FNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1410
                case Constants.DNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1411
                case Constants.ISHL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1412
                case Constants.LSHL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1413
                case Constants.ISHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1414
                case Constants.LSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1415
                case Constants.IUSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1416
                case Constants.LUSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1417
                case Constants.IAND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1418
                case Constants.LAND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1419
                case Constants.IOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1420
                case Constants.LOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1421
                case Constants.IXOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1422
                case Constants.LXOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1423
                case Constants.I2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1424
                case Constants.I2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1425
                case Constants.I2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1426
                case Constants.L2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1427
                case Constants.L2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1428
                case Constants.L2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1429
                case Constants.F2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1430
                case Constants.F2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1431
                case Constants.F2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1432
                case Constants.D2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1433
                case Constants.D2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1434
                case Constants.D2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1435
                case Constants.I2B:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1436
                case Constants.I2C:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1437
                case Constants.I2S:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1438
                case Constants.LCMP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1439
                case Constants.FCMPL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1440
                case Constants.FCMPG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1441
                case Constants.DCMPL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1442
                case Constants.DCMPG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1443
                case Constants.IRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1444
                case Constants.LRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1445
                case Constants.FRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1446
                case Constants.DRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1447
                case Constants.ARETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1448
                case Constants.RETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1449
                case Constants.ARRAYLENGTH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1450
                case Constants.ATHROW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1451
                case Constants.MONITORENTER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1452
                case Constants.MONITOREXIT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1453
                case Constants.ILOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1454
                case Constants.ILOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1455
                case Constants.ILOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1456
                case Constants.ILOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1457
                case Constants.LLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1458
                case Constants.LLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1459
                case Constants.LLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1460
                case Constants.LLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1461
                case Constants.FLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1462
                case Constants.FLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1463
                case Constants.FLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1464
                case Constants.FLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1465
                case Constants.DLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1466
                case Constants.DLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1467
                case Constants.DLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1468
                case Constants.DLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1469
                case Constants.ALOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1470
                case Constants.ALOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1471
                case Constants.ALOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1472
                case Constants.ALOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1473
                case Constants.ISTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1474
                case Constants.ISTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1475
                case Constants.ISTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1476
                case Constants.ISTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1477
                case Constants.LSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1478
                case Constants.LSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1479
                case Constants.LSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1480
                case Constants.LSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1481
                case Constants.FSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1482
                case Constants.FSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1483
                case Constants.FSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1484
                case Constants.FSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1485
                case Constants.DSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1486
                case Constants.DSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1487
                case Constants.DSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1488
                case Constants.DSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1489
                case Constants.ASTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1490
                case Constants.ASTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1491
                case Constants.ASTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1492
                case Constants.ASTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1493
                    currentOffset += 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1494
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1495
                case Constants.IFEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1496
                case Constants.IFNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1497
                case Constants.IFLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1498
                case Constants.IFGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1499
                case Constants.IFGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1500
                case Constants.IFLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1501
                case Constants.IF_ICMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1502
                case Constants.IF_ICMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1503
                case Constants.IF_ICMPLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1504
                case Constants.IF_ICMPGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1505
                case Constants.IF_ICMPGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1506
                case Constants.IF_ICMPLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1507
                case Constants.IF_ACMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1508
                case Constants.IF_ACMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1509
                case Constants.GOTO:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1510
                case Constants.JSR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1511
                case Constants.IFNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1512
                case Constants.IFNONNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1513
                    createLabel(bytecodeOffset + readShort(currentOffset + 1), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1514
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1515
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1516
                case Constants.ASM_IFEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1517
                case Constants.ASM_IFNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1518
                case Constants.ASM_IFLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1519
                case Constants.ASM_IFGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1520
                case Constants.ASM_IFGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1521
                case Constants.ASM_IFLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1522
                case Constants.ASM_IF_ICMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1523
                case Constants.ASM_IF_ICMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1524
                case Constants.ASM_IF_ICMPLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1525
                case Constants.ASM_IF_ICMPGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1526
                case Constants.ASM_IF_ICMPGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1527
                case Constants.ASM_IF_ICMPLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1528
                case Constants.ASM_IF_ACMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1529
                case Constants.ASM_IF_ACMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1530
                case Constants.ASM_GOTO:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1531
                case Constants.ASM_JSR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1532
                case Constants.ASM_IFNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1533
                case Constants.ASM_IFNONNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1534
                    createLabel(bytecodeOffset + readUnsignedShort(currentOffset + 1), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1535
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1536
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1537
                case Constants.GOTO_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1538
                case Constants.JSR_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1539
                case Constants.ASM_GOTO_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1540
                    createLabel(bytecodeOffset + readInt(currentOffset + 1), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1541
                    currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1542
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1543
                case Constants.WIDE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1544
                    switch (classFileBuffer[currentOffset + 1] & 0xFF) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1545
                        case Constants.ILOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1546
                        case Constants.FLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1547
                        case Constants.ALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1548
                        case Constants.LLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1549
                        case Constants.DLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1550
                        case Constants.ISTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1551
                        case Constants.FSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1552
                        case Constants.ASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1553
                        case Constants.LSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1554
                        case Constants.DSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1555
                        case Constants.RET:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1556
                            currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1557
                            break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1558
                        case Constants.IINC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1559
                            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1560
                            break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1561
                        default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1562
                            throw new IllegalArgumentException();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1563
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1564
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1565
                case Constants.TABLESWITCH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1566
                    // Skip 0 to 3 padding bytes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1567
                    currentOffset += 4 - (bytecodeOffset & 3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1568
                    // Read the default label and the number of table entries.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1569
                    createLabel(bytecodeOffset + readInt(currentOffset), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1570
                    int numTableEntries = readInt(currentOffset + 8) - readInt(currentOffset + 4) + 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1571
                    currentOffset += 12;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1572
                    // Read the table labels.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1573
                    while (numTableEntries-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1574
                        createLabel(bytecodeOffset + readInt(currentOffset), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1575
                        currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1576
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1577
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1578
                case Constants.LOOKUPSWITCH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1579
                    // Skip 0 to 3 padding bytes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1580
                    currentOffset += 4 - (bytecodeOffset & 3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1581
                    // Read the default label and the number of switch cases.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1582
                    createLabel(bytecodeOffset + readInt(currentOffset), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1583
                    int numSwitchCases = readInt(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1584
                    currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1585
                    // Read the switch labels.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1586
                    while (numSwitchCases-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1587
                        createLabel(bytecodeOffset + readInt(currentOffset + 4), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1588
                        currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1589
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1590
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1591
                case Constants.ILOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1592
                case Constants.LLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1593
                case Constants.FLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1594
                case Constants.DLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1595
                case Constants.ALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1596
                case Constants.ISTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1597
                case Constants.LSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1598
                case Constants.FSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1599
                case Constants.DSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1600
                case Constants.ASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1601
                case Constants.RET:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1602
                case Constants.BIPUSH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1603
                case Constants.NEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1604
                case Constants.LDC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1605
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1606
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1607
                case Constants.SIPUSH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1608
                case Constants.LDC_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1609
                case Constants.LDC2_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1610
                case Constants.GETSTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1611
                case Constants.PUTSTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1612
                case Constants.GETFIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1613
                case Constants.PUTFIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1614
                case Constants.INVOKEVIRTUAL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1615
                case Constants.INVOKESPECIAL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1616
                case Constants.INVOKESTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1617
                case Constants.NEW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1618
                case Constants.ANEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1619
                case Constants.CHECKCAST:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1620
                case Constants.INSTANCEOF:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1621
                case Constants.IINC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1622
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1623
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1624
                case Constants.INVOKEINTERFACE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1625
                case Constants.INVOKEDYNAMIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1626
                    currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1627
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1628
                case Constants.MULTIANEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1629
                    currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1630
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1631
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1632
                    throw new IllegalArgumentException();
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1633
            }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1634
        }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1635
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1636
        // Read the 'exception_table_length' and 'exception_table' field to create a label for each
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1637
        // referenced instruction, and to make methodVisitor visit the corresponding try catch blocks.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1638
        int exceptionTableLength = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1639
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1640
        while (exceptionTableLength-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1641
            Label start = createLabel(readUnsignedShort(currentOffset), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1642
            Label end = createLabel(readUnsignedShort(currentOffset + 2), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1643
            Label handler = createLabel(readUnsignedShort(currentOffset + 4), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1644
            String catchType = readUTF8(cpInfoOffsets[readUnsignedShort(currentOffset + 6)], charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1645
            currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1646
            methodVisitor.visitTryCatchBlock(start, end, handler, catchType);
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1647
        }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  1648
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1649
        // Read the Code attributes to create a label for each referenced instruction (the variables
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1650
        // are ordered as in Section 4.7 of the JVMS). Attribute offsets exclude the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1651
        // attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1652
        // - The offset of the current 'stack_map_frame' in the StackMap[Table] attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1653
        // Initially, this is the offset of the first 'stack_map_frame' entry. Then this offset is
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1654
        // updated after each stack_map_frame is read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1655
        int stackMapFrameOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1656
        // - The end offset of the StackMap[Table] attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1657
        int stackMapTableEndOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1658
        // - Whether the stack map frames are compressed (i.e. in a StackMapTable) or not.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1659
        boolean compressedFrames = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1660
        // - The offset of the LocalVariableTable attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1661
        int localVariableTableOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1662
        // - The offset of the LocalVariableTypeTable attribute, or 0.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1663
        int localVariableTypeTableOffset = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1664
        // - The offset of each 'type_annotation' entry in the RuntimeVisibleTypeAnnotations
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1665
        // attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1666
        int[] visibleTypeAnnotationOffsets = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1667
        // - The offset of each 'type_annotation' entry in the RuntimeInvisibleTypeAnnotations
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1668
        // attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1669
        int[] invisibleTypeAnnotationOffsets = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1670
        // - The non standard attributes (linked with their {@link Attribute#nextAttribute} field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1671
        //   This list in the <i>reverse order</i> or their order in the ClassFile structure.
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1672
        Attribute attributes = null;
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1673
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1674
        int attributesCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1675
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1676
        while (attributesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1677
            // Read the attribute_info's attribute_name and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1678
            String attributeName = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1679
            int attributeLength = readInt(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1680
            currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1681
            if (Constants.LOCAL_VARIABLE_TABLE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1682
                if ((context.parsingOptions & SKIP_DEBUG) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1683
                    localVariableTableOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1684
                    // Parse the attribute to find the corresponding (debug only) labels.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1685
                    int currentLocalVariableTableOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1686
                    int localVariableTableLength = readUnsignedShort(currentLocalVariableTableOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1687
                    currentLocalVariableTableOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1688
                    while (localVariableTableLength-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1689
                        int startPc = readUnsignedShort(currentLocalVariableTableOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1690
                        createDebugLabel(startPc, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1691
                        int length = readUnsignedShort(currentLocalVariableTableOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1692
                        createDebugLabel(startPc + length, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1693
                        // Skip the name_index, descriptor_index and index fields (2 bytes each).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1694
                        currentLocalVariableTableOffset += 10;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1695
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1696
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1697
            } else if (Constants.LOCAL_VARIABLE_TYPE_TABLE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1698
                localVariableTypeTableOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1699
                // Here we do not extract the labels corresponding to the attribute content. We assume they
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1700
                // are the same or a subset of those of the LocalVariableTable attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1701
            } else if (Constants.LINE_NUMBER_TABLE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1702
                if ((context.parsingOptions & SKIP_DEBUG) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1703
                    // Parse the attribute to find the corresponding (debug only) labels.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1704
                    int currentLineNumberTableOffset = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1705
                    int lineNumberTableLength = readUnsignedShort(currentLineNumberTableOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1706
                    currentLineNumberTableOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1707
                    while (lineNumberTableLength-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1708
                        int startPc = readUnsignedShort(currentLineNumberTableOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1709
                        int lineNumber = readUnsignedShort(currentLineNumberTableOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1710
                        currentLineNumberTableOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1711
                        createDebugLabel(startPc, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1712
                        labels[startPc].addLineNumber(lineNumber);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1713
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1714
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1715
            } else if (Constants.RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1716
                visibleTypeAnnotationOffsets =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1717
                        readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ true);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1718
                // Here we do not extract the labels corresponding to the attribute content. This would
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1719
                // require a full parsing of the attribute, which would need to be repeated when parsing
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1720
                // the bytecode instructions (see below). Instead, the content of the attribute is read one
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1721
                // type annotation at a time (i.e. after a type annotation has been visited, the next type
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1722
                // annotation is read), and the labels it contains are also extracted one annotation at a
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1723
                // time. This assumes that type annotations are ordered by increasing bytecode offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1724
            } else if (Constants.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1725
                invisibleTypeAnnotationOffsets =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1726
                        readTypeAnnotations(methodVisitor, context, currentOffset, /* visible = */ false);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1727
                // Same comment as above for the RuntimeVisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1728
            } else if (Constants.STACK_MAP_TABLE.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1729
                if ((context.parsingOptions & SKIP_FRAMES) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1730
                    stackMapFrameOffset = currentOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1731
                    stackMapTableEndOffset = currentOffset + attributeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1732
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1733
                // Here we do not extract the labels corresponding to the attribute content. This would
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1734
                // require a full parsing of the attribute, which would need to be repeated when parsing
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1735
                // the bytecode instructions (see below). Instead, the content of the attribute is read one
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1736
                // frame at a time (i.e. after a frame has been visited, the next frame is read), and the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1737
                // labels it contains are also extracted one frame at a time. Thanks to the ordering of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1738
                // frames, having only a "one frame lookahead" is not a problem, i.e. it is not possible to
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1739
                // see an offset smaller than the offset of the current instruction and for which no Label
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1740
                // exist. Except for UNINITIALIZED type offsets. We solve this by parsing the stack map
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1741
                // table without a full decoding (see below).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1742
            } else if ("StackMap".equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1743
                if ((context.parsingOptions & SKIP_FRAMES) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1744
                    stackMapFrameOffset = currentOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1745
                    stackMapTableEndOffset = currentOffset + attributeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1746
                    compressedFrames = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1747
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1748
                // IMPORTANT! Here we assume that the frames are ordered, as in the StackMapTable attribute,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1749
                // although this is not guaranteed by the attribute format. This allows an incremental
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1750
                // extraction of the labels corresponding to this attribute (see the comment above for the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1751
                // StackMapTable attribute).
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1752
            } else {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1753
                Attribute attribute =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1754
                        readAttribute(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1755
                                context.attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1756
                                attributeName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1757
                                currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1758
                                attributeLength,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1759
                                charBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1760
                                codeOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1761
                                labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1762
                attribute.nextAttribute = attributes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1763
                attributes = attribute;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1764
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1765
            currentOffset += attributeLength;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1766
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1767
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1768
        // Initialize the context fields related to stack map frames, and generate the first
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1769
        // (implicit) stack map frame, if needed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1770
        final boolean expandFrames = (context.parsingOptions & EXPAND_FRAMES) != 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1771
        if (stackMapFrameOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1772
            // The bytecode offset of the first explicit frame is not offset_delta + 1 but only
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1773
            // offset_delta. Setting the implicit frame offset to -1 allows us to use of the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1774
            // "offset_delta + 1" rule in all cases.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1775
            context.currentFrameOffset = -1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1776
            context.currentFrameType = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1777
            context.currentFrameLocalCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1778
            context.currentFrameLocalCountDelta = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1779
            context.currentFrameLocalTypes = new Object[maxLocals];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1780
            context.currentFrameStackCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1781
            context.currentFrameStackTypes = new Object[maxStack];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1782
            if (expandFrames) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1783
                computeImplicitFrame(context);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1784
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1785
            // Find the labels for UNINITIALIZED frame types. Instead of decoding each element of the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1786
            // stack map table, we look for 3 consecutive bytes that "look like" an UNINITIALIZED type
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1787
            // (tag ITEM_Uninitialized, offset within bytecode bounds, NEW instruction at this offset).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1788
            // We may find false positives (i.e. not real UNINITIALIZED types), but this should be rare,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1789
            // and the only consequence will be the creation of an unneeded label. This is better than
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1790
            // creating a label for each NEW instruction, and faster than fully decoding the whole stack
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1791
            // map table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1792
            for (int offset = stackMapFrameOffset; offset < stackMapTableEndOffset - 2; ++offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1793
                if (classFileBuffer[offset] == Frame.ITEM_UNINITIALIZED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1794
                    int potentialBytecodeOffset = readUnsignedShort(offset + 1);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1795
                    if (potentialBytecodeOffset >= 0
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1796
                            && potentialBytecodeOffset < codeLength
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1797
                            && (classFileBuffer[bytecodeStartOffset + potentialBytecodeOffset] & 0xFF)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1798
                                    == Opcodes.NEW) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1799
                        createLabel(potentialBytecodeOffset, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1800
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1801
                }
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1802
            }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1803
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1804
        if (expandFrames && (context.parsingOptions & EXPAND_ASM_INSNS) != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1805
            // Expanding the ASM specific instructions can introduce F_INSERT frames, even if the method
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1806
            // does not currently have any frame. These inserted frames must be computed by simulating the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1807
            // effect of the bytecode instructions, one by one, starting from the implicit first frame.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1808
            // For this, MethodWriter needs to know maxLocals before the first instruction is visited. To
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1809
            // ensure this, we visit the implicit first frame here (passing only maxLocals - the rest is
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1810
            // computed in MethodWriter).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1811
            methodVisitor.visitFrame(Opcodes.F_NEW, maxLocals, null, 0, null);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1812
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1813
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1814
        // Visit the bytecode instructions. First, introduce state variables for the incremental parsing
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1815
        // of the type annotations.
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1816
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1817
        // Index of the next runtime visible type annotation to read (in the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1818
        // visibleTypeAnnotationOffsets array).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1819
        int currentVisibleTypeAnnotationIndex = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1820
        // The bytecode offset of the next runtime visible type annotation to read, or -1.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1821
        int currentVisibleTypeAnnotationBytecodeOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1822
                getTypeAnnotationBytecodeOffset(visibleTypeAnnotationOffsets, 0);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1823
        // Index of the next runtime invisible type annotation to read (in the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1824
        // invisibleTypeAnnotationOffsets array).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1825
        int currentInvisibleTypeAnnotationIndex = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1826
        // The bytecode offset of the next runtime invisible type annotation to read, or -1.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1827
        int currentInvisibleTypeAnnotationBytecodeOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1828
                getTypeAnnotationBytecodeOffset(invisibleTypeAnnotationOffsets, 0);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1829
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1830
        // Whether a F_INSERT stack map frame must be inserted before the current instruction.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1831
        boolean insertFrame = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1832
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1833
        // The delta to subtract from a goto_w or jsr_w opcode to get the corresponding goto or jsr
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1834
        // opcode, or 0 if goto_w and jsr_w must be left unchanged (i.e. when expanding ASM specific
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1835
        // instructions).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1836
        final int wideJumpOpcodeDelta =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1837
                (context.parsingOptions & EXPAND_ASM_INSNS) == 0 ? Constants.WIDE_JUMP_OPCODE_DELTA : 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1838
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1839
        currentOffset = bytecodeStartOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1840
        while (currentOffset < bytecodeEndOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1841
            final int currentBytecodeOffset = currentOffset - bytecodeStartOffset;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1842
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1843
            // Visit the label and the line number(s) for this bytecode offset, if any.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1844
            Label currentLabel = labels[currentBytecodeOffset];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1845
            if (currentLabel != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1846
                currentLabel.accept(methodVisitor, (context.parsingOptions & SKIP_DEBUG) == 0);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1847
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1848
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1849
            // Visit the stack map frame for this bytecode offset, if any.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1850
            while (stackMapFrameOffset != 0
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1851
                    && (context.currentFrameOffset == currentBytecodeOffset
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1852
                            || context.currentFrameOffset == -1)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1853
                // If there is a stack map frame for this offset, make methodVisitor visit it, and read the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1854
                // next stack map frame if there is one.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1855
                if (context.currentFrameOffset != -1) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1856
                    if (!compressedFrames || expandFrames) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1857
                        methodVisitor.visitFrame(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1858
                                Opcodes.F_NEW,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1859
                                context.currentFrameLocalCount,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1860
                                context.currentFrameLocalTypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1861
                                context.currentFrameStackCount,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1862
                                context.currentFrameStackTypes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1863
                    } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1864
                        methodVisitor.visitFrame(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1865
                                context.currentFrameType,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1866
                                context.currentFrameLocalCountDelta,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1867
                                context.currentFrameLocalTypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1868
                                context.currentFrameStackCount,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1869
                                context.currentFrameStackTypes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1870
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1871
                    // Since there is already a stack map frame for this bytecode offset, there is no need to
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1872
                    // insert a new one.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1873
                    insertFrame = false;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1874
                }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1875
                if (stackMapFrameOffset < stackMapTableEndOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1876
                    stackMapFrameOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1877
                            readStackMapFrame(stackMapFrameOffset, compressedFrames, expandFrames, context);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1878
                } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1879
                    stackMapFrameOffset = 0;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1880
                }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1881
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1882
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1883
            // Insert a stack map frame for this bytecode offset, if requested by setting insertFrame to
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1884
            // true during the previous iteration. The actual frame content is computed in MethodWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1885
            if (insertFrame) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1886
                if ((context.parsingOptions & EXPAND_FRAMES) != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1887
                    methodVisitor.visitFrame(Constants.F_INSERT, 0, null, 0, null);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1888
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1889
                insertFrame = false;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1890
            }
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  1891
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1892
            // Visit the instruction at this bytecode offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1893
            int opcode = classFileBuffer[currentOffset] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1894
            switch (opcode) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1895
                case Constants.NOP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1896
                case Constants.ACONST_NULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1897
                case Constants.ICONST_M1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1898
                case Constants.ICONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1899
                case Constants.ICONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1900
                case Constants.ICONST_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1901
                case Constants.ICONST_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1902
                case Constants.ICONST_4:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1903
                case Constants.ICONST_5:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1904
                case Constants.LCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1905
                case Constants.LCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1906
                case Constants.FCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1907
                case Constants.FCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1908
                case Constants.FCONST_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1909
                case Constants.DCONST_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1910
                case Constants.DCONST_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1911
                case Constants.IALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1912
                case Constants.LALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1913
                case Constants.FALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1914
                case Constants.DALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1915
                case Constants.AALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1916
                case Constants.BALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1917
                case Constants.CALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1918
                case Constants.SALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1919
                case Constants.IASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1920
                case Constants.LASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1921
                case Constants.FASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1922
                case Constants.DASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1923
                case Constants.AASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1924
                case Constants.BASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1925
                case Constants.CASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1926
                case Constants.SASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1927
                case Constants.POP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1928
                case Constants.POP2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1929
                case Constants.DUP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1930
                case Constants.DUP_X1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1931
                case Constants.DUP_X2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1932
                case Constants.DUP2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1933
                case Constants.DUP2_X1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1934
                case Constants.DUP2_X2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1935
                case Constants.SWAP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1936
                case Constants.IADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1937
                case Constants.LADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1938
                case Constants.FADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1939
                case Constants.DADD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1940
                case Constants.ISUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1941
                case Constants.LSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1942
                case Constants.FSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1943
                case Constants.DSUB:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1944
                case Constants.IMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1945
                case Constants.LMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1946
                case Constants.FMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1947
                case Constants.DMUL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1948
                case Constants.IDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1949
                case Constants.LDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1950
                case Constants.FDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1951
                case Constants.DDIV:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1952
                case Constants.IREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1953
                case Constants.LREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1954
                case Constants.FREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1955
                case Constants.DREM:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1956
                case Constants.INEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1957
                case Constants.LNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1958
                case Constants.FNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1959
                case Constants.DNEG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1960
                case Constants.ISHL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1961
                case Constants.LSHL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1962
                case Constants.ISHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1963
                case Constants.LSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1964
                case Constants.IUSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1965
                case Constants.LUSHR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1966
                case Constants.IAND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1967
                case Constants.LAND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1968
                case Constants.IOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1969
                case Constants.LOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1970
                case Constants.IXOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1971
                case Constants.LXOR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1972
                case Constants.I2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1973
                case Constants.I2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1974
                case Constants.I2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1975
                case Constants.L2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1976
                case Constants.L2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1977
                case Constants.L2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1978
                case Constants.F2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1979
                case Constants.F2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1980
                case Constants.F2D:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1981
                case Constants.D2I:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1982
                case Constants.D2L:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1983
                case Constants.D2F:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1984
                case Constants.I2B:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1985
                case Constants.I2C:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1986
                case Constants.I2S:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1987
                case Constants.LCMP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1988
                case Constants.FCMPL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1989
                case Constants.FCMPG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1990
                case Constants.DCMPL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1991
                case Constants.DCMPG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1992
                case Constants.IRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1993
                case Constants.LRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1994
                case Constants.FRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1995
                case Constants.DRETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1996
                case Constants.ARETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1997
                case Constants.RETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1998
                case Constants.ARRAYLENGTH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  1999
                case Constants.ATHROW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2000
                case Constants.MONITORENTER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2001
                case Constants.MONITOREXIT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2002
                    methodVisitor.visitInsn(opcode);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2003
                    currentOffset += 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2004
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2005
                case Constants.ILOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2006
                case Constants.ILOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2007
                case Constants.ILOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2008
                case Constants.ILOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2009
                case Constants.LLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2010
                case Constants.LLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2011
                case Constants.LLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2012
                case Constants.LLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2013
                case Constants.FLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2014
                case Constants.FLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2015
                case Constants.FLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2016
                case Constants.FLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2017
                case Constants.DLOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2018
                case Constants.DLOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2019
                case Constants.DLOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2020
                case Constants.DLOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2021
                case Constants.ALOAD_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2022
                case Constants.ALOAD_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2023
                case Constants.ALOAD_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2024
                case Constants.ALOAD_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2025
                    opcode -= Constants.ILOAD_0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2026
                    methodVisitor.visitVarInsn(Opcodes.ILOAD + (opcode >> 2), opcode & 0x3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2027
                    currentOffset += 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2028
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2029
                case Constants.ISTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2030
                case Constants.ISTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2031
                case Constants.ISTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2032
                case Constants.ISTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2033
                case Constants.LSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2034
                case Constants.LSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2035
                case Constants.LSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2036
                case Constants.LSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2037
                case Constants.FSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2038
                case Constants.FSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2039
                case Constants.FSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2040
                case Constants.FSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2041
                case Constants.DSTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2042
                case Constants.DSTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2043
                case Constants.DSTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2044
                case Constants.DSTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2045
                case Constants.ASTORE_0:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2046
                case Constants.ASTORE_1:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2047
                case Constants.ASTORE_2:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2048
                case Constants.ASTORE_3:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2049
                    opcode -= Constants.ISTORE_0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2050
                    methodVisitor.visitVarInsn(Opcodes.ISTORE + (opcode >> 2), opcode & 0x3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2051
                    currentOffset += 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2052
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2053
                case Constants.IFEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2054
                case Constants.IFNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2055
                case Constants.IFLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2056
                case Constants.IFGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2057
                case Constants.IFGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2058
                case Constants.IFLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2059
                case Constants.IF_ICMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2060
                case Constants.IF_ICMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2061
                case Constants.IF_ICMPLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2062
                case Constants.IF_ICMPGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2063
                case Constants.IF_ICMPGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2064
                case Constants.IF_ICMPLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2065
                case Constants.IF_ACMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2066
                case Constants.IF_ACMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2067
                case Constants.GOTO:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2068
                case Constants.JSR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2069
                case Constants.IFNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2070
                case Constants.IFNONNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2071
                    methodVisitor.visitJumpInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2072
                            opcode, labels[currentBytecodeOffset + readShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2073
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2074
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2075
                case Constants.GOTO_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2076
                case Constants.JSR_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2077
                    methodVisitor.visitJumpInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2078
                            opcode - wideJumpOpcodeDelta,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2079
                            labels[currentBytecodeOffset + readInt(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2080
                    currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2081
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2082
                case Constants.ASM_IFEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2083
                case Constants.ASM_IFNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2084
                case Constants.ASM_IFLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2085
                case Constants.ASM_IFGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2086
                case Constants.ASM_IFGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2087
                case Constants.ASM_IFLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2088
                case Constants.ASM_IF_ICMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2089
                case Constants.ASM_IF_ICMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2090
                case Constants.ASM_IF_ICMPLT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2091
                case Constants.ASM_IF_ICMPGE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2092
                case Constants.ASM_IF_ICMPGT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2093
                case Constants.ASM_IF_ICMPLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2094
                case Constants.ASM_IF_ACMPEQ:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2095
                case Constants.ASM_IF_ACMPNE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2096
                case Constants.ASM_GOTO:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2097
                case Constants.ASM_JSR:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2098
                case Constants.ASM_IFNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2099
                case Constants.ASM_IFNONNULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2100
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2101
                        // A forward jump with an offset > 32767. In this case we automatically replace ASM_GOTO
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2102
                        // with GOTO_W, ASM_JSR with JSR_W and ASM_IFxxx <l> with IFNOTxxx <L> GOTO_W <l> L:...,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2103
                        // where IFNOTxxx is the "opposite" opcode of ASMS_IFxxx (e.g. IFNE for ASM_IFEQ) and
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2104
                        // where <L> designates the instruction just after the GOTO_W.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2105
                        // First, change the ASM specific opcodes ASM_IFEQ ... ASM_JSR, ASM_IFNULL and
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2106
                        // ASM_IFNONNULL to IFEQ ... JSR, IFNULL and IFNONNULL.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2107
                        opcode =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2108
                                opcode < Constants.ASM_IFNULL
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2109
                                        ? opcode - Constants.ASM_OPCODE_DELTA
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2110
                                        : opcode - Constants.ASM_IFNULL_OPCODE_DELTA;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2111
                        Label target = labels[currentBytecodeOffset + readUnsignedShort(currentOffset + 1)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2112
                        if (opcode == Opcodes.GOTO || opcode == Opcodes.JSR) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2113
                            // Replace GOTO with GOTO_W and JSR with JSR_W.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2114
                            methodVisitor.visitJumpInsn(opcode + Constants.WIDE_JUMP_OPCODE_DELTA, target);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2115
                        } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2116
                            // Compute the "opposite" of opcode. This can be done by flipping the least
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2117
                            // significant bit for IFNULL and IFNONNULL, and similarly for IFEQ ... IF_ACMPEQ
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2118
                            // (with a pre and post offset by 1).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2119
                            opcode = opcode < Opcodes.GOTO ? ((opcode + 1) ^ 1) - 1 : opcode ^ 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2120
                            Label endif = createLabel(currentBytecodeOffset + 3, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2121
                            methodVisitor.visitJumpInsn(opcode, endif);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2122
                            methodVisitor.visitJumpInsn(Constants.GOTO_W, target);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2123
                            // endif designates the instruction just after GOTO_W, and is visited as part of the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2124
                            // next instruction. Since it is a jump target, we need to insert a frame here.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2125
                            insertFrame = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2126
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2127
                        currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2128
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2129
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2130
                case Constants.ASM_GOTO_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2131
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2132
                        // Replace ASM_GOTO_W with GOTO_W.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2133
                        methodVisitor.visitJumpInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2134
                                Constants.GOTO_W, labels[currentBytecodeOffset + readInt(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2135
                        // The instruction just after is a jump target (because ASM_GOTO_W is used in patterns
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2136
                        // IFNOTxxx <L> ASM_GOTO_W <l> L:..., see MethodWriter), so we need to insert a frame
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2137
                        // here.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2138
                        insertFrame = true;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2139
                        currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2140
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2141
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2142
                case Constants.WIDE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2143
                    opcode = classFileBuffer[currentOffset + 1] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2144
                    if (opcode == Opcodes.IINC) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2145
                        methodVisitor.visitIincInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2146
                                readUnsignedShort(currentOffset + 2), readShort(currentOffset + 4));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2147
                        currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2148
                    } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2149
                        methodVisitor.visitVarInsn(opcode, readUnsignedShort(currentOffset + 2));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2150
                        currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2151
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2152
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2153
                case Constants.TABLESWITCH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2154
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2155
                        // Skip 0 to 3 padding bytes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2156
                        currentOffset += 4 - (currentBytecodeOffset & 3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2157
                        // Read the instruction.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2158
                        Label defaultLabel = labels[currentBytecodeOffset + readInt(currentOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2159
                        int low = readInt(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2160
                        int high = readInt(currentOffset + 8);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2161
                        currentOffset += 12;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2162
                        Label[] table = new Label[high - low + 1];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2163
                        for (int i = 0; i < table.length; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2164
                            table[i] = labels[currentBytecodeOffset + readInt(currentOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2165
                            currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2166
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2167
                        methodVisitor.visitTableSwitchInsn(low, high, defaultLabel, table);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2168
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2169
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2170
                case Constants.LOOKUPSWITCH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2171
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2172
                        // Skip 0 to 3 padding bytes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2173
                        currentOffset += 4 - (currentBytecodeOffset & 3);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2174
                        // Read the instruction.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2175
                        Label defaultLabel = labels[currentBytecodeOffset + readInt(currentOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2176
                        int numPairs = readInt(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2177
                        currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2178
                        int[] keys = new int[numPairs];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2179
                        Label[] values = new Label[numPairs];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2180
                        for (int i = 0; i < numPairs; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2181
                            keys[i] = readInt(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2182
                            values[i] = labels[currentBytecodeOffset + readInt(currentOffset + 4)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2183
                            currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2184
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2185
                        methodVisitor.visitLookupSwitchInsn(defaultLabel, keys, values);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2186
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2187
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2188
                case Constants.ILOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2189
                case Constants.LLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2190
                case Constants.FLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2191
                case Constants.DLOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2192
                case Constants.ALOAD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2193
                case Constants.ISTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2194
                case Constants.LSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2195
                case Constants.FSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2196
                case Constants.DSTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2197
                case Constants.ASTORE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2198
                case Constants.RET:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2199
                    methodVisitor.visitVarInsn(opcode, classFileBuffer[currentOffset + 1] & 0xFF);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2200
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2201
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2202
                case Constants.BIPUSH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2203
                case Constants.NEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2204
                    methodVisitor.visitIntInsn(opcode, classFileBuffer[currentOffset + 1]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2205
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2206
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2207
                case Constants.SIPUSH:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2208
                    methodVisitor.visitIntInsn(opcode, readShort(currentOffset + 1));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2209
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2210
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2211
                case Constants.LDC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2212
                    methodVisitor.visitLdcInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2213
                            readConst(classFileBuffer[currentOffset + 1] & 0xFF, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2214
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2215
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2216
                case Constants.LDC_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2217
                case Constants.LDC2_W:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2218
                    methodVisitor.visitLdcInsn(readConst(readUnsignedShort(currentOffset + 1), charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2219
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2220
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2221
                case Constants.GETSTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2222
                case Constants.PUTSTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2223
                case Constants.GETFIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2224
                case Constants.PUTFIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2225
                case Constants.INVOKEVIRTUAL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2226
                case Constants.INVOKESPECIAL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2227
                case Constants.INVOKESTATIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2228
                case Constants.INVOKEINTERFACE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2229
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2230
                        int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2231
                        int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2232
                        String owner = readClass(cpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2233
                        String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2234
                        String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2235
                        if (opcode < Opcodes.INVOKEVIRTUAL) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2236
                            methodVisitor.visitFieldInsn(opcode, owner, name, descriptor);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2237
                        } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2238
                            boolean isInterface =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2239
                                    classFileBuffer[cpInfoOffset - 1] == Symbol.CONSTANT_INTERFACE_METHODREF_TAG;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2240
                            methodVisitor.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2241
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2242
                        if (opcode == Opcodes.INVOKEINTERFACE) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2243
                            currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2244
                        } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2245
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2246
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2247
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2248
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2249
                case Constants.INVOKEDYNAMIC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2250
                    {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2251
                        int cpInfoOffset = cpInfoOffsets[readUnsignedShort(currentOffset + 1)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2252
                        int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2253
                        String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2254
                        String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2255
                        int bootstrapMethodOffset = bootstrapMethodOffsets[readUnsignedShort(cpInfoOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2256
                        Handle handle =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2257
                                (Handle) readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2258
                        Object[] bootstrapMethodArguments =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2259
                                new Object[readUnsignedShort(bootstrapMethodOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2260
                        bootstrapMethodOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2261
                        for (int i = 0; i < bootstrapMethodArguments.length; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2262
                            bootstrapMethodArguments[i] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2263
                                    readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2264
                            bootstrapMethodOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2265
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2266
                        methodVisitor.visitInvokeDynamicInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2267
                                name, descriptor, handle, bootstrapMethodArguments);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2268
                        currentOffset += 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2269
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2270
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2271
                case Constants.NEW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2272
                case Constants.ANEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2273
                case Constants.CHECKCAST:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2274
                case Constants.INSTANCEOF:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2275
                    methodVisitor.visitTypeInsn(opcode, readClass(currentOffset + 1, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2276
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2277
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2278
                case Constants.IINC:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2279
                    methodVisitor.visitIincInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2280
                            classFileBuffer[currentOffset + 1] & 0xFF, classFileBuffer[currentOffset + 2]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2281
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2282
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2283
                case Constants.MULTIANEWARRAY:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2284
                    methodVisitor.visitMultiANewArrayInsn(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2285
                            readClass(currentOffset + 1, charBuffer), classFileBuffer[currentOffset + 3] & 0xFF);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2286
                    currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2287
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2288
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2289
                    throw new AssertionError();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2290
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2291
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2292
            // Visit the runtime visible instruction annotations, if any.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2293
            while (visibleTypeAnnotationOffsets != null
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2294
                    && currentVisibleTypeAnnotationIndex < visibleTypeAnnotationOffsets.length
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2295
                    && currentVisibleTypeAnnotationBytecodeOffset <= currentBytecodeOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2296
                if (currentVisibleTypeAnnotationBytecodeOffset == currentBytecodeOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2297
                    // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2298
                    int currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2299
                            readTypeAnnotationTarget(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2300
                                    context, visibleTypeAnnotationOffsets[currentVisibleTypeAnnotationIndex]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2301
                    // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2302
                    String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2303
                    currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2304
                    // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2305
                    readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2306
                            methodVisitor.visitInsnAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2307
                                    context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2308
                                    context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2309
                                    annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2310
                                    /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2311
                            currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2312
                            /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2313
                            charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2314
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2315
                currentVisibleTypeAnnotationBytecodeOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2316
                        getTypeAnnotationBytecodeOffset(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2317
                                visibleTypeAnnotationOffsets, ++currentVisibleTypeAnnotationIndex);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2318
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2319
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2320
            // Visit the runtime invisible instruction annotations, if any.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2321
            while (invisibleTypeAnnotationOffsets != null
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2322
                    && currentInvisibleTypeAnnotationIndex < invisibleTypeAnnotationOffsets.length
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2323
                    && currentInvisibleTypeAnnotationBytecodeOffset <= currentBytecodeOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2324
                if (currentInvisibleTypeAnnotationBytecodeOffset == currentBytecodeOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2325
                    // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2326
                    int currentAnnotationOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2327
                            readTypeAnnotationTarget(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2328
                                    context, invisibleTypeAnnotationOffsets[currentInvisibleTypeAnnotationIndex]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2329
                    // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2330
                    String annotationDescriptor = readUTF8(currentAnnotationOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2331
                    currentAnnotationOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2332
                    // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2333
                    readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2334
                            methodVisitor.visitInsnAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2335
                                    context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2336
                                    context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2337
                                    annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2338
                                    /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2339
                            currentAnnotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2340
                            /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2341
                            charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2342
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2343
                currentInvisibleTypeAnnotationBytecodeOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2344
                        getTypeAnnotationBytecodeOffset(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2345
                                invisibleTypeAnnotationOffsets, ++currentInvisibleTypeAnnotationIndex);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2346
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2347
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2348
        if (labels[codeLength] != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2349
            methodVisitor.visitLabel(labels[codeLength]);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2350
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2351
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2352
        // Visit LocalVariableTable and LocalVariableTypeTable attributes.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2353
        if (localVariableTableOffset != 0 && (context.parsingOptions & SKIP_DEBUG) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2354
            // The (start_pc, index, signature_index) fields of each entry of the LocalVariableTypeTable.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2355
            int[] typeTable = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2356
            if (localVariableTypeTableOffset != 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2357
                typeTable = new int[readUnsignedShort(localVariableTypeTableOffset) * 3];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2358
                currentOffset = localVariableTypeTableOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2359
                int typeTableIndex = typeTable.length;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2360
                while (typeTableIndex > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2361
                    // Store the offset of 'signature_index', and the value of 'index' and 'start_pc'.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2362
                    typeTable[--typeTableIndex] = currentOffset + 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2363
                    typeTable[--typeTableIndex] = readUnsignedShort(currentOffset + 8);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2364
                    typeTable[--typeTableIndex] = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2365
                    currentOffset += 10;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2366
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2367
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2368
            int localVariableTableLength = readUnsignedShort(localVariableTableOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2369
            currentOffset = localVariableTableOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2370
            while (localVariableTableLength-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2371
                int startPc = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2372
                int length = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2373
                String name = readUTF8(currentOffset + 4, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2374
                String descriptor = readUTF8(currentOffset + 6, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2375
                int index = readUnsignedShort(currentOffset + 8);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2376
                currentOffset += 10;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2377
                String signature = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2378
                if (typeTable != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2379
                    for (int i = 0; i < typeTable.length; i += 3) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2380
                        if (typeTable[i] == startPc && typeTable[i + 1] == index) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2381
                            signature = readUTF8(typeTable[i + 2], charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2382
                            break;
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2383
                        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2384
                    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2385
                }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2386
                methodVisitor.visitLocalVariable(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2387
                        name, descriptor, signature, labels[startPc], labels[startPc + length], index);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2388
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2389
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2390
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2391
        // Visit the local variable type annotations of the RuntimeVisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2392
        if (visibleTypeAnnotationOffsets != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2393
            for (int typeAnnotationOffset : visibleTypeAnnotationOffsets) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2394
                int targetType = readByte(typeAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2395
                if (targetType == TypeReference.LOCAL_VARIABLE
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2396
                        || targetType == TypeReference.RESOURCE_VARIABLE) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2397
                    // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2398
                    currentOffset = readTypeAnnotationTarget(context, typeAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2399
                    // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2400
                    String annotationDescriptor = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2401
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2402
                    // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2403
                    readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2404
                            methodVisitor.visitLocalVariableAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2405
                                    context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2406
                                    context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2407
                                    context.currentLocalVariableAnnotationRangeStarts,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2408
                                    context.currentLocalVariableAnnotationRangeEnds,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2409
                                    context.currentLocalVariableAnnotationRangeIndices,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2410
                                    annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2411
                                    /* visible = */ true),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2412
                            currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2413
                            /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2414
                            charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2415
                }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2416
            }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2417
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2418
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2419
        // Visit the local variable type annotations of the RuntimeInvisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2420
        if (invisibleTypeAnnotationOffsets != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2421
            for (int typeAnnotationOffset : invisibleTypeAnnotationOffsets) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2422
                int targetType = readByte(typeAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2423
                if (targetType == TypeReference.LOCAL_VARIABLE
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2424
                        || targetType == TypeReference.RESOURCE_VARIABLE) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2425
                    // Parse the target_type, target_info and target_path fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2426
                    currentOffset = readTypeAnnotationTarget(context, typeAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2427
                    // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2428
                    String annotationDescriptor = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2429
                    currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2430
                    // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2431
                    readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2432
                            methodVisitor.visitLocalVariableAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2433
                                    context.currentTypeAnnotationTarget,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2434
                                    context.currentTypeAnnotationTargetPath,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2435
                                    context.currentLocalVariableAnnotationRangeStarts,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2436
                                    context.currentLocalVariableAnnotationRangeEnds,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2437
                                    context.currentLocalVariableAnnotationRangeIndices,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2438
                                    annotationDescriptor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2439
                                    /* visible = */ false),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2440
                            currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2441
                            /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2442
                            charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2443
                }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2444
            }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2445
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2446
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2447
        // Visit the non standard attributes.
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2448
        while (attributes != null) {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2449
            // Copy and reset the nextAttribute field so that it can also be used in MethodWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2450
            Attribute nextAttribute = attributes.nextAttribute;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2451
            attributes.nextAttribute = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2452
            methodVisitor.visitAttribute(attributes);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2453
            attributes = nextAttribute;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2454
        }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2455
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2456
        // Visit the max stack and max locals values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2457
        methodVisitor.visitMaxs(maxStack, maxLocals);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2458
    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2459
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2460
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2461
      * Returns the label corresponding to the given bytecode offset. The default implementation of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2462
      * this method creates a label for the given offset if it has not been already created.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2463
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2464
      * @param bytecodeOffset a bytecode offset in a method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2465
      * @param labels the already created labels, indexed by their offset. If a label already exists
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2466
      *     for bytecodeOffset this method must not create a new one. Otherwise it must store the new
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2467
      *     label in this array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2468
      * @return a non null Label, which must be equal to labels[bytecodeOffset].
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2469
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2470
    protected Label readLabel(final int bytecodeOffset, final Label[] labels) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2471
        if (labels[bytecodeOffset] == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2472
            labels[bytecodeOffset] = new Label();
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2473
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2474
        return labels[bytecodeOffset];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2475
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2476
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2477
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2478
      * Creates a label without the {@link Label#FLAG_DEBUG_ONLY} flag set, for the given bytecode
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2479
      * offset. The label is created with a call to {@link #readLabel} and its {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2480
      * Label#FLAG_DEBUG_ONLY} flag is cleared.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2481
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2482
      * @param bytecodeOffset a bytecode offset in a method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2483
      * @param labels the already created labels, indexed by their offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2484
      * @return a Label without the {@link Label#FLAG_DEBUG_ONLY} flag set.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2485
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2486
    private Label createLabel(final int bytecodeOffset, final Label[] labels) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2487
        Label label = readLabel(bytecodeOffset, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2488
        label.flags &= ~Label.FLAG_DEBUG_ONLY;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2489
        return label;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2490
    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2491
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2492
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2493
      * Creates a label with the {@link Label#FLAG_DEBUG_ONLY} flag set, if there is no already
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2494
      * existing label for the given bytecode offset (otherwise does nothing). The label is created
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2495
      * with a call to {@link #readLabel}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2496
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2497
      * @param bytecodeOffset a bytecode offset in a method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2498
      * @param labels the already created labels, indexed by their offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2499
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2500
    private void createDebugLabel(final int bytecodeOffset, final Label[] labels) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2501
        if (labels[bytecodeOffset] == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2502
            readLabel(bytecodeOffset, labels).flags |= Label.FLAG_DEBUG_ONLY;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2503
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2504
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2505
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2506
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2507
    // Methods to parse annotations, type annotations and parameter annotations
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2508
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2509
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2510
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2511
      * Parses a Runtime[In]VisibleTypeAnnotations attribute to find the offset of each type_annotation
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2512
      * entry it contains, to find the corresponding labels, and to visit the try catch block
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2513
      * annotations.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2514
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2515
      * @param methodVisitor the method visitor to be used to visit the try catch block annotations.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2516
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2517
      * @param runtimeTypeAnnotationsOffset the start offset of a Runtime[In]VisibleTypeAnnotations
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2518
      *     attribute, excluding the attribute_info's attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2519
      * @param visible true if the attribute to parse is a RuntimeVisibleTypeAnnotations attribute,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2520
      *     false it is a RuntimeInvisibleTypeAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2521
      * @return the start offset of each entry of the Runtime[In]VisibleTypeAnnotations_attribute's
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2522
      *     'annotations' array field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2523
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2524
    private int[] readTypeAnnotations(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2525
            final MethodVisitor methodVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2526
            final Context context,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2527
            final int runtimeTypeAnnotationsOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2528
            final boolean visible) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2529
        char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2530
        int currentOffset = runtimeTypeAnnotationsOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2531
        // Read the num_annotations field and create an array to store the type_annotation offsets.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2532
        int[] typeAnnotationsOffsets = new int[readUnsignedShort(currentOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2533
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2534
        // Parse the 'annotations' array field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2535
        for (int i = 0; i < typeAnnotationsOffsets.length; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2536
            typeAnnotationsOffsets[i] = currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2537
            // Parse the type_annotation's target_type and the target_info fields. The size of the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2538
            // target_info field depends on the value of target_type.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2539
            int targetType = readInt(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2540
            switch (targetType >>> 24) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2541
                case TypeReference.LOCAL_VARIABLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2542
                case TypeReference.RESOURCE_VARIABLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2543
                    // A localvar_target has a variable size, which depends on the value of their table_length
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2544
                    // field. It also references bytecode offsets, for which we need labels.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2545
                    int tableLength = readUnsignedShort(currentOffset + 1);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2546
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2547
                    while (tableLength-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2548
                        int startPc = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2549
                        int length = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2550
                        // Skip the index field (2 bytes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2551
                        currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2552
                        createLabel(startPc, context.currentMethodLabels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2553
                        createLabel(startPc + length, context.currentMethodLabels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2554
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2555
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2556
                case TypeReference.CAST:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2557
                case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2558
                case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2559
                case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2560
                case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2561
                    currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2562
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2563
                case TypeReference.CLASS_EXTENDS:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2564
                case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2565
                case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2566
                case TypeReference.THROWS:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2567
                case TypeReference.EXCEPTION_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2568
                case TypeReference.INSTANCEOF:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2569
                case TypeReference.NEW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2570
                case TypeReference.CONSTRUCTOR_REFERENCE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2571
                case TypeReference.METHOD_REFERENCE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2572
                    currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2573
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2574
                case TypeReference.CLASS_TYPE_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2575
                case TypeReference.METHOD_TYPE_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2576
                case TypeReference.METHOD_FORMAL_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2577
                case TypeReference.FIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2578
                case TypeReference.METHOD_RETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2579
                case TypeReference.METHOD_RECEIVER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2580
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2581
                    // TypeReference type which can't be used in Code attribute, or which is unknown.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2582
                    throw new IllegalArgumentException();
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2583
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2584
            // Parse the rest of the type_annotation structure, starting with the target_path structure
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2585
            // (whose size depends on its path_length field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2586
            int pathLength = readByte(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2587
            if ((targetType >>> 24) == TypeReference.EXCEPTION_PARAMETER) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2588
                // Parse the target_path structure and create a corresponding TypePath.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2589
                TypePath path = pathLength == 0 ? null : new TypePath(b, currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2590
                currentOffset += 1 + 2 * pathLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2591
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2592
                String annotationDescriptor = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2593
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2594
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2595
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2596
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2597
                                methodVisitor.visitTryCatchAnnotation(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2598
                                        targetType & 0xFFFFFF00, path, annotationDescriptor, visible),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2599
                                currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2600
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2601
                                charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2602
            } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2603
                // We don't want to visit the other target_type annotations, so we just skip them (which
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2604
                // requires some parsing because the element_value_pairs array has a variable size). First,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2605
                // skip the target_path structure:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2606
                currentOffset += 3 + 2 * pathLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2607
                // Then skip the num_element_value_pairs and element_value_pairs fields (by reading them
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2608
                // with a null AnnotationVisitor).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2609
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2610
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2611
                                /* annotationVisitor = */ null, currentOffset, /* named = */ true, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2612
            }
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2613
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2614
        return typeAnnotationsOffsets;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2615
    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2616
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2617
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2618
      * Returns the bytecode offset corresponding to the specified JVMS 'type_annotation' structure, or
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2619
      * -1 if there is no such type_annotation of if it does not have a bytecode offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2620
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2621
      * @param typeAnnotationOffsets the offset of each 'type_annotation' entry in a
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2622
      *     Runtime[In]VisibleTypeAnnotations attribute, or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2623
      * @param typeAnnotationIndex the index a 'type_annotation' entry in typeAnnotationOffsets.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2624
      * @return bytecode offset corresponding to the specified JVMS 'type_annotation' structure, or -1
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2625
      *     if there is no such type_annotation of if it does not have a bytecode offset.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2626
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2627
    private int getTypeAnnotationBytecodeOffset(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2628
            final int[] typeAnnotationOffsets, final int typeAnnotationIndex) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2629
        if (typeAnnotationOffsets == null
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2630
                || typeAnnotationIndex >= typeAnnotationOffsets.length
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2631
                || readByte(typeAnnotationOffsets[typeAnnotationIndex]) < TypeReference.INSTANCEOF) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2632
            return -1;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2633
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2634
        return readUnsignedShort(typeAnnotationOffsets[typeAnnotationIndex] + 1);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2635
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2636
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2637
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2638
      * Parses the header of a JVMS type_annotation structure to extract its target_type, target_info
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2639
      * and target_path (the result is stored in the given context), and returns the start offset of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2640
      * the rest of the type_annotation structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2641
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2642
      * @param context information about the class being parsed. This is where the extracted
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2643
      *     target_type and target_path must be stored.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2644
      * @param typeAnnotationOffset the start offset of a type_annotation structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2645
      * @return the start offset of the rest of the type_annotation structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2646
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2647
    private int readTypeAnnotationTarget(final Context context, final int typeAnnotationOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2648
        int currentOffset = typeAnnotationOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2649
        // Parse and store the target_type structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2650
        int targetType = readInt(typeAnnotationOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2651
        switch (targetType >>> 24) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2652
            case TypeReference.CLASS_TYPE_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2653
            case TypeReference.METHOD_TYPE_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2654
            case TypeReference.METHOD_FORMAL_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2655
                targetType &= 0xFFFF0000;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2656
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2657
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2658
            case TypeReference.FIELD:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2659
            case TypeReference.METHOD_RETURN:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2660
            case TypeReference.METHOD_RECEIVER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2661
                targetType &= 0xFF000000;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2662
                currentOffset += 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2663
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2664
            case TypeReference.LOCAL_VARIABLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2665
            case TypeReference.RESOURCE_VARIABLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2666
                targetType &= 0xFF000000;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2667
                int tableLength = readUnsignedShort(currentOffset + 1);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2668
                currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2669
                context.currentLocalVariableAnnotationRangeStarts = new Label[tableLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2670
                context.currentLocalVariableAnnotationRangeEnds = new Label[tableLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2671
                context.currentLocalVariableAnnotationRangeIndices = new int[tableLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2672
                for (int i = 0; i < tableLength; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2673
                    int startPc = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2674
                    int length = readUnsignedShort(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2675
                    int index = readUnsignedShort(currentOffset + 4);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2676
                    currentOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2677
                    context.currentLocalVariableAnnotationRangeStarts[i] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2678
                            createLabel(startPc, context.currentMethodLabels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2679
                    context.currentLocalVariableAnnotationRangeEnds[i] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2680
                            createLabel(startPc + length, context.currentMethodLabels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2681
                    context.currentLocalVariableAnnotationRangeIndices[i] = index;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2682
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2683
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2684
            case TypeReference.CAST:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2685
            case TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2686
            case TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2687
            case TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2688
            case TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2689
                targetType &= 0xFF0000FF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2690
                currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2691
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2692
            case TypeReference.CLASS_EXTENDS:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2693
            case TypeReference.CLASS_TYPE_PARAMETER_BOUND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2694
            case TypeReference.METHOD_TYPE_PARAMETER_BOUND:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2695
            case TypeReference.THROWS:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2696
            case TypeReference.EXCEPTION_PARAMETER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2697
                targetType &= 0xFFFFFF00;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2698
                currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2699
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2700
            case TypeReference.INSTANCEOF:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2701
            case TypeReference.NEW:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2702
            case TypeReference.CONSTRUCTOR_REFERENCE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2703
            case TypeReference.METHOD_REFERENCE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2704
                targetType &= 0xFF000000;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2705
                currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2706
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2707
            default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2708
                throw new IllegalArgumentException();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2709
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2710
        context.currentTypeAnnotationTarget = targetType;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2711
        // Parse and store the target_path structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2712
        int pathLength = readByte(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2713
        context.currentTypeAnnotationTargetPath =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2714
                pathLength == 0 ? null : new TypePath(b, currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2715
        // Return the start offset of the rest of the type_annotation structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2716
        return currentOffset + 1 + 2 * pathLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2717
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2718
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2719
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2720
      * Reads a Runtime[In]VisibleParameterAnnotations attribute and makes the given visitor visit it.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2721
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2722
      * @param methodVisitor the visitor that must visit the parameter annotations.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2723
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2724
      * @param runtimeParameterAnnotationsOffset the start offset of a
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2725
      *     Runtime[In]VisibleParameterAnnotations attribute, excluding the attribute_info's
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2726
      *     attribute_name_index and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2727
      * @param visible true if the attribute to parse is a RuntimeVisibleParameterAnnotations
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2728
      *     attribute, false it is a RuntimeInvisibleParameterAnnotations attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2729
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2730
    private void readParameterAnnotations(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2731
            final MethodVisitor methodVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2732
            final Context context,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2733
            final int runtimeParameterAnnotationsOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2734
            final boolean visible) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2735
        int currentOffset = runtimeParameterAnnotationsOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2736
        int numParameters = b[currentOffset++] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2737
        methodVisitor.visitAnnotableParameterCount(numParameters, visible);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2738
        char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2739
        for (int i = 0; i < numParameters; ++i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2740
            int numAnnotations = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2741
            currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2742
            while (numAnnotations-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2743
                // Parse the type_index field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2744
                String annotationDescriptor = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2745
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2746
                // Parse num_element_value_pairs and element_value_pairs and visit these values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2747
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2748
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2749
                                methodVisitor.visitParameterAnnotation(i, annotationDescriptor, visible),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2750
                                currentOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2751
                                /* named = */ true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2752
                                charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2753
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2754
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2755
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2756
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2757
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2758
      * Reads the element values of a JVMS 'annotation' structure and makes the given visitor visit
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2759
      * them. This method can also be used to read the values of the JVMS 'array_value' field of an
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2760
      * annotation's 'element_value'.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2761
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2762
      * @param annotationVisitor the visitor that must visit the values.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2763
      * @param annotationOffset the start offset of an 'annotation' structure (excluding its type_index
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2764
      *     field) or of an 'array_value' structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2765
      * @param named if the annotation values are named or not. This should be true to parse the values
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2766
      *     of a JVMS 'annotation' structure, and false to parse the JVMS 'array_value' of an
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2767
      *     annotation's element_value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2768
      * @param charBuffer the buffer used to read strings in the constant pool.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2769
      * @return the end offset of the JVMS 'annotation' or 'array_value' structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2770
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2771
    private int readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2772
            final AnnotationVisitor annotationVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2773
            final int annotationOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2774
            final boolean named,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2775
            final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2776
        int currentOffset = annotationOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2777
        // Read the num_element_value_pairs field (or num_values field for an array_value).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2778
        int numElementValuePairs = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2779
        currentOffset += 2;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2780
        if (named) {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2781
            // Parse the element_value_pairs array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2782
            while (numElementValuePairs-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2783
                String elementName = readUTF8(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2784
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2785
                        readElementValue(annotationVisitor, currentOffset + 2, elementName, charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2786
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2787
        } else {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2788
            // Parse the array_value array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2789
            while (numElementValuePairs-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2790
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2791
                        readElementValue(annotationVisitor, currentOffset, /* named = */ null, charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2792
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2793
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2794
        if (annotationVisitor != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2795
            annotationVisitor.visitEnd();
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2796
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2797
        return currentOffset;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2798
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  2799
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2800
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2801
      * Reads a JVMS 'element_value' structure and makes the given visitor visit it.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2802
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2803
      * @param annotationVisitor the visitor that must visit the element_value structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2804
      * @param elementValueOffset the start offset in {@link #b} of the element_value structure to be
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2805
      *     read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2806
      * @param elementName the name of the element_value structure to be read, or {@literal null}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2807
      * @param charBuffer the buffer used to read strings in the constant pool.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2808
      * @return the end offset of the JVMS 'element_value' structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2809
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2810
    private int readElementValue(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2811
            final AnnotationVisitor annotationVisitor,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2812
            final int elementValueOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2813
            final String elementName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2814
            final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2815
        int currentOffset = elementValueOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2816
        if (annotationVisitor == null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2817
            switch (b[currentOffset] & 0xFF) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2818
                case 'e': // enum_const_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2819
                    return currentOffset + 5;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2820
                case '@': // annotation_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2821
                    return readElementValues(null, currentOffset + 3, /* named = */ true, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2822
                case '[': // array_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2823
                    return readElementValues(null, currentOffset + 1, /* named = */ false, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2824
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2825
                    return currentOffset + 3;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2826
            }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2827
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2828
        switch (b[currentOffset++] & 0xFF) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2829
            case 'B': // const_value_index, CONSTANT_Integer
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2830
                annotationVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2831
                        elementName, (byte) readInt(cpInfoOffsets[readUnsignedShort(currentOffset)]));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2832
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2833
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2834
            case 'C': // const_value_index, CONSTANT_Integer
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2835
                annotationVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2836
                        elementName, (char) readInt(cpInfoOffsets[readUnsignedShort(currentOffset)]));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2837
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2838
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2839
            case 'D': // const_value_index, CONSTANT_Double
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2840
            case 'F': // const_value_index, CONSTANT_Float
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2841
            case 'I': // const_value_index, CONSTANT_Integer
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2842
            case 'J': // const_value_index, CONSTANT_Long
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2843
                annotationVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2844
                        elementName, readConst(readUnsignedShort(currentOffset), charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2845
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2846
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2847
            case 'S': // const_value_index, CONSTANT_Integer
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2848
                annotationVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2849
                        elementName, (short) readInt(cpInfoOffsets[readUnsignedShort(currentOffset)]));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2850
                currentOffset += 2;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2851
                break;
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2852
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2853
            case 'Z': // const_value_index, CONSTANT_Integer
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2854
                annotationVisitor.visit(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2855
                        elementName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2856
                        readInt(cpInfoOffsets[readUnsignedShort(currentOffset)]) == 0
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2857
                                ? Boolean.FALSE
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2858
                                : Boolean.TRUE);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2859
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2860
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2861
            case 's': // const_value_index, CONSTANT_Utf8
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2862
                annotationVisitor.visit(elementName, readUTF8(currentOffset, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2863
                currentOffset += 2;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2864
                break;
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2865
            case 'e': // enum_const_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2866
                annotationVisitor.visitEnum(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2867
                        elementName,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2868
                        readUTF8(currentOffset, charBuffer),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2869
                        readUTF8(currentOffset + 2, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2870
                currentOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2871
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2872
            case 'c': // class_info
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2873
                annotationVisitor.visit(elementName, Type.getType(readUTF8(currentOffset, charBuffer)));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2874
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2875
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2876
            case '@': // annotation_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2877
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2878
                        readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2879
                                annotationVisitor.visitAnnotation(elementName, readUTF8(currentOffset, charBuffer)),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2880
                                currentOffset + 2,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2881
                                true,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2882
                                charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2883
                break;
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2884
            case '[': // array_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2885
                int numValues = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2886
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2887
                if (numValues == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2888
                    return readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2889
                            annotationVisitor.visitArray(elementName),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2890
                            currentOffset - 2,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2891
                            /* named = */ false,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2892
                            charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2893
                }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2894
                switch (b[currentOffset] & 0xFF) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2895
                    case 'B':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2896
                        byte[] byteValues = new byte[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2897
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2898
                            byteValues[i] = (byte) readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2899
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2900
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2901
                        annotationVisitor.visit(elementName, byteValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2902
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2903
                    case 'Z':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2904
                        boolean[] booleanValues = new boolean[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2905
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2906
                            booleanValues[i] = readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]) != 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2907
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2908
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2909
                        annotationVisitor.visit(elementName, booleanValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2910
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2911
                    case 'S':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2912
                        short[] shortValues = new short[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2913
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2914
                            shortValues[i] = (short) readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2915
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2916
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2917
                        annotationVisitor.visit(elementName, shortValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2918
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2919
                    case 'C':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2920
                        char[] charValues = new char[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2921
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2922
                            charValues[i] = (char) readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2923
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2924
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2925
                        annotationVisitor.visit(elementName, charValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2926
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2927
                    case 'I':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2928
                        int[] intValues = new int[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2929
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2930
                            intValues[i] = readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2931
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2932
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2933
                        annotationVisitor.visit(elementName, intValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2934
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2935
                    case 'J':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2936
                        long[] longValues = new long[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2937
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2938
                            longValues[i] = readLong(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2939
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2940
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2941
                        annotationVisitor.visit(elementName, longValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2942
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2943
                    case 'F':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2944
                        float[] floatValues = new float[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2945
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2946
                            floatValues[i] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2947
                                    Float.intBitsToFloat(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2948
                                            readInt(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2949
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2950
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2951
                        annotationVisitor.visit(elementName, floatValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2952
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2953
                    case 'D':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2954
                        double[] doubleValues = new double[numValues];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2955
                        for (int i = 0; i < numValues; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2956
                            doubleValues[i] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2957
                                    Double.longBitsToDouble(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2958
                                            readLong(cpInfoOffsets[readUnsignedShort(currentOffset + 1)]));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2959
                            currentOffset += 3;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2960
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2961
                        annotationVisitor.visit(elementName, doubleValues);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2962
                        break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2963
                    default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2964
                        currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2965
                                readElementValues(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2966
                                        annotationVisitor.visitArray(elementName),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2967
                                        currentOffset - 2,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2968
                                        /* named = */ false,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2969
                                        charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2970
                        break;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2971
                }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2972
                break;
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2973
            default:
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2974
                throw new IllegalArgumentException();
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2975
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2976
        return currentOffset;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2977
    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2978
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2979
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2980
    // Methods to parse stack map frames
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2981
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2982
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2983
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2984
      * Computes the implicit frame of the method currently being parsed (as defined in the given
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2985
      * {@link Context}) and stores it in the given context.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2986
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2987
      * @param context information about the class being parsed.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2988
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2989
    private void computeImplicitFrame(final Context context) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2990
        String methodDescriptor = context.currentMethodDescriptor;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2991
        Object[] locals = context.currentFrameLocalTypes;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2992
        int numLocal = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2993
        if ((context.currentMethodAccessFlags & Opcodes.ACC_STATIC) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2994
            if ("<init>".equals(context.currentMethodName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2995
                locals[numLocal++] = Opcodes.UNINITIALIZED_THIS;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2996
            } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  2997
                locals[numLocal++] = readClass(header + 2, context.charBuffer);
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2998
            }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  2999
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3000
        // Parse the method descriptor, one argument type descriptor at each iteration. Start by
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3001
        // skipping the first method descriptor character, which is always '('.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3002
        int currentMethodDescritorOffset = 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3003
        while (true) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3004
            int currentArgumentDescriptorStartOffset = currentMethodDescritorOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3005
            switch (methodDescriptor.charAt(currentMethodDescritorOffset++)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3006
                case 'Z':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3007
                case 'C':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3008
                case 'B':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3009
                case 'S':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3010
                case 'I':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3011
                    locals[numLocal++] = Opcodes.INTEGER;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3012
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3013
                case 'F':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3014
                    locals[numLocal++] = Opcodes.FLOAT;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3015
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3016
                case 'J':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3017
                    locals[numLocal++] = Opcodes.LONG;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3018
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3019
                case 'D':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3020
                    locals[numLocal++] = Opcodes.DOUBLE;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3021
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3022
                case '[':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3023
                    while (methodDescriptor.charAt(currentMethodDescritorOffset) == '[') {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3024
                        ++currentMethodDescritorOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3025
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3026
                    if (methodDescriptor.charAt(currentMethodDescritorOffset) == 'L') {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3027
                        ++currentMethodDescritorOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3028
                        while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3029
                            ++currentMethodDescritorOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3030
                        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3031
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3032
                    locals[numLocal++] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3033
                            methodDescriptor.substring(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3034
                                    currentArgumentDescriptorStartOffset, ++currentMethodDescritorOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3035
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3036
                case 'L':
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3037
                    while (methodDescriptor.charAt(currentMethodDescritorOffset) != ';') {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3038
                        ++currentMethodDescritorOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3039
                    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3040
                    locals[numLocal++] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3041
                            methodDescriptor.substring(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3042
                                    currentArgumentDescriptorStartOffset + 1, currentMethodDescritorOffset++);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3043
                    break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3044
                default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3045
                    context.currentFrameLocalCount = numLocal;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3046
                    return;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3047
            }
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3048
        }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3049
    }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3050
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3051
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3052
      * Reads a JVMS 'stack_map_frame' structure and stores the result in the given {@link Context}
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3053
      * object. This method can also be used to read a full_frame structure, excluding its frame_type
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3054
      * field (this is used to parse the legacy StackMap attributes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3055
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3056
      * @param stackMapFrameOffset the start offset in {@link #b} of the stack_map_frame_value
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3057
      *     structure to be read, or the start offset of a full_frame structure (excluding its
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3058
      *     frame_type field).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3059
      * @param compressed true to read a 'stack_map_frame' structure, false to read a 'full_frame'
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3060
      *     structure without its frame_type field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3061
      * @param expand if the stack map frame must be expanded. See {@link #EXPAND_FRAMES}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3062
      * @param context where the parsed stack map frame must be stored.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3063
      * @return the end offset of the JVMS 'stack_map_frame' or 'full_frame' structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3064
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3065
    private int readStackMapFrame(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3066
            final int stackMapFrameOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3067
            final boolean compressed,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3068
            final boolean expand,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3069
            final Context context) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3070
        int currentOffset = stackMapFrameOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3071
        final char[] charBuffer = context.charBuffer;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3072
        final Label[] labels = context.currentMethodLabels;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3073
        int frameType;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3074
        if (compressed) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3075
            // Read the frame_type field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3076
            frameType = b[currentOffset++] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3077
        } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3078
            frameType = Frame.FULL_FRAME;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3079
            context.currentFrameOffset = -1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3080
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3081
        int offsetDelta;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3082
        context.currentFrameLocalCountDelta = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3083
        if (frameType < Frame.SAME_LOCALS_1_STACK_ITEM_FRAME) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3084
            offsetDelta = frameType;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3085
            context.currentFrameType = Opcodes.F_SAME;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3086
            context.currentFrameStackCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3087
        } else if (frameType < Frame.RESERVED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3088
            offsetDelta = frameType - Frame.SAME_LOCALS_1_STACK_ITEM_FRAME;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3089
            currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3090
                    readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3091
                            currentOffset, context.currentFrameStackTypes, 0, charBuffer, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3092
            context.currentFrameType = Opcodes.F_SAME1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3093
            context.currentFrameStackCount = 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3094
        } else if (frameType >= Frame.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3095
            offsetDelta = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3096
            currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3097
            if (frameType == Frame.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3098
                currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3099
                        readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3100
                                currentOffset, context.currentFrameStackTypes, 0, charBuffer, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3101
                context.currentFrameType = Opcodes.F_SAME1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3102
                context.currentFrameStackCount = 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3103
            } else if (frameType >= Frame.CHOP_FRAME && frameType < Frame.SAME_FRAME_EXTENDED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3104
                context.currentFrameType = Opcodes.F_CHOP;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3105
                context.currentFrameLocalCountDelta = Frame.SAME_FRAME_EXTENDED - frameType;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3106
                context.currentFrameLocalCount -= context.currentFrameLocalCountDelta;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3107
                context.currentFrameStackCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3108
            } else if (frameType == Frame.SAME_FRAME_EXTENDED) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3109
                context.currentFrameType = Opcodes.F_SAME;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3110
                context.currentFrameStackCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3111
            } else if (frameType < Frame.FULL_FRAME) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3112
                int local = expand ? context.currentFrameLocalCount : 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3113
                for (int k = frameType - Frame.SAME_FRAME_EXTENDED; k > 0; k--) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3114
                    currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3115
                            readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3116
                                    currentOffset, context.currentFrameLocalTypes, local++, charBuffer, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3117
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3118
                context.currentFrameType = Opcodes.F_APPEND;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3119
                context.currentFrameLocalCountDelta = frameType - Frame.SAME_FRAME_EXTENDED;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3120
                context.currentFrameLocalCount += context.currentFrameLocalCountDelta;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3121
                context.currentFrameStackCount = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3122
            } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3123
                final int numberOfLocals = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3124
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3125
                context.currentFrameType = Opcodes.F_FULL;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3126
                context.currentFrameLocalCountDelta = numberOfLocals;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3127
                context.currentFrameLocalCount = numberOfLocals;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3128
                for (int local = 0; local < numberOfLocals; ++local) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3129
                    currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3130
                            readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3131
                                    currentOffset, context.currentFrameLocalTypes, local, charBuffer, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3132
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3133
                final int numberOfStackItems = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3134
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3135
                context.currentFrameStackCount = numberOfStackItems;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3136
                for (int stack = 0; stack < numberOfStackItems; ++stack) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3137
                    currentOffset =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3138
                            readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3139
                                    currentOffset, context.currentFrameStackTypes, stack, charBuffer, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3140
                }
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3141
            }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3142
        } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3143
            throw new IllegalArgumentException();
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3144
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3145
        context.currentFrameOffset += offsetDelta + 1;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3146
        createLabel(context.currentFrameOffset, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3147
        return currentOffset;
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3148
    }
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3149
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3150
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3151
      * Reads a JVMS 'verification_type_info' structure and stores it at the given index in the given
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3152
      * array.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3153
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3154
      * @param verificationTypeInfoOffset the start offset of the 'verification_type_info' structure to
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3155
      *     read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3156
      * @param frame the array where the parsed type must be stored.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3157
      * @param index the index in 'frame' where the parsed type must be stored.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3158
      * @param charBuffer the buffer used to read strings in the constant pool.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3159
      * @param labels the labels of the method currently being parsed, indexed by their offset. If the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3160
      *     parsed type is an ITEM_Uninitialized, a new label for the corresponding NEW instruction is
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3161
      *     stored in this array if it does not already exist.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3162
      * @return the end offset of the JVMS 'verification_type_info' structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3163
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3164
    private int readVerificationTypeInfo(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3165
            final int verificationTypeInfoOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3166
            final Object[] frame,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3167
            final int index,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3168
            final char[] charBuffer,
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3169
            final Label[] labels) {
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3170
        int currentOffset = verificationTypeInfoOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3171
        int tag = b[currentOffset++] & 0xFF;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3172
        switch (tag) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3173
            case Frame.ITEM_TOP:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3174
                frame[index] = Opcodes.TOP;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3175
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3176
            case Frame.ITEM_INTEGER:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3177
                frame[index] = Opcodes.INTEGER;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3178
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3179
            case Frame.ITEM_FLOAT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3180
                frame[index] = Opcodes.FLOAT;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3181
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3182
            case Frame.ITEM_DOUBLE:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3183
                frame[index] = Opcodes.DOUBLE;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3184
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3185
            case Frame.ITEM_LONG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3186
                frame[index] = Opcodes.LONG;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3187
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3188
            case Frame.ITEM_NULL:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3189
                frame[index] = Opcodes.NULL;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3190
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3191
            case Frame.ITEM_UNINITIALIZED_THIS:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3192
                frame[index] = Opcodes.UNINITIALIZED_THIS;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3193
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3194
            case Frame.ITEM_OBJECT:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3195
                frame[index] = readClass(currentOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3196
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3197
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3198
            case Frame.ITEM_UNINITIALIZED:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3199
                frame[index] = createLabel(readUnsignedShort(currentOffset), labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3200
                currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3201
                break;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3202
            default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3203
                throw new IllegalArgumentException();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3204
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3205
        return currentOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3206
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3207
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3208
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3209
    // Methods to parse attributes
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3210
    // ----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3211
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3212
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3213
      * Returns the offset in {@link #b} of the first ClassFile's 'attributes' array field entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3214
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3215
      * @return the offset in {@link #b} of the first ClassFile's 'attributes' array field entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3216
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3217
    final int getFirstAttributeOffset() {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3218
        // Skip the access_flags, this_class, super_class, and interfaces_count fields (using 2 bytes
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3219
        // each), as well as the interfaces array field (2 bytes per interface).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3220
        int currentOffset = header + 8 + readUnsignedShort(header + 6) * 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3221
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3222
        // Read the fields_count field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3223
        int fieldsCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3224
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3225
        // Skip the 'fields' array field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3226
        while (fieldsCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3227
            // Invariant: currentOffset is the offset of a field_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3228
            // Skip the access_flags, name_index and descriptor_index fields (2 bytes each), and read the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3229
            // attributes_count field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3230
            int attributesCount = readUnsignedShort(currentOffset + 6);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3231
            currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3232
            // Skip the 'attributes' array field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3233
            while (attributesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3234
                // Invariant: currentOffset is the offset of an attribute_info structure.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3235
                // Read the attribute_length field (2 bytes after the start of the attribute_info) and skip
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3236
                // this many bytes, plus 6 for the attribute_name_index and attribute_length fields
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3237
                // (yielding the total size of the attribute_info structure).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3238
                currentOffset += 6 + readInt(currentOffset + 2);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3239
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3240
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3241
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3242
        // Skip the methods_count and 'methods' fields, using the same method as above.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3243
        int methodsCount = readUnsignedShort(currentOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3244
        currentOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3245
        while (methodsCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3246
            int attributesCount = readUnsignedShort(currentOffset + 6);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3247
            currentOffset += 8;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3248
            while (attributesCount-- > 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3249
                currentOffset += 6 + readInt(currentOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3250
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3251
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3252
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3253
        // Skip the ClassFile's attributes_count field.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3254
        return currentOffset + 2;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3255
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3256
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3257
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3258
      * Reads the BootstrapMethods attribute to compute the offset of each bootstrap method.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3259
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3260
      * @param maxStringLength a conservative estimate of the maximum length of the strings contained
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3261
      *     in the constant pool of the class.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3262
      * @return the offsets of the bootstrap methods or null.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3263
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3264
    private int[] readBootstrapMethodsAttribute(final int maxStringLength) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3265
        char[] charBuffer = new char[maxStringLength];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3266
        int currentAttributeOffset = getFirstAttributeOffset();
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3267
        int[] currentBootstrapMethodOffsets = null;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3268
        for (int i = readUnsignedShort(currentAttributeOffset - 2); i > 0; --i) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3269
            // Read the attribute_info's attribute_name and attribute_length fields.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3270
            String attributeName = readUTF8(currentAttributeOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3271
            int attributeLength = readInt(currentAttributeOffset + 2);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3272
            currentAttributeOffset += 6;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3273
            if (Constants.BOOTSTRAP_METHODS.equals(attributeName)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3274
                // Read the num_bootstrap_methods field and create an array of this size.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3275
                currentBootstrapMethodOffsets = new int[readUnsignedShort(currentAttributeOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3276
                // Compute and store the offset of each 'bootstrap_methods' array field entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3277
                int currentBootstrapMethodOffset = currentAttributeOffset + 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3278
                for (int j = 0; j < currentBootstrapMethodOffsets.length; ++j) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3279
                    currentBootstrapMethodOffsets[j] = currentBootstrapMethodOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3280
                    // Skip the bootstrap_method_ref and num_bootstrap_arguments fields (2 bytes each),
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3281
                    // as well as the bootstrap_arguments array field (of size num_bootstrap_arguments * 2).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3282
                    currentBootstrapMethodOffset +=
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3283
                            4 + readUnsignedShort(currentBootstrapMethodOffset + 2) * 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3284
                }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3285
                return currentBootstrapMethodOffsets;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3286
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3287
            currentAttributeOffset += attributeLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3288
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3289
        return null;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3290
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3291
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3292
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3293
      * Reads a non standard JVMS 'attribute' structure in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3294
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3295
      * @param attributePrototypes prototypes of the attributes that must be parsed during the visit of
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3296
      *     the class. Any attribute whose type is not equal to the type of one the prototypes will not
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3297
      *     be parsed: its byte array value will be passed unchanged to the ClassWriter.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3298
      * @param type the type of the attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3299
      * @param offset the start offset of the JVMS 'attribute' structure in {@link #b}. The 6 attribute
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3300
      *     header bytes (attribute_name_index and attribute_length) are not taken into account here.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3301
      * @param length the length of the attribute's content (excluding the 6 attribute header bytes).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3302
      * @param charBuffer the buffer to be used to read strings in the constant pool.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3303
      * @param codeAttributeOffset the start offset of the enclosing Code attribute in {@link #b}, or
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3304
      *     -1 if the attribute to be read is not a code attribute. The 6 attribute header bytes
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3305
      *     (attribute_name_index and attribute_length) are not taken into account here.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3306
      * @param labels the labels of the method's code, or {@literal null} if the attribute to be read
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3307
      *     is not a code attribute.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3308
      * @return the attribute that has been read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3309
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3310
    private Attribute readAttribute(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3311
            final Attribute[] attributePrototypes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3312
            final String type,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3313
            final int offset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3314
            final int length,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3315
            final char[] charBuffer,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3316
            final int codeAttributeOffset,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3317
            final Label[] labels) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3318
        for (Attribute attributePrototype : attributePrototypes) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3319
            if (attributePrototype.type.equals(type)) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3320
                return attributePrototype.read(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3321
                        this, offset, length, charBuffer, codeAttributeOffset, labels);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3322
            }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3323
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3324
        return new Attribute(type).read(this, offset, length, null, -1, null);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3325
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3326
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3327
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3328
    // Utility methods: low level parsing
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3329
    // -----------------------------------------------------------------------------------------------
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3330
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3331
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3332
      * Returns the number of entries in the class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3333
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3334
      * @return the number of entries in the class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3335
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3336
    public int getItemCount() {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3337
        return cpInfoOffsets.length;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3338
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3339
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3340
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3341
      * Returns the start offset in {@link #b} of a JVMS 'cp_info' structure (i.e. a constant pool
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3342
      * entry), plus one. <i>This method is intended for {@link Attribute} sub classes, and is normally
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3343
      * not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3344
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3345
      * @param constantPoolEntryIndex the index a constant pool entry in the class's constant pool
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3346
      *     table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3347
      * @return the start offset in {@link #b} of the corresponding JVMS 'cp_info' structure, plus one.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3348
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3349
    public int getItem(final int constantPoolEntryIndex) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3350
        return cpInfoOffsets[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3351
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3352
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3353
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3354
      * Returns a conservative estimate of the maximum length of the strings contained in the class's
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3355
      * constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3356
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3357
      * @return a conservative estimate of the maximum length of the strings contained in the class's
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3358
      *     constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3359
      */
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3360
    public int getMaxStringLength() {
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3361
        return maxStringLength;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3362
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3363
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3364
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3365
      * Reads a byte value in {@link #b}. <i>This method is intended for {@link Attribute} sub classes,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3366
      * and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3367
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3368
      * @param offset the start offset of the value to be read in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3369
      * @return the read value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3370
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3371
    public int readByte(final int offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3372
        return b[offset] & 0xFF;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3373
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3374
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3375
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3376
      * Reads an unsigned short value in {@link #b}. <i>This method is intended for {@link Attribute}
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3377
      * sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3378
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3379
      * @param offset the start index of the value to be read in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3380
      * @return the read value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3381
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3382
    public int readUnsignedShort(final int offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3383
        byte[] classFileBuffer = b;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3384
        return ((classFileBuffer[offset] & 0xFF) << 8) | (classFileBuffer[offset + 1] & 0xFF);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3385
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3386
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3387
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3388
      * Reads a signed short value in {@link #b}. <i>This method is intended for {@link Attribute} sub
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3389
      * classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3390
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3391
      * @param offset the start offset of the value to be read in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3392
      * @return the read value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3393
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3394
    public short readShort(final int offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3395
        byte[] classFileBuffer = b;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3396
        return (short) (((classFileBuffer[offset] & 0xFF) << 8) | (classFileBuffer[offset + 1] & 0xFF));
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3397
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3398
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3399
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3400
      * Reads a signed int value in {@link #b}. <i>This method is intended for {@link Attribute} sub
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3401
      * classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3402
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3403
      * @param offset the start offset of the value to be read in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3404
      * @return the read value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3405
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3406
    public int readInt(final int offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3407
        byte[] classFileBuffer = b;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3408
        return ((classFileBuffer[offset] & 0xFF) << 24)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3409
                | ((classFileBuffer[offset + 1] & 0xFF) << 16)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3410
                | ((classFileBuffer[offset + 2] & 0xFF) << 8)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3411
                | (classFileBuffer[offset + 3] & 0xFF);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3412
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3413
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3414
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3415
      * Reads a signed long value in {@link #b}. <i>This method is intended for {@link Attribute} sub
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3416
      * classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3417
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3418
      * @param offset the start offset of the value to be read in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3419
      * @return the read value.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3420
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3421
    public long readLong(final int offset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3422
        long l1 = readInt(offset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3423
        long l0 = readInt(offset + 4) & 0xFFFFFFFFL;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3424
        return (l1 << 32) | l0;
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3425
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3426
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3427
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3428
      * Reads a CONSTANT_Utf8 constant pool entry in {@link #b}. <i>This method is intended for {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3429
      * Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3430
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3431
      * @param offset the start offset of an unsigned short value in {@link #b}, whose value is the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3432
      *     index of a CONSTANT_Utf8 entry in the class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3433
      * @param charBuffer the buffer to be used to read the string. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3434
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3435
      * @return the String corresponding to the specified CONSTANT_Utf8 entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3436
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3437
    // DontCheck(AbbreviationAsWordInName): can't be renamed (for backward binary compatibility).
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3438
    public String readUTF8(final int offset, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3439
        int constantPoolEntryIndex = readUnsignedShort(offset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3440
        if (offset == 0 || constantPoolEntryIndex == 0) {
17420
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3441
            return null;
6163a8236046 8013225: Refresh jdk's private ASM to the latest.
ksrini
parents: 14198
diff changeset
  3442
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3443
        return readUtf(constantPoolEntryIndex, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3444
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3445
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3446
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3447
      * Reads a CONSTANT_Utf8 constant pool entry in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3448
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3449
      * @param constantPoolEntryIndex the index of a CONSTANT_Utf8 entry in the class's constant pool
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3450
      *     table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3451
      * @param charBuffer the buffer to be used to read the string. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3452
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3453
      * @return the String corresponding to the specified CONSTANT_Utf8 entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3454
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3455
    final String readUtf(final int constantPoolEntryIndex, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3456
        String value = constantUtf8Values[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3457
        if (value != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3458
            return value;
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3459
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3460
        int cpInfoOffset = cpInfoOffsets[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3461
        return constantUtf8Values[constantPoolEntryIndex] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3462
                readUtf(cpInfoOffset + 2, readUnsignedShort(cpInfoOffset), charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3463
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3464
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3465
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3466
      * Reads an UTF8 string in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3467
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3468
      * @param utfOffset the start offset of the UTF8 string to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3469
      * @param utfLength the length of the UTF8 string to be read.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3470
      * @param charBuffer the buffer to be used to read the string. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3471
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3472
      * @return the String corresponding to the specified UTF8 string.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3473
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3474
    private String readUtf(final int utfOffset, final int utfLength, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3475
        int currentOffset = utfOffset;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3476
        int endOffset = currentOffset + utfLength;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3477
        int strLength = 0;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3478
        byte[] classFileBuffer = b;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3479
        while (currentOffset < endOffset) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3480
            int currentByte = classFileBuffer[currentOffset++];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3481
            if ((currentByte & 0x80) == 0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3482
                charBuffer[strLength++] = (char) (currentByte & 0x7F);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3483
            } else if ((currentByte & 0xE0) == 0xC0) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3484
                charBuffer[strLength++] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3485
                        (char) (((currentByte & 0x1F) << 6) + (classFileBuffer[currentOffset++] & 0x3F));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3486
            } else {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3487
                charBuffer[strLength++] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3488
                        (char)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3489
                                (((currentByte & 0xF) << 12)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3490
                                        + ((classFileBuffer[currentOffset++] & 0x3F) << 6)
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3491
                                        + (classFileBuffer[currentOffset++] & 0x3F));
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3492
            }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3493
        }
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3494
        return new String(charBuffer, 0, strLength);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3495
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3496
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3497
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3498
      * Reads a CONSTANT_Class, CONSTANT_String, CONSTANT_MethodType, CONSTANT_Module or
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3499
      * CONSTANT_Package constant pool entry in {@link #b}. <i>This method is intended for {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3500
      * Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3501
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3502
      * @param offset the start offset of an unsigned short value in {@link #b}, whose value is the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3503
      *     index of a CONSTANT_Class, CONSTANT_String, CONSTANT_MethodType, CONSTANT_Module or
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3504
      *     CONSTANT_Package entry in class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3505
      * @param charBuffer the buffer to be used to read the item. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3506
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3507
      * @return the String corresponding to the specified constant pool entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3508
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3509
    private String readStringish(final int offset, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3510
        // Get the start offset of the cp_info structure (plus one), and read the CONSTANT_Utf8 entry
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3511
        // designated by the first two bytes of this cp_info.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3512
        return readUTF8(cpInfoOffsets[readUnsignedShort(offset)], charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3513
    }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3514
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3515
    /**
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3516
      * Reads a CONSTANT_Class constant pool entry in {@link #b}. <i>This method is intended for {@link
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3517
      * Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3518
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3519
      * @param offset the start offset of an unsigned short value in {@link #b}, whose value is the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3520
      *     index of a CONSTANT_Class entry in class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3521
      * @param charBuffer the buffer to be used to read the item. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3522
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3523
      * @return the String corresponding to the specified CONSTANT_Class entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3524
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3525
    public String readClass(final int offset, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3526
        return readStringish(offset, charBuffer);
47488
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3527
    }
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3528
2af7932c2f6f 8190287: Update JDK's internal ASM to ASMv6
ksrini
parents: 47216
diff changeset
  3529
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3530
      * Reads a CONSTANT_Module constant pool entry in {@link #b}. <i>This method is intended for
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3531
      * {@link Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3532
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3533
      * @param offset the start offset of an unsigned short value in {@link #b}, whose value is the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3534
      *     index of a CONSTANT_Module entry in class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3535
      * @param charBuffer the buffer to be used to read the item. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3536
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3537
      * @return the String corresponding to the specified CONSTANT_Module entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3538
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3539
    public String readModule(final int offset, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3540
        return readStringish(offset, charBuffer);
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3541
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3542
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3543
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3544
      * Reads a CONSTANT_Package constant pool entry in {@link #b}. <i>This method is intended for
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3545
      * {@link Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3546
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3547
      * @param offset the start offset of an unsigned short value in {@link #b}, whose value is the
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3548
      *     index of a CONSTANT_Package entry in class's constant pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3549
      * @param charBuffer the buffer to be used to read the item. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3550
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3551
      * @return the String corresponding to the specified CONSTANT_Package entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3552
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3553
    public String readPackage(final int offset, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3554
        return readStringish(offset, charBuffer);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3555
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3556
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3557
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3558
      * Reads a CONSTANT_Dynamic constant pool entry in {@link #b}.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3559
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3560
      * @param constantPoolEntryIndex the index of a CONSTANT_Dynamic entry in the class's constant
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3561
      *     pool table.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3562
      * @param charBuffer the buffer to be used to read the string. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3563
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3564
      * @return the ConstantDynamic corresponding to the specified CONSTANT_Dynamic entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3565
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3566
    private ConstantDynamic readConstantDynamic(
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3567
            final int constantPoolEntryIndex, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3568
        ConstantDynamic constantDynamic = constantDynamicValues[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3569
        if (constantDynamic != null) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3570
            return constantDynamic;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3571
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3572
        int cpInfoOffset = cpInfoOffsets[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3573
        int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3574
        String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3575
        String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3576
        int bootstrapMethodOffset = bootstrapMethodOffsets[readUnsignedShort(cpInfoOffset)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3577
        Handle handle = (Handle) readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3578
        Object[] bootstrapMethodArguments = new Object[readUnsignedShort(bootstrapMethodOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3579
        bootstrapMethodOffset += 4;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3580
        for (int i = 0; i < bootstrapMethodArguments.length; i++) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3581
            bootstrapMethodArguments[i] = readConst(readUnsignedShort(bootstrapMethodOffset), charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3582
            bootstrapMethodOffset += 2;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3583
        }
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3584
        return constantDynamicValues[constantPoolEntryIndex] =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3585
                new ConstantDynamic(name, descriptor, handle, bootstrapMethodArguments);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3586
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3587
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents: 36636
diff changeset
  3588
    /**
52515
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3589
      * Reads a numeric or string constant pool entry in {@link #b}. <i>This method is intended for
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3590
      * {@link Attribute} sub classes, and is normally not needed by class generators or adapters.</i>
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3591
      *
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3592
      * @param constantPoolEntryIndex the index of a CONSTANT_Integer, CONSTANT_Float, CONSTANT_Long,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3593
      *     CONSTANT_Double, CONSTANT_Class, CONSTANT_String, CONSTANT_MethodType,
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3594
      *     CONSTANT_MethodHandle or CONSTANT_Dynamic entry in the class's constant pool.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3595
      * @param charBuffer the buffer to be used to read strings. This buffer must be sufficiently
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3596
      *     large. It is not automatically resized.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3597
      * @return the {@link Integer}, {@link Float}, {@link Long}, {@link Double}, {@link String},
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3598
      *     {@link Type}, {@link Handle} or {@link ConstantDynamic} corresponding to the specified
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3599
      *     constant pool entry.
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3600
      */
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3601
    public Object readConst(final int constantPoolEntryIndex, final char[] charBuffer) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3602
        int cpInfoOffset = cpInfoOffsets[constantPoolEntryIndex];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3603
        switch (b[cpInfoOffset - 1]) {
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3604
            case Symbol.CONSTANT_INTEGER_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3605
                return readInt(cpInfoOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3606
            case Symbol.CONSTANT_FLOAT_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3607
                return Float.intBitsToFloat(readInt(cpInfoOffset));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3608
            case Symbol.CONSTANT_LONG_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3609
                return readLong(cpInfoOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3610
            case Symbol.CONSTANT_DOUBLE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3611
                return Double.longBitsToDouble(readLong(cpInfoOffset));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3612
            case Symbol.CONSTANT_CLASS_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3613
                return Type.getObjectType(readUTF8(cpInfoOffset, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3614
            case Symbol.CONSTANT_STRING_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3615
                return readUTF8(cpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3616
            case Symbol.CONSTANT_METHOD_TYPE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3617
                return Type.getMethodType(readUTF8(cpInfoOffset, charBuffer));
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3618
            case Symbol.CONSTANT_METHOD_HANDLE_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3619
                int referenceKind = readByte(cpInfoOffset);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3620
                int referenceCpInfoOffset = cpInfoOffsets[readUnsignedShort(cpInfoOffset + 1)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3621
                int nameAndTypeCpInfoOffset = cpInfoOffsets[readUnsignedShort(referenceCpInfoOffset + 2)];
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3622
                String owner = readClass(referenceCpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3623
                String name = readUTF8(nameAndTypeCpInfoOffset, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3624
                String descriptor = readUTF8(nameAndTypeCpInfoOffset + 2, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3625
                boolean isInterface =
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3626
                        b[referenceCpInfoOffset - 1] == Symbol.CONSTANT_INTERFACE_METHODREF_TAG;
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3627
                return new Handle(referenceKind, owner, name, descriptor, isInterface);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3628
            case Symbol.CONSTANT_DYNAMIC_TAG:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3629
                return readConstantDynamic(constantPoolEntryIndex, charBuffer);
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3630
            default:
746df0ae4fe1 8213480: update internal ASM version to 7.0
vromero
parents: 50892
diff changeset
  3631
                throw new IllegalArgumentException();
14198
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3632
        }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3633
    }
071fd6fd257d 7197401: Add a subset of the org.objectweb.asm packages to jdk8
jjh
parents:
diff changeset
  3634
}