jaxp/src/com/sun/org/apache/bcel/internal/classfile/LocalVariableTypeTable.java
author dbuck
Thu, 10 Jan 2013 20:26:00 -0800
changeset 15346 3f6fd93fec9a
permissions -rw-r--r--
8003147: port fix for BCEL bug 39695 Summary: Added support for Local Variable Type Table so that BCEL library can be used to modify methods with generics-related debug data without violating class file format Reviewed-by: lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15346
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     1
/*
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     2
 * reserved comment block
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     3
 * DO NOT REMOVE OR ALTER!
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     4
 */
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     5
package com.sun.org.apache.bcel.internal.classfile;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     6
/**
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     7
 *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     8
 *  contributor license agreements.  See the NOTICE file distributed with
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
     9
 *  this work for additional information regarding copyright ownership.
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    10
 *  The ASF licenses this file to You under the Apache License, Version 2.0
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    11
 *  (the "License"); you may not use this file except in compliance with
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    12
 *  the License.  You may obtain a copy of the License at
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    13
 *
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    14
 *     http://www.apache.org/licenses/LICENSE-2.0
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    15
 *
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    16
 *  Unless required by applicable law or agreed to in writing, software
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    17
 *  distributed under the License is distributed on an "AS IS" BASIS,
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    18
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    19
 *  See the License for the specific language governing permissions and
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    20
 *  limitations under the License.
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    21
 */
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    22
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    23
import  com.sun.org.apache.bcel.internal.Constants;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    24
import  java.io.*;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    25
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    26
// The new table is used when generic types are about...
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    27
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    28
//LocalVariableTable_attribute {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    29
//         u2 attribute_name_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    30
//         u4 attribute_length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    31
//         u2 local_variable_table_length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    32
//         {  u2 start_pc;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    33
//            u2 length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    34
//            u2 name_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    35
//            u2 descriptor_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    36
//            u2 index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    37
//         } local_variable_table[local_variable_table_length];
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    38
//       }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    39
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    40
//LocalVariableTypeTable_attribute {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    41
//    u2 attribute_name_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    42
//    u4 attribute_length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    43
//    u2 local_variable_type_table_length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    44
//    {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    45
//      u2 start_pc;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    46
//      u2 length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    47
//      u2 name_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    48
//      u2 signature_index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    49
//      u2 index;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    50
//    } local_variable_type_table[local_variable_type_table_length];
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    51
//  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    52
// J5TODO: Needs some testing !
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    53
public class LocalVariableTypeTable extends Attribute {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    54
  private static final long serialVersionUID = -1082157891095177114L;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    55
private int             local_variable_type_table_length; // Table of local
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    56
  private LocalVariable[] local_variable_type_table;        // variables
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    57
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    58
  public LocalVariableTypeTable(LocalVariableTypeTable c) {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    59
    this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(),
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    60
         c.getConstantPool());
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    61
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    62
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    63
  public LocalVariableTypeTable(int name_index, int length,
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    64
                            LocalVariable[] local_variable_table,
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    65
                            ConstantPool    constant_pool)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    66
  {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    67
    super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    68
    setLocalVariableTable(local_variable_table);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    69
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    70
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    71
  LocalVariableTypeTable(int nameIdx, int len, DataInputStream dis,ConstantPool cpool) throws IOException {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    72
    this(nameIdx, len, (LocalVariable[])null, cpool);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    73
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    74
    local_variable_type_table_length = (dis.readUnsignedShort());
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    75
    local_variable_type_table = new LocalVariable[local_variable_type_table_length];
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    76
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    77
    for(int i=0; i < local_variable_type_table_length; i++)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    78
      local_variable_type_table[i] = new LocalVariable(dis, cpool);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    79
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    80
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    81
  @Override
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    82
public void accept(Visitor v) {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    83
    v.visitLocalVariableTypeTable(this);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    84
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    85
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    86
  @Override
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    87
public final void dump(DataOutputStream file) throws IOException
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    88
  {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    89
    super.dump(file);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    90
    file.writeShort(local_variable_type_table_length);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    91
    for(int i=0; i < local_variable_type_table_length; i++)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    92
      local_variable_type_table[i].dump(file);
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    93
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    94
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    95
  public final LocalVariable[] getLocalVariableTypeTable() {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    96
    return local_variable_type_table;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    97
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    98
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
    99
  public final LocalVariable getLocalVariable(int index) {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   100
    for(int i=0; i < local_variable_type_table_length; i++)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   101
      if(local_variable_type_table[i].getIndex() == index)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   102
        return local_variable_type_table[i];
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   103
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   104
    return null;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   105
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   106
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   107
  public final void setLocalVariableTable(LocalVariable[] local_variable_table)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   108
  {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   109
    this.local_variable_type_table = local_variable_table;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   110
    local_variable_type_table_length = (local_variable_table == null)? 0 :
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   111
      local_variable_table.length;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   112
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   113
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   114
  /**
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   115
   * @return String representation.
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   116
   */
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   117
  @Override
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   118
public final String toString() {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   119
      StringBuilder buf = new StringBuilder();
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   120
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   121
    for(int i=0; i < local_variable_type_table_length; i++) {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   122
      buf.append(local_variable_type_table[i].toString());
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   123
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   124
      if(i < local_variable_type_table_length - 1) buf.append('\n');
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   125
    }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   126
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   127
    return buf.toString();
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   128
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   129
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   130
  /**
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   131
   * @return deep copy of this attribute
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   132
   */
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   133
  @Override
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   134
public Attribute copy(ConstantPool constant_pool) {
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   135
    LocalVariableTypeTable c = (LocalVariableTypeTable)clone();
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   136
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   137
    c.local_variable_type_table = new LocalVariable[local_variable_type_table_length];
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   138
    for(int i=0; i < local_variable_type_table_length; i++)
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   139
      c.local_variable_type_table[i] = local_variable_type_table[i].copy();
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   140
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   141
    c.constant_pool = constant_pool;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   142
    return c;
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   143
  }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   144
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   145
  public final int getTableLength() { return local_variable_type_table_length; }
3f6fd93fec9a 8003147: port fix for BCEL bug 39695
dbuck
parents:
diff changeset
   146
}