[vmkit-commits] [vmkit] r145687 - in /vmkit/trunk/lib/j3: ClassLib/GNUClasspath/JavaUpcalls.cpp ClassLib/GNUClasspath/JavaUpcalls.h Compiler/JavaAOTCompiler.cpp VMCore/JavaString.cpp VMCore/JavaString.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h VMCore/LockedMap.cpp VMCore/LockedMap.h VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Dec 2 09:52:24 PST 2011


Author: geoffray
Date: Fri Dec  2 11:52:23 2011
New Revision: 145687

URL: http://llvm.org/viewvc/llvm-project?rev=145687&view=rev
Log:
Use VMString.intern to intern strings, instead of using our own ad-hoc c++ weak reference.


Removed:
    vmkit/trunk/lib/j3/VMCore/LockedMap.cpp
Modified:
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
    vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/j3/VMCore/JavaString.cpp
    vmkit/trunk/lib/j3/VMCore/JavaString.h
    vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/j3/VMCore/Jnjvm.h
    vmkit/trunk/lib/j3/VMCore/LockedMap.h
    vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.cpp Fri Dec  2 11:52:23 2011
@@ -94,6 +94,7 @@
 JavaMethod* Classpath::InitDirectByteBuffer;
 Class*      Classpath::newClassLoader;
 Class*      Classpath::cloneableClass;
+JavaMethod* Classpath::internString;
 
 
 JavaField*  Classpath::boolValue;
@@ -377,27 +378,6 @@
   END_NATIVE_EXCEPTION
 }
 
-extern "C" JavaString* Java_java_lang_VMString_intern__Ljava_lang_String_2(
-    JavaString* obj) {
-  const ArrayUInt16* array = 0;
-  JavaString* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(array, 0);
-  llvm_gcroot(res, 0);
-  // If the string is already interned, just return.
-  if (obj->getVirtualTable() == JavaString::internStringVT) return obj;
-  
-  BEGIN_NATIVE_EXCEPTION(0)
-  
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  array = JavaString::strToArray(obj, vm);
-  res = vm->constructString(array);
-  
-  END_NATIVE_EXCEPTION
-
-  return res;
-}
-
 extern "C" uint8 Java_java_lang_Class_isArray__(JavaObjectClass* klass) {
   llvm_gcroot(klass, 0);
   UserCommonClass* cl = 0;
@@ -742,10 +722,9 @@
     UPCALL_METHOD(loader, "java/lang/ClassLoader", "loadClass",
                   "(Ljava/lang/String;)Ljava/lang/Class;", ACC_VIRTUAL);
 
-  JavaMethod* internString =
+  internString =
     UPCALL_METHOD(loader, "java/lang/VMString", "intern",
                   "(Ljava/lang/String;)Ljava/lang/String;", ACC_STATIC); 
-  internString->setNative();
   
   JavaMethod* isArray =
     UPCALL_METHOD(loader, "java/lang/Class", "isArray", "()Z", ACC_VIRTUAL);

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/JavaUpcalls.h Fri Dec  2 11:52:23 2011
@@ -155,6 +155,7 @@
   ISOLATE_STATIC JavaMethod* getUncaughtExceptionHandler;
   ISOLATE_STATIC JavaMethod* uncaughtException;
   ISOLATE_STATIC UserClass*  inheritableThreadLocal;
+  ISOLATE_STATIC JavaMethod* internString;
   
 
   ISOLATE_STATIC UserClass* InvocationTargetException;

Modified: vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp Fri Dec  2 11:52:23 2011
@@ -2210,6 +2210,10 @@
       }
       bootstrapLoader->setCompiler(M);
     }
+
+    // We don't want strings to be interned when AOT'ing, otherwise
+    // we would call Java code.
+    bootstrapLoader->upcalls->internString = NULL;
    
     // Set the thread as the owner of the classes, so that it knows it
     // has to compile them. 

