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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Jan 11 13:43:38 PST 2009


Author: geoffray
Date: Sun Jan 11 15:43:38 2009
New Revision: 62051

URL: http://llvm.org/viewvc/llvm-project?rev=62051&view=rev
Log:
Initial support for main application loading as a .so.


Modified:
    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/JnjvmClassLoader.h

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan 11 15:43:38 2009
@@ -541,7 +541,7 @@
 
 void ClArgumentsInfo::extractClassFromJar(Jnjvm* vm, int argc, char** argv, 
                                           int i) {
-  char* jarFile = argv[i];
+  jarFile = argv[i];
   uint32 size = 2 + strlen(vm->classpath) + strlen(jarFile);
   char* temp = (char*)vm->allocator.Allocate(size);
 
@@ -761,6 +761,10 @@
       upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl);
     appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader,
                                                                     this);
+    if (argumentsInfo.jarFile)
+      appClassLoader->loadLibFromJar(this, argumentsInfo.jarFile,
+                                     argumentsInfo.className);
+    else appClassLoader->loadLibFromFile(this, argumentsInfo.className);
   }
   return appClassLoader;
 }
@@ -1057,32 +1061,7 @@
     hashStr.insert(*i);
   }
 
-  ClassMap* classes = bootstrapLoader->getClasses();
-  JnjvmModule* M = bootstrapLoader->getModule();
-  for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
-       i != e; ++i) {
-    CommonClass* cl = i->second;
-    if (cl->isClass()) {
-      Class* C = cl->asClass();
-      
-      for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
-        JavaMethod& meth = C->virtualMethods[i];
-        if (!isAbstract(meth.access) && meth.code) {
-          addMethodInFunctionMap(&meth, meth.code);
-          M->setMethod(&meth, meth.code, "");
-        }
-      }
-      
-      for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
-        JavaMethod& meth = C->staticMethods[i];
-        if (!isAbstract(meth.access) && meth.code) {
-          addMethodInFunctionMap(&meth, meth.code);
-          M->setMethod(&meth, meth.code, "");
-        }
-      }
-    }
-  }
-  
+  bootstrapLoader->insertAllMethodsInVM(this);  
 
 #ifdef ISOLATE
   IsolateLock.lock();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Sun Jan 11 15:43:38 2009
@@ -86,6 +86,7 @@
   char** argv;
   uint32 appArgumentsPos;
   char* className;
+  char* jarFile;
   std::vector< std::pair<char*, char*> > agents;
 
   void readArgs(Jnjvm *vm);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan 11 15:43:38 2009
@@ -9,6 +9,8 @@
 
 #include <climits>
 #include <cstdlib>
+
+// for strrchr
 #include <cstring>
 
 // for dlopen and dlsym
@@ -23,10 +25,10 @@
 
 #if defined(__MACH__)
 #define SELF_HANDLE RTLD_DEFAULT
-#define BOOTLIBNAME "libvmjc.dylib"
+#define DYLD_EXTENSION ".dylib"
 #else
 #define SELF_HANDLE 0
-#define BOOTLIBNAME "libvmjc.so"
+#define DYLD_EXTENSION ".so"
 #endif
 
 #include "debug.h"
@@ -162,7 +164,7 @@
 
   // Now that native types have been loaded, try to find if we have a
   // pre-compiled rt.jar
-  nativeHandle = dlopen(BOOTLIBNAME, RTLD_LAZY | RTLD_GLOBAL);
+  nativeHandle = dlopen("libvmjc"DYLD_EXTENSION, RTLD_LAZY | RTLD_GLOBAL);
   if (nativeHandle) {
     // Found it!
     SuperArray = (Class*)dlsym(nativeHandle, "java.lang.Object");
@@ -948,6 +950,66 @@
   return res;
 }
 
+void JnjvmClassLoader::insertAllMethodsInVM(Jnjvm* vm) {
+  JnjvmModule* M = getModule();
+  for (ClassMap::iterator i = classes->map.begin(), e = classes->map.end();
+       i != e; ++i) {
+    CommonClass* cl = i->second;
+    if (cl->isClass()) {
+      Class* C = cl->asClass();
+      
+      for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
+        JavaMethod& meth = C->virtualMethods[i];
+        if (!isAbstract(meth.access) && meth.code) {
+          vm->addMethodInFunctionMap(&meth, meth.code);
+          M->setMethod(&meth, meth.code, "");
+        }
+      }
+      
+      for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
+        JavaMethod& meth = C->staticMethods[i];
+        if (!isAbstract(meth.access) && meth.code) {
+          vm->addMethodInFunctionMap(&meth, meth.code);
+          M->setMethod(&meth, meth.code, "");
+        }
+      }
+    }
+  }
+}
+
+void JnjvmClassLoader::loadLibFromJar(Jnjvm* vm, const char* name,
+                                      const char* file) {
+
+  char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION));
+  char* ptr = strrchr(name, '/');
+  sprintf(soName, "%s%s", ptr ? ptr + 1 : name, DYLD_EXTENSION);
+  void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL);
+  if (handle) {
+    Class* cl = (Class*)dlsym(handle, file);
+    if (cl) {
+      static_init_t init = (static_init_t)(uintptr_t)cl->classLoader;
+      assert(init && "Loaded the wrong library");
+      init(this);
+      insertAllMethodsInVM(vm);
+    }
+  }
+}
+
+void JnjvmClassLoader::loadLibFromFile(Jnjvm* vm, const char* name) {
+  assert(classes->map.size() == 0);
+  char* soName = (char*)alloca(strlen(name) + strlen(DYLD_EXTENSION));
+  sprintf(soName, "%s%s", name, DYLD_EXTENSION);
+  void* handle = dlopen(soName, RTLD_LAZY | RTLD_LOCAL);
+  if (handle) {
+    Class* cl = (Class*)dlsym(handle, name);
+    if (cl) {
+      static_init_t init = (static_init_t)(uintptr_t)cl->classLoader;
+      init(this);
+      insertAllMethodsInVM(vm);
+    }
+  }
+}
+
 
 // Extern "C" functions called by the vmjc static intializer.
 extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sun Jan 11 15:43:38 2009
@@ -266,6 +266,22 @@
   /// JnJVM.
   ///
   intptr_t nativeLookup(JavaMethod* meth, bool& jnjvm, char* buf);
+
+  /// insertAllMethodsInVM - Insert all methods defined by this class loader
+  /// in the VM.
+  ///
+  void insertAllMethodsInVM(Jnjvm* vm);
+
+  /// loadLibFromJar - Try to load the shared library compiled by vmjc with
+  /// this jar file.
+  ///
+  void loadLibFromJar(Jnjvm* vm, const char* name, const char* file);
+
+  /// loadLibFromFile - Try to load the shared library compiled by vmjc with
+  /// this class file.
+  ///
+  void loadLibFromFile(Jnjvm* vm, const char* name);
+
 };
 
 /// JnjvmBootstrapLoader - This class is for the bootstrap class loader, which





More information about the vmkit-commits mailing list