Mercurial > hg > truffle
comparison graal/GraalCompiler/src/com/sun/c1x/ir/AccessField.java @ 2540:3fc322165071
More flags clean up.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 27 Apr 2011 20:27:43 +0200 |
parents | fa3bda50cbfd |
children | 0f9eeb15e636 |
comparison
equal
deleted
inserted
replaced
2539:fa3bda50cbfd | 2540:3fc322165071 |
---|---|
22 */ | 22 */ |
23 package com.sun.c1x.ir; | 23 package com.sun.c1x.ir; |
24 | 24 |
25 import java.lang.reflect.*; | 25 import java.lang.reflect.*; |
26 | 26 |
27 import com.sun.c1x.*; | |
28 import com.sun.c1x.value.*; | 27 import com.sun.c1x.value.*; |
29 import com.sun.cri.ci.*; | 28 import com.sun.cri.ci.*; |
30 import com.sun.cri.ri.*; | 29 import com.sun.cri.ri.*; |
31 | 30 |
32 /** | 31 /** |
34 */ | 33 */ |
35 public abstract class AccessField extends StateSplit { | 34 public abstract class AccessField extends StateSplit { |
36 | 35 |
37 private Value object; | 36 private Value object; |
38 protected final RiField field; | 37 protected final RiField field; |
39 private boolean needsPatching; | |
40 | 38 |
41 /** | 39 /** |
42 * Constructs a new access field object. | 40 * Constructs a new access field object. |
43 * @param kind the result kind of the access | 41 * @param kind the result kind of the access |
44 * @param object the instruction producing the receiver object | 42 * @param object the instruction producing the receiver object |
45 * @param field the compiler interface representation of the field | 43 * @param field the compiler interface representation of the field |
46 * @param isStatic indicates if the field is static | 44 * @param isStatic indicates if the field is static |
47 * @param stateBefore the state before the field access | 45 * @param stateBefore the state before the field access |
48 * @param isLoaded indicates if the class is loaded | 46 * @param isLoaded indicates if the class is loaded |
49 */ | 47 */ |
50 public AccessField(CiKind kind, Value object, RiField field, FrameState stateBefore, boolean isLoaded) { | 48 public AccessField(CiKind kind, Value object, RiField field, FrameState stateBefore) { |
51 super(kind, stateBefore); | 49 super(kind, stateBefore); |
52 this.object = object; | 50 this.object = object; |
53 this.field = field; | 51 this.field = field; |
54 if (!isLoaded || (C1XOptions.TestPatching && !Modifier.isVolatile(field.accessFlags()))) { | 52 if (field.isResolved() && object.isNonNull()) { |
55 // require patching if the field is not loaded (i.e. resolved), | |
56 // or if patch testing is turned on (but not if the field is volatile) | |
57 needsPatching = true; | |
58 } | |
59 initFlag(Flag.IsLoaded, isLoaded); | |
60 if (isLoaded && object.isNonNull()) { | |
61 eliminateNullCheck(); | 53 eliminateNullCheck(); |
62 } | 54 } |
63 assert object != null : "every field access must reference some object"; | 55 assert object != null : "every field access must reference some object"; |
64 } | 56 } |
65 | 57 |
91 /** | 83 /** |
92 * Checks whether the class of the field of this access is loaded. | 84 * Checks whether the class of the field of this access is loaded. |
93 * @return {@code true} if the class is loaded | 85 * @return {@code true} if the class is loaded |
94 */ | 86 */ |
95 public boolean isLoaded() { | 87 public boolean isLoaded() { |
96 return checkFlag(Flag.IsLoaded); | 88 return field.isResolved(); |
97 } | 89 } |
98 | 90 |
99 /** | 91 /** |
100 * Checks whether this field is declared volatile. | 92 * Checks whether this field is declared volatile. |
101 * @return {@code true} if the field is resolved and declared volatile | 93 * @return {@code true} if the field is resolved and declared volatile |
110 clearState(); | 102 clearState(); |
111 } | 103 } |
112 } | 104 } |
113 | 105 |
114 /** | 106 /** |
115 * Checks whether this field access will require patching. | |
116 * @return {@code true} if this field access will require patching | |
117 */ | |
118 public boolean needsPatching() { | |
119 return needsPatching; | |
120 } | |
121 | |
122 /** | |
123 * Checks whether this field access may cause a trap or an exception, which | 107 * Checks whether this field access may cause a trap or an exception, which |
124 * is if it either requires a null check or needs patching. | 108 * is if it either requires a null check or needs patching. |
125 * @return {@code true} if this field access can cause a trap | 109 * @return {@code true} if this field access can cause a trap |
126 */ | 110 */ |
127 @Override | 111 @Override |
128 public boolean canTrap() { | 112 public boolean canTrap() { |
129 return needsPatching() || needsNullCheck(); | 113 return !isLoaded() || needsNullCheck(); |
130 } | 114 } |
131 | 115 |
132 @Override | 116 @Override |
133 public void inputValuesDo(ValueClosure closure) { | 117 public void inputValuesDo(ValueClosure closure) { |
134 object = closure.apply(object); | 118 object = closure.apply(object); |