1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package org.codehaus.groovy.classgen;
47
48 import org.codehaus.groovy.ast.Type;
49 import org.objectweb.asm.Label;
50
51
52 /***
53 * Represents compile time variable metadata while compiling a method.
54 *
55 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
56 * @version $Revision: 1.7 $
57 */
58 public class Variable {
59
60 private int index;
61 private Type type;
62 private String name;
63 private boolean holder;
64 private boolean property;
65
66
67
68 private Label startLabel = null;
69 private Label endLabel = null;
70
71 public Variable(int index, Type type, String name) {
72 this.index = index;
73 this.type = type;
74 this.name = name;
75 }
76
77 public String getName() {
78 return name;
79 }
80
81 public Type getType() {
82 return type;
83 }
84
85 public String getTypeName() {
86 return type.getName();
87 }
88
89 /***
90 * @return the stack index for this variable
91 */
92 public int getIndex() {
93 return index;
94 }
95
96 /***
97 * @return is this local variable shared in other scopes (and so must use a ValueHolder)
98 */
99 public boolean isHolder() {
100 return holder;
101 }
102
103 public void setHolder(boolean holder) {
104 this.holder = holder;
105 }
106
107 public boolean isProperty() {
108 return property;
109 }
110
111 public void setProperty(boolean property) {
112 this.property = property;
113 }
114
115 public Label getStartLabel() {
116 return startLabel;
117 }
118
119 public void setStartLabel(Label startLabel) {
120 this.startLabel = startLabel;
121 }
122
123 public Label getEndLabel() {
124 return endLabel;
125 }
126
127 public void setEndLabel(Label endLabel) {
128 this.endLabel = endLabel;
129 }
130
131 public String toString() {
132
133 return super.toString() + "[" + type + " " + name + " (" + index + ")";
134 }
135
136 /***
137 * derive a new Variable from this if this is a primitive variable, or return this instance
138 * @return
139 */
140 public Variable deriveBoxedVersion() {
141 if (BytecodeHelper.isPrimitiveType(this.getTypeName())) {
142 Type t = new Type(BytecodeHelper.getObjectTypeForPrimitive(getTypeName()));
143 return new Variable(index, t, name);
144 } else {
145 return this;
146 }
147 }
148
149 public void setType(Type type) {
150 this.type = type;
151 }
152
153 public void setDynamic(boolean b) {
154 type.setDynamic(b);
155 }
156 }