[vmkit-commits] [vmkit] r198504 - Implement some JVM interface functions

Gael Thomas gael.thomas at lip6.fr
Sat Jan 4 09:40:06 PST 2014


Author: gthomas
Date: Sat Jan  4 11:40:06 2014
New Revision: 198504

URL: http://llvm.org/viewvc/llvm-project?rev=198504&view=rev
Log:
Implement some JVM interface functions

Modified:
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3method.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sat Jan  4 11:40:06 2014
@@ -125,7 +125,6 @@ namespace j3 {
 		J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; }
 		void                       prepareInterfaceTable();
 
-		virtual J3Method*          findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1);
 
 		bool                       isObjectType() { return 1; }
 
@@ -133,7 +132,11 @@ namespace j3 {
 
 		void                       dumpInterfaceSlotDescriptors();
 
+		virtual J3Method*          findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1);
 		virtual J3ObjectHandle*    clone(J3ObjectHandle* obj);
+		virtual uint16_t           access();
+		virtual uint16_t           modifiers();
+		virtual J3Class*           super();
 	};
 
 	class J3Layout : public J3ObjectType {
@@ -232,6 +235,7 @@ namespace j3 {
 		J3Class**           interfaces() { return _interfaces; }
 		J3Class*            super() { return _super; }
 		uint16_t            access() { return _access; }
+		uint16_t            modifiers();
 
 		J3ObjectHandle*     staticInstance();
 
@@ -275,6 +279,10 @@ namespace j3 {
 		bool                isArrayClass() { return 1; }
 
 		J3Method*           findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error=1);
+
+		uint16_t            access();
+		uint16_t            modifiers();
+		J3Class*            super();
 	};
 
 	class J3Primitive : public J3Type {

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan  4 11:40:06 2014
@@ -62,6 +62,7 @@ namespace j3 {
 
 		uint32_t            slot() { return _slot; }
 
+		static J3Method*    nativeMethod(J3ObjectHandle* handle);
 		J3ObjectHandle*     javaMethod();
 
 		void*               nativeFnPtr() { return _nativeFnPtr; }

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=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan  4 11:40:06 2014
@@ -401,7 +401,14 @@ jclass JNICALL JVM_DefineClassWithSource
  * Reflection support functions
  */
 
-jstring JNICALL JVM_GetClassName(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
+jstring JNICALL JVM_GetClassName(JNIEnv* env, jclass cls) { 
+	jstring res;
+	enterJVM(); 
+	res = J3Thread::get()->vm()->nameToString(J3ObjectType::nativeClass(cls)->name());
+	leaveJVM(); 
+	return res;
+}
+
 jobjectArray JNICALL JVM_GetClassInterfaces(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
 jobject JNICALL JVM_GetClassLoader(JNIEnv* env, jclass cls) { 
 	enterJVM(); 
@@ -425,7 +432,14 @@ jobject JNICALL JVM_GetProtectionDomain(
 jboolean JNICALL JVM_IsArrayClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
 jboolean JNICALL JVM_IsPrimitiveClass(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
 jclass JNICALL JVM_GetComponentType(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
-jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
+jint JNICALL JVM_GetClassModifiers(JNIEnv* env, jclass cls) { 
+	jint res;
+	enterJVM(); 
+	res = J3ObjectType::nativeClass(cls)->modifiers();
+	leaveJVM(); 
+	return res;
+}
+
 jobjectArray JNICALL JVM_GetDeclaredClasses(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); }
 jclass JNICALL JVM_GetDeclaringClass(JNIEnv* env, jclass ofClass) { enterJVM(); NYI(); leaveJVM(); }
 
@@ -502,7 +516,13 @@ jobjectArray JNICALL JVM_GetClassDeclare
    present) to find the source-level access flags. Only the values of
    the low 13 bits (i.e., a mask of 0x1FFF) are guaranteed to be
    valid. */
-jint JNICALL JVM_GetClassAccessFlags(JNIEnv* env, jclass cls) { enterJVM(); NYI(); leaveJVM(); }
+jint JNICALL JVM_GetClassAccessFlags(JNIEnv* env, jclass cls) { 
+	jint res;
+	enterJVM(); 
+	res = J3ObjectType::nativeClass(cls)->access();
+	leaveJVM(); 
+	return res;
+}
 
 /* The following two reflection routines are still needed due to startup time issues */
 /*
@@ -513,7 +533,16 @@ jobject JNICALL JVM_InvokeMethod(JNIEnv*
 /*
  * java.lang.reflect.Constructor
  */
-jobject JNICALL JVM_NewInstanceFromConstructor(JNIEnv* env, jobject c, jobjectArray args0) { enterJVM(); NYI(); leaveJVM(); }
+jobject JNICALL JVM_NewInstanceFromConstructor(JNIEnv* env, jobject c, jobjectArray args0) { 
+	enterJVM(); 
+	J3Method* cons = J3Method::nativeMethod(c);
+	jobject res = J3ObjectHandle::doNewObject(cons->cl());
+	if(cons->signature()->nbIns())
+		J3::internalError("implement me: JVM_NewInstanceFromConstructor with arguments");
+	cons->invokeSpecial(res);
+	leaveJVM(); 
+	return res;
+}
 
 /*
  * Constant pool access; currently used to implement reflective access to annotations (JDK 1.5)

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sat Jan  4 11:40:06 2014
@@ -180,6 +180,18 @@ J3ObjectHandle* J3ObjectType::clone(J3Ob
 	J3::internalError("should not happen");
 }
 
+uint16_t J3ObjectType::access() {
+	J3::internalError("should not happen");
+}
+
+uint16_t J3ObjectType::modifiers() {
+	J3::internalError("should not happen");
+}
+
+J3Class* J3ObjectType::super() {
+	J3::internalError("should not happen");
+}
+
 void J3ObjectType::prepareInterfaceTable() {
 	//fprintf(stderr, "prepare interface table of %s\n", name()->cStr());
 
@@ -296,6 +308,16 @@ J3Class::J3Class(J3ClassLoader* loader,
 	status = LOADED;
 }
 
+uint16_t J3Class::modifiers() {
+	return access();
+#if 0
+  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
+    // javac may put that flag to inner classes of enum classes.
+    res &= ~ACC_ENUM;
+  }
+#endif
+}
+
 J3ObjectHandle* J3Class::clone(J3ObjectHandle* obj) {
 	J3ObjectHandle* res = J3ObjectHandle::doNewObject(this);
 	obj->rawObjectCopyTo(0, res, 0, structSize());
@@ -846,8 +868,20 @@ J3ObjectHandle* J3ArrayClass::clone(J3Ob
 	return res;
 }
 
+uint16_t J3ArrayClass::access() {
+	return super()->access();
+}
+
+uint16_t J3ArrayClass::modifiers() {
+	return super()->modifiers();
+}
+
+J3Class* J3ArrayClass::super() {
+	return loader()->vm()->objectClass;
+}
+
 J3Method* J3ArrayClass::findMethod(uint32_t access, const vmkit::Name* name, J3Signature* signature, bool error) {
-	return loader()->vm()->objectClass->findMethod(access, name, signature, error);
+	return super()->findMethod(access, name, signature, error);
 }
 
 void J3ArrayClass::doResolve(J3Field* hiddenFields, size_t nbHiddenFields) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan  4 11:40:06 2014
@@ -37,7 +37,15 @@ jfieldID JNICALL FromReflectedField(JNIE
 
 jobject JNICALL ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic) { enterJVM(); leaveJVM(); NYI(); }
 
-jclass JNICALL GetSuperclass(JNIEnv* env, jclass sub) { enterJVM(); leaveJVM(); NYI(); }
+jclass JNICALL GetSuperclass(JNIEnv* env, jclass sub) { 
+	jclass res;
+	enterJVM();
+	J3ObjectType* cl = J3ObjectType::nativeClass(sub);
+	res = J3Thread::get()->vm()->objectClass ? 0 : cl->javaClass();
+	leaveJVM(); 
+	return res;
+}
+
 jboolean JNICALL IsAssignableFrom(JNIEnv* env, jclass sub, jclass sup) { enterJVM(); leaveJVM(); NYI(); }
 
 jobject JNICALL ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic) { enterJVM(); leaveJVM(); NYI(); }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=198504&r1=198503&r2=198504&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan  4 11:40:06 2014
@@ -247,6 +247,19 @@ void J3Method::registerNative(void* fnPt
 	_nativeFnPtr = fnPtr;
 }
 
+J3Method* J3Method::nativeMethod(J3ObjectHandle* handle) {
+	J3* vm = J3Thread::get()->vm();
+	if(handle->vt()->type() == vm->constructorClass) {
+		J3Class* cl = J3ObjectType::nativeClass(handle->getObject(vm->constructorClassClass))->asClass();
+		uint32_t slot = handle->getInteger(vm->constructorClassSlot);
+		J3Method* res = cl->methods()[slot];
+		if(res->name() != vm->initName)
+			J3::internalError("nativeName with a java.lang.reflect.Constructor with a non-constructot method");
+		return res;
+	} else
+		J3::internalError("implement me: nativeMethod with method");
+}
+
 J3ObjectHandle* J3Method::javaMethod() {
 	if(!_javaMethod) {
 		cl()->lock();





More information about the vmkit-commits mailing list