Modified: vmkit/trunk/lib/j3/VMCore/JavaString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.cpp Fri Dec  2 11:52:23 2011
@@ -13,27 +13,18 @@
 #include "JavaThread.h"
 #include "JavaUpcalls.h"
 #include "Jnjvm.h"
-#include "LockedMap.h"
 
-using namespace j3;
+namespace j3 {
 
-JavaVirtualTable* JavaString::internStringVT = 0;
-
-JavaString* JavaString::stringDup(const ArrayUInt16 *const& _array, Jnjvm* vm) {
+JavaString* JavaString::create(const ArrayUInt16 * array, Jnjvm* vm) {
   
   JavaString* res = 0;
-  const ArrayUInt16* array = _array;
   llvm_gcroot(array, 0);
   llvm_gcroot(res, 0);
 
   UserClass* cl = vm->upcalls->newString;
   res = (JavaString*)cl->doNew(vm);
   
-  // It's a hashed string, set the destructor so that the string
-  // removes itself from the vm string map. Do this only if
-  // internStringVT exists (in case of AOT).
-  if (internStringVT) res->setVirtualTable(internStringVT);
-
   // No need to call the Java function: both the Java function and
   // this function do the same thing.
   JavaString::setValue(res, array);
@@ -91,17 +82,6 @@
   }
 }
 
-void JavaString::stringDestructor(JavaString* str) {
-  const ArrayUInt16* value = NULL;
-  llvm_gcroot(str, 0);
-  llvm_gcroot(value, 0);
-  value = JavaString::getValue(str);
-  
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  assert(vm && "No vm when destroying a string");
-  if (value != NULL) vm->hashStr.removeUnlocked(value, str);
-}
-
 JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) {
   
   ArrayUInt16* array = 0;
@@ -139,3 +119,5 @@
   const UTF8* res = map->lookupOrCreateReader(java, self->count);
   return res;
 }
+
+}

Modified: vmkit/trunk/lib/j3/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaString.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaString.h Fri Dec  2 11:52:23 2011
@@ -47,7 +47,7 @@
     return self->value;
   }
   
-  static JavaString* stringDup(const ArrayUInt16 *const & array, Jnjvm* vm);
+  static JavaString* create(const ArrayUInt16 * array, Jnjvm* vm);
 
   /// internalToJava - Creates a copy of the UTF8 at its given offset and size
   /// with all its '.' replaced by '/'. The JVM bytecode reference classes in
@@ -56,15 +56,12 @@
   ///
   static JavaString* internalToJava(const UTF8* utf8, Jnjvm* vm);
 
-  static void stringDestructor(JavaString*);
   static char* strToAsciiz(JavaString* self);
   static char* strToAsciiz(JavaString* self, vmkit::ThreadAllocator* allocator);
   static const ArrayUInt16* strToArray(JavaString* self, Jnjvm* vm);
 
   /// javaToInternal - Replaces all '/' into '.'.
   static const UTF8* javaToInternal(const JavaString* self, UTF8Map* map);
-
-  static JavaVirtualTable* internStringVT;
 };
 
 } // end namespace j3

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Fri Dec  2 11:52:23 2011
@@ -733,17 +733,21 @@
   for (uint32 i = 0; i < size; i++) {
     ArrayUInt16::setElement(tmp, utf8->elements[i], i);
   }
