[vmkit-commits] [vmkit] r72416 - in /vmkit/trunk/lib/JnJVM: Compiler/JnjvmModule.cpp VMCore/JavaArray.h VMCore/JavaClass.h VMCore/JavaObject.h VMCore/VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue May 26 07:46:41 PDT 2009
Author: geoffray
Date: Tue May 26 09:46:31 2009
New Revision: 72416
URL: http://llvm.org/viewvc/llvm-project?rev=72416&view=rev
Log:
Provide a universal tracer for Java objects.
Modified:
vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
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/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Tue May 26 09:46:31 2009
@@ -148,7 +148,7 @@
for (uint32 i = 0; i < nbFields; ++i) {
JavaField& cur = fields[i];
- if (cur.getSignature()->trace()) {
+ if (cur.isReference()) {
LLVMFieldInfo* LFI = getFieldInfo(&cur);
std::vector<Value*> args; //size = 2
args.push_back(zero);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Tue May 26 09:46:31 2009
@@ -65,11 +65,6 @@
static const unsigned int T_INT;
static const unsigned int T_LONG;
- /// tracer - The trace method of Java arrays of primitive types. Since their
- /// class lives throughout the lifetime of the application, there is no need
- /// to trace them. Therefore this trace function does nothing.
- virtual void TRACER;
-
};
/// Instantiation of the TJavaArray class for Java arrays of primitive types.
@@ -86,20 +81,10 @@
ARRAYCLASS(ArrayLong, sint64);
ARRAYCLASS(ArrayFloat, float);
ARRAYCLASS(ArrayDouble, double);
+ARRAYCLASS(ArrayObject, JavaObject*);
#undef ARRAYCLASS
-/// ArrayObject - Instantiation of the TJavaArray class for arrays of objects.
-/// Arrays of objects are different than arrays of primitive types because
-/// they have to trace all objects in the array.
-class ArrayObject : public TJavaArray<JavaObject*> {
-public:
- /// tracer - The tracer method of Java arrays of objects. This method will
- /// trace all objects in the array.
- virtual void TRACER;
-};
-
-
/// UTF8 - The UTF8 class is basically the ArrayUInt16 class (arrays of elements
/// of type uint16) with helper functions for manipulating UTF8. Each JVM
/// instance hashes UTF8. UTF8 are not allocated by the application's garbage
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue May 26 09:46:31 2009
@@ -1440,6 +1440,10 @@
return static_cast<Ty*>(JInfo);
}
+ bool isReference() {
+ uint16 val = type->elements[0];
+ return (val == 'L' || val == '[');
+ }
};
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Tue May 26 09:46:31 2009
@@ -194,9 +194,6 @@
if (obj == 0) JavaThread::get()->getJVM()->nullPointerException();
#endif
- virtual void TRACER;
-
-
/// lockObj - Get the LockObj if the lock is a fat lock.
LockObj* lockObj() {
return lock.getFatLock();
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=72416&r1=72415&r2=72416&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Tue May 26 09:46:31 2009
@@ -69,6 +69,7 @@
// Empty tracer for static tracers of classes that do not declare static
// variables.
//===----------------------------------------------------------------------===//
+
extern "C" void EmptyTracer(void*) {}
//===----------------------------------------------------------------------===//
@@ -81,44 +82,57 @@
// classloader is the bootstrap loader and is traced by the JVM.
//===----------------------------------------------------------------------===//
-
-/// Method for scanning the root of an object. This method is called by all
-/// JavObjects except native Java arrays.
-void JavaObject::tracer() {
- if (getClass()) getClass()->classLoader->getJavaClassLoader()->markAndTrace();
- LockObj* l = lockObj();
- if (l) l->markAndTrace();
-}
-
+/// Method for scanning the root of an object.
extern "C" void JavaObjectTracer(JavaObject* obj) {
- obj->JavaObject::tracer();
+ if (obj->getClass())
+ obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
+ LockObj* l = obj->lockObj();
+ if (l) l->markAndTrace();
}
/// Method for scanning an array whose elements are JavaObjects. This method is
/// called by all non-native Java arrays.
-void ArrayObject::tracer() {
- JavaObject::tracer();
- for (sint32 i = 0; i < size; i++) {
- if (elements[i]) elements[i]->MARK_AND_TRACE;
- }
-}
-
extern "C" void ArrayObjectTracer(ArrayObject* obj) {
- obj->ArrayObject::tracer();
+ if (obj->getClass())
+ obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
+ LockObj* l = obj->lockObj();
+ if (l) l->markAndTrace();
+ for (sint32 i = 0; i < obj->size; i++) {
+ if (obj->elements[i]) obj->elements[i]->MARK_AND_TRACE;
+ }
}
/// Method for scanning a native array. Only scan the lock. The classloader of
/// the class is the bootstrap loader and therefore does not need to be
/// scanned here.
-void JavaArray::tracer() {
- LockObj* l = lockObj();
+extern "C" void JavaArrayTracer(JavaArray* obj) {
+ LockObj* l = obj->lockObj();
if (l) l->markAndTrace();
}
-extern "C" void JavaArrayTracer(JavaArray* obj) {
- obj->JavaArray::tracer();
-}
+//===----------------------------------------------------------------------===//
+// Tracer for regular Java objects.
+//===----------------------------------------------------------------------===//
+extern "C" void RegularObjectTracer(JavaObject* obj) {
+ LockObj* l = obj->lockObj();
+ if (l) l->markAndTrace();
+
+ 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;
+ }
+}
//===----------------------------------------------------------------------===//
// Support for scanning Java objects referenced by classes. All classes must
More information about the vmkit-commits
mailing list