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.12 $
58 */
59 public class Variable {
60
61 public static Variable THIS_VARIABLE = new Variable();
62 public static Variable SUPER_VARIABLE = new Variable();
63
64 private int index;
65 private ClassNode type;
66 private String name;
67 private boolean holder;
68 private boolean property;
69
70
71
72 private Label startLabel = null;
73 private Label endLabel = null;
74 private boolean dynamicTyped;
75
76 private Variable(){
77 dynamicTyped = true;
78 index=0;
79 holder=false;
80 property=false;
81 }
82
83 public Variable(int index, ClassNode type, String name) {
84 this.index = index;
85 this.type = type;
86 this.name = name;
87 }
88
89 public String getName() {
90 return name;
91 }
92
93 public ClassNode getType() {
94 return type;
95 }
96
97 public String getTypeName() {
98 return type.getName();
99 }
100
101 /***
102 * @return the stack index for this variable
103 */
104 public int getIndex() {
105 return index;
106 }
107
108 /***
109 * @return is this local variable shared in other scopes (and so must use a ValueHolder)
110 */
111 public boolean isHolder() {
112 return holder;
113 }
114
115 public void setHolder(boolean holder) {
116 this.holder = holder;
117 }
118
119 public boolean isProperty() {
120 return property;
121 }
122
123 public void setProperty(boolean property) {
124 this.property = property;
125 }
126
127 public Label getStartLabel() {
128 return startLabel;
129 }
130
131 public void setStartLabel(Label startLabel) {
132 this.startLabel = startLabel;
133 }
134
135 public Label getEndLabel() {
136 return endLabel;
137 }
138
139 public void setEndLabel(Label endLabel) {
140 this.endLabel = endLabel;
141 }
142
143 public String toString() {
144
145 return super.toString() + "[" + type + " " + name + " (" + index + ")";
146 }
147
148 public void setType(ClassNode type) {
149 this.type = type;
150 dynamicTyped |= type==ClassHelper.DYNAMIC_TYPE;
151 }
152
153 public void setDynamicTyped(boolean b) {
154 dynamicTyped = b;
155 }
156
157 public boolean isDynamicTyped() {
158 return dynamicTyped;
159 }
160 }