-  
-  return hashStr.lookupOrCreate(const_cast<const ArrayUInt16*&>(tmp), this,
-                                JavaString::stringDup);
+
+  return constructString(tmp);
 }
 
 JavaString* Jnjvm::constructString(const ArrayUInt16* array) { 
-  JavaString* res = NULL;
+  JavaString* key = NULL;
   llvm_gcroot(array, 0);
-  llvm_gcroot(res, 0);
-  res = hashStr.lookupOrCreate(array, this, JavaString::stringDup);
-  return res;
+  llvm_gcroot(key, 0);
+  key = JavaString::create(array, this);
+  if (upcalls->internString) {
+    return (JavaString*)upcalls->internString->invokeJavaObjectStatic(
+        this, upcalls->internString->classDef, &key);
+  } else {
+    return key;
+  }
 }
 
 JavaString* Jnjvm::asciizToStr(const char* asciiz) {
@@ -1085,28 +1089,7 @@
   cl->resolveClass(); \
   cl->initialiseClass(this);
   
-  // If a string belongs to the vm hashmap, we must remove it when
-  // 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();
-  if (JavaString::internStringVT == NULL) {
-    JavaVirtualTable* stringVT = upcalls->newString->getVirtualVT();
-    uint32 size = upcalls->newString->virtualTableSize * sizeof(word_t);
-    
-    JavaString::internStringVT = 
-      (JavaVirtualTable*)bootstrapLoader->allocator.Allocate(size, "String VT");
-
-    memcpy(JavaString::internStringVT, stringVT, size);
-    
-    JavaString::internStringVT->destructor = 
-      (word_t)JavaString::stringDestructor;
-
-    // Tell the finalizer that this is a native destructor.
-    JavaString::internStringVT->operatorDelete = 
-      (word_t)JavaString::stringDestructor;
-  }
-  upcalls->newString->initialiseClass(this);
+  LOAD_CLASS(upcalls->newString);
 
   // The initialization code of the classes initialized below may require
   // to get the Java thread, so we create the Java thread object first.

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Fri Dec  2 11:52:23 2011
@@ -28,6 +28,7 @@
 namespace j3 {
 
 class ArrayObject;
+class ArrayUInt16;
 class Classpath;
 class CommonClass;
 class FinalizerThread;
@@ -243,10 +244,6 @@
   ///
   JnjvmClassLoader* appClassLoader;
 
-  /// hashStr - Hash map of java/lang/String objects allocated by this JVM.
-  ///
-  StringMap hashStr;
- 
 public:
   
   /// CreateExceptions - These are the runtime exceptions thrown by Java code

Removed: vmkit/trunk/lib/j3/VMCore/LockedMap.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/LockedMap.cpp?rev=145686&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/LockedMap.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/LockedMap.cpp (removed)
@@ -1,40 +0,0 @@
-//===------- LockedMap.cpp - Implementation of the UTF8 map ---------------===//
-//
-//                            The VMKit project
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include <map>
-
-#include "JavaArray.h"
-#include "JavaString.h"
-#include "LockedMap.h"
-
-namespace j3 {
-
-bool ltarray16::operator()(const ArrayUInt16* s1, const ArrayUInt16* s2) const {
-  llvm_gcroot(s1, 0);
-  llvm_gcroot(s2, 0);
-  if (ArrayUInt16::getSize(s1) < ArrayUInt16::getSize(s2)) return true;
-  else if (ArrayUInt16::getSize(s1) > ArrayUInt16::getSize(s2)) return false;
-  else return memcmp((const char*)ArrayUInt16::getElements(s1),
-                     (const char*)ArrayUInt16::getElements(s2),
-                     ArrayUInt16::getSize(s1) * sizeof(uint16)) < 0;
-}
-
-void StringMap::insert(JavaString* str) {
-  const ArrayUInt16* array = NULL;
-  llvm_gcroot(str, 0);
-  llvm_gcroot(array, 0);
-  array = JavaString::getValue(str);
-  StringMap::iterator it = map.insert(std::make_pair(array, str)).first;
-  assert(map.find(array)->second == str);
-  assert(map.find(array)->first == array);
-  assert(&(map.find(array)->second) == &(it->second));
-  assert(&(map.find(array)->first) == &(it->first));
-}
-
-}

Modified: vmkit/trunk/lib/j3/VMCore/LockedMap.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/LockedMap.h?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/j3/VMCore/LockedMap.h Fri Dec  2 11:52:23 2011
@@ -30,83 +30,9 @@
 
 namespace j3 {
 
-class ArrayUInt16;
-class JavaString;
-class JnjvmClassLoader;
 class Signdef;
 class Typedef;
 class UserCommonClass;
-class UserClassArray;
-
-struct ltarray16 {
-  bool operator()(const ArrayUInt16 *const s1, const ArrayUInt16 *const s2) const;
-};
-
-class StringMap : public vmkit::PermanentObject {
-public:
-  typedef std::map<const ArrayUInt16 *const, JavaString*, ltarray16>::iterator iterator;
-  typedef JavaString* (*funcCreate)(const ArrayUInt16 *const& V, Jnjvm* vm);
-
-  vmkit::LockNormal lock;
-  std::map<const ArrayUInt16 *const, JavaString*, ltarray16,
-           std::allocator<std::pair<const ArrayUInt16 *const, JavaString*> > > map;
-  
-  inline JavaString* lookupOrCreate(const ArrayUInt16 *const array, Jnjvm* vm, funcCreate func) {
-    JavaString* res = 0;
-    llvm_gcroot(res, 0);
-    llvm_gcroot(array, 0);
-    lock.lock();
-    iterator End = map.end();
-    iterator I = map.find(array);
-    if (I == End) {
-      res = func(array, vm);
-      map.insert(std::make_pair(array, res));
-      lock.unlock();
-      return res;
-    } else {
-      lock.unlock();
-      return ((JavaString*)(I->second));
-    }
-  }
-  
-  inline void remove(const ArrayUInt16 *const array) {
-    llvm_gcroot(array, 0);
-    lock.lock();
-    map.erase(array);
-    lock.unlock();
-  }
-
-  inline JavaString* lookup(const ArrayUInt16 *const array) {
-    llvm_gcroot(array, 0);
-    lock.lock();
-    iterator End = map.end();
-    iterator I = map.find(array);
-    lock.unlock();
-    return I != End ? ((JavaString*)(I->second)) : 0; 
-  }
-
-  inline void hash(const ArrayUInt16 *const array, JavaString* str) {
-    llvm_gcroot(array, 0);
-    llvm_gcroot(str, 0);
-    lock.lock();
-    map.insert(std::make_pair(array, str));
-    lock.unlock();
-  }
-
-  inline void removeUnlocked(const ArrayUInt16 *const array, JavaString* str) {
-    llvm_gcroot(str, 0);
-    llvm_gcroot(array, 0);
-    iterator End = map.end();
-    iterator I = map.find(array);
-
-    if (I != End && I->second == str) map.erase(I); 
-  }
-
-  ~StringMap() {}
-
-  void insert(JavaString* str);
-};
-
 
 class ClassMap : public vmkit::PermanentObject {
 public:

Modified: vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp?rev=145687&r1=145686&r2=145687&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp Fri Dec  2 11:52:23 2011
@@ -284,26 +284,17 @@
     start = start->next;
   }
   
-  // (4) Trace the interned strings.
-  for (StringMap::iterator i = hashStr.map.begin(), e = hashStr.map.end();
-       i!= e; ++i) {
-    JavaString** str = &(i->second);
-    vmkit::Collector::markAndTraceRoot(str, closure);
-    ArrayUInt16** key = const_cast<ArrayUInt16**>(&(i->first));
-    vmkit::Collector::markAndTraceRoot(key, closure);
-  }
-
-  // (5) Trace the finalization queue.
+  // (4) Trace the finalization queue.
   for (uint32 i = 0; i < finalizerThread->CurrentFinalizedIndex; ++i) {
     vmkit::Collector::markAndTraceRoot(finalizerThread->ToBeFinalized + i, closure);
   }
   
-  // (6) Trace the reference queue
+  // (5) Trace the reference queue
   for (uint32 i = 0; i < referenceThread->ToEnqueueIndex; ++i) {
     vmkit::Collector::markAndTraceRoot(referenceThread->ToEnqueue + i, closure);
   }
  
-  // (7) Trace the locks and their associated object.
+  // (6) Trace the locks and their associated object.
   uint32 i = 0;
   for (; i < vmkit::LockSystem::GlobalSize; i++) {
     vmkit::FatLock** array = lockSystem.LockTable[i];





More information about the vmkit-commits mailing list