Merge
This commit is contained in:
commit
d6e0250020
@ -746,27 +746,29 @@ public interface Constants {
|
||||
|
||||
/** Attributes and their corresponding names.
|
||||
*/
|
||||
public static final byte ATTR_UNKNOWN = -1;
|
||||
public static final byte ATTR_SOURCE_FILE = 0;
|
||||
public static final byte ATTR_CONSTANT_VALUE = 1;
|
||||
public static final byte ATTR_CODE = 2;
|
||||
public static final byte ATTR_EXCEPTIONS = 3;
|
||||
public static final byte ATTR_LINE_NUMBER_TABLE = 4;
|
||||
public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5;
|
||||
public static final byte ATTR_INNER_CLASSES = 6;
|
||||
public static final byte ATTR_SYNTHETIC = 7;
|
||||
public static final byte ATTR_DEPRECATED = 8;
|
||||
public static final byte ATTR_PMG = 9;
|
||||
public static final byte ATTR_SIGNATURE = 10;
|
||||
public static final byte ATTR_STACK_MAP = 11;
|
||||
public static final byte ATTR_UNKNOWN = -1;
|
||||
public static final byte ATTR_SOURCE_FILE = 0;
|
||||
public static final byte ATTR_CONSTANT_VALUE = 1;
|
||||
public static final byte ATTR_CODE = 2;
|
||||
public static final byte ATTR_EXCEPTIONS = 3;
|
||||
public static final byte ATTR_LINE_NUMBER_TABLE = 4;
|
||||
public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5;
|
||||
public static final byte ATTR_INNER_CLASSES = 6;
|
||||
public static final byte ATTR_SYNTHETIC = 7;
|
||||
public static final byte ATTR_DEPRECATED = 8;
|
||||
public static final byte ATTR_PMG = 9;
|
||||
public static final byte ATTR_SIGNATURE = 10;
|
||||
public static final byte ATTR_STACK_MAP = 11;
|
||||
public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 12;
|
||||
|
||||
public static final short KNOWN_ATTRIBUTES = 12;
|
||||
public static final short KNOWN_ATTRIBUTES = 13;
|
||||
|
||||
public static final String[] ATTRIBUTE_NAMES = {
|
||||
"SourceFile", "ConstantValue", "Code", "Exceptions",
|
||||
"LineNumberTable", "LocalVariableTable",
|
||||
"InnerClasses", "Synthetic", "Deprecated",
|
||||
"PMGClass", "Signature", "StackMap"
|
||||
"PMGClass", "Signature", "StackMap",
|
||||
"LocalVariableTypeTable"
|
||||
};
|
||||
|
||||
/** Constants used in the StackMap attribute.
|
||||
|
@ -206,6 +206,9 @@ public abstract class Attribute implements Cloneable, Node, Serializable {
|
||||
case Constants.ATTR_LOCAL_VARIABLE_TABLE:
|
||||
return new LocalVariableTable(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE:
|
||||
return new LocalVariableTypeTable(name_index, length, file, constant_pool);
|
||||
|
||||
case Constants.ATTR_INNER_CLASSES:
|
||||
return new InnerClasses(name_index, length, file, constant_pool);
|
||||
|
||||
|
@ -210,6 +210,12 @@ public class DescendingVisitor implements Visitor {
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {
|
||||
stack.push(obj);
|
||||
obj.accept(visitor);
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
public void visitStackMap(StackMap table) {
|
||||
stack.push(table);
|
||||
table.accept(visitor);
|
||||
|
@ -98,6 +98,7 @@ public class EmptyVisitor implements Visitor {
|
||||
public void visitLineNumberTable(LineNumberTable obj) {}
|
||||
public void visitLocalVariable(LocalVariable obj) {}
|
||||
public void visitLocalVariableTable(LocalVariableTable obj) {}
|
||||
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {}
|
||||
public void visitMethod(Method obj) {}
|
||||
public void visitSignature(Signature obj) {}
|
||||
public void visitSourceFile(SourceFile obj) {}
|
||||
|
@ -0,0 +1,146 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
package com.sun.org.apache.bcel.internal.classfile;
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import com.sun.org.apache.bcel.internal.Constants;
|
||||
import java.io.*;
|
||||
|
||||
// The new table is used when generic types are about...
|
||||
|
||||
//LocalVariableTable_attribute {
|
||||
// u2 attribute_name_index;
|
||||
// u4 attribute_length;
|
||||
// u2 local_variable_table_length;
|
||||
// { u2 start_pc;
|
||||
// u2 length;
|
||||
// u2 name_index;
|
||||
// u2 descriptor_index;
|
||||
// u2 index;
|
||||
// } local_variable_table[local_variable_table_length];
|
||||
// }
|
||||
|
||||
//LocalVariableTypeTable_attribute {
|
||||
// u2 attribute_name_index;
|
||||
// u4 attribute_length;
|
||||
// u2 local_variable_type_table_length;
|
||||
// {
|
||||
// u2 start_pc;
|
||||
// u2 length;
|
||||
// u2 name_index;
|
||||
// u2 signature_index;
|
||||
// u2 index;
|
||||
// } local_variable_type_table[local_variable_type_table_length];
|
||||
// }
|
||||
// J5TODO: Needs some testing !
|
||||
public class LocalVariableTypeTable extends Attribute {
|
||||
private static final long serialVersionUID = -1082157891095177114L;
|
||||
private int local_variable_type_table_length; // Table of local
|
||||
private LocalVariable[] local_variable_type_table; // variables
|
||||
|
||||
public LocalVariableTypeTable(LocalVariableTypeTable c) {
|
||||
this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(),
|
||||
c.getConstantPool());
|
||||
}
|
||||
|
||||
public LocalVariableTypeTable(int name_index, int length,
|
||||
LocalVariable[] local_variable_table,
|
||||
ConstantPool constant_pool)
|
||||
{
|
||||
super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool);
|
||||
setLocalVariableTable(local_variable_table);
|
||||
}
|
||||
|
||||
LocalVariableTypeTable(int nameIdx, int len, DataInputStream dis,ConstantPool cpool) throws IOException {
|
||||
this(nameIdx, len, (LocalVariable[])null, cpool);
|
||||
|
||||
local_variable_type_table_length = (dis.readUnsignedShort());
|
||||
local_variable_type_table = new LocalVariable[local_variable_type_table_length];
|
||||
|
||||
for(int i=0; i < local_variable_type_table_length; i++)
|
||||
local_variable_type_table[i] = new LocalVariable(dis, cpool);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(Visitor v) {
|
||||
v.visitLocalVariableTypeTable(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void dump(DataOutputStream file) throws IOException
|
||||
{
|
||||
super.dump(file);
|
||||
file.writeShort(local_variable_type_table_length);
|
||||
for(int i=0; i < local_variable_type_table_length; i++)
|
||||
local_variable_type_table[i].dump(file);
|
||||
}
|
||||
|
||||
public final LocalVariable[] getLocalVariableTypeTable() {
|
||||
return local_variable_type_table;
|
||||
}
|
||||
|
||||
public final LocalVariable getLocalVariable(int index) {
|
||||
for(int i=0; i < local_variable_type_table_length; i++)
|
||||
if(local_variable_type_table[i].getIndex() == index)
|
||||
return local_variable_type_table[i];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public final void setLocalVariableTable(LocalVariable[] local_variable_table)
|
||||
{
|
||||
this.local_variable_type_table = local_variable_table;
|
||||
local_variable_type_table_length = (local_variable_table == null)? 0 :
|
||||
local_variable_table.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return String representation.
|
||||
*/
|
||||
@Override
|
||||
public final String toString() {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
|
||||
for(int i=0; i < local_variable_type_table_length; i++) {
|
||||
buf.append(local_variable_type_table[i].toString());
|
||||
|
||||
if(i < local_variable_type_table_length - 1) buf.append('\n');
|
||||
}
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return deep copy of this attribute
|
||||
*/
|
||||
@Override
|
||||
public Attribute copy(ConstantPool constant_pool) {
|
||||
LocalVariableTypeTable c = (LocalVariableTypeTable)clone();
|
||||
|
||||
c.local_variable_type_table = new LocalVariable[local_variable_type_table_length];
|
||||
for(int i=0; i < local_variable_type_table_length; i++)
|
||||
c.local_variable_type_table[i] = local_variable_type_table[i].copy();
|
||||
|
||||
c.constant_pool = constant_pool;
|
||||
return c;
|
||||
}
|
||||
|
||||
public final int getTableLength() { return local_variable_type_table_length; }
|
||||
}
|
@ -94,6 +94,7 @@ public interface Visitor {
|
||||
public void visitLineNumberTable(LineNumberTable obj);
|
||||
public void visitLocalVariable(LocalVariable obj);
|
||||
public void visitLocalVariableTable(LocalVariableTable obj);
|
||||
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj);
|
||||
public void visitMethod(Method obj);
|
||||
public void visitSignature(Signature obj);
|
||||
public void visitSourceFile(SourceFile obj);
|
||||
|
@ -258,6 +258,23 @@ public class MethodGen extends FieldGenOrMethodGen {
|
||||
addLocalVariable(l.getName(), Type.getType(l.getSignature()),
|
||||
l.getIndex(), start, end);
|
||||
}
|
||||
} else if (a instanceof LocalVariableTypeTable) {
|
||||
LocalVariable[] lv = ((LocalVariableTypeTable) a).getLocalVariableTypeTable();
|
||||
removeLocalVariables();
|
||||
for (int k = 0; k < lv.length; k++) {
|
||||
LocalVariable l = lv[k];
|
||||
InstructionHandle start = il.findHandle(l.getStartPC());
|
||||
InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength());
|
||||
// Repair malformed handles
|
||||
if (null == start) {
|
||||
start = il.getStart();
|
||||
}
|
||||
if (null == end) {
|
||||
end = il.getEnd();
|
||||
}
|
||||
addLocalVariable(l.getName(), Type.getType(l.getSignature()), l
|
||||
.getIndex(), start, end);
|
||||
}
|
||||
} else
|
||||
addCodeAttribute(a);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user