[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