comparison src/share/vm/oops/cpCacheKlass.cpp @ 726:be93aad57795

6655646: dynamic languages need dynamically linked call sites Summary: invokedynamic instruction (JSR 292 RI) Reviewed-by: twisti, never
author jrose
date Tue, 21 Apr 2009 23:21:04 -0700
parents 0fbdb4381b99
children 4e6abf09f540
comparison
equal deleted inserted replaced
725:928912ce8438 726:be93aad57795
167 167
168 #ifndef SERIALGC 168 #ifndef SERIALGC
169 void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm, 169 void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm,
170 oop obj) { 170 oop obj) {
171 assert(obj->is_constantPoolCache(), "should be constant pool"); 171 assert(obj->is_constantPoolCache(), "should be constant pool");
172 if (EnableInvokeDynamic) {
173 constantPoolCacheOop cache = (constantPoolCacheOop)obj;
174 // during a scavenge, it is safe to inspect my pool, since it is perm
175 constantPoolOop pool = cache->constant_pool();
176 assert(pool->is_constantPool(), "should be constant pool");
177 if (pool->has_invokedynamic()) {
178 for (int i = 0; i < cache->length(); i++) {
179 ConstantPoolCacheEntry* e = cache->entry_at(i);
180 oop* p = (oop*)&e->_f1;
181 if (e->is_secondary_entry()) {
182 if (PSScavenge::should_scavenge(p))
183 pm->claim_or_forward_breadth(p);
184 assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
185 "no live oops here");
186 }
187 }
188 }
189 }
172 } 190 }
173 191
174 void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm, 192 void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
175 oop obj) { 193 oop obj) {
176 assert(obj->is_constantPoolCache(), "should be constant pool"); 194 assert(obj->is_constantPoolCache(), "should be constant pool");
195 if (EnableInvokeDynamic) {
196 constantPoolCacheOop cache = (constantPoolCacheOop)obj;
197 // during a scavenge, it is safe to inspect my pool, since it is perm
198 constantPoolOop pool = cache->constant_pool();
199 assert(pool->is_constantPool(), "should be constant pool");
200 if (pool->has_invokedynamic()) {
201 for (int i = 0; i < cache->length(); i++) {
202 ConstantPoolCacheEntry* e = cache->entry_at(i);
203 oop* p = (oop*)&e->_f1;
204 if (e->is_secondary_entry()) {
205 if (PSScavenge::should_scavenge(p))
206 pm->claim_or_forward_depth(p);
207 assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
208 "no live oops here");
209 }
210 }
211 }
212 }
177 } 213 }
178 214
179 int 215 int
180 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { 216 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
181 assert(obj->is_constantPoolCache(), "obj must be constant pool cache"); 217 assert(obj->is_constantPoolCache(), "obj must be constant pool cache");