[vmkit-commits] [vmkit] r199567 - Implements get delcared methods
Gael Thomas
gael.thomas at lip6.fr
Sat Jan 18 16:22:18 PST 2014
Author: gthomas
Date: Sat Jan 18 18:22:17 2014
New Revision: 199567
URL: http://llvm.org/viewvc/llvm-project?rev=199567&view=rev
Log:
Implements get delcared methods
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199567&r1=199566&r2=199567&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 18:22:17 2014
@@ -87,6 +87,7 @@ namespace j3 {
J3Class* classLoaderClass;
J3Field* classLoaderClassVMData;
+ J3Method* classLoaderClassLoadClass;
J3Class* threadClass;
J3Field* threadClassVMData;
Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=199567&r1=199566&r2=199567&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 18:22:17 2014
@@ -865,7 +865,40 @@ jbyteArray JNICALL JVM_GetClassTypeAnnot
* New (JDK 1.4) reflection implementation
*/
-jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) { enterJVM(); leaveJVM(); NYI(); }
+jobjectArray JNICALL JVM_GetClassDeclaredMethods(JNIEnv* env, jclass ofClass, jboolean publicOnly) {
+ jobjectArray res;
+
+ enterJVM();
+ J3* vm = J3Thread::get()->vm();
+ J3ObjectType* type = J3ObjectType::nativeClass(ofClass);
+
+ if(type->isClass()) {
+ J3Class* cl = type->asClass();
+ cl->resolve();
+ res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(),
+ publicOnly ?
+ cl->staticLayout()->nbPublicMethods() + cl->nbPublicMethods() - cl->nbPublicConstructors() :
+ cl->staticLayout()->nbMethods() + cl->nbMethods() - cl->nbConstructors());
+
+ uint32_t pos = 0;
+ for(uint32_t i=0; i<cl->nbMethods(); i++) {
+ J3Method* m = cl->methods()[i];
+ if(m->name() != vm->initName && (!publicOnly || J3Cst::isPublic(m->access())))
+ res->setObjectAt(pos++, m->javaMethod());
+ }
+
+ for(uint32_t i=0; i<cl->staticLayout()->nbMethods(); i++) {
+ J3Method* m = cl->staticLayout()->methods()[i];
+ if(!publicOnly || J3Cst::isPublic(m->access()))
+ res->setObjectAt(pos++, m->javaMethod());
+ }
+ } else
+ res = J3ObjectHandle::doNewArray(vm->constructorClass->getArray(), 0);
+
+ leaveJVM();
+ return res;
+}
+
jobjectArray JNICALL JVM_GetClassDeclaredFields(JNIEnv* env, jclass ofClass, jboolean publicOnly) {
jobjectArray res;
@@ -899,6 +932,7 @@ jobjectArray JNICALL JVM_GetClassDeclare
jobjectArray JNICALL JVM_GetClassDeclaredConstructors(JNIEnv* env, jclass ofClass, jboolean publicOnly) {
jobjectArray res;
+
enterJVM();
J3* vm = J3Thread::get()->vm();
J3ObjectType* type = J3ObjectType::nativeClass(ofClass);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199567&r1=199566&r2=199567&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 18:22:17 2014
@@ -127,6 +127,8 @@ void J3::run() {
classLoaderClass = z_class("java/lang/ClassLoader");
classLoaderClass->resolve(vmData, 1);
classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type());
+ classLoaderClassLoadClass = z_method(0, classLoaderClass, names()->get("loadClass"),
+ names()->get("(Ljava/lang/String;)Ljava/lang/Class;"));
threadClass = z_class("java/lang/Thread");
threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V"));
Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=199567&r1=199566&r2=199567&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan 18 18:22:17 2014
@@ -110,7 +110,8 @@ J3Class* J3ClassLoader::defineClass(cons
}
J3Class* J3ClassLoader::loadClass(const vmkit::Name* name) {
- J3::internalError("implement me: loadClass from a Java class loader");
+ J3* vm = J3Thread::get()->vm();
+ return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass();
}
void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) {
More information about the vmkit-commits
mailing list