[vmkit-commits] [PATCH] Impl JVM_GetClassDeclared{Fields, Methods, Constructors}

Nicolas Geoffray nicolas.geoffray at gmail.com
Thu Nov 3 14:36:06 PDT 2011


Looks good!

On Thu, Nov 3, 2011 at 3:17 PM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below.
>
> Mostly copied from equivalent Classpath implementations, only the
> OpenJDK constructors are different.
>
> ~Will
>
> >From 0821f3663e504c431f96a52070e9983afd87d4a7 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Mon, 31 Oct 2011 16:54:28 -0500
> Subject: [PATCH 01/17] Impl
> JVM_GetClassDeclared{Fields,Methods,Constructors}
>
> ---
>  lib/J3/ClassLib/OpenJDK/OpenJDK.inc |  228
> ++++++++++++++++++++++++++++++++++-
>  1 files changed, 225 insertions(+), 3 deletions(-)
>
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index f4110b7..b724e73 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -1016,17 +1016,237 @@ JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {
>
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean
> publicOnly) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  JavaString* str = 0;
> +  JavaObject * Cl = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +  llvm_gcroot(str, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  Cl = *(JavaObject**)ofClass;
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> +  Classpath* upcalls = vm->upcalls;
> +
> +  if (cl->isArray() || cl->isPrimitive()) {
> +    ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);
> +  } else {
> +    UserClass* realCl = cl->asClass();
> +    JnjvmClassLoader* classLoader = cl->classLoader;
> +    uint32 size = 0;
> +
> +    for (uint32 i = 0; i < realCl->nbVirtualMethods +
> realCl->nbStaticMethods;
> +         ++i) {
> +      JavaMethod* meth = &realCl->virtualMethods[i];
> +      bool pub = isPublic(meth->access);
> +      if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&
> +          (!publicOnly || pub)) {
> +        ++size;
> +      }
> +    }
> +
> +
> +    ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);
> +
> +    sint32 index = 0;
> +    for (uint32 i = 0; i < realCl->nbVirtualMethods +
> realCl->nbStaticMethods;
> +         ++i) {
> +      JavaMethod* meth = &realCl->virtualMethods[i];
> +      bool pub = isPublic(meth->access);
> +      if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&
> +          (!publicOnly || pub)) {
> +        // TODO: check parameter types
> +        UserClass* Meth = vm->upcalls->newMethod;
> +        tmp = Meth->doNew(vm);
> +        str = vm->internalUTF8ToStr(meth->name);
> +        JavaObject * pArr = meth->getParameterTypes(classLoader);
> +        JavaObject * eArr = meth->getExceptionTypes(classLoader);
> +        JavaObject * retTy = meth->getReturnType(classLoader);
> +        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp,
> +          &Cl,          /* declaring class */
> +          &str,         /* name */
> +          &pArr,        /* parameter types */
> +          &retTy,       /* return type */
> +          &eArr,        /* exceptions */
> +          meth->access, /* modifiers */
> +          i,            /* slot */
> +          NULL,         /* signature */
> +          NULL,         /* annotations */
> +          NULL,         /* parameter annotations */
> +          NULL,         /* default annotations */
> +          i);
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +
> +  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean
> publicOnly) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  JavaString* name = 0;
> +  JavaObject*const*  type = 0;
> +  JavaString* sign = 0;
> +  JavaObject* annArray = 0;
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +  llvm_gcroot(name, 0);
> +  llvm_gcroot(type, 0);
> +  llvm_gcroot(sign, 0);
> +  llvm_gcroot(annArray, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  JavaObject * Cl = *(JavaObject**)ofClass;
> +  llvm_gcroot(Cl, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> +
> +  if (!cl->isClass()) {
> +    ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);
> +  } else {
> +    UserClass* realCl = cl->asClass();
> +    uint32 size = 0;
> +    for (uint32 i = 0; i < realCl->nbVirtualFields +
> realCl->nbStaticFields;
> +         ++i) {
> +      JavaField* field = &realCl->virtualFields[i];
> +      if (!publicOnly || isPublic(field->access)) {
> +        ++size;
> +      }
> +    }
> +
> +
> +    ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);
> +
> +    sint32 index = 0;
> +    for (uint32 i = 0; i < realCl->nbVirtualFields +
> realCl->nbStaticFields;
> +         ++i) {
> +      JavaField* field = &realCl->virtualFields[i];
> +      if (!publicOnly || isPublic(field->access)) {
> +        // TODO: check parameter types
> +        UserClass* Field = vm->upcalls->newField;
> +        tmp = Field->doNew(vm);
> +        name = vm->internalUTF8ToStr(field->name);
> +
> +        //type->Class
> +        UserCommonClass * fieldCl =
> field->getSignature()->assocClass(cl->classLoader);
> +        assert(fieldCl);
> +        type = fieldCl->getClassDelegateePtr(vm);
> +
> +        // TODO:Implement these!
> +        sign = NULL;
> +        annArray = NULL;
> +
> +        //Convert to string
> +
> +        /* java.reflect.Field(
> +         *   Class declaringClass,
> +         *   String name,
> +         *   Class type,
> +         *   int modifiers,
> +         *   int slot,
> +         *   String signature,
> +         *   byte[] annotations)
> +         */
> +        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp,
> +          &Cl,
> +          &name,
> +          type,
> +          field->access,
> +          i,
> +          sign,
> +          annArray);
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass,
> jboolean publicOnly) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  JavaObject* Cl = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  Cl = *(JavaObject**)ofClass;
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> +
> +  if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {
> +    ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);
> +  } else {
> +    UserClass* realCl = cl->asClass();;
> +    JnjvmClassLoader* classLoader = cl->classLoader;
> +    uint32 size = 0;
> +
> +    for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {
> +      JavaMethod* meth = &realCl->virtualMethods[i];
> +      bool pub = isPublic(meth->access);
> +      if (meth->name->equals(classLoader->bootstrapLoader->initName) &&
> +          (!publicOnly || pub)) {
> +        ++size;
> +      }
> +    }
> +
> +    ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size,
> vm);
> +
> +    sint32 index = 0;
> +    for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {
> +      JavaMethod* meth = &realCl->virtualMethods[i];
> +      bool pub = isPublic(meth->access);
> +      if (meth->name->equals(classLoader->bootstrapLoader->initName) &&
> +          (!publicOnly || pub)) {
> +        UserClass* Cons = vm->upcalls->newConstructor;
> +        JavaObject * pArr = meth->getParameterTypes(classLoader);
> +        JavaObject * eArr = meth->getExceptionTypes(classLoader);
> +        tmp = Cons->doNew(vm);
> +        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp,
> +          &Cl,          /* declaringClass */
> +          &pArr,        /* parameterTypes */
> +          &eArr,        /* checkedExceptions */
> +          meth->access, /* modifiers */
> +          i,            /* slot */
> +          NULL,         /* String signature */
> +          NULL,         /* annotations */
> +          NULL          /* parameterAnnotations */
> +        );
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +
> +  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  /* Differs from JVM_GetClassModifiers in treatment of inner classes.
> @@ -1170,6 +1390,8 @@ JVM_DoPrivileged(JNIEnv *env, jclass cls,
>   RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
>
>   END_JNI_EXCEPTION
> +
> +  return NULL;
>  }
>
>  JNIEXPORT jobject JNICALL
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111103/493ace39/attachment.html>


More information about the vmkit-commits mailing list