[vmkit-commits] [vmkit] r60345 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaString.cpp JavaString.h Jnjvm.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Dec 1 01:02:49 PST 2008
Author: geoffray
Date: Mon Dec 1 03:02:47 2008
New Revision: 60345
URL: http://llvm.org/viewvc/llvm-project?rev=60345&view=rev
Log:
Create a new VT for vm-allocated Strings, so that these
strings have a detructor. Strings allocated by the application
do not have a destructor.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaString.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=60345&r1=60344&r2=60345&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Mon Dec 1 03:02:47 2008
@@ -17,10 +17,15 @@
using namespace jnjvm;
+VirtualTable* JavaString::internStringVT = 0;
JavaString* JavaString::stringDup(const UTF8*& utf8, Jnjvm* vm) {
UserClass* cl = vm->upcalls->newString;
JavaString* res = (JavaString*)cl->doNew(vm);
+
+ // It's a hashed string, set the destructor so that the string
+ // removes itself from the vm string map.
+ res->setVirtualTable(internStringVT);
// No need to call the Java function: both the Java function and
// this function do the same thing.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.h?rev=60345&r1=60344&r2=60345&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.h Mon Dec 1 03:02:47 2008
@@ -32,6 +32,8 @@
static void stringDestructor(JavaString*);
char* strToAsciiz();
const UTF8* strToUTF8(Jnjvm* vm);
+
+ static VirtualTable* internStringVT;
};
} // end namespace jnjvm
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=60345&r1=60344&r2=60345&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon Dec 1 03:02:47 2008
@@ -745,18 +745,24 @@
cl->initialiseClass(this);
// If a string belongs to the vm hashmap, we must remove it when
- // it's destroyed. So we change the destructor of java.lang.String
- // to perform this action.
- LOAD_CLASS(upcalls->newString);
- uintptr_t* ptr = ((uintptr_t*)upcalls->newString->getVirtualVT());
- ptr[VT_DESTRUCTOR_OFFSET] = (uintptr_t)JavaString::stringDestructor;
-
+ // it's destroyed. So we define a new VT for strings that will be
+ // placed in the hashmap. This VT will have its destructor set so
+ // that the string is removed when deallocated.
+ upcalls->newString->resolveClass();
+ void* stringVT = ((void*)upcalls->newString->getVirtualVT());
+ uint32 size = upcalls->newString->virtualTableSize * sizeof(void*);
+ JavaString::internStringVT = bootstrapLoader->allocator.Allocate(size);
+ memcpy(JavaString::internStringVT, stringVT, size);
+ ((void**)(JavaString::internStringVT))[VT_DESTRUCTOR_OFFSET] =
+ (void*)(uintptr_t)JavaString::stringDestructor;
+ upcalls->newString->initialiseClass(this);
+
// To make classes non GC-allocated, we have to bypass the tracer
// functions of java.lang.Class, java.lang.reflect.Field,
// java.lang.reflect.Method and java.lang.reflect.constructor. The new
// tracer functions trace the classloader instead of the class/field/method.
LOAD_CLASS(upcalls->newClass);
- ptr = ((uintptr_t*)upcalls->newClass->getVirtualVT());
+ uintptr_t* ptr = ((uintptr_t*)upcalls->newClass->getVirtualVT());
ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectClass::staticTracer;
LOAD_CLASS(upcalls->newConstructor);
More information about the vmkit-commits
mailing list