Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/constantPoolKlass.cpp @ 431:a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
Summary: low-level privileged sun.misc.Unsafe.defineAnonymousClass
Reviewed-by: kvn
author | jrose |
---|---|
date | Wed, 12 Nov 2008 22:33:26 -0800 |
parents | d1605aabd0a1 |
children | 0af8b0718fc9 |
comparison
equal
deleted
inserted
replaced
430:4d20a3aaf1ab | 431:a45484ea312d |
---|---|
33 | 33 |
34 c->set_length(length); | 34 c->set_length(length); |
35 c->set_tags(NULL); | 35 c->set_tags(NULL); |
36 c->set_cache(NULL); | 36 c->set_cache(NULL); |
37 c->set_pool_holder(NULL); | 37 c->set_pool_holder(NULL); |
38 c->set_flags(0); | |
38 // only set to non-zero if constant pool is merged by RedefineClasses | 39 // only set to non-zero if constant pool is merged by RedefineClasses |
39 c->set_orig_length(0); | 40 c->set_orig_length(0); |
40 // all fields are initialized; needed for GC | 41 // all fields are initialized; needed for GC |
41 | 42 |
42 // initialize tag array | 43 // initialize tag array |
259 return cp->object_size(); | 260 return cp->object_size(); |
260 } | 261 } |
261 | 262 |
262 void constantPoolKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) { | 263 void constantPoolKlass::oop_copy_contents(PSPromotionManager* pm, oop obj) { |
263 assert(obj->is_constantPool(), "should be constant pool"); | 264 assert(obj->is_constantPool(), "should be constant pool"); |
265 constantPoolOop cp = (constantPoolOop) obj; | |
266 if (AnonymousClasses && cp->has_pseudo_string() && cp->tags() != NULL) { | |
267 oop* base = (oop*)cp->base(); | |
268 for (int i = 0; i < cp->length(); ++i, ++base) { | |
269 if (cp->tag_at(i).is_string()) { | |
270 if (PSScavenge::should_scavenge(base)) { | |
271 pm->claim_or_forward_breadth(base); | |
272 } | |
273 } | |
274 } | |
275 } | |
264 } | 276 } |
265 | 277 |
266 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { | 278 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { |
267 assert(obj->is_constantPool(), "should be constant pool"); | 279 assert(obj->is_constantPool(), "should be constant pool"); |
280 constantPoolOop cp = (constantPoolOop) obj; | |
281 if (AnonymousClasses && cp->has_pseudo_string() && cp->tags() != NULL) { | |
282 oop* base = (oop*)cp->base(); | |
283 for (int i = 0; i < cp->length(); ++i, ++base) { | |
284 if (cp->tag_at(i).is_string()) { | |
285 if (PSScavenge::should_scavenge(base)) { | |
286 pm->claim_or_forward_depth(base); | |
287 } | |
288 } | |
289 } | |
290 } | |
268 } | 291 } |
269 #endif // SERIALGC | 292 #endif // SERIALGC |
270 | 293 |
271 #ifndef PRODUCT | 294 #ifndef PRODUCT |
272 | 295 |
276 EXCEPTION_MARK; | 299 EXCEPTION_MARK; |
277 oop anObj; | 300 oop anObj; |
278 assert(obj->is_constantPool(), "must be constantPool"); | 301 assert(obj->is_constantPool(), "must be constantPool"); |
279 Klass::oop_print_on(obj, st); | 302 Klass::oop_print_on(obj, st); |
280 constantPoolOop cp = constantPoolOop(obj); | 303 constantPoolOop cp = constantPoolOop(obj); |
304 if (cp->flags() != 0) { | |
305 st->print(" - flags : 0x%x", cp->flags()); | |
306 if (cp->has_pseudo_string()) st->print(" has_pseudo_string"); | |
307 st->cr(); | |
308 } | |
281 | 309 |
282 // Temp. remove cache so we can do lookups with original indicies. | 310 // Temp. remove cache so we can do lookups with original indicies. |
283 constantPoolCacheHandle cache (THREAD, cp->cache()); | 311 constantPoolCacheHandle cache (THREAD, cp->cache()); |
284 cp->set_cache(NULL); | 312 cp->set_cache(NULL); |
285 | 313 |
300 st->print("klass_index=%d", cp->klass_ref_index_at(index)); | 328 st->print("klass_index=%d", cp->klass_ref_index_at(index)); |
301 st->print(" name_and_type_index=%d", cp->name_and_type_ref_index_at(index)); | 329 st->print(" name_and_type_index=%d", cp->name_and_type_ref_index_at(index)); |
302 break; | 330 break; |
303 case JVM_CONSTANT_UnresolvedString : | 331 case JVM_CONSTANT_UnresolvedString : |
304 case JVM_CONSTANT_String : | 332 case JVM_CONSTANT_String : |
305 anObj = cp->string_at(index, CATCH); | 333 if (cp->is_pseudo_string_at(index)) { |
334 anObj = cp->pseudo_string_at(index); | |
335 } else { | |
336 anObj = cp->string_at(index, CATCH); | |
337 } | |
306 anObj->print_value_on(st); | 338 anObj->print_value_on(st); |
307 st->print(" {0x%lx}", (address)anObj); | 339 st->print(" {0x%lx}", (address)anObj); |
308 break; | 340 break; |
309 case JVM_CONSTANT_Integer : | 341 case JVM_CONSTANT_Integer : |
310 st->print("%d", cp->int_at(index)); | 342 st->print("%d", cp->int_at(index)); |
380 guarantee((*base)->is_perm(), "should be in permspace"); | 412 guarantee((*base)->is_perm(), "should be in permspace"); |
381 guarantee((*base)->is_symbol() || (*base)->is_instance(), | 413 guarantee((*base)->is_symbol() || (*base)->is_instance(), |
382 "should be symbol or instance"); | 414 "should be symbol or instance"); |
383 } | 415 } |
384 if (cp->tag_at(i).is_string()) { | 416 if (cp->tag_at(i).is_string()) { |
385 guarantee((*base)->is_perm(), "should be in permspace"); | 417 if (!cp->has_pseudo_string()) { |
386 guarantee((*base)->is_instance(), "should be instance"); | 418 guarantee((*base)->is_perm(), "should be in permspace"); |
419 guarantee((*base)->is_instance(), "should be instance"); | |
420 } else { | |
421 // can be non-perm, can be non-instance (array) | |
422 } | |
387 } | 423 } |
388 base++; | 424 base++; |
389 } | 425 } |
390 guarantee(cp->tags()->is_perm(), "should be in permspace"); | 426 guarantee(cp->tags()->is_perm(), "should be in permspace"); |
391 guarantee(cp->tags()->is_typeArray(), "should be type array"); | 427 guarantee(cp->tags()->is_typeArray(), "should be type array"); |