[vmkit-commits] [vmkit] r76550 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaObject.cpp JnjvmClassLoader.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Jul 21 01:38:58 PDT 2009
Author: geoffray
Date: Tue Jul 21 03:38:40 2009
New Revision: 76550
URL: http://llvm.org/viewvc/llvm-project?rev=76550&view=rev
Log:
Add llvm_gcroot's.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=76550&r1=76549&r2=76550&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Tue Jul 21 03:38:40 2009
@@ -19,6 +19,7 @@
using namespace jnjvm;
LockObj* LockObj::allocate(JavaObject* owner) {
+ llvm_gcroot(owner, 0);
#ifdef USE_GC_BOEHM
LockObj* res = new LockObj();
#else
@@ -34,9 +35,12 @@
}
void JavaObject::waitIntern(struct timeval* info, bool timed) {
+ LockObj* l = 0;
+ llvm_gcroot(this, 0);
+ llvm_gcroot(l, 0);
if (owner()) {
- LockObj * l = lock.changeToFatlock(this);
+ l = lock.changeToFatlock(this);
JavaThread* thread = JavaThread::get();
thread->waitsOn = l;
mvm::Cond& varcondThread = thread->varcond;
@@ -128,16 +132,22 @@
}
void JavaObject::wait() {
+ llvm_gcroot(this, 0);
waitIntern(0, false);
}
void JavaObject::timedWait(struct timeval& info) {
+ llvm_gcroot(this, 0);
waitIntern(&info, true);
}
void JavaObject::notify() {
+ LockObj* l = 0;
+ llvm_gcroot(this, 0);
+ llvm_gcroot(l, 0);
+
if (owner()) {
- LockObj * l = lock.getFatLock();
+ l = lock.getFatLock();
if (l) {
JavaThread* cur = l->firstThread;
if (cur) {
@@ -177,8 +187,12 @@
}
void JavaObject::notifyAll() {
+ LockObj* l = 0;
+ llvm_gcroot(this, 0);
+ llvm_gcroot(l, 0);
+
if (owner()) {
- LockObj * l = lock.getFatLock();
+ l = lock.getFatLock();
if (l) {
JavaThread* cur = l->firstThread;
if (cur) {
@@ -203,6 +217,8 @@
const Typedef* signature) {
JavaObject* obj = this;
+ llvm_gcroot(obj, 0);
+
if (!signature->isPrimitive()) {
if (obj && !(obj->getClass()->isOfTypeName(signature->getName()))) {
vm->illegalArgumentException("wrong type argument");
@@ -343,6 +359,8 @@
}
bool JavaObject::instanceOf(UserCommonClass* cl) {
+ llvm_gcroot(this, 0);
+
if (!this) return false;
else return this->getClass()->isAssignableFrom(cl);
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=76550&r1=76549&r2=76550&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jul 21 03:38:40 2009
@@ -341,6 +341,7 @@
char* buf = (char*)alloca(strLen + alen + 7);
sprintf(buf, "%s%s.class", str, asciiz);
+ // This array is not allocated by the GC.
res = Reader::openFile(this, buf);
if (res) return res;
}
@@ -351,6 +352,7 @@
ZipArchive* archive = *i;
char* buf = (char*)alloca(alen + 7);
sprintf(buf, "%s.class", asciiz);
+ // This array is not allocated by the GC.
res = Reader::openZip(this, archive, buf);
if (res) return res;
}
@@ -362,10 +364,13 @@
UserClass* JnjvmBootstrapLoader::internalLoad(const UTF8* name,
bool doResolve,
JavaString* strName) {
-
+
+ llvm_gcroot(strName, 0);
+
UserCommonClass* cl = lookupClass(name);
if (!cl) {
+ // This array is not allocated by the GC.
ArrayUInt8* bytes = openName(name);
if (bytes) {
cl = constructClass(name, bytes);
@@ -382,6 +387,10 @@
UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve,
JavaString* strName) {
+ JavaObject* obj = 0;
+ llvm_gcroot(strName, 0);
+ llvm_gcroot(obj, 0);
+
UserCommonClass* cl = lookupClass(name);
if (!cl) {
@@ -390,10 +399,8 @@
if (!strName) {
strName = JavaString::internalToJava(name, isolate);
}
- JavaObject* obj = (JavaObject*)
- upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
- javaLoader, strName,
- doResolve);
+ obj = upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
+ javaLoader, strName, doResolve);
cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass();
}
@@ -407,7 +414,8 @@
UserClass* JnjvmClassLoader::loadName(const UTF8* name, bool doResolve,
bool doThrow, JavaString* strName) {
-
+
+ llvm_gcroot(strName, 0);
UserClass* cl = internalLoad(name, doResolve, strName);
@@ -511,6 +519,8 @@
bool doResolve,
bool doThrow,
JavaString* strName) {
+ llvm_gcroot(strName, 0);
+
if (name->size == 0) {
return 0;
} else if (name->elements[0] == I_TAB) {
@@ -564,6 +574,8 @@
JnjvmClassLoader::loadClassFromJavaString(JavaString* str, bool doResolve,
bool doThrow) {
+ llvm_gcroot(str, 0);
+
UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
if (name) {
@@ -591,6 +603,8 @@
UserCommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str) {
+ llvm_gcroot(str, 0);
+
UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
if (name) {
name->size = str->count;
@@ -653,6 +667,9 @@
UserClass* JnjvmClassLoader::constructClass(const UTF8* name,
ArrayUInt8* bytes) {
+
+ // The array of bytes might be GC-allocated or malloc'd. Consider
+ // that this function can never be interrupted.
assert(bytes && "constructing a class without bytes");
classes->lock.lock();
ClassMap::iterator End = classes->map.end();
@@ -831,12 +848,17 @@
JnjvmClassLoader*
JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader, Jnjvm* vm) {
+ VMClassLoader* vmdata = 0
+
+ llvm_gcroot(loader, 0);
+ llvm_gcroot(vmdata, 0);
+
if (loader == 0)
return vm->bootstrapLoader;
JnjvmClassLoader* JCL = 0;
Classpath* upcalls = vm->bootstrapLoader->upcalls;
- VMClassLoader* vmdata =
+ vmdata =
(VMClassLoader*)(upcalls->vmdataClassLoader->getObjectField(loader));
if (!vmdata) {
More information about the vmkit-commits
mailing list