[vmkit-commits] [vmkit] r71653 - in /vmkit/trunk: include/jnjvm/ lib/JnJVM/Classpath/ lib/JnJVM/Compiler/ lib/JnJVM/VMCore/

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed May 13 05:49:54 PDT 2009


Author: geoffray
Date: Wed May 13 07:49:51 2009
New Revision: 71653

URL: http://llvm.org/viewvc/llvm-project?rev=71653&view=rev
Log:
Code cleanup: make it explicit that Strings hold GC-objects and
not UTF8s. UTF8s are allocated by class loaders.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaString.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=71653&r1=71652&r2=71653&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Wed May 13 07:49:51 2009
@@ -33,6 +33,7 @@
 
 namespace jnjvm {
 
+class ArrayUInt16;
 class Attribut;
 class CacheNode;
 class CommonClass;
@@ -570,7 +571,6 @@
   
   //--------------- Static compiler specific functions -----------------------//
   llvm::Constant* CreateConstantFromVT(JavaVirtualTable* VT);
-  llvm::Constant* CreateConstantFromUTF8(const UTF8* val);
   llvm::Constant* CreateConstantFromEnveloppe(Enveloppe* val);
   llvm::Constant* CreateConstantFromCacheNode(CacheNode* CN);
   llvm::Constant* CreateConstantFromCommonClass(CommonClass* cl);
@@ -585,10 +585,10 @@
   llvm::Constant* CreateConstantFromJavaClass(CommonClass* cl);
   llvm::Constant* CreateConstantForBaseObject(CommonClass* cl);
   llvm::Constant* CreateConstantFromJavaObject(JavaObject* obj);
-  llvm::Constant* getUTF8(const UTF8* val);
+  llvm::Constant* getArrayUInt16(const ArrayUInt16* val);
   
   template<typename T>
-  llvm::Constant* CreateConstantFromArray(T* val, const llvm::Type* Ty);
+  llvm::Constant* CreateConstantFromArray(const T* val, const llvm::Type* Ty);
   
   std::map<const CommonClass*, llvm::Constant*> nativeClasses;
   std::map<const ClassArray*, llvm::GlobalVariable*> arrayClasses;
@@ -599,7 +599,7 @@
   std::map<const JavaString*, llvm::Constant*> strings;
   std::map<const Enveloppe*, llvm::Constant*> enveloppes;
   std::map<const JavaMethod*, llvm::Constant*> nativeFunctions;
-  std::map<const UTF8*, llvm::Constant*> utf8s;
+  std::map<const ArrayUInt16*, llvm::Constant*> utf8s;
   std::map<const Class*, llvm::Constant*> virtualMethods;
   std::map<const JavaObject*, llvm::Constant*> finalObjects;
   
@@ -636,7 +636,7 @@
   typedef std::map<const JavaMethod*, llvm::Constant*>::iterator
     native_function_iterator;
   
-  typedef std::map<const UTF8*, llvm::Constant*>::iterator
+  typedef std::map<const ArrayUInt16*, llvm::Constant*>::iterator
     utf8_iterator;
 
 #ifdef SERVICE

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Wed May 13 07:49:51 2009
@@ -185,7 +185,7 @@
   verifyNull(Meth);
   JavaMethod* meth = Meth->getInternalMethod();
   Jnjvm* vm = JavaThread::get()->getJVM();
-  result = (jobject)(vm->UTF8ToStr(meth->type));
+  result = (jobject)(vm->internalUTF8ToStr(meth->type));
   
   END_NATIVE_EXCEPTION
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Wed May 13 07:49:51 2009
@@ -274,7 +274,7 @@
   verifyNull(Meth);
   JavaMethod* meth = Meth->getInternalMethod();
   Jnjvm* vm = JavaThread::get()->getJVM();
-  result = (jobject)(vm->UTF8ToStr(meth->type));
+  result = (jobject)(vm->internalUTF8ToStr(meth->type));
   
   END_NATIVE_EXCEPTION
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp Wed May 13 07:49:51 2009
@@ -130,8 +130,7 @@
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
   
   JavaString* str = (JavaString*)_str;
-  const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset,
-                                                str->count);
+  const UTF8* name = str->javaToInternal(JCL->hashUTF8);
   UserCommonClass* cl = JCL->lookupClass(name);
   
   if (!cl) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.cpp Wed May 13 07:49:51 2009
