[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