<div>Looks good, with one request.</div><div><br></div>On Mon, Nov 7, 2011 at 4:00 AM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Inlined below. Also attached, since it's a bit larger.<br>
<br>
Shares a lot more code, which is good.<br>
<br>
However, the creation of Field/Method/Constructor objects is still<br>
different for classpath vs openjdk, so add some callback functions to<br>
define those.<br>
<br>
~Will<br>
<br>
>From 151c15f1982b9b4ced11a704303f7103104aac36 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Sat, 5 Nov 2011 23:53:56 -0500<br>
Subject: [PATCH 3/8] Refactor Class-related code into new Class.inc.<br>
<br>
---<br>
lib/J3/ClassLib/Class.inc | 251 ++++++++++++++<br>
lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc | 239 ++++----------<br>
lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 367 +++++++++------------<br>
3 files changed, 474 insertions(+), 383 deletions(-)<br>
create mode 100644 lib/J3/ClassLib/Class.inc<br>
<br>
diff --git a/lib/J3/ClassLib/Class.inc b/lib/J3/ClassLib/Class.inc<br>
new file mode 100644<br>
index 0000000..4e8e063<br>
--- /dev/null<br>
+++ b/lib/J3/ClassLib/Class.inc<br>
@@ -0,0 +1,251 @@<br>
+//===---- Class.inc - Shared j.l.Class code<br>
-------------------------------===//<br>
+//<br>
+// The VMKit project<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// Implementation-specific logic<br>
+JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i);<br>
+JavaObject* ClassLib_getMethod(JavaMethod* meth, int i);<br>
+JavaObject* ClassLib_getField(JavaField* field, int i);<br>
+<br>
+static inline ArrayObject* Class_getDeclaredConstructors(JavaObject*<br>
Cl, jboolean publicOnly) {<br></blockquote><div><br></div><div>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).</div><div><br></div>
<div>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!</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+<br>
+ if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {<br>
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();;<br>
+ JnjvmClassLoader* classLoader = cl->classLoader;<br>
+ uint32 size = 0;<br>
+<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
+ (!publicOnly || pub)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+ ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
+ (!publicOnly || pub)) {<br>
+ tmp = ClassLib_getConstructor(meth, i);<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+static inline ArrayObject* Class_getDeclaredMethods(JavaObject* Cl,<br>
jboolean publicOnly) {<br>
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ JavaString* str = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+ llvm_gcroot(str, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+ Classpath* upcalls = vm->upcalls;<br>
+<br>
+ if (cl->isArray() || cl->isPrimitive()) {<br>
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();<br>
+ JnjvmClassLoader* classLoader = cl->classLoader;<br>
+ uint32 size = 0;<br>
+<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
+ ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
+ !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<br>
+ (!publicOnly || pub)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+<br>
+ ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
+ ++i) {<br>
+ JavaMethod* meth = &realCl->virtualMethods[i];<br>
+ bool pub = isPublic(meth->access);<br>
+ if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
+ !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<br>
+ (!publicOnly || pub)) {<br>
+ tmp = ClassLib_getMethod(meth, i);<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+static inline JavaObject* Class_getDeclaringClass(JavaObject * Cl) {<br>
+ JavaObject* res = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(res, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
+<br>
+ if (cl) {<br>
+ cl->resolveInnerOuterClasses();<br>
+ UserClass* outer = cl->getOuterClass();<br>
+ if (outer) {<br>
+ res = outer->getClassDelegatee(vm);<br>
+ }<br>
+ }<br>
+<br>
+ return res;<br>
+}<br>
+<br>
+static inline ArrayObject* Class_getDeclaredClasses(JavaObject* Cl,<br>
bool publicOnly) {<br>
+ ArrayObject* result = 0;<br>
+ llvm_gcroot(result, 0);<br>
+ llvm_gcroot(Cl, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
+ if (cl) {<br>
+ cl->resolveInnerOuterClasses();<br>
+ UserClassArray* array = vm->upcalls->constructorArrayClass;<br>
+<br>
+ uint16 sizeArray = 0;<br>
+<br>
+ if (publicOnly) {<br>
+ for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
+ UserClass* klass = cl->innerClasses[i];<br>
+ if (isPublic(klass->innerAccess)) ++sizeArray;<br>
+ }<br>
+ } else {<br>
+ sizeArray = cl->nbInnerClasses;<br>
+ }<br>
+<br>
+ result = (ArrayObject*)array->doNew(sizeArray, vm);<br>
+ int index = 0;<br>
+ for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
+ UserClass* klass = cl->innerClasses[i];<br>
+ if (!publicOnly || isPublic(klass->innerAccess))<br>
+ ArrayObject::setElement(result, klass->getClassDelegatee(vm), index++);<br>
+ }<br>
+ assert(index == sizeArray);<br>
+ }<br>
+<br>
+ return result;<br>
+}<br>
+<br>
+static inline ArrayObject* Class_getDeclaredFields(JavaObject* Cl,<br>
jboolean publicOnly) {<br>
+ ArrayObject* ret = 0;<br>
+ JavaObject* tmp = 0;<br>
+ JavaString* name = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(tmp, 0);<br>
+ llvm_gcroot(name, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+<br>
+ if (!cl->isClass()) {<br>
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);<br>
+ } else {<br>
+ UserClass* realCl = cl->asClass();<br>
+ uint32 size = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
+ ++i) {<br>
+ JavaField* field = &realCl->virtualFields[i];<br>
+ if (!publicOnly || isPublic(field->access)) {<br>
+ ++size;<br>
+ }<br>
+ }<br>
+<br>
+ ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);<br>
+<br>
+ sint32 index = 0;<br>
+ for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
+ ++i) {<br>
+ JavaField* field = &realCl->virtualFields[i];<br>
+ if (!publicOnly || isPublic(field->access)) {<br>
+ tmp = ClassLib_getField(field, i);<br>
+ ArrayObject::setElement(ret, tmp, index);<br>
+ index++;<br>
+ }<br>
+ }<br>
+ }<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+static inline ArrayObject* Class_getInterfaces(JavaObject* Cl) {<br>
+ ArrayObject* res = 0;<br>
+ llvm_gcroot(Cl, 0);<br>
+ llvm_gcroot(res, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+ res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,<br>
vm);<br>
+<br>
+ for (uint16 i = 0; i < cl->nbInterfaces; ++i) {<br>
+ UserClass* klass = cl->interfaces[i];<br>
+ ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);<br>
+ }<br>
+<br>
+ return res;<br>
+}<br>
+<br>
+static inline ArrayObject* Class_getDeclaredAnnotations(JavaObject* Cl) {<br>
+ // TODO: Implement me (for now just returning empty array)<br>
+ ArrayObject* res = 0;<br>
+ llvm_gcroot(res, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClassArray* array = vm->upcalls->constructorArrayAnnotation;<br>
+ res = (ArrayObject*)array->doNew(0, vm);<br>
+<br>
+ return res;<br>
+}<br>
+<br>
+static inline jint Class_getModifiers(JavaObject * Cl) {<br>
+ llvm_gcroot(Cl, 0);<br>
+ jint res;<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
+ res = cl->getAccess();<br>
+<br>
+ if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
+ // javac may put that flag to inner classes of enum classes.<br>
+ res &= ~ACC_ENUM;<br>
+ }<br>
+<br>
+ return res;<br>
+}<br>
diff --git a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
index 0c4d21c..47fd6b6 100644<br>
--- a/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
+++ b/lib/J3/ClassLib/GNUClasspath/ClasspathVMClass.inc<br>
@@ -21,6 +21,8 @@<br>
#include "JavaUpcalls.h"<br>
#include "Jnjvm.h"<br>
<br>
+#include "Class.inc"<br>
+<br>
using namespace j3;<br>
<br>
extern "C" {<br>
@@ -86,48 +88,12 @@ JavaObject* Cl,<br>
jboolean publicOnly) {<br>
<br>
ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
llvm_gcroot(Cl, 0);<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-<br>
- if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {<br>
- ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();;<br>
- JnjvmClassLoader* classLoader = cl->classLoader;<br>
- uint32 size = 0;<br>
-<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
- (!publicOnly || pub)) {<br>
- ++size;<br>
- }<br>
- }<br>
-<br>
- ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
- (!publicOnly || pub)) {<br>
- UserClass* Cons = vm->upcalls->newConstructor;<br>
- tmp = Cons->doNew(vm);<br>
- vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, &Cl, i);<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
+ ret = Class_getDeclaredConstructors(Cl, publicOnly);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -143,58 +109,12 @@ JavaObject* Cl,<br>
jboolean publicOnly) {<br>
<br>
ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
- JavaString* str = 0;<br>
llvm_gcroot(Cl, 0);<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
- llvm_gcroot(str, 0);<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
- Classpath* upcalls = vm->upcalls;<br>
-<br>
- if (cl->isArray() || cl->isPrimitive()) {<br>
- ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();<br>
- JnjvmClassLoader* classLoader = cl->classLoader;<br>
- uint32 size = 0;<br>
-<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
- ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
- !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<br>
- (!publicOnly || pub)) {<br>
- ++size;<br>
- }<br>
- }<br>
-<br>
-<br>
- ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
- ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
- !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) &&<br>
- (!publicOnly || pub)) {<br>
- // TODO: check parameter types<br>
- UserClass* Meth = vm->upcalls->newMethod;<br>
- tmp = Meth->doNew(vm);<br>
- str = vm->internalUTF8ToStr(meth->name);<br>
- upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str, i);<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
+ ret = Class_getDeclaredMethods(Cl, publicOnly);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -214,14 +134,7 @@ jboolean ignore) {<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
- res = cl->getAccess();<br>
-<br>
- if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
- // javac may put that flag to inner classes of enum classes.<br>
- res &= ~ACC_ENUM;<br>
- }<br>
+ res = Class_getModifiers(Cl);<br>
<br>
END_NATIVE_EXCEPTION<br>
return res;<br>
@@ -428,49 +341,12 @@ jclass clazz,<br>
JavaObject* Cl, jboolean publicOnly) {<br>
<br>
ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
- JavaString* name = 0;<br>
llvm_gcroot(Cl, 0);<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
- llvm_gcroot(name, 0);<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-<br>
- if (!cl->isClass()) {<br>
- ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();<br>
- uint32 size = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
- ++i) {<br>
- JavaField* field = &realCl->virtualFields[i];<br>
- if (!publicOnly || isPublic(field->access)) {<br>
- ++size;<br>
- }<br>
- }<br>
-<br>
-<br>
- ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
- ++i) {<br>
- JavaField* field = &realCl->virtualFields[i];<br>
- if (!publicOnly || isPublic(field->access)) {<br>
- // TODO: check parameter types<br>
- UserClass* Field = vm->upcalls->newField;<br>
- tmp = Field->doNew(vm);<br>
- name = vm->internalUTF8ToStr(field->name);<br>
- vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl,<br>
&name, i);<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
+ ret = Class_getDeclaredFields(Cl, publicOnly);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -490,14 +366,7 @@ JavaObject* Cl) {<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
- res = (ArrayObject*)vm->upcalls->classArrayClass->doNew(cl->nbInterfaces,<br>
vm);<br>
-<br>
- for (uint16 i = 0; i < cl->nbInterfaces; ++i) {<br>
- UserClass* klass = cl->interfaces[i];<br>
- ArrayObject::setElement(res, klass->getClassDelegatee(vm), i);<br>
- }<br>
+ res = Class_getInterfaces(Cl);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -518,16 +387,7 @@ JavaObject* Cl) {<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
-<br>
- if (cl) {<br>
- cl->resolveInnerOuterClasses();<br>
- UserClass* outer = cl->getOuterClass();<br>
- if (outer) {<br>
- res = outer->getClassDelegatee(vm);<br>
- }<br>
- }<br>
+ res = Class_getDeclaringClass(Cl);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -548,33 +408,7 @@ JavaObject* Cl, bool publicOnly) {<br>
<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false)->asClass();<br>
- if (cl) {<br>
- cl->resolveInnerOuterClasses();<br>
- UserClassArray* array = vm->upcalls->constructorArrayClass;<br>
-<br>
- uint16 sizeArray = 0;<br>
-<br>
- if (publicOnly) {<br>
- for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
- UserClass* klass = cl->innerClasses[i];<br>
- if (isPublic(klass->innerAccess)) ++sizeArray;<br>
- }<br>
- } else {<br>
- sizeArray = cl->nbInnerClasses;<br>
- }<br>
-<br>
- result = (ArrayObject*)array->doNew(sizeArray, vm);<br>
- int index = 0;<br>
- for (uint16 i = 0; i < cl->nbInnerClasses; ++i) {<br>
- UserClass* klass = cl->innerClasses[i];<br>
- if (!publicOnly || isPublic(klass->innerAccess))<br>
- ArrayObject::setElement(result, klass->getClassDelegatee(vm),<br>
index++);<br>
- }<br>
- assert(index == sizeArray);<br>
- }<br>
-<br>
+ result = Class_getDeclaredClasses(Cl, publicOnly);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -603,16 +437,14 @@ jclass clazz,<br>
#endif<br>
JavaObject* Cl) {<br>
// TODO implement me<br>
-<br>
+<br>
ArrayObject* res = 0;<br>
llvm_gcroot(res, 0);<br>
llvm_gcroot(Cl, 0);<br>
-<br>
+<br>
BEGIN_NATIVE_EXCEPTION(0)<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserClassArray* array = vm->upcalls->constructorArrayAnnotation;<br>
- res = (ArrayObject*)array->doNew(0, vm);<br>
+ res = Class_getDeclaredAnnotations(Cl);<br>
<br>
END_NATIVE_EXCEPTION<br>
<br>
@@ -641,5 +473,52 @@ JavaObject* Cl) {<br>
return res;<br>
}<br>
<br>
+JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i) {<br>
+ JavaObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClass* Cons = vm->upcalls->newConstructor;<br>
+ ret = Cons->doNew(vm);<br>
+ JavaObject* const* Cl = cons->classDef->getDelegateePtr();<br>
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,<br>
+ Cl, i);<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+JavaObject* ClassLib_getMethod(JavaMethod* meth, int i) {<br>
+ JavaObject* ret = 0;<br>
+ JavaString* str = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(str, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClass* Meth = vm->upcalls->newMethod;<br>
+ ret = Meth->doNew(vm);<br>
+ str = vm->internalUTF8ToStr(meth->name);<br>
+ JavaObject* const* Cl = meth->classDef->getDelegateePtr();<br>
+ vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,<br>
+ Cl, &str, i);<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+JavaObject* ClassLib_getField(JavaField* field, int i) {<br>
+ JavaObject* ret = 0;<br>
+ JavaString* name = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(name, 0);<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ UserClass* Field = vm->upcalls->newField;<br>
+ ret = Field->doNew(vm);<br>
+ name = vm->internalUTF8ToStr(field->name);<br>
+ JavaObject* const* Cl = field->classDef->getDelegateePtr();<br>
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,<br>
+ Cl, &name, i);<br>
+<br>
+ return ret;<br>
+}<br>
<br>
}<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index 012b021..4f25fb0 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -12,6 +12,7 @@<br>
#include "Reader.h"<br>
<br>
#include "ArrayCopy.inc"<br>
+#include "Class.inc"<br>
#include "ClassContext.inc"<br>
#include "SetProperties.inc"<br>
#include "Object.inc"<br>
@@ -1038,7 +1039,18 @@ JVM_GetClassName(JNIEnv *env, jclass cls) {<br>
<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassInterfaces(JNIEnv *env, jclass cls) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ ret = Class_getInterfaces(*(JavaObject**)cls);<br>
+<br>
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
JNIEXPORT jobject JNICALL<br>
@@ -1184,17 +1196,7 @@ JVM_GetClassModifiers(JNIEnv *env, jclass cls) {<br>
<br>
Cl = *(JavaObject**)cls;<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserClass* cl = UserCommonClass::resolvedImplClass(vm, Cl,<br>
false)->asClass();;<br>
-<br>
- jint res = cl->getAccess();<br>
-<br>
- if (isEnum(res) && cl->getSuper() != vm->upcalls->EnumClass) {<br>
- // javac may put that flag to inner classes of enum classes.<br>
- res &= ~ACC_ENUM;<br>
- }<br>
-<br>
- RETURN_FROM_JNI(res);<br>
+ RETURN_FROM_JNI(Class_getModifiers(Cl));<br>
<br>
END_JNI_EXCEPTION<br>
<br>
@@ -1203,12 +1205,35 @@ JVM_GetClassModifiers(JNIEnv *env, jclass cls) {<br>
<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ // TODO: Verify boolean parameter here, assuming should default to true.<br>
+ ret = Class_getDeclaredClasses(*(JavaObject**)ofClass, false);<br>
+<br>
+ RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
JNIEXPORT jclass JNICALL<br>
JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass) {<br>
- NYI();<br>
+ JavaObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ ret = Class_getDeclaringClass(*(JavaObject**)ofClass);<br>
+<br>
+ RETURN_FROM_JNI((jclass)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
/* Generics support (JDK 1.5) */<br>
@@ -1220,84 +1245,144 @@ JVM_GetClassSignature(JNIEnv *env, jclass cls) {<br>
/* Annotations support (JDK 1.5) */<br>
JNIEXPORT jbyteArray JNICALL<br>
JVM_GetClassAnnotations(JNIEnv *env, jclass cls) {<br>
- NYI();<br>
+ ArrayObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ ret = Class_getDeclaredAnnotations(*(JavaObject**)cls);<br>
+<br>
+ RETURN_FROM_JNI((jbyteArray)th->pushJNIRef(ret));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
/*<br>
* New (JDK 1.4) reflection implementation<br>
*/<br>
+JavaObject* ClassLib_getConstructor(JavaMethod * cons, int i) {<br>
+ JavaObject* ret = 0;<br>
+ JavaObject* pArr = 0;<br>
+ JavaObject* eArr = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(pArr, 0);<br>
+ llvm_gcroot(eArr, 0);<br>
<br>
-JNIEXPORT jobjectArray JNICALL<br>
-JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
- ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ JnjvmClassLoader * classLoader = cons->classDef->classLoader;<br>
+<br>
+ UserClass* Cons = vm->upcalls->newConstructor;<br>
+ pArr = cons->getParameterTypes(classLoader);<br>
+ eArr = cons->getExceptionTypes(classLoader);<br>
+ ret = Cons->doNew(vm);<br>
+ JavaObject* const* Cl = cons->classDef->getDelegateePtr();<br>
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret,<br>
+ Cl, /* declaringClass */<br>
+ &pArr, /* parameterTypes */<br>
+ &eArr, /* checkedExceptions */<br>
+ cons->access, /* modifiers */<br>
+ i, /* slot */<br>
+ NULL, /* String signature */<br>
+ NULL, /* annotations */<br>
+ NULL /* parameterAnnotations */<br>
+ );<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+JavaObject* ClassLib_getMethod(JavaMethod* meth, int i) {<br>
+ JavaObject* ret = 0;<br>
JavaString* str = 0;<br>
- JavaObject * Cl = 0;<br>
- llvm_gcroot(Cl, 0);<br>
+ JavaObject* pArr = 0;<br>
+ JavaObject* eArr = 0;<br>
+ JavaObject* retTy = 0;<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
llvm_gcroot(str, 0);<br>
+ llvm_gcroot(pArr, 0);<br>
+ llvm_gcroot(eArr, 0);<br>
+ llvm_gcroot(retTy, 0);<br>
<br>
- BEGIN_JNI_EXCEPTION<br>
-<br>
- Cl = *(JavaObject**)ofClass;<br>
+ // TODO: check parameter types<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ JnjvmClassLoader * classLoader = meth->classDef->classLoader;<br>
+<br>
+ UserClass* Meth = vm->upcalls->newMethod;<br>
+ ret = Meth->doNew(vm);<br>
+ str = vm->internalUTF8ToStr(meth->name);<br>
+ pArr = meth->getParameterTypes(classLoader);<br>
+ eArr = meth->getExceptionTypes(classLoader);<br>
+ retTy = meth->getReturnType(classLoader);<br>
+ JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm);<br>
+ vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret,<br>
+ Cl, /* declaring class */<br>
+ &str, /* name */<br>
+ &pArr, /* parameter types */<br>
+ &retTy, /* return type */<br>
+ &eArr, /* exceptions */<br>
+ meth->access, /* modifiers */<br>
+ i, /* slot */<br>
+ NULL, /* signature */<br>
+ NULL, /* annotations */<br>
+ NULL, /* parameter annotations */<br>
+ NULL); /* default annotations */<br>
+<br>
+ return ret;<br>
+}<br>
+<br>
+JavaObject* ClassLib_getField(JavaField* field, int i) {<br>
+ JavaObject* ret = 0;<br>
+ JavaString* name = 0;<br>
+ llvm_gcroot(ret, 0);<br>
+ llvm_gcroot(name, 0);<br>
<br>
+ // TODO: check parameter types<br>
Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
- Classpath* upcalls = vm->upcalls;<br>
+ UserClass* Field = vm->upcalls->newField;<br>
+ ret = Field->doNew(vm);<br>
+ name = vm->internalUTF8ToStr(field->name);<br>
+<br>
+ //type->Class<br>
+ JnjvmClassLoader* loader = field->classDef->classLoader;<br>
+ UserCommonClass * fieldCl = field->getSignature()->assocClass(loader);<br>
+ assert(fieldCl);<br>
+ JavaObject* const* type = fieldCl->getClassDelegateePtr(vm);<br>
+ JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm);<br>
+<br>
+ // TODO:Implement these!<br>
+ JavaObject** sign = NULL;<br>
+ JavaObject** annArray = NULL;<br>
+<br>
+ /* java.reflect.Field(<br>
+ * Class declaringClass,<br>
+ * String name,<br>
+ * Class type,<br>
+ * int modifiers,<br>
+ * int slot,<br>
+ * String signature,<br>
+ * byte[] annotations)<br>
+ */<br>
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, ret,<br>
+ Cl,<br>
+ &name,<br>
+ type,<br>
+ field->access,<br>
+ i,<br>
+ sign,<br>
+ annArray);<br>
+<br>
+ return ret;<br>
+}<br>
<br>
- if (cl->isArray() || cl->isPrimitive()) {<br>
- ret = (ArrayObject*)upcalls->methodArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();<br>
- JnjvmClassLoader* classLoader = cl->classLoader;<br>
- uint32 size = 0;<br>
-<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
- ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
- (!publicOnly || pub)) {<br>
- ++size;<br>
- }<br>
- }<br>
+JNIEXPORT jobjectArray JNICALL<br>
+JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
+ ArrayObject* ret = 0;<br>
+ llvm_gcroot(ret, 0);<br>
<br>
+ BEGIN_JNI_EXCEPTION<br>
<br>
- ret = (ArrayObject*)upcalls->methodArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods + realCl->nbStaticMethods;<br>
- ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) &&<br>
- (!publicOnly || pub)) {<br>
- // TODO: check parameter types<br>
- UserClass* Meth = vm->upcalls->newMethod;<br>
- tmp = Meth->doNew(vm);<br>
- str = vm->internalUTF8ToStr(meth->name);<br>
- JavaObject * pArr = meth->getParameterTypes(classLoader);<br>
- JavaObject * eArr = meth->getExceptionTypes(classLoader);<br>
- JavaObject * retTy = meth->getReturnType(classLoader);<br>
- upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp,<br>
- &Cl, /* declaring class */<br>
- &str, /* name */<br>
- &pArr, /* parameter types */<br>
- &retTy, /* return type */<br>
- &eArr, /* exceptions */<br>
- meth->access, /* modifiers */<br>
- i, /* slot */<br>
- NULL, /* signature */<br>
- NULL, /* annotations */<br>
- NULL, /* parameter annotations */<br>
- NULL, /* default annotations */<br>
- i);<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
+ ret = Class_getDeclaredMethods(*(JavaObject**)ofClass, publicOnly);<br>
<br>
RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
<br>
@@ -1309,85 +1394,12 @@ JVM_GetClassDeclaredMethods(JNIEnv *env,<br>
jclass ofClass, jboolean publicOnly) {<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly) {<br>
ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
- JavaString* name = 0;<br>
- JavaObject*const* type = 0;<br>
- JavaString* sign = 0;<br>
- JavaObject* annArray = 0;<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
- llvm_gcroot(name, 0);<br>
- llvm_gcroot(type, 0);<br>
- llvm_gcroot(sign, 0);<br>
- llvm_gcroot(annArray, 0);<br>
<br>
BEGIN_JNI_EXCEPTION<br>
<br>
- JavaObject * Cl = *(JavaObject**)ofClass;<br>
- llvm_gcroot(Cl, 0);<br>
+ ret = Class_getDeclaredFields(*(JavaObject**)ofClass, publicOnly);<br>
<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-<br>
- if (!cl->isClass()) {<br>
- ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();<br>
- uint32 size = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
- ++i) {<br>
- JavaField* field = &realCl->virtualFields[i];<br>
- if (!publicOnly || isPublic(field->access)) {<br>
- ++size;<br>
- }<br>
- }<br>
-<br>
-<br>
- ret = (ArrayObject*)vm->upcalls->fieldArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualFields + realCl->nbStaticFields;<br>
- ++i) {<br>
- JavaField* field = &realCl->virtualFields[i];<br>
- if (!publicOnly || isPublic(field->access)) {<br>
- // TODO: check parameter types<br>
- UserClass* Field = vm->upcalls->newField;<br>
- tmp = Field->doNew(vm);<br>
- name = vm->internalUTF8ToStr(field->name);<br>
-<br>
- //type->Class<br>
- UserCommonClass * fieldCl =<br>
field->getSignature()->assocClass(cl->classLoader);<br>
- assert(fieldCl);<br>
- type = fieldCl->getClassDelegateePtr(vm);<br>
-<br>
- // TODO:Implement these!<br>
- sign = NULL;<br>
- annArray = NULL;<br>
-<br>
- //Convert to string<br>
-<br>
- /* java.reflect.Field(<br>
- * Class declaringClass,<br>
- * String name,<br>
- * Class type,<br>
- * int modifiers,<br>
- * int slot,<br>
- * String signature,<br>
- * byte[] annotations)<br>
- */<br>
- vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp,<br>
- &Cl,<br>
- &name,<br>
- type,<br>
- field->access,<br>
- i,<br>
- sign,<br>
- annArray);<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
<br>
END_JNI_EXCEPTION<br>
@@ -1398,62 +1410,11 @@ JVM_GetClassDeclaredFields(JNIEnv *env, jclass<br>
ofClass, jboolean publicOnly) {<br>
JNIEXPORT jobjectArray JNICALL<br>
JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass,<br>
jboolean publicOnly) {<br>
ArrayObject* ret = 0;<br>
- JavaObject* tmp = 0;<br>
- JavaObject* Cl = 0;<br>
- llvm_gcroot(Cl, 0);<br>
llvm_gcroot(ret, 0);<br>
- llvm_gcroot(tmp, 0);<br>
<br>
BEGIN_JNI_EXCEPTION<br>
<br>
- Cl = *(JavaObject**)ofClass;<br>
-<br>
- Jnjvm* vm = JavaThread::get()->getJVM();<br>
- UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, false);<br>
-<br>
- if (cl->isArray() || cl->isInterface() || cl->isPrimitive()) {<br>
- ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(0, vm);<br>
- } else {<br>
- UserClass* realCl = cl->asClass();;<br>
- JnjvmClassLoader* classLoader = cl->classLoader;<br>
- uint32 size = 0;<br>
-<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
- (!publicOnly || pub)) {<br>
- ++size;<br>
- }<br>
- }<br>
-<br>
- ret = (ArrayObject*)vm->upcalls->constructorArrayClass->doNew(size, vm);<br>
-<br>
- sint32 index = 0;<br>
- for (uint32 i = 0; i < realCl->nbVirtualMethods; ++i) {<br>
- JavaMethod* meth = &realCl->virtualMethods[i];<br>
- bool pub = isPublic(meth->access);<br>
- if (meth->name->equals(classLoader->bootstrapLoader->initName) &&<br>
- (!publicOnly || pub)) {<br>
- UserClass* Cons = vm->upcalls->newConstructor;<br>
- JavaObject * pArr = meth->getParameterTypes(classLoader);<br>
- JavaObject * eArr = meth->getExceptionTypes(classLoader);<br>
- tmp = Cons->doNew(vm);<br>
- vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp,<br>
- &Cl, /* declaringClass */<br>
- &pArr, /* parameterTypes */<br>
- &eArr, /* checkedExceptions */<br>
- meth->access, /* modifiers */<br>
- i, /* slot */<br>
- NULL, /* String signature */<br>
- NULL, /* annotations */<br>
- NULL /* parameterAnnotations */<br>
- );<br>
- ArrayObject::setElement(ret, tmp, index);<br>
- index++;<br>
- }<br>
- }<br>
- }<br>
+ ret = Class_getDeclaredConstructors(*(JavaObject**)ofClass, publicOnly);<br>
<br>
RETURN_FROM_JNI((jobjectArray)th->pushJNIRef(ret));<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.7.5.1<br>
</font></span><br>_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
<br></blockquote></div><br>