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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Aug 20 07:10:04 PDT 2008


Author: geoffray
Date: Wed Aug 20 09:10:04 2008
New Revision: 55051

URL: http://llvm.org/viewvc/llvm-project?rev=55051&view=rev
Log:
Give the array of bytes when constructing a class.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp.inc Wed Aug 20 09:10:04 2008
@@ -92,16 +92,8 @@
   JnjvmClassLoader* JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader);
   JavaString* str = (JavaString*)_str;
   const UTF8* name = str->value->javaToInternal(JCL->hashUTF8, str->offset, str->count);
-  Class* cl = JCL->constructClass(name);
+  Class* cl = JCL->constructClass(name, (ArrayUInt8*)bytes);
 
-  if (cl->status == hashed) {
-    cl->acquire();
-    if (cl->status == hashed) {
-      cl->bytes = (ArrayUInt8*)bytes;
-      cl->status = loaded;
-    }
-    cl->release();
-  }
   return (jclass)(cl->getClassDelegatee((JavaObject*)pd));
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 20 09:10:04 2008
@@ -260,10 +260,14 @@
   
   CommonClass* cl = lookupClass(name);
   
-  if (!cl || cl->status == hashed) {
-    ArrayUInt8* bytes = bootstrapLoader->openName(name);
+  if (!cl) {
+    ArrayUInt8* bytes = openName(name);
+    if (bytes) {
+      cl = constructClass(name, bytes);
+    }
+  } else if (cl->status == hashed) {
+    ArrayUInt8* bytes = openName(name);
     if (bytes) {
-      if (!cl) cl = bootstrapLoader->constructClass(name);
       if (cl->status == hashed) {
         cl->acquire();
         if (cl->status == hashed) {
@@ -405,13 +409,26 @@
 }
 
 
-static CommonClass* classDup(const UTF8*& name, JnjvmClassLoader* loader) {
-  Class* cl = allocator_new(loader->allocator, Class)(loader, name);
-  return cl;
-}
-
-Class* JnjvmClassLoader::constructClass(const UTF8* name) {
-  Class* res = (Class*)classes->lookupOrCreate(name, this, classDup);
+Class* JnjvmClassLoader::constructClass(const UTF8* name, ArrayUInt8* bytes) {
+  classes->lock->lock();
+  ClassMap::iterator End = classes->map.end();
+  ClassMap::iterator I = classes->map.find(name);
+  Class* res = 0;
+  if (I == End) {
+    res = allocator_new(allocator, Class)(this, name);
+    if (bytes) {
+      res->bytes = bytes;
+      res->status = loaded;
+    }
+    classes->map.insert(std::make_pair(name, res));
+  } else {
+    res = ((Class*)(I->second));
+    if (res->status == hashed && bytes) {
+      res->bytes = bytes;
+      res->status = loaded;
+    }
+  }
+  classes->lock->unlock();
   return res;
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Wed Aug 20 09:10:04 2008
@@ -189,7 +189,7 @@
   /// constructClass - Hashes a runtime representation of a class with
   /// the given name.
   ///
-  Class*      constructClass(const UTF8* name);
+  Class* constructClass(const UTF8* name, ArrayUInt8* bytes = 0);
   
   /// constructType - Hashes a Typedef, an internal representation of a class
   /// still not loaded.





More information about the vmkit-commits mailing list