Mercurial > hg > truffle
comparison src/share/vm/ci/ciObject.cpp @ 989:148e5441d916
6863023: need non-perm oops in code cache for JSR 292
Summary: Make a special root-list for those few nmethods which might contain non-perm oops.
Reviewed-by: twisti, kvn, never, jmasa, ysr
author | jrose |
---|---|
date | Tue, 15 Sep 2009 21:53:47 -0700 |
parents | a61af66fc99e |
children | 3483ec571caf c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
987:00977607da34 | 989:148e5441d916 |
---|---|
53 } else { | 53 } else { |
54 _handle = JNIHandles::make_global(o); | 54 _handle = JNIHandles::make_global(o); |
55 } | 55 } |
56 _klass = NULL; | 56 _klass = NULL; |
57 _ident = 0; | 57 _ident = 0; |
58 init_flags_from(o); | |
58 } | 59 } |
59 | 60 |
60 // ------------------------------------------------------------------ | 61 // ------------------------------------------------------------------ |
61 // ciObject::ciObject | 62 // ciObject::ciObject |
62 // | 63 // |
67 } else { | 68 } else { |
68 _handle = JNIHandles::make_global(h); | 69 _handle = JNIHandles::make_global(h); |
69 } | 70 } |
70 _klass = NULL; | 71 _klass = NULL; |
71 _ident = 0; | 72 _ident = 0; |
73 init_flags_from(h()); | |
72 } | 74 } |
73 | 75 |
74 // ------------------------------------------------------------------ | 76 // ------------------------------------------------------------------ |
75 // ciObject::ciObject | 77 // ciObject::ciObject |
76 // | 78 // |
156 int ciObject::hash() { | 158 int ciObject::hash() { |
157 return ident() * 31; | 159 return ident() * 31; |
158 } | 160 } |
159 | 161 |
160 // ------------------------------------------------------------------ | 162 // ------------------------------------------------------------------ |
161 // ciObject::encoding | 163 // ciObject::constant_encoding |
162 // | 164 // |
163 // The address which the compiler should embed into the | 165 // The address which the compiler should embed into the |
164 // generated code to represent this oop. This address | 166 // generated code to represent this oop. This address |
165 // is not the true address of the oop -- it will get patched | 167 // is not the true address of the oop -- it will get patched |
166 // during nmethod creation. | 168 // during nmethod creation. |
170 // Implementation note: we use the handle as the encoding. The | 172 // Implementation note: we use the handle as the encoding. The |
171 // nmethod constructor resolves the handle and patches in the oop. | 173 // nmethod constructor resolves the handle and patches in the oop. |
172 // | 174 // |
173 // This method should be changed to return an generified address | 175 // This method should be changed to return an generified address |
174 // to discourage use of the JNI handle. | 176 // to discourage use of the JNI handle. |
175 jobject ciObject::encoding() { | 177 jobject ciObject::constant_encoding() { |
176 assert(is_null_object() || handle() != NULL, "cannot embed null pointer"); | 178 assert(is_null_object() || handle() != NULL, "cannot embed null pointer"); |
177 assert(has_encoding(), "oop must be NULL or perm"); | 179 assert(can_be_constant(), "oop must be NULL or perm"); |
178 return handle(); | 180 return handle(); |
179 } | 181 } |
180 | 182 |
181 // ------------------------------------------------------------------ | 183 // ------------------------------------------------------------------ |
182 // ciObject::has_encoding | 184 // ciObject::can_be_constant |
183 bool ciObject::has_encoding() { | 185 bool ciObject::can_be_constant() { |
184 return handle() == NULL || is_perm(); | 186 if (ScavengeRootsInCode >= 1) return true; // now everybody can encode as a constant |
187 return handle() == NULL || !is_scavengable(); | |
188 } | |
189 | |
190 // ------------------------------------------------------------------ | |
191 // ciObject::should_be_constant() | |
192 bool ciObject::should_be_constant() { | |
193 if (ScavengeRootsInCode >= 2) return true; // force everybody to be a constant | |
194 return handle() == NULL || !is_scavengable(); | |
185 } | 195 } |
186 | 196 |
187 | 197 |
188 // ------------------------------------------------------------------ | 198 // ------------------------------------------------------------------ |
189 // ciObject::print | 199 // ciObject::print |
193 // Implementation note: dispatch to the virtual print_impl behavior | 203 // Implementation note: dispatch to the virtual print_impl behavior |
194 // for this ciObject. | 204 // for this ciObject. |
195 void ciObject::print(outputStream* st) { | 205 void ciObject::print(outputStream* st) { |
196 st->print("<%s", type_string()); | 206 st->print("<%s", type_string()); |
197 GUARDED_VM_ENTRY(print_impl(st);) | 207 GUARDED_VM_ENTRY(print_impl(st);) |
198 st->print(" ident=%d %s address=0x%x>", ident(), | 208 st->print(" ident=%d %s%s address=0x%x>", ident(), |
199 is_perm() ? "PERM" : "", | 209 is_perm() ? "PERM" : "", |
210 is_scavengable() ? "SCAVENGABLE" : "", | |
200 (address)this); | 211 (address)this); |
201 } | 212 } |
202 | 213 |
203 // ------------------------------------------------------------------ | 214 // ------------------------------------------------------------------ |
204 // ciObject::print_oop | 215 // ciObject::print_oop |