@@ -43,7 +43,7 @@
   JavaString* strLib = (JavaString*)_strLib;
   Jnjvm* vm = JavaThread::get()->getJVM();
 
-  const UTF8* utf8Lib = strLib->value;
+  const ArrayUInt16* utf8Lib = strLib->value;
   uint32 stLib = strLib->offset;
   sint32 lgLib = strLib->count;
   sint32 lgPre = vm->bootstrapLoader->prelib->size;
@@ -60,7 +60,7 @@
   memmove(&(elements[lgPre + lgLib]), vm->bootstrapLoader->postlib->elements,
            lgPost * sizeof(uint16));
   
-  res = (jobject)(vm->UTF8ToStr((const UTF8*)array));
+  res = (jobject)(vm->constructString(array));
 
   END_NATIVE_EXCEPTION
 

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=71653&r1=71652&r2=71653&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Wed May 13 07:49:51 2009
@@ -511,7 +511,7 @@
 
   Elmts.push_back(CreateConstantForBaseObject(cl));
 
-  Constant* Array = getUTF8(str->value);
+  Constant* Array = getArrayUInt16(str->value);
   Constant* ObjGEPs[2] = { JnjvmModule::constantZero,
                            JnjvmModule::constantZero };
   Array = ConstantExpr::getGetElementPtr(Array, ObjGEPs, 2);
@@ -551,8 +551,8 @@
   Elmts.push_back(new GlobalVariable(CNTy, false,
                                      GlobalValue::InternalLinkage,
                                      firstCache, "", getLLVMModule()));
-  Elmts.push_back(getUTF8(val->methodName));
-  Elmts.push_back(getUTF8(val->methodSign));
+  Elmts.push_back(getArrayUInt16(val->methodName));
+  Elmts.push_back(getArrayUInt16(val->methodSign));
 
   Elmts.push_back(Constant::getNullValue(Type::Int8Ty));
   Elmts.push_back(getNativeClass(val->classDef));
@@ -570,7 +570,7 @@
   std::vector<Constant*> Elmts;
 
   // name
-  Elmts.push_back(getUTF8(attribut.name));
+  Elmts.push_back(getArrayUInt16(attribut.name));
 
   // start
   Elmts.push_back(ConstantInt::get(Type::Int32Ty, attribut.start));
@@ -623,7 +623,7 @@
   CommonClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbInterfaces));
 
   // name
