comparison src/share/vm/graal/graalCompilerToVM.cpp @ 9985:e6bd1004082a

added HotSpotResolvedObjectType.getMethods() to get all methods of a class including those (such as <clinit>) not normally exposed by Java reflection
author Doug Simon <doug.simon@oracle.com>
date Tue, 11 Jun 2013 01:18:57 +0200
parents 0f7ca53be929
children f90fc8987779
comparison
equal deleted inserted replaced
9984:f3330a4487eb 9985:e6bd1004082a
589 instanceKlassHandle k = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass)); 589 instanceKlassHandle k = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass));
590 GrowableArray<Handle> fields(k->java_fields_count()); 590 GrowableArray<Handle> fields(k->java_fields_count());
591 591
592 for (AllFieldStream fs(k()); !fs.done(); fs.next()) { 592 for (AllFieldStream fs(k()); !fs.done(); fs.next()) {
593 if (!fs.access_flags().is_static()) { 593 if (!fs.access_flags().is_static()) {
594 Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, Thread::current()); 594 Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, THREAD);
595 int flags = fs.access_flags().as_int(); 595 int flags = fs.access_flags().as_int();
596 bool internal = fs.access_flags().is_internal(); 596 bool internal = fs.access_flags().is_internal();
597 Handle name = java_lang_String::create_from_symbol(fs.name(), Thread::current()); 597 Handle name = java_lang_String::create_from_symbol(fs.name(), THREAD);
598 Handle field = VMToCompiler::createJavaField(JNIHandles::resolve(klass), name, type, fs.offset(), flags, internal, Thread::current()); 598 Handle field = VMToCompiler::createJavaField(JNIHandles::resolve(klass), name, type, fs.offset(), flags, internal, THREAD);
599 fields.append(field()); 599 fields.append(field());
600 } 600 }
601 } 601 }
602 objArrayHandle field_array = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaField_klass(), fields.length(), CHECK_NULL); 602 objArrayHandle field_array = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaField_klass(), fields.length(), CHECK_NULL);
603 for (int i = 0; i < fields.length(); ++i) { 603 for (int i = 0; i < fields.length(); ++i) {
604 field_array->obj_at_put(i, fields.at(i)()); 604 field_array->obj_at_put(i, fields.at(i)());
605 } 605 }
606 return JNIHandles::make_local(field_array()); 606 return JNIHandles::make_local(THREAD, field_array());
607 C2V_END
608
609 C2V_VMENTRY(jobject, getMethods, (JNIEnv *, jobject, jobject klass))
610 ResourceMark rm;
611
612 instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass)));
613 Array<Method*>* methods = k->methods();
614 int methods_length = methods->length();
615
616 // Allocate result
617 objArrayOop r = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaMethod_klass(), methods_length, CHECK_NULL);
618 objArrayHandle result (THREAD, r);
619
620 for (int i = 0; i < methods_length; i++) {
621 methodHandle method(THREAD, methods->at(i));
622 Handle holder = JNIHandles::resolve(klass);
623 oop m = VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD);
624 result->obj_at_put(i, m);
625 }
626
627 return JNIHandles::make_local(THREAD, result());
607 C2V_END 628 C2V_END
608 629
609 C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv *env, jobject, jlong addr)) 630 C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv *env, jobject, jlong addr))
610 address target_addr = (address) addr; 631 address target_addr = (address) addr;
611 if (target_addr != 0x0) { 632 if (target_addr != 0x0) {
1207 {CC"lookupTypeInPool", CC"("HS_RESOLVED_TYPE"I)"TYPE, FN_PTR(lookupTypeInPool)}, 1228 {CC"lookupTypeInPool", CC"("HS_RESOLVED_TYPE"I)"TYPE, FN_PTR(lookupTypeInPool)},
1208 {CC"lookupReferencedTypeInPool", CC"("HS_RESOLVED_TYPE"IB)V", FN_PTR(lookupReferencedTypeInPool)}, 1229 {CC"lookupReferencedTypeInPool", CC"("HS_RESOLVED_TYPE"IB)V", FN_PTR(lookupReferencedTypeInPool)},
1209 {CC"lookupFieldInPool", CC"("HS_RESOLVED_TYPE"IB)"FIELD, FN_PTR(lookupFieldInPool)}, 1230 {CC"lookupFieldInPool", CC"("HS_RESOLVED_TYPE"IB)"FIELD, FN_PTR(lookupFieldInPool)},
1210 {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)}, 1231 {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)},
1211 {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)}, 1232 {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)},
1233 {CC"getMethods", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_METHOD, FN_PTR(getMethods)},
1212 {CC"isTypeInitialized", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(isTypeInitialized)}, 1234 {CC"isTypeInitialized", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(isTypeInitialized)},
1213 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)}, 1235 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)},
1214 {CC"initializeType", CC"("HS_RESOLVED_TYPE")V", FN_PTR(initializeType)}, 1236 {CC"initializeType", CC"("HS_RESOLVED_TYPE")V", FN_PTR(initializeType)},
1215 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, 1237 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)},
1216 {CC"getResolvedType", CC"("CLASS")"RESOLVED_TYPE, FN_PTR(getResolvedType)}, 1238 {CC"getResolvedType", CC"("CLASS")"RESOLVED_TYPE, FN_PTR(getResolvedType)},