[vmkit-commits] [vmkit] r73035 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathReflect.h VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaObject.h VMCore/VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jun 7 12:44:17 PDT 2009
Author: geoffray
Date: Sun Jun 7 14:44:16 2009
New Revision: 73035
URL: http://llvm.org/viewvc/llvm-project?rev=73035&view=rev
Log:
Now that the mark and trace function of GCMmap is not recursive,
we can put back a universal tracer. The next step is to remove
dynamic generation of per-class tracer.
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
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=73035&r1=73034&r2=73035&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Sun Jun 7 14:44:16 2009
@@ -18,7 +18,6 @@
#include <JavaObject.h>
extern "C" jnjvm::JavaObject* internalFillInStackTrace(jnjvm::JavaObject*);
-extern "C" void JavaObjectTracer(jnjvm::JavaObject*);
namespace jnjvm {
@@ -36,7 +35,7 @@
}
static void staticTracer(JavaObjectClass* obj) {
- JavaObjectTracer(obj);
+ obj->traceLock();
obj->pd->markAndTrace();
obj->signers->markAndTrace();
obj->constructor->markAndTrace();
@@ -57,7 +56,7 @@
public:
static void staticTracer(JavaObjectField* obj) {
- JavaObjectTracer(obj);
+ obj->traceLock();
obj->name->markAndTrace();
obj->declaringClass->markAndTrace();
}
@@ -82,7 +81,7 @@
public:
static void staticTracer(JavaObjectMethod* obj) {
- JavaObjectTracer(obj);
+ obj->traceLock();
obj->name->markAndTrace();
obj->declaringClass->markAndTrace();
}
@@ -105,7 +104,7 @@
public:
static void staticTracer(JavaObjectConstructor* obj) {
- JavaObjectTracer(obj);
+ obj->traceLock();
obj->clazz->markAndTrace();
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=73035&r1=73034&r2=73035&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sun Jun 7 14:44:16 2009
@@ -43,6 +43,7 @@
extern "C" void JavaArrayTracer(JavaObject*);
extern "C" void JavaObjectTracer(JavaObject*);
extern "C" void ArrayObjectTracer(JavaObject*);
+extern "C" void RegularObjectTracer(JavaObject*);
Attribut::Attribut(const UTF8* name, uint32 length,
uint32 offset) {
@@ -1250,6 +1251,12 @@
JavaVirtualTable::JavaVirtualTable(Class* C) {
if (C->super) {
+
+ // Set the regular object tracer, destructor and delete.
+ tracer = (uintptr_t)RegularObjectTracer;
+ destructor = 0;
+ operatorDelete = 0;
+
// Set the class of this VT.
cl = C;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=73035&r1=73034&r2=73035&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Jun 7 14:44:16 2009
@@ -1297,6 +1297,11 @@
}
+ bool isReference() {
+ uint16 val = type->elements[0];
+ return (val == '[' || val == 'L');
+ }
+
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=73035&r1=73034&r2=73035&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sun Jun 7 14:44:16 2009
@@ -364,6 +364,10 @@
///
void decapsulePrimitive(Jnjvm* vm, uintptr_t &buf, const Typedef* signature);
+ void traceLock() {
+ LockObj* l = lockObj();
+ if (l) l->markAndTrace();
+ }
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=73035&r1=73034&r2=73035&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Jun 7 14:44:16 2009
@@ -13,15 +13,13 @@
//
// The file is divided into four parts:
// (1) Declaration of internal GC classes.
-// (2) Tracing roots of objects: regular object, native array, object array.
+// (2) Tracing Java objects: regular object, native array, object array.
// (3) Tracing a class loader, which involves tracing the Java objects
// referenced by classes.
// (4) Tracing the roots of a program: the JVM and the threads.
//
//===----------------------------------------------------------------------===//
-#include "mvm/Object.h"
-
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
@@ -69,12 +67,15 @@
// Empty tracer for static tracers of classes that do not declare static
// variables.
//===----------------------------------------------------------------------===//
+
extern "C" void EmptyTracer(void*) {}
//===----------------------------------------------------------------------===//
-// Root trace methods for Java objects. There are three types of roots:
-// (1) Object whose class is not an array: needs to trace the classloader and
-// the lock.
+// Trace methods for Java objects. There are four types of objects:
+// (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
@@ -82,22 +83,25 @@
//===----------------------------------------------------------------------===//
-/// Method for scanning the root of an object. This method is called by all
-/// JavObjects except native Java arrays.
+/// Method for scanning the root of an object.
extern "C" void JavaObjectTracer(JavaObject* obj) {
- if (obj->getClass())
- obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
- LockObj* l = obj->lockObj();
- if (l) l->markAndTrace();
+ obj->traceLock();
+
+ CommonClass* cl = obj->getClass();
+ assert(cl && "No class");
+ cl->classLoader->getJavaClassLoader()->markAndTrace();
}
/// 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) {
- if (obj->getClass())
- obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
- LockObj* l = obj->lockObj();
- if (l) l->markAndTrace();
+ obj->traceLock();
+
+ CommonClass* cl = obj->getClass();
+ assert(cl && "No class");
+ cl->classLoader->getJavaClassLoader()->markAndTrace();
+
+
for (sint32 i = 0; i < obj->size; i++) {
if (obj->elements[i]) obj->elements[i]->markAndTrace();
}
@@ -107,8 +111,27 @@
/// the class is the bootstrap loader and therefore does not need to be
/// scanned here.
extern "C" void JavaArrayTracer(JavaArray* obj) {
- LockObj* l = obj->lockObj();
- if (l) l->markAndTrace();
+ obj->traceLock();
+}
+
+/// Method for scanning regular objects.
+extern "C" void RegularObjectTracer(JavaObject* obj) {
+ obj->traceLock();
+
+ Class* cl = obj->getClass()->asClass();
+ assert(cl && "Not a class in regular tracer");
+ cl->classLoader->getJavaClassLoader()->markAndTrace();
+
+ while (cl->super != 0) {
+ 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;
+ }
}
@@ -156,7 +179,13 @@
for (uint32 i =0; i < NR_ISOLATES; ++i) {
TaskClassMirror &M = IsolateInfo[i];
if (M.staticInstance && staticTracer != EmptyTracer) {
- staticTracer(M.staticInstance);
+ for (uint32 i = 0; i < nbStaticFields; ++i) {
+ JavaField& field = staticFields[i];
+ if (field.isReference()) {
+ JavaObject* ptr = field.getObjectField(M.staticInstance);
+ ptr->markAndTrace();
+ }
+ }
}
}
}
More information about the vmkit-commits
mailing list