28 #include "ci/ciInstanceKlass.hpp" |
28 #include "ci/ciInstanceKlass.hpp" |
29 #include "ci/ciMemberName.hpp" |
29 #include "ci/ciMemberName.hpp" |
30 #include "ci/ciMethod.hpp" |
30 #include "ci/ciMethod.hpp" |
31 #include "ci/ciMethodData.hpp" |
31 #include "ci/ciMethodData.hpp" |
32 #include "ci/ciMethodHandle.hpp" |
32 #include "ci/ciMethodHandle.hpp" |
|
33 #include "ci/ciMethodType.hpp" |
33 #include "ci/ciNullObject.hpp" |
34 #include "ci/ciNullObject.hpp" |
34 #include "ci/ciObjArray.hpp" |
35 #include "ci/ciObjArray.hpp" |
35 #include "ci/ciObjArrayKlass.hpp" |
36 #include "ci/ciObjArrayKlass.hpp" |
36 #include "ci/ciObject.hpp" |
37 #include "ci/ciObject.hpp" |
37 #include "ci/ciObjectFactory.hpp" |
38 #include "ci/ciObjectFactory.hpp" |
235 ciObject* ciObjectFactory::get(oop key) { |
236 ciObject* ciObjectFactory::get(oop key) { |
236 ASSERT_IN_VM; |
237 ASSERT_IN_VM; |
237 |
238 |
238 assert(key == NULL || Universe::heap()->is_in_reserved(key), "must be"); |
239 assert(key == NULL || Universe::heap()->is_in_reserved(key), "must be"); |
239 |
240 |
240 NonPermObject* &bucket = find_non_perm(key); |
241 NonPermObject* &bucket = find_non_perm(key); |
241 if (bucket != NULL) { |
242 if (bucket != NULL) { |
242 return bucket->object(); |
243 return bucket->object(); |
243 } |
244 } |
244 |
245 |
245 // The ciObject does not yet exist. Create it and insert it |
246 // The ciObject does not yet exist. Create it and insert it |
246 // into the cache. |
247 // into the cache. |
247 Handle keyHandle(key); |
248 Handle keyHandle(key); |
248 ciObject* new_object = create_new_object(keyHandle()); |
249 ciObject* new_object = create_new_object(keyHandle()); |
249 assert(keyHandle() == new_object->get_oop(), "must be properly recorded"); |
250 assert(keyHandle() == new_object->get_oop(), "must be properly recorded"); |
250 init_ident_of(new_object); |
251 init_ident_of(new_object); |
251 assert(Universe::heap()->is_in_reserved(new_object->get_oop()), "must be"); |
252 assert(Universe::heap()->is_in_reserved(new_object->get_oop()), "must be"); |
252 |
253 |
253 // Not a perm-space object. |
254 // Not a perm-space object. |
254 insert_non_perm(bucket, keyHandle(), new_object); |
255 insert_non_perm(bucket, keyHandle(), new_object); |
255 return new_object; |
256 return new_object; |
256 } |
257 } |
257 |
258 |
258 // ------------------------------------------------------------------ |
259 // ------------------------------------------------------------------ |
259 // ciObjectFactory::get |
260 // ciObjectFactory::get |
260 // |
261 // |
261 // Get the ciObject corresponding to some oop. If the ciObject has |
262 // Get the ciObject corresponding to some oop. If the ciObject has |
322 return new (arena()) ciCallSite(h_i); |
323 return new (arena()) ciCallSite(h_i); |
323 else if (java_lang_invoke_MemberName::is_instance(o)) |
324 else if (java_lang_invoke_MemberName::is_instance(o)) |
324 return new (arena()) ciMemberName(h_i); |
325 return new (arena()) ciMemberName(h_i); |
325 else if (java_lang_invoke_MethodHandle::is_instance(o)) |
326 else if (java_lang_invoke_MethodHandle::is_instance(o)) |
326 return new (arena()) ciMethodHandle(h_i); |
327 return new (arena()) ciMethodHandle(h_i); |
|
328 else if (java_lang_invoke_MethodType::is_instance(o)) |
|
329 return new (arena()) ciMethodType(h_i); |
327 else |
330 else |
328 return new (arena()) ciInstance(h_i); |
331 return new (arena()) ciInstance(h_i); |
329 } else if (o->is_objArray()) { |
332 } else if (o->is_objArray()) { |
330 objArrayHandle h_oa(THREAD, (objArrayOop)o); |
333 objArrayHandle h_oa(THREAD, (objArrayOop)o); |
331 return new (arena()) ciObjArray(h_oa); |
334 return new (arena()) ciObjArray(h_oa); |