comparison src/share/vm/opto/parse3.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 bd02caa94611
children f96a1a986f7b
comparison
equal deleted inserted replaced
987:00977607da34 989:148e5441d916
265 set_wrote_final(true); 265 set_wrote_final(true);
266 } 266 }
267 } 267 }
268 268
269 269
270 bool Parse::push_constant(ciConstant constant) { 270 bool Parse::push_constant(ciConstant constant, bool require_constant) {
271 switch (constant.basic_type()) { 271 switch (constant.basic_type()) {
272 case T_BOOLEAN: push( intcon(constant.as_boolean()) ); break; 272 case T_BOOLEAN: push( intcon(constant.as_boolean()) ); break;
273 case T_INT: push( intcon(constant.as_int()) ); break; 273 case T_INT: push( intcon(constant.as_int()) ); break;
274 case T_CHAR: push( intcon(constant.as_char()) ); break; 274 case T_CHAR: push( intcon(constant.as_char()) ); break;
275 case T_BYTE: push( intcon(constant.as_byte()) ); break; 275 case T_BYTE: push( intcon(constant.as_byte()) ); break;
277 case T_FLOAT: push( makecon(TypeF::make(constant.as_float())) ); break; 277 case T_FLOAT: push( makecon(TypeF::make(constant.as_float())) ); break;
278 case T_DOUBLE: push_pair( makecon(TypeD::make(constant.as_double())) ); break; 278 case T_DOUBLE: push_pair( makecon(TypeD::make(constant.as_double())) ); break;
279 case T_LONG: push_pair( longcon(constant.as_long()) ); break; 279 case T_LONG: push_pair( longcon(constant.as_long()) ); break;
280 case T_ARRAY: 280 case T_ARRAY:
281 case T_OBJECT: { 281 case T_OBJECT: {
282 // the oop is in perm space if the ciObject "has_encoding" 282 // cases:
283 // can_be_constant = (oop not scavengable || ScavengeRootsInCode != 0)
284 // should_be_constant = (oop not scavengable || ScavengeRootsInCode >= 2)
285 // An oop is not scavengable if it is in the perm gen.
283 ciObject* oop_constant = constant.as_object(); 286 ciObject* oop_constant = constant.as_object();
284 if (oop_constant->is_null_object()) { 287 if (oop_constant->is_null_object()) {
285 push( zerocon(T_OBJECT) ); 288 push( zerocon(T_OBJECT) );
286 break; 289 break;
287 } else if (oop_constant->has_encoding()) { 290 } else if (require_constant || oop_constant->should_be_constant()) {
288 push( makecon(TypeOopPtr::make_from_constant(oop_constant)) ); 291 push( makecon(TypeOopPtr::make_from_constant(oop_constant, require_constant)) );
289 break; 292 break;
290 } else { 293 } else {
291 // we cannot inline the oop, but we can use it later to narrow a type 294 // we cannot inline the oop, but we can use it later to narrow a type
292 return false; 295 return false;
293 } 296 }