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.ClassHelper;
49 import org.codehaus.groovy.ast.ClassNode;
50 import org.objectweb.asm.Label;
51
52
53 /***
54 * Represents compile time variable metadata while compiling a method.
55 *
56 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
57 * @version $Revision: 1.9 $
58 */
59 public class Variable {
60
61 private int index;
62 private ClassNode type;
63 private String name;
64 private boolean holder;
65 private boolean property;
66
67
68
69 private Label startLabel = null;
70 private Label endLabel = null;
71 private boolean dynamicTyped;
72
73 public Variable(int index, ClassNode type, String name) {
74 this.index = index;
75 this.type = type;
76 this.name = name;
77 }
78
79 public String getName() {
80 return name;
81 }
82
83 public ClassNode getType() {
84 return type;
85 }
86
87 public String getTypeName() {
88 return type.getName();
89 }
90
91 /***
92 * @return the stack index for this variable
93 */
94 public int getIndex() {
95 return index;
96 }
97
98 /***
99 * @return is this local variable shared in other scopes (and so must use a ValueHolder)
100 */
101 public boolean isHolder() {
102 return holder;
103 }
104
105 public void setHolder(boolean holder) {
106 this.holder = holder;
107 }
108
109 public boolean isProperty() {
110 return property;
111 }
112
113 public void setProperty(boolean property) {
114 this.property = property;
115 }
116
117 public Label getStartLabel() {
118 return startLabel;
119 }
120
121 public void setStartLabel(Label startLabel) {
122 this.startLabel = startLabel;
123 }
124
125 public Label getEndLabel() {
126 return endLabel;
127 }
128
129 public void setEndLabel(Label endLabel) {
130 this.endLabel = endLabel;
131 }
132
133 public String toString() {
134
135 return super.toString() + "[" + type + " " + name + " (" + index + ")";
136 }
137
138 /***
139 * derive a new Variable from this if this is a primitive variable, or return this instance
140 * @return
141 */
142 public Variable deriveBoxedVersion() {
143 if (ClassHelper.isPrimitiveType(getType())) {
144 ClassNode t = ClassHelper.getWrapper(getType());
145 return new Variable(index, t, name);
146 } else {
147 return this;
148 }
149 }
150
151 public void setType(ClassNode type) {
152 this.type = type;
153 dynamicTyped |= type==ClassHelper.DYNAMIC_TYPE;
154 }
155
156 public void setDynamicTyped(boolean b) {
157 dynamicTyped = b;
158 }
159
160 public boolean isDynamicTyped() {
161 return dynamicTyped;
162 }
163 }