[vmkit-commits] [vmkit] r70154 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaInitialise.cpp JavaObject.cpp JavaObject.h JnjvmClassLoader.cpp JnjvmClassLoader.h VirtualTables.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Apr 26 13:17:09 PDT 2009
Author: geoffray
Date: Sun Apr 26 15:17:09 2009
New Revision: 70154
URL: http://llvm.org/viewvc/llvm-project?rev=70154&view=rev
Log:
Control the VTs of native GC objects, namely VMClassLoader and LockObj.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Sun Apr 26 15:17:09 2009
@@ -23,32 +23,8 @@
using namespace jnjvm;
-static void initialiseVT() {
-
-# define INIT(X) { \
- X fake; \
- X::VT = ((VirtualTable**)(void*)(&fake))[0]; }
-
- INIT(LockObj);
- INIT(VMClassLoader);
-
- LockObj::VT->destructor = 0;
- LockObj::VT->operatorDelete = 0;
- VMClassLoader::VT->operatorDelete = VMClassLoader::VT->destructor;
-#ifdef ISOLATE_SHARING
- INIT(JnjvmSharedLoader);
- INIT(SharedClassByteMap);
- INIT(UserClass);
- INIT(UserClassArray);
- INIT(UserConstantPool);
-#endif
-#undef INIT
-
-}
-
#ifdef ISOLATE_SHARING
JnjvmClassLoader* mvm::VirtualMachine::initialiseJVM(JavaCompiler* Comp) {
- initialiseVT();
JnjvmSharedLoader::sharedLoader = JnjvmSharedLoader::createSharedLoader(Comp);
return JnjvmSharedLoader::sharedLoader;
}
@@ -65,7 +41,6 @@
JnjvmClassLoader*
mvm::VirtualMachine::initialiseJVM(JavaCompiler* Comp, bool dlLoad) {
- initialiseVT();
mvm::BumpPtrAllocator* A = new mvm::BumpPtrAllocator();
return new(*A) JnjvmBootstrapLoader(*A, Comp, dlLoad);
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Sun Apr 26 15:17:09 2009
@@ -70,7 +70,12 @@
#ifdef USE_GC_BOEHM
LockObj* res = new LockObj();
#else
- LockObj* res = gc_new(LockObj)();
+ LockObj* res = new(&VT) LockObj();
+ // Set the virtual table to change what C++ did: by using the new operator
+ // C++ after the allocation will set its own VT. Since we want to call
+ // the C++ constructor (because it initializes the native data structures
+ // such as LockRecursive), we have to change the VT of this object.
+ res->setVirtualTable(&VT);
#endif
return res;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sun Apr 26 15:17:09 2009
@@ -107,7 +107,7 @@
/// VT - LockObj is GC-allocated, so we must make the VT explicit.
///
- static VirtualTable* VT;
+ static VirtualTable VT;
~LockObj() {}
LockObj() {}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Apr 26 15:17:09 2009
@@ -777,7 +777,7 @@
if (!vmdata) {
mvm::BumpPtrAllocator* A = new mvm::BumpPtrAllocator();
JCL = new(*A) JnjvmClassLoader(*A, *vm->bootstrapLoader, loader, vm);
- vmdata = gc_new(VMClassLoader)(JCL);
+ vmdata = VMClassLoader::allocate(JCL);
(upcalls->vmdataClassLoader->setObjectField(loader, (JavaObject*)vmdata));
}
loader->release();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sun Apr 26 15:17:09 2009
@@ -399,24 +399,30 @@
public:
+ static VMClassLoader* allocate(JnjvmClassLoader* J) {
+ VMClassLoader* res =
+ (VMClassLoader*)gc::operator new(sizeof(VMClassLoader), &VT);
+ res->JCL = J;
+ return res;
+ }
+
/// VT - The VirtualTable for this GC-class.
- static VirtualTable* VT;
+ static VirtualTable VT;
/// TRACER - Trace the internal class loader.
- virtual void TRACER {
- JCL->CALL_TRACER;
+ static void STATIC_TRACER(VMClassLoader) {
+ obj->JCL->CALL_TRACER;
}
/// ~VMClassLoader - Delete the internal class loader.
///
- ~VMClassLoader() {
- if (JCL) JCL->~JnjvmClassLoader();
+ static void staticDestructor(VMClassLoader* obj) {
+ if (obj->JCL) obj->JCL->~JnjvmClassLoader();
}
/// VMClassLoader - Default constructors.
///
VMClassLoader(JnjvmClassLoader* J) : JCL(J) {}
- VMClassLoader() : JCL(0) {}
/// getClassLoader - Get the internal class loader.
///
Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=70154&r1=70153&r2=70154&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Apr 26 15:17:09 2009
@@ -57,12 +57,11 @@
// Classpath with the vmdata field).
//===----------------------------------------------------------------------===//
-#define INIT(X) VirtualTable* X::VT = 0
+VirtualTable VMClassLoader::VT((uintptr_t)VMClassLoader::staticDestructor,
+ (uintptr_t)VMClassLoader::staticDestructor,
+ (uintptr_t)VMClassLoader::staticTracer);
- INIT(LockObj);
- INIT(VMClassLoader);
-
-#undef INIT
+VirtualTable LockObj::VT(0, 0, (uintptr_t)VirtualTable::emptyTracer);
//===----------------------------------------------------------------------===//
// Empty tracer for static tracers of classes that do not declare static
More information about the vmkit-commits
mailing list