1+ package net .cvs0 .classfile ;
2+
3+ import java .io .ByteArrayOutputStream ;
4+ import java .io .DataOutputStream ;
5+ import java .io .IOException ;
6+ import java .util .List ;
7+ import java .util .ArrayList ;
8+
9+ public class LocalVariableTypeTableAttribute extends Attribute
10+ {
11+ private List <LocalVariableTypeInfo > localVariableTypes ;
12+
13+ public LocalVariableTypeTableAttribute ()
14+ {
15+ super ("LocalVariableTypeTable" );
16+ this .localVariableTypes = new ArrayList <>();
17+ }
18+
19+ public List <LocalVariableTypeInfo > getLocalVariableTypes ()
20+ {
21+ return localVariableTypes ;
22+ }
23+
24+ public void addLocalVariableType (LocalVariableTypeInfo localVariableType )
25+ {
26+ this .localVariableTypes .add (localVariableType );
27+ }
28+
29+ public void addLocalVariableType (int startPc , int length , String name , String signature , int index )
30+ {
31+ this .localVariableTypes .add (new LocalVariableTypeInfo (startPc , length , name , signature , index ));
32+ }
33+
34+ @ Override
35+ public byte [] getData ()
36+ {
37+ try
38+ {
39+ ByteArrayOutputStream baos = new ByteArrayOutputStream ();
40+ DataOutputStream dos = new DataOutputStream (baos );
41+
42+ dos .writeShort (localVariableTypes .size ());
43+
44+ for (LocalVariableTypeInfo localVariableType : localVariableTypes )
45+ {
46+ dos .writeShort (localVariableType .getStartPc ());
47+ dos .writeShort (localVariableType .getLength ());
48+ dos .writeShort (localVariableType .getNameIndex ());
49+ dos .writeShort (localVariableType .getSignatureIndex ());
50+ dos .writeShort (localVariableType .getIndex ());
51+ }
52+
53+ dos .close ();
54+ return baos .toByteArray ();
55+ }
56+ catch (IOException e )
57+ {
58+ throw new RuntimeException ("Failed to serialize LocalVariableTypeTable attribute" , e );
59+ }
60+ }
61+
62+ @ Override
63+ public int getLength ()
64+ {
65+ return 2 + (localVariableTypes .size () * 10 );
66+ }
67+
68+ public static class LocalVariableTypeInfo
69+ {
70+ private int startPc ;
71+ private int length ;
72+ private String name ;
73+ private String signature ;
74+ private int index ;
75+ private int nameIndex ;
76+ private int signatureIndex ;
77+
78+ public LocalVariableTypeInfo (int startPc , int length , String name , String signature , int index )
79+ {
80+ this .startPc = startPc ;
81+ this .length = length ;
82+ this .name = name ;
83+ this .signature = signature ;
84+ this .index = index ;
85+ }
86+
87+ public LocalVariableTypeInfo (int startPc , int length , int nameIndex , int signatureIndex , int index )
88+ {
89+ this .startPc = startPc ;
90+ this .length = length ;
91+ this .nameIndex = nameIndex ;
92+ this .signatureIndex = signatureIndex ;
93+ this .index = index ;
94+ }
95+
96+ public int getStartPc () { return startPc ; }
97+ public void setStartPc (int startPc ) { this .startPc = startPc ; }
98+ public int getLength () { return length ; }
99+ public void setLength (int length ) { this .length = length ; }
100+ public String getName () { return name ; }
101+ public void setName (String name ) { this .name = name ; }
102+ public String getSignature () { return signature ; }
103+ public void setSignature (String signature ) { this .signature = signature ; }
104+ public int getIndex () { return index ; }
105+ public void setIndex (int index ) { this .index = index ; }
106+ public int getNameIndex () { return nameIndex ; }
107+ public void setNameIndex (int nameIndex ) { this .nameIndex = nameIndex ; }
108+ public int getSignatureIndex () { return signatureIndex ; }
109+ public void setSignatureIndex (int signatureIndex ) { this .signatureIndex = signatureIndex ; }
110+
111+ @ Override
112+ public String toString ()
113+ {
114+ return "LocalVariableTypeInfo{startPc=" + startPc + ", length=" + length + ", name='" + name + "', signature='" + signature + "', index=" + index + "}" ;
115+ }
116+ }
117+
118+ @ Override
119+ public String toString ()
120+ {
121+ return "LocalVariableTypeTableAttribute{localVariableTypes=" + localVariableTypes .size () + "}" ;
122+ }
123+ }
0 commit comments