[vmkit-commits] [vmkit] r108831 - in /vmkit/trunk/lib: J3/Classpath/ClasspathReflect.h J3/Classpath/JavaUpcalls.cpp J3/VMCore/JavaClass.cpp J3/VMCore/VirtualTables.cpp Mvm/Runtime/Object.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Jul 20 06:01:41 PDT 2010
Author: geoffray
Date: Tue Jul 20 08:01:41 2010
New Revision: 108831
URL: http://llvm.org/viewvc/llvm-project?rev=108831&view=rev
Log:
Revert to r108827, J3 was crashing.
Modified:
vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
vmkit/trunk/lib/Mvm/Runtime/Object.cpp
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul 20 08:01:41 2010
@@ -210,12 +210,16 @@
llvm_gcroot(self, 0);
return &(self->referent);
}
-
static void setReferent(JavaObjectReference* self, JavaObject* r) {
llvm_gcroot(self, 0);
llvm_gcroot(r, 0);
self->referent = r;
}
+
+ static void staticTracer(JavaObjectReference* obj, uintptr_t closure) {
+ mvm::Collector::markAndTrace(obj, &obj->queue, closure);
+ mvm::Collector::markAndTrace(obj, &obj->nextOnQueue, closure);
+ }
};
}
Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul 20 08:01:41 2010
@@ -511,6 +511,11 @@
JavaObjectConstructor::staticTracer(obj, closure);
}
+extern "C" void nativeJavaObjectReferenceTracer(
+ JavaObjectReference* obj, uintptr_t closure) {
+ JavaObjectReference::staticTracer(obj, closure);
+}
+
extern "C" void nativeJavaObjectVMThreadTracer(
JavaObjectVMThread* obj, uintptr_t closure) {
JavaObjectVMThread::staticTracer(obj, closure);
@@ -521,9 +526,6 @@
JavaObjectVMThread::staticDestructor(obj);
}
-extern "C" void ObjectReferenceTracer(
- JavaObjectReference* obj, uintptr_t closure);
-
// Defined in Classpath/ClasspathVMClassLoader.cpp
extern "C" ArrayObject* nativeGetBootPackages();
@@ -1041,7 +1043,8 @@
newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
newReference->getVirtualVT()->setNativeTracer(
- (uintptr_t)ObjectReferenceTracer, "ObjectReferenceTracer");
+ (uintptr_t)nativeJavaObjectReferenceTracer,
+ "nativeJavaObjectReferenceTracer");
EnqueueReference =
UPCALL_METHOD(loader, "java/lang/ref/Reference", "enqueue", "()Z",
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Jul 20 08:01:41 2010
@@ -41,6 +41,7 @@
Class** ClassArray::InterfacesArray;
extern "C" void JavaArrayTracer(JavaObject*);
+extern "C" void JavaObjectTracer(JavaObject*);
extern "C" void ArrayObjectTracer(JavaObject*);
extern "C" void RegularObjectTracer(JavaObject*);
@@ -1476,7 +1477,7 @@
assert(C->super->virtualVT && "Super has no VT");
// Set the regular object tracer, destructor and delete.
- tracer = (uintptr_t)C->super->tracer;
+ tracer = (uintptr_t)RegularObjectTracer;
destructor = 0;
operatorDelete = 0;
@@ -1543,7 +1544,7 @@
} else {
// Set the tracer, destructor and delete.
- tracer = (uintptr_t)RegularObjectTracer;
+ tracer = (uintptr_t)JavaObjectTracer;
destructor = 0;
operatorDelete = 0;
Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Tue Jul 20 08:01:41 2010
@@ -20,7 +20,6 @@
//
//===----------------------------------------------------------------------===//
-#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
@@ -65,62 +64,25 @@
//===----------------------------------------------------------------------===//
// Trace methods for Java objects. There are four types of objects:
-// (1) Regular object: needs to trace the classloader, and all the virtual
-// fields.
-// (2) java.lang.ref.Reference objects: needs to trace the class loader and
-// all the virtual fields except the referent.
-// (3) Object whose class is an array of objects: needs to trace the class loader
-// and all elements in the array.
-// (4) Object whose class is a native array: nothing to trace. The
+// (1) Base object whose class is not an array: needs to trace the classloader
+// and the lock.
+// (1) Object whose class is not an array: needs to trace the classloader, the
+// lock and all the virtual fields.
+// (2) Object whose class is an array of objects: needs to trace root (1) and
+// all elements in the array.
+// (3) Object whose class is a native array: only needs to trace the lock. The
// classloader is the bootstrap loader and is traced by the JVM.
//===----------------------------------------------------------------------===//
-/// Method for scanning regular objects.
-extern "C" void RegularObjectTracer(JavaObject* obj, uintptr_t closure) {
- Class* cl = JavaObject::getClass(obj)->asClass();
- assert(cl && "Not a class in regular tracer");
- mvm::Collector::markAndTraceRoot(
- cl->classLoader->getJavaClassLoaderPtr(), closure);
-
- while (cl->super != 0) {
- for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
- JavaField& field = cl->virtualFields[i];
- if (field.isReference()) {
- JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
- mvm::Collector::markAndTrace(obj, ptr, closure);
- }
- }
- cl = cl->super;
- }
-}
-/// Method for scanning Java java.lang.ref.Reference objects.
-extern "C" void ObjectReferenceTracer(
- JavaObjectReference* obj, uintptr_t closure) {
- Class* cl = JavaObject::getClass(obj)->asClass();
- assert(cl && "Not a class in reference tracer");
+/// Method for scanning the root of an object.
+extern "C" void JavaObjectTracer(JavaObject* obj, uintptr_t closure) {
+ CommonClass* cl = JavaObject::getClass(obj);
+ assert(cl && "No class");
mvm::Collector::markAndTraceRoot(
cl->classLoader->getJavaClassLoaderPtr(), closure);
-
- bool found = false;
- while (cl->super != 0) {
- for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
- JavaField& field = cl->virtualFields[i];
- if (field.isReference()) {
- JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
- if (ptr != JavaObjectReference::getReferentPtr(obj)) {
- mvm::Collector::markAndTrace(obj, ptr, closure);
- } else {
- found = true;
- }
- }
- }
- cl = cl->super;
- }
- assert(found && "No referent in a reference");
}
-
/// Method for scanning an array whose elements are JavaObjects. This method is
/// called by all non-native Java arrays.
extern "C" void ArrayObjectTracer(ArrayObject* obj, uintptr_t closure) {
@@ -129,6 +91,7 @@
mvm::Collector::markAndTraceRoot(
cl->classLoader->getJavaClassLoaderPtr(), closure);
+
for (sint32 i = 0; i < ArrayObject::getSize(obj); i++) {
if (ArrayObject::getElement(obj, i) != NULL) {
mvm::Collector::markAndTrace(
@@ -143,6 +106,26 @@
extern "C" void JavaArrayTracer(JavaArray* obj, uintptr_t closure) {
}
+/// Method for scanning regular objects.
+extern "C" void RegularObjectTracer(JavaObject* obj, uintptr_t closure) {
+ Class* cl = JavaObject::getClass(obj)->asClass();
+ assert(cl && "Not a class in regular tracer");
+ mvm::Collector::markAndTraceRoot(
+ cl->classLoader->getJavaClassLoaderPtr(), closure);
+
+ while (cl->super != 0) {
+ for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
+ JavaField& field = cl->virtualFields[i];
+ if (field.isReference()) {
+ JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
+ mvm::Collector::markAndTrace(obj, ptr, closure);
+ }
+ }
+ cl = cl->super;
+ }
+}
+
+
//===----------------------------------------------------------------------===//
// Support for scanning Java objects referenced by classes. All classes must
// trace:
@@ -158,27 +141,25 @@
void CommonClass::tracer(uintptr_t closure) {
- if (super != NULL && super->classLoader != NULL) {
+ if (super && super->classLoader) {
JavaObject** Obj = super->classLoader->getJavaClassLoaderPtr();
if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
for (uint32 i = 0; i < nbInterfaces; ++i) {
- if (interfaces[i]->classLoader != NULL) {
+ if (interfaces[i]->classLoader) {
JavaObject** Obj = interfaces[i]->classLoader->getJavaClassLoaderPtr();
- if ((*Obj) != NULL) mvm::Collector::markAndTraceRoot(Obj, closure);
+ if (*Obj) mvm::Collector::markAndTraceRoot(Obj, closure);
}
}
}
- if (classLoader != NULL) {
+ if (classLoader)
mvm::Collector::markAndTraceRoot(
classLoader->getJavaClassLoaderPtr(), closure);
- }
for (uint32 i = 0; i < NR_ISOLATES; ++i) {
- if (delegatee[i] != NULL) {
- // TODO: remove the call to tracer until no j.l.Class are allocated
- // statically in AOT.
+ // If the delegatee was static allocated, we want to trace its fields.
+ if (delegatee[i]) {
delegatee[i]->tracer(closure);
mvm::Collector::markAndTraceRoot(delegatee + i, closure);
}
Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=108831&r1=108830&r2=108831&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Tue Jul 20 08:01:41 2010
@@ -202,14 +202,12 @@
gc* reference, VirtualMachine* vm, uintptr_t closure) {
if (!Collector::isLive(reference, closure)) {
vm->clearReferent(reference);
- return NULL;
+ return 0;
}
gc* referent = *(vm->getReferentPtr(reference));
- if (!referent) {
- return NULL;
- }
+ if (!referent) return 0;
if (semantics == SOFT) {
// TODO: are we are out of memory? Consider that we always are for now.
@@ -220,16 +218,16 @@
// Nothing to do.
}
- gc* newReference =
- mvm::Collector::getForwardedReference(reference, closure);
if (Collector::isLive(referent, closure)) {
gc* newReferent = mvm::Collector::getForwardedReferent(referent, closure);
+ gc* newReference =
+ mvm::Collector::getForwardedReference(reference, closure);
vm->setReferent(newReference, newReferent);
return newReference;
} else {
- vm->clearReferent(newReference);
- vm->addToEnqueue(newReference);
- return NULL;
+ vm->clearReferent(reference);
+ vm->addToEnqueue(reference);
+ return 0;
}
}
More information about the vmkit-commits
mailing list