// ------------------------------------------------------------------ // ciObjectFactory::create_new_object // // Create a new ciObject from a Metadata*. // // Implementation note: this functionality could be virtual behavior // of the oop itself. For now, we explicitly marshal the object. ciMetadata* ciObjectFactory::create_new_object(Metadata* o) { EXCEPTION_CONTEXT; if (o->is_klass()) { KlassHandle h_k(THREAD, (Klass*)o); Klass* k = (Klass*)o; 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 (o->is_method()) { methodHandle h_m(THREAD, (Method*)o); return new (arena()) ciMethod(h_m); } else if (o->is_methodData()) { // Hold methodHandle alive - might not be necessary ??? methodHandle h_m(THREAD, ((MethodData*)o)->method()); return new (arena()) ciMethodData((MethodData*)o); } // The oop is of some type not supported by the compiler interface. ShouldNotReachHere(); return NULL; }
// ------------------------------------------------------------------ // ciObjectFactory::create_new_metadata // // Create a new ciMetadata from a Metadata*. // // Implementation note: in order to keep Metadata live, an auxiliary ciObject // is used, which points to it's holder. ciMetadata* ciObjectFactory::create_new_metadata(Metadata* o) { EXCEPTION_CONTEXT; // Hold metadata from unloading by keeping it's holder alive. if (_initialized && o->is_klass()) { Klass* holder = ((Klass*)o); if (holder->oop_is_instance() && InstanceKlass::cast(holder)->is_anonymous()) { // Though ciInstanceKlass records class loader oop, it's not enough to keep // VM anonymous classes alive (loader == NULL). Klass holder should be used instead. // It is enough to record a ciObject, since cached elements are never removed // during ciObjectFactory lifetime. ciObjectFactory itself is created for // every compilation and lives for the whole duration of the compilation. ciObject* h = get(holder->klass_holder()); } } if (o->is_klass()) { KlassHandle h_k(THREAD, (Klass*)o); Klass* k = (Klass*)o; 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 (o->is_method()) { methodHandle h_m(THREAD, (Method*)o); ciEnv *env = CURRENT_THREAD_ENV; ciInstanceKlass* holder = env->get_instance_klass(h_m()->method_holder()); return new (arena()) ciMethod(h_m, holder); } else if (o->is_methodData()) { // Hold methodHandle alive - might not be necessary ??? methodHandle h_m(THREAD, ((MethodData*)o)->method()); return new (arena()) ciMethodData((MethodData*)o); } // The Metadata* 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; }