[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