// ------------------------------------------------------------------ // ciObjectFactory::create_new_object // // Create a new ciObject from an oop. // // Implementation note: this functionality could be virtual behavior // of the oop itself. For now, we explicitly marshal the object. ciObject* ciObjectFactory::create_new_object(oop o) { EXCEPTION_CONTEXT; if (o->is_instance()) { instanceHandle h_i(THREAD, (instanceOop)o); if (java_lang_invoke_CallSite::is_instance(o)) return new (arena()) ciCallSite(h_i); else if (java_lang_invoke_MemberName::is_instance(o)) return new (arena()) ciMemberName(h_i); else if (java_lang_invoke_MethodHandle::is_instance(o)) return new (arena()) ciMethodHandle(h_i); else if (java_lang_invoke_MethodType::is_instance(o)) return new (arena()) ciMethodType(h_i); else return new (arena()) ciInstance(h_i); } else if (o->is_objArray()) { objArrayHandle h_oa(THREAD, (objArrayOop)o); return new (arena()) ciObjArray(h_oa); } else if (o->is_typeArray()) { typeArrayHandle h_ta(THREAD, (typeArrayOop)o); return new (arena()) ciTypeArray(h_ta); } // The oop is of some type not supported by the compiler interface. ShouldNotReachHere(); return NULL; }
// ------------------------------------------------------------------ // ciObjectFactory::create_new_object // // Create a new ciObject from an oop. // // Implementation note: this functionality could be virtual behavior // of the oop itself. For now, we explicitly marshal the object. ciObject* ciObjectFactory::create_new_object(oop o) { EXCEPTION_CONTEXT; if (o->is_symbol()) { symbolHandle h_o(THREAD, (symbolOop)o); assert(vmSymbols::find_sid(h_o()) == vmSymbols::NO_SID, ""); return new (arena()) ciSymbol(h_o, vmSymbols::NO_SID); } else if (o->is_klass()) { KlassHandle h_k(THREAD, (klassOop)o); Klass* k = ((klassOop)o)->klass_part(); if (k->oop_is_instance()) { return new (arena()) ciInstanceKlass(h_k); } else if (k->oop_is_objArray()) { return new (arena()) ciObjArrayKlass(h_k); } else if (k->oop_is_typeArray()) { return new (arena()) ciTypeArrayKlass(h_k); } else if (k->oop_is_method()) { return new (arena()) ciMethodKlass(h_k); } else if (k->oop_is_symbol()) { return new (arena()) ciSymbolKlass(h_k); } else if (k->oop_is_klass()) { if (k->oop_is_objArrayKlass()) { return new (arena()) ciObjArrayKlassKlass(h_k); } else if (k->oop_is_typeArrayKlass()) { return new (arena()) ciTypeArrayKlassKlass(h_k); } else if (k->oop_is_instanceKlass()) { return new (arena()) ciInstanceKlassKlass(h_k); } else { assert(o == Universe::klassKlassObj(), "bad klassKlass"); return new (arena()) ciKlassKlass(h_k); } } } else if (o->is_method()) { methodHandle h_m(THREAD, (methodOop)o); return new (arena()) ciMethod(h_m); } else if (o->is_methodData()) { methodDataHandle h_md(THREAD, (methodDataOop)o); return new (arena()) ciMethodData(h_md); } else if (o->is_instance()) { instanceHandle h_i(THREAD, (instanceOop)o); if (java_dyn_CallSite::is_instance(o)) return new (arena()) ciCallSite(h_i); else if (java_dyn_MethodHandle::is_instance(o)) return new (arena()) ciMethodHandle(h_i); else return new (arena()) ciInstance(h_i); } else if (o->is_objArray()) { objArrayHandle h_oa(THREAD, (objArrayOop)o); return new (arena()) ciObjArray(h_oa); } else if (o->is_typeArray()) { typeArrayHandle h_ta(THREAD, (typeArrayOop)o); return new (arena()) ciTypeArray(h_ta); } else if (o->is_constantPoolCache()) { constantPoolCacheHandle h_cpc(THREAD, (constantPoolCacheOop) o); return new (arena()) ciCPCache(h_cpc); } // The oop is of some type not supported by the compiler interface. ShouldNotReachHere(); return NULL; }