[vmkit-commits] [vmkit] r107643 - in /vmkit/trunk/lib/J3/Classpath: Classpath.inc ClasspathConstructor.inc ClasspathField.inc ClasspathMethod.inc ClasspathReflect.h ClasspathVMClass.inc ClasspathVMClassLoader.inc ClasspathVMStackWalker.inc ClasspathVMThread.inc ClasspathVMThrowable.inc JavaUpcalls.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Jul 5 22:59:04 PDT 2010
Author: geoffray
Date: Tue Jul 6 00:59:04 2010
New Revision: 107643
URL: http://llvm.org/viewvc/llvm-project?rev=107643&view=rev
Log:
Added some missing llvm_gcroot.
Also fixed a latent bug when initializaing the vmdata of the initial thread.
Modified:
vmkit/trunk/lib/J3/Classpath/Classpath.inc
vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
Modified: vmkit/trunk/lib/J3/Classpath/Classpath.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/Classpath.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/Classpath.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/Classpath.inc Tue Jul 6 00:59:04 2010
@@ -27,21 +27,21 @@
JNIEnv *env,
jclass clazz,
#endif
-jclass Cl) {
+JavaObject* Cl) {
+ llvm_gcroot(Cl, 0);
bool res = false;
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(Cl);
Jnjvm* vm = JavaThread::get()->getJVM();
- UserCommonClass* cl =
- UserCommonClass::resolvedImplClass(vm, (JavaObject*)Cl, true);
+ UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, Cl, true);
if (cl->isClass() &&
cl->asClass()->lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
vm->bootstrapLoader->clinitType,
true, false, 0))
- res = true;
+ res = true;
END_NATIVE_EXCEPTION
@@ -226,6 +226,7 @@
llvm_gcroot(res, 0);
llvm_gcroot(target, 0);
llvm_gcroot(constr, 0);
+ llvm_gcroot(cons, 0);
BEGIN_NATIVE_EXCEPTION(0)
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc Tue Jul 6 00:59:04 2010
@@ -96,7 +96,7 @@
if (isAbstract(cl->access)) vm->instantiationException(cl);
// Allocate a buffer to store the arguments.
- jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
+ jvalue* buf = size ? new jvalue[size] : NULL;
if (size) memset(buf, 0, size * sizeof(jvalue));
if (nbArgs == size) {
@@ -123,6 +123,7 @@
excp = th->getJavaException();
} END_CATCH;
if (excp) {
+ if (size) delete[] buf;
if (JavaObject::getClass(excp)->isAssignableFrom(vm->upcalls->newException)) {
th->clearException();
// If it's an exception, we encapsule it in an
@@ -135,12 +136,17 @@
return NULL;
}
} else {
+ if (size) delete[] buf;
vm->illegalArgumentException("class is not a regular class");
+ return NULL;
}
} else {
+ if (size) delete[] buf;
vm->illegalArgumentException("wrong number of arguments");
+ return NULL;
}
+ if (size) delete[] buf;
return res;
}
@@ -159,7 +165,6 @@
BEGIN_NATIVE_EXCEPTION(0)
- // Proceed in another function because we are using alloca.
res = proceedConstructor(cons, args, Clazz, index);
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathField.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathField.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathField.inc Tue Jul 6 00:59:04 2010
@@ -573,44 +573,37 @@
field->getInstanceInt8Field(obj);
res = vm->upcalls->boolClass->doNew(vm);
vm->upcalls->boolValue->setInstanceInt8Field(res, val);
- }
- else if (prim->isByte()) {
+ } else if (prim->isByte()) {
sint8 val = stat ? field->getStaticInt8Field() :
field->getInstanceInt8Field(obj);
res = vm->upcalls->byteClass->doNew(vm);
vm->upcalls->byteValue->setInstanceInt8Field(res, val);
- }
- else if (prim->isChar()) {
+ } else if (prim->isChar()) {
uint16 val = stat ? field->getStaticInt16Field() :
field->getInstanceInt16Field(obj);
res = vm->upcalls->charClass->doNew(vm);
vm->upcalls->charValue->setInstanceInt16Field(res, val);
- }
- else if (prim->isShort()) {
+ } else if (prim->isShort()) {
sint16 val = stat ? field->getStaticInt16Field() :
field->getInstanceInt16Field(obj);
res = vm->upcalls->shortClass->doNew(vm);
vm->upcalls->shortValue->setInstanceInt16Field(res, val);
- }
- else if (prim->isInt()) {
+ } else if (prim->isInt()) {
sint64 val = stat ? field->getStaticInt32Field() :
field->getInstanceInt32Field(obj);
res = vm->upcalls->intClass->doNew(vm);
vm->upcalls->intValue->setInstanceInt32Field(res, val);
- }
- else if (prim->isLong()) {
+ } else if (prim->isLong()) {
sint64 val = stat ? field->getStaticLongField() :
field->getInstanceLongField(obj);
res = vm->upcalls->longClass->doNew(vm);
vm->upcalls->longValue->setInstanceLongField(res, val);
- }
- else if (prim->isFloat()) {
+ } else if (prim->isFloat()) {
float val = stat ? field->getStaticFloatField() :
field->getInstanceFloatField(obj);
res = vm->upcalls->floatClass->doNew(vm);
vm->upcalls->floatValue->setInstanceFloatField(res, val);
- }
- else if (prim->isDouble()) {
+ } else if (prim->isDouble()) {
double val = stat ? field->getStaticDoubleField() :
field->getInstanceDoubleField(obj);
res = vm->upcalls->doubleClass->doNew(vm);
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc Tue Jul 6 00:59:04 2010
@@ -83,7 +83,7 @@
JavaMethod* meth = JavaObjectMethod::getInternalMethod(Meth);
JnjvmClassLoader* loader = cl->classLoader;
- res = (meth->getParameterTypes(loader));
+ res = meth->getParameterTypes(loader);
END_NATIVE_EXCEPTION
@@ -115,7 +115,7 @@
Signdef* sign = meth->getSignature();
sint32 size = sign->nbArguments;
- jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
+ jvalue* buf = size ? new jvalue[size] : 0;
if (size) memset(buf, 0, size * sizeof(jvalue));
if (nbArgs == size) {
@@ -167,6 +167,7 @@
exc = th->getJavaException(); \
} END_CATCH; \
if (exc) { \
+ if (size) delete[] buf; \
if (JavaObject::getClass(exc)->isAssignableFrom( \
vm->upcalls->newException)) { \
th->clearException(); \
@@ -229,10 +230,12 @@
RUN_METH(JavaObject, res);
}
} else {
+ if (size) delete[] buf;
vm->illegalArgumentException("wrong number of arguments");
return NULL;
}
+ if (size) delete[] buf;
return res;
}
@@ -253,7 +256,6 @@
BEGIN_NATIVE_EXCEPTION(0)
- // Create a new function because we use alloca.
res = proceedMethod(Meth, obj, args, Cl, index);
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul 6 00:59:04 2010
@@ -158,8 +158,10 @@
mvm::Collector::markAndTrace(obj, &obj->thread, closure);
}
- void setVmdata(JavaThread* internal_thread) {
- vmdata = internal_thread;
+ static void setVmdata(JavaObjectVMThread* vmthread,
+ JavaThread* internal_thread) {
+ llvm_gcroot(vmthread, 0);
+ vmthread->vmdata = internal_thread;
}
};
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc Tue Jul 6 00:59:04 2010
@@ -58,7 +58,7 @@
BEGIN_NATIVE_EXCEPTION(0)
verifyNull(str);
- Jnjvm* vm = JavaThread::get()->getJVM();
+ Jnjvm* vm = JavaThread::get()->getJVM();
JnjvmClassLoader* JCL =
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
UserCommonClass* cl = JCL->loadClassFromJavaString(str, true, false);
@@ -67,7 +67,7 @@
if (clinit && cl->asClass()) {
cl->asClass()->initialiseClass(vm);
}
- res =cl->getClassDelegatee(vm);
+ res = cl->getClassDelegatee(vm);
} else {
vm->classNotFoundException(str);
}
@@ -535,7 +535,6 @@
#endif
JavaObject* Cl, bool publicOnly) {
-
ArrayObject* result = 0;
llvm_gcroot(result, 0);
llvm_gcroot(Cl, 0);
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClassLoader.inc Tue Jul 6 00:59:04 2010
@@ -120,10 +120,13 @@
JavaObject* pd) {
JavaObject* res = 0;
+ JavaObject* excp = 0;
llvm_gcroot(loader, 0);
llvm_gcroot(str, 0);
llvm_gcroot(bytes, 0);
llvm_gcroot(pd, 0);
+ llvm_gcroot(res, 0);
+ llvm_gcroot(excp, 0);
BEGIN_NATIVE_EXCEPTION(0)
@@ -148,8 +151,8 @@
res = cl->getClassDelegatee(vm, pd);
} else {
- JavaObject* obj = vm->CreateLinkageError("duplicate class definition");
- JavaThread::get()->throwException(obj);
+ excp = vm->CreateLinkageError("duplicate class definition");
+ JavaThread::get()->throwException(excp);
}
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMStackWalker.inc Tue Jul 6 00:59:04 2010
@@ -39,21 +39,22 @@
Jnjvm* vm = th->getJVM();
uint32 length = th->getFrameContextLength();
- void** buffer = (void**)alloca(length * sizeof(void*));
+ uintptr_t* buffer = new uintptr_t[length];
- uint32 finalSize = th->getJavaFrameContext(buffer);
+ uint32 finalSize = th->getJavaFrameContext((void**)buffer);
result = (ArrayObject*)
vm->upcalls->stackTraceArray->doNew(finalSize, vm);
for (uint32 i = 0; i != finalSize; ++i) {
- JavaMethod* meth = (JavaMethod*)buffer[i];
+ JavaMethod* meth = ((JavaMethod**)buffer)[i];
assert(meth && "Wrong stack trace");
ArrayObject::setElement(result, meth->classDef->getClassDelegatee(vm), i);
}
+ delete[] buffer;
END_NATIVE_EXCEPTION
-
+
return result;
}
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThread.inc Tue Jul 6 00:59:04 2010
@@ -45,7 +45,7 @@
// which is the JavaThread object.
vmThread = (JavaObjectVMThread*)thread->vmThread;
assert(vmThread && "Didn't fix the vmThread of a j3 thread");
- vmThread->setVmdata(thread);
+ JavaObjectVMThread::setVmdata(vmThread, thread);
UserClass* vmthClass = (UserClass*)JavaObject::getClass(vmThread);
@@ -188,9 +188,10 @@
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
-JavaObject* vmthread, jobject exc) {
+JavaObject* vmthread, JavaObject* exc) {
// Currently not implemented
llvm_gcroot(vmthread, 0);
+ llvm_gcroot(exc, 0);
}
// Never throws.
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc Tue Jul 6 00:59:04 2010
@@ -28,22 +28,34 @@
JavaObject* internalFillInStackTrace(JavaObject* throwable) {
JavaObject* vmThrowable = 0;
+ ArrayPtr* result = 0;
llvm_gcroot(throwable, 0);
llvm_gcroot(vmThrowable, 0);
+ llvm_gcroot(result, 0);
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
uint32 length = th->getFrameContextLength();
- ClassArray* cl = sizeof(void*) == 4 ? vm->upcalls->ArrayOfInt :
- vm->upcalls->ArrayOfLong;
- JavaObject* result = (JavaObject*) cl->doNew(length, vm);
- void** tab = (void**)JavaArray::getElements(result);
-
- // Get the frame context.
- th->getFrameContext(tab);
+ if (sizeof(void*) == 4) {
+ ClassArray* cl = vm->upcalls->ArrayOfInt;
+ result = (ArrayPtr*) cl->doNew(length, vm);
+ } else {
+ ClassArray* cl = vm->upcalls->ArrayOfLong;
+ result = (ArrayPtr*) cl->doNew(length, vm);
+ }
+ // Don't call th->getFrameContext because it is not GC-safe.
+ mvm::StackWalker Walker(th);
+ uint32_t i = 0;
+
+ while (void* ip = *Walker) {
+ ArrayPtr::setElement(result, ip, i);
+ ++i;
+ ++Walker;
+ }
+
// Set the tempory data in the new VMThrowable object.
vmThrowable = vm->upcalls->newVMThrowable->doNew(vm);
vm->upcalls->vmDataVMThrowable->setInstanceObjectField(vmThrowable, result);
Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=107643&r1=107642&r2=107643&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul 6 00:59:04 2010
@@ -229,16 +229,17 @@
void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,
const char* thName, JavaObject* Group) {
- JavaObject* vmth = NULL;
+ JavaObjectVMThread* vmth = NULL;
JavaObject* th = NULL;
JavaObject* name = NULL;
llvm_gcroot(Group, 0);
llvm_gcroot(vmth, 0);
llvm_gcroot(th, 0);
+ llvm_gcroot(name, 0);
th = newThread->doNew(vm);
myth->javaThread = th;
- vmth = newVMThread->doNew(vm);
+ vmth = (JavaObjectVMThread*)newVMThread->doNew(vm);
name = vm->asciizToStr(thName);
threadName->setInstanceObjectField(th, name);
@@ -247,7 +248,7 @@
vmThread->setInstanceObjectField(th, vmth);
assocThread->setInstanceObjectField(vmth, th);
running->setInstanceInt8Field(vmth, (uint32)1);
- ((JavaObjectVMThread*)vmdataVMThread)->setVmdata(myth);
+ JavaObjectVMThread::setVmdata(vmth, myth);
group->setInstanceObjectField(th, Group);
groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);
@@ -422,7 +423,7 @@
extern "C" JavaObject* nativeGetCallingClassLoader() {
- JavaObject *res = 0;
+ JavaObject* res = 0;
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
@@ -437,7 +438,7 @@
}
extern "C" JavaObject* nativeFirstNonNullClassLoader() {
- JavaObject *res = 0;
+ JavaObject* res = 0;
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
@@ -452,7 +453,7 @@
extern "C" JavaObject* nativeGetCallerClass(uint32 index) {
- JavaObject *res = 0;
+ JavaObject* res = 0;
llvm_gcroot(res, 0);
BEGIN_NATIVE_EXCEPTION(0)
More information about the vmkit-commits
mailing list