[vmkit-commits] [vmkit] r71558 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp VMCore/JavaArray.cpp VMCore/JavaArray.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue May 12 08:55:29 PDT 2009


Author: geoffray
Date: Tue May 12 10:55:14 2009
New Revision: 71558

URL: http://llvm.org/viewvc/llvm-project?rev=71558&view=rev
Log:
Continue avoiding the creation of UTF8s.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp?rev=71558&r1=71557&r2=71558&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp Tue May 12 10:55:14 2009
@@ -62,11 +62,9 @@
 
   Jnjvm* vm = JavaThread::get()->getJVM();
   JavaString* name = (JavaString*)_name;
-  const UTF8* utf8 = name->strToUTF8(vm);
-  const UTF8* internalName = utf8->javaToInternal(vm, 0, utf8->size);
   JnjvmClassLoader* JCL = 
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
-  UserCommonClass* cl = JCL->lookupClass(internalName);
+  UserCommonClass* cl = JCL->lookupClassFromJavaString(name);
 
   if (cl) res = (jclass)(cl->getClassDelegatee(vm));
 
@@ -132,7 +130,8 @@
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
   
   JavaString* str = (JavaString*)_str;
-  const UTF8* name = str->value->javaToInternal(vm, str->offset, str->count);
+  const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset,
+                                                str->count);
   UserCommonClass* cl = JCL->lookupClass(name);
   
   if (!cl) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp Tue May 12 10:55:14 2009
@@ -44,17 +44,17 @@
   return printUTF8(buf);
 }
 
-const UTF8* UTF8::javaToInternal(Jnjvm* vm, unsigned int start,
+const UTF8* UTF8::javaToInternal(UTF8Map* map, unsigned int start,
                                  unsigned int len) const {
-  UTF8* array = (UTF8*)vm->upcalls->ArrayOfChar->doNew(len, vm);
-  uint16* java = array->elements;
-  for (uint32 i = 0; i < len; i++) {
+  uint16* java = (uint16*)alloca(sizeof(uint16) * len);
+
+  for (uint32 i = 0; i < len; ++i) {
     uint16 cur = elements[start + i];
     if (cur == '.') java[i] = '/';
     else java[i] = cur;
   }
-
-  return (const UTF8*)array;
+  
+  return map->lookupOrCreateReader(java, len);
 }
 
 // We also define a checked java to internal function to disallow

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Tue May 12 10:55:14 2009
@@ -132,7 +132,7 @@
                              unsigned int len) const;
   
   /// javaToInternal - Replaces all '/' into '.'.
-  const UTF8* javaToInternal(Jnjvm* vm, unsigned int start,
+  const UTF8* javaToInternal(UTF8Map* map, unsigned int start,
                              unsigned int len) const;
   
   /// checkedJavaToInternal - Replaces all '/' into '.'. Returns null if the

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Tue May 12 10:55:14 2009
@@ -507,16 +507,43 @@
 JnjvmClassLoader::loadClassFromJavaString(JavaString* str, bool doResolve,
                                           bool doThrow) {
   
-  const UTF8* name = 0;
-  
-  if (str->value->elements[str->offset] != I_TAB)
-    name = str->value->checkedJavaToInternal(isolate, str->offset, str->count);
-  else
-    name = str->value->javaToInternal(isolate, str->offset, str->count);
-
-  if (name)
+  UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
+ 
+  if (name) {
+    name->size = str->count;
+    if (str->value->elements[str->offset] != I_TAB) {
+      for (sint32 i = 0; i < str->count; ++i) {
+        uint16 cur = str->value->elements[str->offset + i];
+        if (cur == '.') name->elements[i] = '/';
+        else if (cur == '/') return 0;
+        else name->elements[i] = cur;
+      }
+    } else {
+      for (sint32 i = 0; i < str->count; ++i) {
+        uint16 cur = str->value->elements[str->offset + i];
+        if (cur == '.') name->elements[i] = '/';
+        else name->elements[i] = cur;
+      }
+    }
+    
     return loadClassFromUserUTF8(name, doResolve, doThrow);
+  }
+
+  return 0;
+}
 
+UserCommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str) {
+  
+  UTF8* name = (UTF8*)alloca(sizeof(UTF8) + str->count * sizeof(uint16));
+  if (name) {
+    name->size = str->count;
+    for (sint32 i = 0; i < str->count; ++i) {
+      uint16 cur = str->value->elements[str->offset + i];
+      if (cur == '.') name->elements[i] = '/';
+      else name->elements[i] = cur;
+    }
+    return lookupClass(name);
+  }
   return 0;
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Tue May 12 10:55:14 2009
@@ -161,6 +161,13 @@
   ///
   UserCommonClass* loadClassFromJavaString(JavaString* str,
                                            bool doResolve, bool doThrow);
+  
+  /// lookupClassFromJavaString - Finds the class of the given string name in
+  /// the class loader's table. Do not inline this function, because it
+  /// does an alloca and is called by Classpath functions.
+  ///
+  UserCommonClass* lookupClassFromJavaString(JavaString* str) 
+    __attribute__ ((noinline));
    
   /// lookupClass - Finds the class of the given name in the class loader's
   /// table.





More information about the vmkit-commits mailing list