[vmkit-commits] [vmkit] r72522 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathReflect.h VMCore/JavaClass.cpp VMCore/JavaUpcalls.cpp VMCore/VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu May 28 03:43:24 PDT 2009
Author: geoffray
Date: Thu May 28 05:43:06 2009
New Revision: 72522
URL: http://llvm.org/viewvc/llvm-project?rev=72522&view=rev
Log:
Classes that inherit java.lang.ref.Reference have a special tracer.
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=72522&r1=72521&r2=72522&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Thu May 28 05:43:06 2009
@@ -167,11 +167,7 @@
JavaObject* getReferent() const { return referent; }
void setReferent(JavaObject* r) { referent = r; }
-
- static void STATIC_TRACER(JavaObjectReference) {
- obj->queue->MARK_AND_TRACE;
- obj->nextOnQueue->MARK_AND_TRACE;
- }
+
};
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=72522&r1=72521&r2=72522&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu May 28 05:43:06 2009
@@ -40,9 +40,10 @@
Class* ClassArray::SuperArray;
Class** ClassArray::InterfacesArray;
+extern "C" void ArrayObjectTracer(JavaObject*);
extern "C" void JavaArrayTracer(JavaObject*);
extern "C" void JavaObjectTracer(JavaObject*);
-extern "C" void ArrayObjectTracer(JavaObject*);
+extern "C" void ReferenceObjectTracer(JavaObject*);
extern "C" void RegularObjectTracer(JavaObject*);
Attribut::Attribut(const UTF8* name, uint32 length,
@@ -1253,7 +1254,6 @@
if (C->super) {
// Set the class of this VT.
cl = C;
- tracer = (uintptr_t)RegularObjectTracer;
// Set depth and display for fast dynamic type checking.
JavaVirtualTable* superVT = C->super->virtualVT;
@@ -1311,6 +1311,15 @@
sizeof(JavaVirtualTable*) * cur->nbSecondaryTypes);
lastIndex += cur->nbSecondaryTypes;
}
+
+ JnjvmClassLoader* JCL = cl->classLoader;
+ Classpath* upcalls = JCL->bootstrapLoader->upcalls;
+ Class* ref = upcalls->newReference;
+ if (ref && display[1] == ref->virtualVT) {
+ tracer = (uintptr_t)ReferenceObjectTracer;
+ } else {
+ tracer = (uintptr_t)RegularObjectTracer;
+ }
} else {
// Set the tracer, destructor and delete
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=72522&r1=72521&r2=72522&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu May 28 05:43:06 2009
@@ -404,10 +404,6 @@
JavaObjectConstructor::staticTracer(obj);
}
-extern "C" void nativeJavaObjectReferenceTracer(JavaObjectReference* obj) {
- JavaObjectReference::staticTracer(obj);
-}
-
extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
JavaObjectVMThread::staticDestructor(obj);
}
@@ -415,6 +411,8 @@
// Defined in Classpath/ClasspathVMClassLoader.cpp
extern "C" ArrayObject* nativeGetBootPackages();
+extern "C" void ReferenceObjectTracer(JavaObject*);
+
void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
newClassLoader =
@@ -885,11 +883,11 @@
newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
-
- newReference->getVirtualVT()->setNativeTracer(
- (uintptr_t)nativeJavaObjectReferenceTracer,
- "nativeJavaObjectReferenceTracer");
+ newReference->getVirtualVT()->setNativeTracer(
+ (uintptr_t)ReferenceObjectTracer,
+ "ReferenceObjectTracer");
+
EnqueueReference =
UPCALL_METHOD(loader, "java/lang/ref/Reference", "enqueue", "()Z",
ACC_VIRTUAL);
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=72522&r1=72521&r2=72522&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Thu May 28 05:43:06 2009
@@ -134,6 +134,36 @@
}
}
+extern "C" void ReferenceObjectTracer(JavaObject* obj) {
+ LockObj* l = obj->lockObj();
+ if (l) l->markAndTrace();
+
+ Class* cl = obj->getClass()->asClass();
+ assert(cl && "Not a class in reference tracer");
+ cl->classLoader->getJavaClassLoader()->markAndTrace();
+ Classpath* upcalls = cl->classLoader->bootstrapLoader->upcalls;
+
+
+ while (cl != upcalls->newReference) {
+ for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
+ JavaField& field = cl->virtualFields[i];
+ if (field.isReference()) {
+ JavaObject* ptr = field.getObjectField(obj);
+ ptr->markAndTrace();
+ }
+ }
+ cl = cl->super;
+ }
+
+ for (uint32 i = 1; i < cl->nbVirtualFields; ++i) {
+ JavaField& field = cl->virtualFields[i];
+ if (field.isReference()) {
+ JavaObject* ptr = field.getObjectField(obj);
+ ptr->markAndTrace();
+ }
+ }
+}
+
//===----------------------------------------------------------------------===//
// Support for scanning Java objects referenced by classes. All classes must
// trace:
More information about the vmkit-commits
mailing list