# HG changeset patch # User Doug Simon # Date 1370906337 -7200 # Node ID e6bd1004082a51eddcc026fb147c0c1e6bd66baa # Parent f3330a4487eb4d59b39206650638272848860503 added HotSpotResolvedObjectType.getMethods() to get all methods of a class including those (such as ) not normally exposed by Java reflection diff -r f3330a4487eb -r e6bd1004082a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Jun 11 01:17:10 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVM.java Tue Jun 11 01:18:57 2013 +0200 @@ -168,6 +168,8 @@ HotSpotResolvedJavaField[] getInstanceFields(HotSpotResolvedObjectType klass); + HotSpotResolvedJavaMethod[] getMethods(HotSpotResolvedObjectType klass); + boolean hasFinalizableSubclass(HotSpotResolvedObjectType klass); /** diff -r f3330a4487eb -r e6bd1004082a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Jun 11 01:17:10 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/CompilerToVMImpl.java Tue Jun 11 01:18:57 2013 +0200 @@ -124,6 +124,9 @@ public native HotSpotResolvedJavaField[] getInstanceFields(HotSpotResolvedObjectType klass); @Override + public native HotSpotResolvedJavaMethod[] getMethods(HotSpotResolvedObjectType klass); + + @Override public native int getCompiledCodeSize(long metaspaceMethod); @Override diff -r f3330a4487eb -r e6bd1004082a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Tue Jun 11 01:17:10 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java Tue Jun 11 01:18:57 2013 +0200 @@ -541,6 +541,15 @@ return result; } + /** + * Gets all methods and constructors declared by this class, including the {@code } + * method if there is one. The latter is not made accessible via standard Java reflection. + */ + public ResolvedJavaMethod[] getMethods() { + HotSpotResolvedJavaMethod[] methods = graalRuntime().getCompilerToVM().getMethods(this); + return methods; + } + @Override public Constant newArray(int length) { return Constant.forObject(Array.newInstance(javaMirror, length)); diff -r f3330a4487eb -r e6bd1004082a src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Tue Jun 11 01:17:10 2013 +0200 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Tue Jun 11 01:18:57 2013 +0200 @@ -591,11 +591,11 @@ for (AllFieldStream fs(k()); !fs.done(); fs.next()) { if (!fs.access_flags().is_static()) { - Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, Thread::current()); + Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, THREAD); int flags = fs.access_flags().as_int(); bool internal = fs.access_flags().is_internal(); - Handle name = java_lang_String::create_from_symbol(fs.name(), Thread::current()); - Handle field = VMToCompiler::createJavaField(JNIHandles::resolve(klass), name, type, fs.offset(), flags, internal, Thread::current()); + Handle name = java_lang_String::create_from_symbol(fs.name(), THREAD); + Handle field = VMToCompiler::createJavaField(JNIHandles::resolve(klass), name, type, fs.offset(), flags, internal, THREAD); fields.append(field()); } } @@ -603,7 +603,28 @@ for (int i = 0; i < fields.length(); ++i) { field_array->obj_at_put(i, fields.at(i)()); } - return JNIHandles::make_local(field_array()); + return JNIHandles::make_local(THREAD, field_array()); +C2V_END + +C2V_VMENTRY(jobject, getMethods, (JNIEnv *, jobject, jobject klass)) + ResourceMark rm; + + instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass))); + Array* methods = k->methods(); + int methods_length = methods->length(); + + // Allocate result + objArrayOop r = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaMethod_klass(), methods_length, CHECK_NULL); + objArrayHandle result (THREAD, r); + + for (int i = 0; i < methods_length; i++) { + methodHandle method(THREAD, methods->at(i)); + Handle holder = JNIHandles::resolve(klass); + oop m = VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD); + result->obj_at_put(i, m); + } + + return JNIHandles::make_local(THREAD, result()); C2V_END C2V_VMENTRY(jlong, getMaxCallTargetOffset, (JNIEnv *env, jobject, jlong addr)) @@ -1209,6 +1230,7 @@ {CC"lookupFieldInPool", CC"("HS_RESOLVED_TYPE"IB)"FIELD, FN_PTR(lookupFieldInPool)}, {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)}, {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)}, + {CC"getMethods", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_METHOD, FN_PTR(getMethods)}, {CC"isTypeInitialized", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(isTypeInitialized)}, {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)}, {CC"initializeType", CC"("HS_RESOLVED_TYPE")V", FN_PTR(initializeType)},