[vmkit-commits] [PATCH] Refactor Class-related code into new Class.inc.

Nicolas Geoffray nicolas.geoffray at gmail.com
Tue Nov 8 12:36:55 PST 2011


Looks good, with one request.

On Mon, Nov 7, 2011 at 4:00 AM, Will Dietz <wdietz2 at illinois.edu> wrote:

> Inlined below. Also attached, since it's a bit larger.
>
> Shares a lot more code, which is good.
>
> However, the creation of Field/Method/Constructor objects is still
> different for classpath vs openjdk, so add some callback functions to
> define those.
>
> ~Will
>
> >From 151c15f1982b9b4ced11a704303f7103104aac36 Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Sat, 5 Nov 2011 23:53:56 -0500
> Subject: [PATCH 3/8] Refactor Class-related code into new Class.inc.
>
> ---
>  lib/J3/ClassLib/Class.inc                         |  251 ++++++++++++++
>  lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc |  239 ++++----------
>  lib/J3/ClassLib/OpenJDK/OpenJDK.inc               |  367
> +++++++++------------
>  3 files changed, 474 insertions(+), 383 deletions(-)
>  create mode 100644 lib/J3/ClassLib/Class.inc
>
> diff --git a/lib/J3/ClassLib/Class.inc b/lib/J3/ClassLib/Class.inc
> new file mode 100644
> index 0000000..4e8e063
> --- /dev/null
> +++ b/lib/J3/ClassLib/Class.inc
> @@ -0,0 +1,251 @@
> +//===---- Class.inc - Shared j.l.Class code
> -------------------------------===//
> +//
> +//                            The VMKit project
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +// Implementation-specific logic
> +JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i);
> +JavaObject* ClassLib_getMethod(JavaMethod* meth, int i);
> +JavaObject* ClassLib_getField(JavaField* field, int i);
> +
> +static inline ArrayObject* Class_getDeclaredConstructors(JavaObject*
> Cl, jboolean publicOnly) {
>

Please put this method as a static method of JavaObjectClass (I know, you
have to add it to the file in gnu classpath, as well as openjdk).

The reason I'm asking is because I just realized that you're using static
inline. Note that if it was static only, the GC would not work with it
(limitation in clang). Because you're putting inline, I guess that's the
reason why it did not fail, but that's very brittle. Please do the same for
all the other methods above. Thanks!


> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +
> +
> +  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)) {
> +        tmp = ClassLib_getConstructor(meth, i);
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +
> +  return ret;
> +}
> +
> +static inline ArrayObject* Class_getDeclaredMethods(JavaObject* Cl,
> jboolean publicOnly) {
> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  JavaString* str = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +  llvm_gcroot(str, 0);
> +
> +  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)) &&
> +          !(meth->name->equals(classLoader->bootstrapLoader->clinitName))
> &&
> +          (!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)) &&
> +          !(meth->name->equals(classLoader->bootstrapLoader->clinitName))
> &&
> +          (!publicOnly || pub)) {
> +        tmp = ClassLib_getMethod(meth, i);
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +
> +  return ret;
> +}
> +
> +static inline JavaObject* Class_getDeclaringClass(JavaObject * Cl) {
> +  JavaObject* res = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(res, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,
> false)->asClass();
> +
> +  if (cl) {
> +    cl->resolveInnerOuterClasses();
> +    UserClass* outer = cl->getOuterClass();
> +    if (outer) {
> +      res = outer->getClassDelegatee(vm);
> +    }
> +  }
> +
> +  return res;
> +}
> +
> +static inline ArrayObject* Class_getDeclaredClasses(JavaObject* Cl,
> bool publicOnly) {
> +  ArrayObject* result = 0;
> +  llvm_gcroot(result, 0);
> +  llvm_gcroot(Cl, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,
> false)->asClass();
> +  if (cl) {
> +    cl->resolveInnerOuterClasses();
> +    UserClassArray* array = vm->upcalls->constructorArrayClass;
> +
> +    uint16 sizeArray = 0;
> +
> +    if (publicOnly) {
> +      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
> +        UserClass* klass = cl->innerClasses[i];
> +        if (isPublic(klass->innerAccess)) ++sizeArray;
> +      }
> +    } else {
> +      sizeArray = cl->nbInnerClasses;
> +    }
> +
> +    result = (ArrayObject*)array->doNew(sizeArray, vm);
> +    int index = 0;
> +    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
> +      UserClass* klass = cl->innerClasses[i];
> +      if (!publicOnly || isPublic(klass->innerAccess))
> +        ArrayObject::setElement(result, klass->getClassDelegatee(vm),
> index++);
> +    }
> +    assert(index == sizeArray);
> +  }
> +
> +  return result;
> +}
> +
> +static inline ArrayObject* Class_getDeclaredFields(JavaObject* Cl,
> jboolean publicOnly) {
> +  ArrayObject* ret = 0;
> +  JavaObject* tmp = 0;
> +  JavaString* name = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(tmp, 0);
> +  llvm_gcroot(name, 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)) {
> +        tmp = ClassLib_getField(field, i);
> +        ArrayObject::setElement(ret, tmp, index);
> +        index++;
> +      }
> +    }
> +  }
> +
> +  return ret;
> +}
> +
> +static inline ArrayObject* Class_getInterfaces(JavaObject* Cl) {
> +  ArrayObject* res = 0;
> +  llvm_gcroot(Cl, 0);
> +  llvm_gcroot(res, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> +  res =
> (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,
> vm);
> +
> +  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {
> +    UserClass* klass = cl->interfaces[i];
> +    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);
> +  }
> +
> +  return res;
> +}
> +
> +static inline ArrayObject* Class_getDeclaredAnnotations(JavaObject* Cl) {
> +  // TODO: Implement me (for now just returning empty array)
> +  ArrayObject* res = 0;
> +  llvm_gcroot(res, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;
> +  res = (ArrayObject*)array->doNew(0, vm);
> +
> +  return res;
> +}
> +
> +static inline jint Class_getModifiers(JavaObject * Cl) {
> +  llvm_gcroot(Cl, 0);
> +  jint res;
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> +  res = cl->getAccess();
> +
> +  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
> +    // javac may put that flag to inner classes of enum classes.
> +    res &= ~ACC_ENUM;
> +  }
> +
> +  return res;
> +}
> diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
> b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
> index 0c4d21c..47fd6b6 100644
> --- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
> +++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc
> @@ -21,6 +21,8 @@
>  #include "JavaUpcalls.h"
>  #include "Jnjvm.h"
>
> +#include "Class.inc"
> +
>  using namespace j3;
>
>  extern "C" {
> @@ -86,48 +88,12 @@ JavaObject* Cl,
>  jboolean publicOnly) {
>
>   ArrayObject* ret = 0;
> -  JavaObject* tmp = 0;
>   llvm_gcroot(Cl, 0);
>   llvm_gcroot(ret, 0);
> -  llvm_gcroot(tmp, 0);
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  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;
> -        tmp = Cons->doNew(vm);
> -        vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp,
> &Cl, i);
> -        ArrayObject::setElement(ret, tmp, index);
> -        index++;
> -      }
> -    }
> -  }
> +  ret = Class_getDeclaredConstructors(Cl, publicOnly);
>
>   END_NATIVE_EXCEPTION
>
> @@ -143,58 +109,12 @@ JavaObject* Cl,
>  jboolean publicOnly) {
>
>   ArrayObject* ret = 0;
> -  JavaObject* tmp = 0;
> -  JavaString* str = 0;
>   llvm_gcroot(Cl, 0);
>   llvm_gcroot(ret, 0);
> -  llvm_gcroot(tmp, 0);
> -  llvm_gcroot(str, 0);
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  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)) &&
> -          !(meth->name->equals(classLoader->bootstrapLoader->clinitName))
> &&
> -          (!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)) &&
> -          !(meth->name->equals(classLoader->bootstrapLoader->clinitName))
> &&
> -          (!publicOnly || pub)) {
> -        // TODO: check parameter types
> -        UserClass* Meth = vm->upcalls->newMethod;
> -        tmp = Meth->doNew(vm);
> -        str = vm->internalUTF8ToStr(meth->name);
> -        upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str,
> i);
> -        ArrayObject::setElement(ret, tmp, index);
> -        index++;
> -      }
> -    }
> -  }
> +  ret = Class_getDeclaredMethods(Cl, publicOnly);
>
>   END_NATIVE_EXCEPTION
>
> @@ -214,14 +134,7 @@ jboolean ignore) {
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> -  res = cl->getAccess();
> -
> -  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
> -    // javac may put that flag to inner classes of enum classes.
> -    res &= ~ACC_ENUM;
> -  }
> +  res = Class_getModifiers(Cl);
>
>   END_NATIVE_EXCEPTION
>   return res;
> @@ -428,49 +341,12 @@ jclass clazz,
>  JavaObject* Cl, jboolean publicOnly) {
>
>   ArrayObject* ret = 0;
> -  JavaObject* tmp = 0;
> -  JavaString* name = 0;
>   llvm_gcroot(Cl, 0);
>   llvm_gcroot(ret, 0);
> -  llvm_gcroot(tmp, 0);
> -  llvm_gcroot(name, 0);
>
>   BEGIN_NATIVE_EXCEPTION(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);
> -        vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl,
> &name, i);
> -        ArrayObject::setElement(ret, tmp, index);
> -        index++;
> -      }
> -    }
> -  }
> +  ret = Class_getDeclaredFields(Cl, publicOnly);
>
>   END_NATIVE_EXCEPTION
>
> @@ -490,14 +366,7 @@ JavaObject* Cl) {
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> -  res =
> (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,
> vm);
> -
> -  for (uint16 i = 0; i < cl->nbInterfaces; ++i) {
> -    UserClass* klass = cl->interfaces[i];
> -    ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);
> -  }
> +  res = Class_getInterfaces(Cl);
>
>   END_NATIVE_EXCEPTION
>
> @@ -518,16 +387,7 @@ JavaObject* Cl) {
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,
> false)->asClass();
> -
> -  if (cl) {
> -    cl->resolveInnerOuterClasses();
> -    UserClass* outer = cl->getOuterClass();
> -    if (outer) {
> -      res = outer->getClassDelegatee(vm);
> -    }
> -  }
> +  res = Class_getDeclaringClass(Cl);
>
>   END_NATIVE_EXCEPTION
>
> @@ -548,33 +408,7 @@ JavaObject* Cl, bool publicOnly) {
>
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,
> false)->asClass();
> -  if (cl) {
> -    cl->resolveInnerOuterClasses();
> -    UserClassArray* array = vm->upcalls->constructorArrayClass;
> -
> -    uint16 sizeArray = 0;
> -
> -    if (publicOnly) {
> -      for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
> -        UserClass* klass = cl->innerClasses[i];
> -        if (isPublic(klass->innerAccess)) ++sizeArray;
> -      }
> -    } else {
> -      sizeArray = cl->nbInnerClasses;
> -    }
> -
> -    result = (ArrayObject*)array->doNew(sizeArray, vm);
> -    int index = 0;
> -    for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {
> -      UserClass* klass = cl->innerClasses[i];
> -      if (!publicOnly || isPublic(klass->innerAccess))
> -        ArrayObject::setElement(result, klass->getClassDelegatee(vm),
> index++);
> -    }
> -    assert(index == sizeArray);
> -  }
> -
> +  result = Class_getDeclaredClasses(Cl, publicOnly);
>
>   END_NATIVE_EXCEPTION
>
> @@ -603,16 +437,14 @@ jclass clazz,
>  #endif
>  JavaObject* Cl) {
>   // TODO implement me
> -
> +
>   ArrayObject* res = 0;
>   llvm_gcroot(res, 0);
>   llvm_gcroot(Cl, 0);
> -
> +
>   BEGIN_NATIVE_EXCEPTION(0)
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserClassArray* array = vm->upcalls->constructorArrayAnnotation;
> -  res = (ArrayObject*)array->doNew(0, vm);
> +  res = Class_getDeclaredAnnotations(Cl);
>
>   END_NATIVE_EXCEPTION
>
> @@ -641,5 +473,52 @@ JavaObject* Cl) {
>   return res;
>  }
>
> +JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i) {
> +  JavaObject* ret = 0;
> +  llvm_gcroot(ret, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* Cons = vm->upcalls->newConstructor;
> +  ret = Cons->doNew(vm);
> +  JavaObject* const* Cl = cons->classDef->getDelegateePtr();
> +  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
> +    Cl, i);
> +
> +  return ret;
> +}
> +
> +JavaObject* ClassLib_getMethod(JavaMethod* meth, int i) {
> +  JavaObject* ret = 0;
> +  JavaString* str = 0;
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(str, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* Meth = vm->upcalls->newMethod;
> +  ret = Meth->doNew(vm);
> +  str = vm->internalUTF8ToStr(meth->name);
> +  JavaObject* const* Cl = meth->classDef->getDelegateePtr();
> +  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
> +    Cl, &str, i);
> +
> +  return ret;
> +}
> +
> +JavaObject* ClassLib_getField(JavaField* field, int i) {
> +  JavaObject* ret = 0;
> +  JavaString* name = 0;
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(name, 0);
> +
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  UserClass* Field = vm->upcalls->newField;
> +  ret = Field->doNew(vm);
> +  name = vm->internalUTF8ToStr(field->name);
> +  JavaObject* const* Cl = field->classDef->getDelegateePtr();
> +  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
> +    Cl, &name, i);
> +
> +  return ret;
> +}
>
>  }
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index 012b021..4f25fb0 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -12,6 +12,7 @@
>  #include "Reader.h"
>
>  #include "ArrayCopy.inc"
> +#include "Class.inc"
>  #include "ClassContext.inc"
>  #include "SetProperties.inc"
>  #include "Object.inc"
> @@ -1038,7 +1039,18 @@ JVM_GetClassName(JNIEnv *env, jclass cls) {
>
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassInterfaces(JNIEnv *env, jclass cls) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  llvm_gcroot(ret, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  ret = Class_getInterfaces(*(JavaObject**)cls);
> +
> +  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  JNIEXPORT jobject JNICALL
> @@ -1184,17 +1196,7 @@ JVM_GetClassModifiers(JNIEnv *env, jclass cls) {
>
>   Cl = *(JavaObject**)cls;
>
> -  Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,
> false)->asClass();;
> -
> -  jint res = cl->getAccess();
> -
> -  if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {
> -    // javac may put that flag to inner classes of enum classes.
> -    res &= ~ACC_ENUM;
> -  }
> -
> -  RETURN_FROM_JNI(res);
> +  RETURN_FROM_JNI(Class_getModifiers(Cl));
>
>   END_JNI_EXCEPTION
>
> @@ -1203,12 +1205,35 @@ JVM_GetClassModifiers(JNIEnv *env, jclass cls) {
>
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  llvm_gcroot(ret, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  // TODO: Verify boolean parameter here, assuming should default to true.
> +  ret = Class_getDeclaredClasses(*(JavaObject**)ofClass, false);
> +
> +  RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  JNIEXPORT jclass JNICALL
>  JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass) {
> -  NYI();
> +  JavaObject* ret = 0;
> +  llvm_gcroot(ret, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  ret = Class_getDeclaringClass(*(JavaObject**)ofClass);
> +
> +  RETURN_FROM_JNI((jclass)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  /* Generics support (JDK 1.5) */
> @@ -1220,84 +1245,144 @@ JVM_GetClassSignature(JNIEnv *env, jclass cls) {
>  /* Annotations support (JDK 1.5) */
>  JNIEXPORT jbyteArray JNICALL
>  JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {
> -  NYI();
> +  ArrayObject* ret = 0;
> +  llvm_gcroot(ret, 0);
> +
> +  BEGIN_JNI_EXCEPTION
> +
> +  ret = Class_getDeclaredAnnotations(*(JavaObject**)cls);
> +
> +  RETURN_FROM_JNI((jbyteArray)th->pushJNIRef(ret));
> +
> +  END_JNI_EXCEPTION
> +
> +  return 0;
>  }
>
>  /*
>  * New (JDK 1.4) reflection implementation
>  */
> +JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i) {
> +  JavaObject* ret = 0;
> +  JavaObject* pArr = 0;
> +  JavaObject* eArr = 0;
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(pArr, 0);
> +  llvm_gcroot(eArr, 0);
>
> -JNIEXPORT jobjectArray JNICALL
> -JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean
> publicOnly) {
> -  ArrayObject* ret = 0;
> -  JavaObject* tmp = 0;
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  JnjvmClassLoader * classLoader = cons->classDef->classLoader;
> +
> +  UserClass* Cons = vm->upcalls->newConstructor;
> +  pArr = cons->getParameterTypes(classLoader);
> +  eArr = cons->getExceptionTypes(classLoader);
> +  ret = Cons->doNew(vm);
> +  JavaObject* const* Cl = cons->classDef->getDelegateePtr();
> +  vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,
> +    Cl,           /* declaringClass */
> +    &pArr,        /* parameterTypes */
> +    &eArr,        /* checkedExceptions */
> +    cons->access, /* modifiers */
> +    i,            /* slot */
> +    NULL,         /* String signature */
> +    NULL,         /* annotations */
> +    NULL          /* parameterAnnotations */
> +  );
> +
> +  return ret;
> +}
> +
> +JavaObject* ClassLib_getMethod(JavaMethod* meth, int i) {
> +  JavaObject* ret = 0;
>   JavaString* str = 0;
> -  JavaObject * Cl = 0;
> -  llvm_gcroot(Cl, 0);
> +  JavaObject* pArr = 0;
> +  JavaObject* eArr = 0;
> +  JavaObject* retTy = 0;
>   llvm_gcroot(ret, 0);
> -  llvm_gcroot(tmp, 0);
>   llvm_gcroot(str, 0);
> +  llvm_gcroot(pArr, 0);
> +  llvm_gcroot(eArr, 0);
> +  llvm_gcroot(retTy, 0);
>
> -  BEGIN_JNI_EXCEPTION
> -
> -  Cl = *(JavaObject**)ofClass;
> +  // TODO: check parameter types
> +  Jnjvm* vm = JavaThread::get()->getJVM();
> +  JnjvmClassLoader * classLoader = meth->classDef->classLoader;
> +
> +  UserClass* Meth = vm->upcalls->newMethod;
> +  ret = Meth->doNew(vm);
> +  str = vm->internalUTF8ToStr(meth->name);
> +  pArr = meth->getParameterTypes(classLoader);
> +  eArr = meth->getExceptionTypes(classLoader);
> +  retTy = meth->getReturnType(classLoader);
> +  JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);
> +  vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,
> +    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 */
> +
> +  return ret;
> +}
> +
> +JavaObject* ClassLib_getField(JavaField* field, int i) {
> +  JavaObject* ret = 0;
> +  JavaString* name = 0;
> +  llvm_gcroot(ret, 0);
> +  llvm_gcroot(name, 0);
>
> +  // TODO: check parameter types
>   Jnjvm* vm = JavaThread::get()->getJVM();
> -  UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
> -  Classpath* upcalls = vm->upcalls;
> +  UserClass* Field = vm->upcalls->newField;
> +  ret = Field->doNew(vm);
> +  name = vm->internalUTF8ToStr(field->name);
> +
> +  //type->Class
> +  JnjvmClassLoader* loader = field->classDef->classLoader;
> +  UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);
> +  assert(fieldCl);
> +  JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);
> +  JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);
> +
> +  // TODO:Implement these!
> +  JavaObject** sign = NULL;
> +  JavaObject** annArray = NULL;
> +
> +  /* java.reflect.Field(
> +  *   Class declaringClass,
> +  *   String name,
> +  *   Class type,
> +  *   int modifiers,
> +  *   int slot,
> +  *   String signature,
> +  *   byte[] annotations)
> +  */
> +  vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,
> +    Cl,
> +    &name,
> +    type,
> +    field->access,
> +    i,
> +    sign,
> +    annArray);
> +
> +  return ret;
> +}
>
> -  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;
> -      }
> -    }
> +JNIEXPORT jobjectArray JNICALL
> +JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean
> publicOnly) {
> +  ArrayObject* ret = 0;
> +  llvm_gcroot(ret, 0);
>
> +  BEGIN_JNI_EXCEPTION
>
> -    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++;
> -      }
> -    }
> -  }
> +  ret = Class_getDeclaredMethods(*(JavaObject**)ofClass, publicOnly);
>
>   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
>
> @@ -1309,85 +1394,12 @@ JVM_GetClassDeclaredMethods(JNIEnv *env,
> jclass ofClass, jboolean publicOnly) {
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean
> publicOnly) {
>   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);
> +  ret = Class_getDeclaredFields(*(JavaObject**)ofClass, publicOnly);
>
> -  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
> @@ -1398,62 +1410,11 @@ JVM_GetClassDeclaredFields(JNIEnv *env, jclass
> ofClass, jboolean publicOnly) {
>  JNIEXPORT jobjectArray JNICALL
>  JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass,
> jboolean publicOnly) {
>   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++;
> -      }
> -    }
> -  }
> +  ret = Class_getDeclaredConstructors(*(JavaObject**)ofClass, publicOnly);
>
>   RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));
>
> --
> 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/20111108/0196b6dc/attachment.html>


More information about the vmkit-commits mailing list