-  CommonClassElts.push_back(getUTF8(cl->name));
+  CommonClassElts.push_back(getArrayUInt16(cl->name));
 
   // super
   if (cl->super) {
@@ -663,10 +663,10 @@
   FieldElts.push_back(ConstantInt::get(Type::Int16Ty, field.access));
 
   // name
-  FieldElts.push_back(getUTF8(field.name));
+  FieldElts.push_back(getArrayUInt16(field.name));
 
   // type
-  FieldElts.push_back(getUTF8(field.type));
+  FieldElts.push_back(getArrayUInt16(field.type));
   
   // attributs 
   if (field.nbAttributs) {
@@ -754,10 +754,10 @@
   MethodElts.push_back(getNativeClass(method.classDef));
   
   // name
-  MethodElts.push_back(getUTF8(method.name));
+  MethodElts.push_back(getArrayUInt16(method.name));
 
   // type
-  MethodElts.push_back(getUTF8(method.type));
+  MethodElts.push_back(getArrayUInt16(method.type));
   
   // canBeInlined
   MethodElts.push_back(ConstantInt::get(Type::Int8Ty, method.canBeInlined));
@@ -1044,7 +1044,7 @@
 }
 
 template<typename T>
-Constant* JavaAOTCompiler::CreateConstantFromArray(T* val, const Type* Ty) {
+Constant* JavaAOTCompiler::CreateConstantFromArray(const T* val, const Type* Ty) {
   std::vector<const Type*> Elemts;
   const ArrayType* ATy = ArrayType::get(Ty, val->size);
   Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
@@ -1074,37 +1074,12 @@
   return ConstantStruct::get(STy, Cts);
 }
 
-Constant* JavaAOTCompiler::CreateConstantFromUTF8(const UTF8* val) {
-  std::vector<const Type*> Elemts;
-  const ArrayType* ATy = ArrayType::get(Type::Int16Ty, val->size);
-  Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
-  Elemts.push_back(JnjvmModule::pointerSizeType);
-
-  Elemts.push_back(ATy);
-
-  const StructType* STy = StructType::get(Elemts);
-  
-  std::vector<Constant*> Cts;
-  CommonClass* cl = JavaThread::get()->getJVM()->upcalls->ArrayOfChar;
-  Cts.push_back(CreateConstantForBaseObject(cl));
-  Cts.push_back(ConstantInt::get(JnjvmModule::pointerSizeType, val->size));
-  
-  std::vector<Constant*> Vals;
-  for (sint32 i = 0; i < val->size; ++i) {
-    Vals.push_back(ConstantInt::get(Type::Int16Ty, val->elements[i]));
-  }
-
-  Cts.push_back(ConstantArray::get(ATy, Vals));
-  
-  return ConstantStruct::get(STy, Cts);
-
-}
-
-Constant* JavaAOTCompiler::getUTF8(const UTF8* val) {
+Constant* JavaAOTCompiler::getArrayUInt16(const ArrayUInt16* val) {
   utf8_iterator End = utf8s.end();
   utf8_iterator I = utf8s.find(val);
   if (I == End) {
-    Constant* C = CreateConstantFromUTF8(val);
+    Constant* C = CreateConstantFromArray<ArrayUInt16>(val, Type::Int16Ty);
+
     GlobalVariable* varGV = new GlobalVariable(C->getType(), true,
                                                GlobalValue::InternalLinkage,
                                                C, "", getLLVMModule());
@@ -1414,7 +1389,7 @@
        e = arrayClasses.end(); i != e; ++i) {
     Args[0] = loader;
     Args[1] = i->second;
-    Args[2] = getUTF8(i->first->name);
+    Args[2] = getArrayUInt16(i->first->name);
     CallInst::Create(GetClassArray, Args, Args + 3, "", currentBlock);
   }
   
@@ -1626,7 +1601,7 @@
 
       // Also do not allow inling of some functions.
 #define SET_INLINE(NAME) { \
-      const UTF8* name = vm->asciizToUTF8(NAME); \
+      const UTF8* name = bootstrapLoader->asciizConstructUTF8(NAME); \
       Class* cl = (Class*)bootstrapLoader->lookupClass(name); \
       if (cl) M->setNoInline(cl); }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.cpp Wed May 13 07:49:51 2009
@@ -44,19 +44,6 @@
   return printUTF8(buf);
 }
 
-const UTF8* UTF8::javaToInternal(UTF8Map* map, unsigned int start,
-                                 unsigned int len) const {
-  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 map->lookupOrCreateReader(java, len);
-}
-
 const UTF8* UTF8::extract(UTF8Map* map, uint32 start, uint32 end) const {
   uint32 len = end - start;
   uint16* buf = (uint16*)alloca(sizeof(uint16) * len);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Wed May 13 07:49:51 2009
@@ -122,10 +122,6 @@
                            mvm::BumpPtrAllocator& allocator);
 public:
   
-
-  /// javaToInternal - Replaces all '/' into '.'.
-  const UTF8* javaToInternal(UTF8Map* map, unsigned int start,
-                             unsigned int len) const;
   
   /// extract - Similar, but creates it in the map.
   const UTF8* extract(UTF8Map* map, uint32 start, uint32 len) const;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Wed May 13 07:49:51 2009
@@ -19,7 +19,7 @@
 
 JavaVirtualTable* JavaString::internStringVT = 0;
 
-JavaString* JavaString::stringDup(const UTF8*& utf8, Jnjvm* vm) {
+JavaString* JavaString::stringDup(const ArrayUInt16*& array, Jnjvm* vm) {
   UserClass* cl = vm->upcalls->newString;
   JavaString* res = (JavaString*)cl->doNew(vm);
   
@@ -30,8 +30,8 @@
 
   // No need to call the Java function: both the Java function and
   // this function do the same thing.
-  res->value = utf8;
-  res->count = utf8->size;
+  res->value = array;
+  res->count = array->size;
   res->offset = 0;
   res->cachedHashCode = 0;
   return res;
@@ -46,19 +46,19 @@
   return buf->cString();
 }
 
-const UTF8* JavaString::strToUTF8(Jnjvm* vm) {
-  const UTF8* utf8 = this->value;
-  assert(utf8 && "String without an UTF8?");
-  if (offset || (count != utf8->size)) {
-    UTF8* array = (UTF8*) vm->upcalls->ArrayOfChar->doNew(count, vm);
+const ArrayUInt16* JavaString::strToArray(Jnjvm* vm) {
+  assert(value && "String without an array?");
+  if (offset || (count != value->size)) {
+    ArrayUInt16* array = 
+      (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(count, vm);
     uint16* buf = array->elements;
 
     for (sint32 i = 0; i < count; i++) {
       buf[i] = value->elements[i + offset];
     }
-    return (const UTF8*)array;
+    return array;
   } else {
-    return utf8;
+    return value;
   }
 }
 
@@ -69,7 +69,9 @@
 }
 
 JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) {
-  UTF8* array = (UTF8*)vm->upcalls->ArrayOfChar->doNew(name->size, vm);
+  ArrayUInt16* array = 
+    (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(name->size, vm);
+  
   uint16* java = array->elements;
   for (sint32 i = 0; i < name->size; i++) {
     uint16 cur = name->elements[i];
@@ -77,5 +79,17 @@
     else java[i] = cur;
   }
 
-  return vm->UTF8ToStr(array);
+  return vm->constructString(array);
+}
+
+const UTF8* JavaString::javaToInternal(UTF8Map* map) const {
+  uint16* java = (uint16*)alloca(sizeof(uint16) * count);
+
+  for (sint32 i = 0; i < count; ++i) {
+    uint16 cur = value->elements[offset + i];
+    if (cur == '.') java[i] = '/';
+    else java[i] = cur;
+  }
+  
+  return map->lookupOrCreateReader(java, count);
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.h Wed May 13 07:49:51 2009
@@ -16,18 +16,19 @@
 
 namespace jnjvm {
 
+class ArrayUInt16;
 class Jnjvm;
 
 class JavaString : public JavaObject {
 public:
 
   // CLASSPATH FIELDS!!
-  const UTF8* value;
+  const ArrayUInt16* value;
   sint32 count;
   sint32 cachedHashCode;
   sint32 offset;
   
-  static JavaString* stringDup(const UTF8*& utf8, Jnjvm* vm);
+  static JavaString* stringDup(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
@@ -38,7 +39,10 @@
 
   static void stringDestructor(JavaString*);
   char* strToAsciiz();
-  const UTF8* strToUTF8(Jnjvm* vm);
+  const ArrayUInt16* strToArray(Jnjvm* vm);
+
+    /// javaToInternal - Replaces all '/' into '.'.
+  const UTF8* javaToInternal(UTF8Map* map) const;
 
   static JavaVirtualTable* internStringVT;
 };

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed May 13 07:49:51 2009
@@ -250,8 +250,8 @@
 
 extern "C" JavaString* nativeInternString(JavaString* obj) {
   Jnjvm* vm = JavaThread::get()->getJVM();
-  const UTF8* utf8 = obj->strToUTF8(vm);
-  return vm->UTF8ToStr(utf8);
+  const ArrayUInt16* array = obj->strToArray(vm);
+  return vm->constructString(array);
 }
 
 extern "C" uint8 nativeIsArray(JavaObject* klass) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed May 13 07:49:51 2009
@@ -473,27 +473,27 @@
   JavaString* res = hashStr.lookup(utf8);
   if (!res) {
     uint32 size = utf8->size;
-    UTF8* tmp = (UTF8*)upcalls->ArrayOfChar->doNew(size, this);
+    ArrayUInt16* tmp = (ArrayUInt16*)upcalls->ArrayOfChar->doNew(size, this);
     uint16* buf = tmp->elements;
   
     for (uint32 i = 0; i < size; i++) {
       buf[i] = utf8->elements[i];
     }
   
-    const UTF8* newUTF8 = (const UTF8*)tmp;
-    res = hashStr.lookupOrCreate(newUTF8, this, JavaString::stringDup);
+    res = hashStr.lookupOrCreate((const ArrayUInt16*&)tmp, this,
+                                 JavaString::stringDup);
   }
   return res;
 }
 
-JavaString* Jnjvm::UTF8ToStr(const UTF8* utf8) { 
-  JavaString* res = hashStr.lookupOrCreate(utf8, this, JavaString::stringDup);
+JavaString* Jnjvm::constructString(const ArrayUInt16* array) { 
+  JavaString* res = hashStr.lookupOrCreate(array, this, JavaString::stringDup);
   return res;
 }
 
 JavaString* Jnjvm::asciizToStr(const char* asciiz) {
-  const UTF8* var = asciizToUTF8(asciiz);
-  return UTF8ToStr(var);
+  ArrayUInt16* var = asciizToArray(asciiz);
+  return constructString(var);
 }
 
 void Jnjvm::addProperty(char* key, char* value) {
@@ -1112,15 +1112,15 @@
 
 }
   
-const UTF8* Jnjvm::asciizToUTF8(const char* asciiz) {
+ArrayUInt16* Jnjvm::asciizToArray(const char* asciiz) {
   uint32 size = strlen(asciiz);
-  UTF8* tmp = (UTF8*)upcalls->ArrayOfChar->doNew(size, this);
+  ArrayUInt16* tmp = (ArrayUInt16*)upcalls->ArrayOfChar->doNew(size, this);
   uint16* buf = tmp->elements;
   
   for (uint32 i = 0; i < size; i++) {
     buf[i] = asciiz[i];
   }
-  return (const UTF8*)tmp;
+  return tmp;
 }
 
 void Jnjvm::removeMethodsInFunctionMap(JnjvmClassLoader* loader) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed May 13 07:49:51 2009
@@ -284,7 +284,7 @@
 
   /// UTF8ToStr - Constructs a java/lang/String object from the given UTF8.
   ///
-  JavaString* UTF8ToStr(const UTF8* utf8);
+  JavaString* constructString(const ArrayUInt16* array);
   
   /// UTF8ToStr - Constructs a java/lang/String object from the given internal
   /// UTF8, thus duplicating the UTF8.
@@ -298,7 +298,7 @@
   
   /// asciizToUTF8 - Constructs an UTF8 out of the asciiz.
   ///
-  const UTF8* asciizToUTF8(const char* asciiz);
+  ArrayUInt16* asciizToArray(const char* asciiz);
   
   /// setBootstrapThread - Set the bootstrap thread of this VM.
   ///

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed May 13 07:49:51 2009
@@ -499,7 +499,16 @@
                                                        bool doThrow) {
   const UTF8* name = hashUTF8->lookupAsciiz(asciiz);
   if (!name) name = bootstrapLoader->hashUTF8->lookupAsciiz(asciiz);
-  if (!name) name = isolate->asciizToUTF8(asciiz);
+  if (!name) {
+    uint32 size = strlen(asciiz);
+    UTF8* temp = (UTF8*)alloca(sizeof(UTF8) + size * sizeof(uint16));
+    if (!temp) return 0;
+
+    for (uint32 i = 0; i < size; ++i) {
+      temp->elements[i] = asciiz[i];
+    }
+    name = temp;
+  }
   
   UserCommonClass* temp = lookupClass(name);
   if (temp) return temp;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Wed May 13 07:49:51 2009
@@ -44,6 +44,14 @@
   }
 };
 
+struct ltarray16
+{
+  bool operator()(const ArrayUInt16* s1, const ArrayUInt16* s2) const
+  {
+    return ((UTF8*)s1)->lessThan((UTF8*)s2);
+  }
+};
+
 template<class Key, class Container, class Compare, class Meta, class TLock>
 class LockedMap : public mvm::PermanentObject {
 public:
@@ -149,7 +157,8 @@
 };
 
 class StringMap :
-  public LockedMap<const UTF8*, JavaString*, ltutf8, Jnjvm*, mvm::LockNormal> {
+  public LockedMap<const ArrayUInt16*, JavaString*, ltarray16, Jnjvm*,
+                   mvm::LockNormal> {
 
 public:
   void insert(JavaString* str);





More information about the vmkit-commits mailing list