[vmkit-commits] [vmkit] r76580 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmClassLoader.cpp JnjvmClassLoader.h VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 21 09:50:06 PDT 2009


Author: geoffray
Date: Tue Jul 21 11:50:05 2009
New Revision: 76580

URL: http://llvm.org/viewvc/llvm-project?rev=76580&view=rev
Log:
Don't use vectors to sore strings located in class files.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    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/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=76580&r1=76579&r2=76580&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Jul 21 11:50:05 2009
@@ -1283,10 +1283,14 @@
   upcalls = bootstrapLoader->upcalls;
 
   throwable = upcalls->newThrowable;
- 
-  for (std::vector<JavaString*, gc_allocator<JavaString*> >::iterator i = 
-       loader->strings.begin(), e = loader->strings.end(); i != e; ++i) {
-    hashStr.insert(*i);
+
+  StringList* end = loader->strings;
+  while (end) {
+    for (uint32 i = 0; i < end->length; ++i) {
+      JavaString* obj = end->strings[i];
+      hashStr.insert(obj);
+    }
+    end = end->prev;
   }
 
   bootstrapLoader->insertAllMethodsInVM(this);  

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=76580&r1=76579&r2=76580&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue Jul 21 11:50:05 2009
@@ -50,6 +50,11 @@
 #include "Reader.h"
 #include "Zip.h"
 
+
+namespace jnjvm {
+
+}
+
 using namespace jnjvm;
 
 typedef void (*static_init_t)(JnjvmClassLoader*);
@@ -64,7 +69,8 @@
   hashUTF8 = new(allocator, "UTF8Map") UTF8Map(allocator);
   classes = new(allocator, "ClassMap") ClassMap();
   javaTypes = new(allocator, "TypeMap") TypeMap(); 
-  javaSignatures = new(allocator, "SignMap") SignMap(); 
+  javaSignatures = new(allocator, "SignMap") SignMap();
+  strings = new(allocator, "StringList") StringList();
   
   bootClasspathEnv = getenv("JNJVM_BOOTCLASSPATH");
   if (!bootClasspathEnv) {
@@ -261,6 +267,7 @@
   classes = new(allocator, "ClassMap") ClassMap();
   javaTypes = new(allocator, "TypeMap") TypeMap();
   javaSignatures = new(allocator, "SignMap") SignMap();
+  strings = new(allocator, "StringList") StringList();
 
   javaLoader = loader;
   isolate = I;
@@ -928,14 +935,14 @@
 
 JavaString* JnjvmClassLoader::UTF8ToStr(const UTF8* val) {
   JavaString* res = isolate->internalUTF8ToStr(val);
-  strings.push_back(res);
+  strings->addString(this, res);
   return res;
 }
 
 JavaString* JnjvmBootstrapLoader::UTF8ToStr(const UTF8* val) {
   Jnjvm* vm = JavaThread::get()->getJVM();
   JavaString* res = vm->internalUTF8ToStr(val);
-  strings.push_back(res);
+  strings->addString(this, res);
   return res;
 }
 
@@ -1185,7 +1192,7 @@
 }
 
 extern "C" void vmjcAddString(JnjvmClassLoader* JCL, JavaString* val) {
-  JCL->strings.push_back(val);
+  JCL->strings->addString(JCL, val);
 }
 
 extern "C" intptr_t vmjcNativeLoader(JavaMethod* meth) {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=76580&r1=76579&r2=76580&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue Jul 21 11:50:05 2009
@@ -35,8 +35,10 @@
 class JavaString;
 class Jnjvm;
 class JnjvmBootstrapLoader;
+class JnjvmClassLoader;
 class Signdef;
 class SignMap;
+class StringList;
 class Typedef;
 class TypeMap;
 class UTF8;
@@ -239,7 +241,7 @@
 
   /// Strings hashed by this classloader.
   ///
-  std::vector<JavaString*, gc_allocator<JavaString*> > strings;
+  StringList* strings;
   
   /// nativeLibs - Native libraries (e.g. '.so') loaded by this class loader.
   ///
@@ -455,6 +457,37 @@
 
 };
 
+#define MAXIMUM_STRINGS 100
+
+class StringList : public mvm::PermanentObject {
+  friend class JnjvmClassLoader;
+  friend class Jnjvm;
+
+private:
+  StringList* prev;
+  uint32_t length;
+  JavaString* strings[MAXIMUM_STRINGS];
+
+public:
+  StringList() {
+    prev = 0;
+    length = 0;
+  }
+
+  JavaString** addString(JnjvmClassLoader* JCL, JavaString* obj) {
+    llvm_gcroot(obj, 0);
+    if (length == MAXIMUM_STRINGS) {
+      StringList* next = new(JCL->allocator, "StringList") StringList();
+      next->prev = this;
+      JCL->strings = next;
+      return next->addString(JCL, obj);
+    } else {
+      strings[length] = obj;
+      return &strings[length++];
+    }
+  }
+};
+
 } // end namespace jnjvm
 
 #endif // JNJVM_CLASSLOADER_H

Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=76580&r1=76579&r2=76580&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Tue Jul 21 11:50:05 2009
@@ -217,15 +217,17 @@
     else cl->tracer();
   }
   
-  for (std::vector<JavaString*,
-       gc_allocator<JavaString*> >::iterator i = strings.begin(), 
-       e = strings.end(); i!= e; ++i) {
-    (*i)->markAndTrace();
-    // If the string was static allocated, we want to trace its lock.
-    LockObj* l = (*i)->lockObj();
-    if (l) l->markAndTrace();
+  StringList* end = strings;
+  while (end) {
+    for (uint32 i = 0; i < end->length; ++i) {
+      JavaObject* obj = end->strings[i];
+      obj->markAndTrace(); 
+      // If the string was static allocated, we want to trace its lock.
+      LockObj* l = obj->lockObj();
+      if (l) l->markAndTrace();
+    }
+    end = end->prev;
   }
-  
 }
 
 void JnjvmBootstrapLoader::tracer() {





More information about the vmkit-commits mailing list