You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LocalVariableTypeTable.java 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /* *******************************************************************
  2. * Copyright (c) 2004 IBM Corporation
  3. *
  4. * All rights reserved.
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Public License v1.0
  7. * which accompanies this distribution and is available at
  8. * http://www.eclipse.org/legal/epl-v10.html
  9. *
  10. * Contributors:
  11. * Andy Clement initial implementation
  12. * Heavily based on LocalVariableTable
  13. * ******************************************************************/
  14. package org.aspectj.apache.bcel.classfile;
  15. import org.aspectj.apache.bcel.Constants;
  16. import java.io.*;
  17. // The new table is used when generic types are about...
  18. //LocalVariableTable_attribute {
  19. // u2 attribute_name_index;
  20. // u4 attribute_length;
  21. // u2 local_variable_table_length;
  22. // { u2 start_pc;
  23. // u2 length;
  24. // u2 name_index;
  25. // u2 descriptor_index;
  26. // u2 index;
  27. // } local_variable_table[local_variable_table_length];
  28. // }
  29. //LocalVariableTypeTable_attribute {
  30. // u2 attribute_name_index;
  31. // u4 attribute_length;
  32. // u2 local_variable_type_table_length;
  33. // {
  34. // u2 start_pc;
  35. // u2 length;
  36. // u2 name_index;
  37. // u2 signature_index;
  38. // u2 index;
  39. // } local_variable_type_table[local_variable_type_table_length];
  40. // }
  41. // J5TODO: Needs some testing !
  42. public class LocalVariableTypeTable extends Attribute {
  43. private int local_variable_type_table_length; // Table of local
  44. private LocalVariable[] local_variable_type_table; // variables
  45. public LocalVariableTypeTable(LocalVariableTypeTable c) {
  46. this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(),
  47. c.getConstantPool());
  48. }
  49. public LocalVariableTypeTable(int name_index, int length,
  50. LocalVariable[] local_variable_table,
  51. ConstantPool constant_pool)
  52. {
  53. super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool);
  54. setLocalVariableTable(local_variable_table);
  55. }
  56. LocalVariableTypeTable(int nameIdx, int len, DataInputStream dis,ConstantPool cpool) throws IOException {
  57. this(nameIdx, len, (LocalVariable[])null, cpool);
  58. local_variable_type_table_length = (dis.readUnsignedShort());
  59. local_variable_type_table = new LocalVariable[local_variable_type_table_length];
  60. for(int i=0; i < local_variable_type_table_length; i++)
  61. local_variable_type_table[i] = new LocalVariable(dis, cpool);
  62. }
  63. public void accept(Visitor v) {
  64. v.visitLocalVariableTypeTable(this);
  65. }
  66. public final void dump(DataOutputStream file) throws IOException
  67. {
  68. super.dump(file);
  69. file.writeShort(local_variable_type_table_length);
  70. for(int i=0; i < local_variable_type_table_length; i++)
  71. local_variable_type_table[i].dump(file);
  72. }
  73. public final LocalVariable[] getLocalVariableTypeTable() {
  74. return local_variable_type_table;
  75. }
  76. public final LocalVariable getLocalVariable(int index) {
  77. for(int i=0; i < local_variable_type_table_length; i++)
  78. if(local_variable_type_table[i].getIndex() == index)
  79. return local_variable_type_table[i];
  80. return null;
  81. }
  82. public final void setLocalVariableTable(LocalVariable[] local_variable_table)
  83. {
  84. this.local_variable_type_table = local_variable_table;
  85. local_variable_type_table_length = (local_variable_table == null)? 0 :
  86. local_variable_table.length;
  87. }
  88. /**
  89. * @return String representation.
  90. */
  91. public final String toString() {
  92. StringBuffer buf = new StringBuffer("");
  93. for(int i=0; i < local_variable_type_table_length; i++) {
  94. buf.append(local_variable_type_table[i].toString());
  95. if(i < local_variable_type_table_length - 1) buf.append('\n');
  96. }
  97. return buf.toString();
  98. }
  99. /**
  100. * @return deep copy of this attribute
  101. */
  102. public Attribute copy(ConstantPool constant_pool) {
  103. LocalVariableTypeTable c = (LocalVariableTypeTable)clone();
  104. c.local_variable_type_table = new LocalVariable[local_variable_type_table_length];
  105. for(int i=0; i < local_variable_type_table_length; i++)
  106. c.local_variable_type_table[i] = local_variable_type_table[i].copy();
  107. c.constant_pool = constant_pool;
  108. return c;
  109. }
  110. public final int getTableLength() { return local_variable_type_table_length; }
  111. }