[vmkit-commits] [vmkit] r55416 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ Isolate/ VMCore/

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Aug 27 08:43:13 PDT 2008


Author: geoffray
Date: Wed Aug 27 10:43:10 2008
New Revision: 55416

URL: http://llvm.org/viewvc/llvm-project?rev=55416&view=rev
Log:
Add a new parameter when making upcalls and calling Java
method. This parameter is the cache constant pool.


Modified:
    vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc
    vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h
    vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp Wed Aug 27 10:43:10 2008
@@ -160,7 +160,7 @@
   UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(target, true);
   JavaObject* res = cl->doNew(vm);
   JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons));
-  meth->invokeIntSpecial(vm, res);
+  meth->invokeIntSpecial(vm, cl, res);
   return (jobject)res;
 }
 

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Wed Aug 27 10:43:10 2008
@@ -80,7 +80,7 @@
       
       JavaObject* excp = 0;
       try {
-        meth->invokeIntSpecialBuf(vm, res, _buf);
+        meth->invokeIntSpecialBuf(vm, cl, res, _buf);
       }catch(...) {
         excp = JavaThread::getJavaException();
         JavaThread::clearException();

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Wed Aug 27 10:43:10 2008
@@ -116,12 +116,12 @@
     try{ \
       if (isVirtual(meth->access)) { \
         if (isPublic(meth->access)) { \
-          val = meth->invoke##TYPE##VirtualBuf(vm, obj, _buf); \
+          val = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, _buf); \
         } else { \
-          val = meth->invoke##TYPE##SpecialBuf(vm, obj, _buf); \
+          val = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, _buf); \
         } \
       } else { \
-        val = meth->invoke##TYPE##StaticBuf(vm, _buf); \
+        val = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \
       } \
     }catch(...) { \
       exc = JavaThread::getJavaException(); \

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Wed Aug 27 10:43:10 2008
@@ -92,8 +92,9 @@
           i != e; ++i, ++index) {
       JavaMethod* meth = *i;
       // TODO: check parameter types
-      JavaObject* tmp = vm->upcalls->newConstructor->doNew(vm);
-      vm->upcalls->initConstructor->invokeIntSpecial(vm, tmp, Cl, meth);
+      UserClass* Cons = vm->upcalls->newConstructor;
+      JavaObject* tmp = Cons->doNew(vm);
+      vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, meth);
       ret->elements[index] = tmp;
     }
     return (jobject)ret;
@@ -124,8 +125,9 @@
           i != e; ++i, ++index) {
       JavaMethod* meth = *i;
       // TODO: check parameter types
-      JavaObject* tmp = vm->upcalls->newMethod->doNew(vm);
-      vm->upcalls->initMethod->invokeIntSpecial(vm, tmp, Cl,
+      UserClass* Meth = vm->upcalls->newMethod;
+      JavaObject* tmp = Meth->doNew(vm);
+      vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl,
                                               vm->UTF8ToStr(meth->name), meth);
       ret->elements[index] = tmp;
     }
@@ -284,8 +286,9 @@
           i != e; ++i, ++index) {
       JavaField* field = *i;
       // TODO: check parameter types
-      JavaObject* tmp = vm->upcalls->newField->doNew(vm);
-      vm->upcalls->initField->invokeIntSpecial(vm, tmp, Cl,
+      UserClass* Field = vm->upcalls->newField;
+      JavaObject* tmp = Field->doNew(vm);
+      vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl,
                                              vm->UTF8ToStr(field->name), field);
       ret->elements[index] = tmp;
     }

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Wed Aug 27 10:43:10 2008
@@ -28,7 +28,9 @@
 
 static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key,
                         const char* val) {
-  vm->upcalls->setProperty->invokeIntSpecial(vm, prop, vm->asciizToStr(key),
+  vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->classOf,
+                                             prop,
+                                             vm->asciizToStr(key),
                                              vm->asciizToStr(val));
 }
 

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Wed Aug 27 10:43:10 2008
@@ -78,7 +78,7 @@
   vm->lock->unlock();
 #endif
   JavaMethod* method = vmthClass->lookupMethod(Jnjvm::runName, Jnjvm::clinitType, ACC_VIRTUAL, true);
-  method->invokeIntSpecial(isolate, vmThread);
+  method->invokeIntSpecial(isolate, (UserClass*)vmthClass, vmThread);
 
   
   if (!isDaemon) {

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Wed Aug 27 10:43:10 2008
@@ -65,10 +65,12 @@
 
   bool native = isNative(meth->access);
 
-  JavaObject* res = vm->upcalls->newStackTraceElement->doNew(vm);
-  vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, res, sourceName,
-                                                     (uint32)ip, className,
-                                                     methodName, native);
+  UserClass* newS = vm->upcalls->newStackTraceElement;
+  JavaObject* res = newS->doNew(vm);
+  vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, newS, res,
+                                                       sourceName,
+                                                       (uint32)ip, className,
+                                                       methodName, native);
   return res;
 }
 

Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Wed Aug 27 10:43:10 2008
@@ -139,6 +139,9 @@
   UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, uint32 nb);
 };
 
+class UserConstantPool {
+};
+
 } // end namespace jnjvm
 
 #endif // JNJVM_CLASS_ISOLATE_H

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Wed Aug 27 10:43:10 2008
@@ -31,6 +31,7 @@
 class AssessorDesc;
 class Enveloppe;
 class Class;
+class ClassArray;
 class JavaConstantPool;
 class JavaField;
 class JavaJIT;
@@ -611,6 +612,13 @@
   JavaConstantPool* getConstantPool() {
     return ctpInfo;
   }
+
+  /// getCtpCache - A class does not have a ctp cache, hence
+  /// this method always returns 0.
+  ///
+  JavaConstantPool* getCtpCache() {
+    return 0;
+  }
   
   ArrayUInt8* getBytes() {
     return bytes;
@@ -782,62 +790,62 @@
 //===----------------------------------------------------------------------===//
   
   /// This class of methods takes a variable argument list.
-  uint32 invokeIntSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  float invokeFloatSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  double invokeDoubleSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  sint64 invokeLongSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  
-  uint32 invokeIntVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  float invokeFloatVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  double invokeDoubleVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  sint64 invokeLongVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-  
-  uint32 invokeIntStaticAP(Jnjvm* vm, va_list ap);
-  float invokeFloatStaticAP(Jnjvm* vm, va_list ap);
-  double invokeDoubleStaticAP(Jnjvm* vm, va_list ap);
-  sint64 invokeLongStaticAP(Jnjvm* vm, va_list ap);
-  JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, va_list ap);
+  uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  
+  uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+  
+  uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+  float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+  double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+  sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+  JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap);
 
   /// This class of methods takes a buffer which contain the arguments of the
   /// call.
-  uint32 invokeIntSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  float invokeFloatSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  double invokeDoubleSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  sint64 invokeLongSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  
-  uint32 invokeIntVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  float invokeFloatVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  double invokeDoubleVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  sint64 invokeLongVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-  
-  uint32 invokeIntStaticBuf(Jnjvm* vm, void* buf);
-  float invokeFloatStaticBuf(Jnjvm* vm, void* buf);
-  double invokeDoubleStaticBuf(Jnjvm* vm, void* buf);
-  sint64 invokeLongStaticBuf(Jnjvm* vm, void* buf);
-  JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, void* buf);
+  uint32 invokeIntSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  float invokeFloatSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  double invokeDoubleSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  sint64 invokeLongSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  
+  uint32 invokeIntVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  float invokeFloatVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  double invokeDoubleVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  sint64 invokeLongVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+  
+  uint32 invokeIntStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+  float invokeFloatStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+  double invokeDoubleStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+  sint64 invokeLongStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+  JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, UserClass*, void* buf);
 
   /// This class of methods is variadic.
-  uint32 invokeIntSpecial(Jnjvm* vm, JavaObject* obj, ...);
-  float invokeFloatSpecial(Jnjvm* vm, JavaObject* obj, ...);
-  double invokeDoubleSpecial(Jnjvm* vm, JavaObject* obj, ...);
-  sint64 invokeLongSpecial(Jnjvm* vm, JavaObject* obj, ...);
-  JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, JavaObject* obj, ...);
-  
-  uint32 invokeIntVirtual(Jnjvm* vm, JavaObject* obj, ...);
-  float invokeFloatVirtual(Jnjvm* vm, JavaObject* obj, ...);
-  double invokeDoubleVirtual(Jnjvm* vm, JavaObject* obj, ...);
-  sint64 invokeLongVirtual(Jnjvm* vm, JavaObject* obj, ...);
-  JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, JavaObject* obj, ...);
-  
-  uint32 invokeIntStatic(Jnjvm* vm, ...);
-  float invokeFloatStatic(Jnjvm* vm, ...);
-  double invokeDoubleStatic(Jnjvm* vm, ...);
-  sint64 invokeLongStatic(Jnjvm* vm, ...);
-  JavaObject* invokeJavaObjectStatic(Jnjvm* vm, ...);
+  uint32 invokeIntSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  float invokeFloatSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  double invokeDoubleSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  sint64 invokeLongSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  
+  uint32 invokeIntVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  float invokeFloatVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  double invokeDoubleVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  sint64 invokeLongVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+  
+  uint32 invokeIntStatic(Jnjvm* vm, UserClass*, ...);
+  float invokeFloatStatic(Jnjvm* vm, UserClass*, ...);
+  double invokeDoubleStatic(Jnjvm* vm, UserClass*, ...);
+  sint64 invokeLongStatic(Jnjvm* vm, UserClass*, ...);
+  JavaObject* invokeJavaObjectStatic(Jnjvm* vm, UserClass*, ...);
   
   mvm::JITInfo* JInfo;
   template<typename Ty> 
@@ -965,4 +973,9 @@
 
 } // end namespace jnjvm
 
+
+#ifdef MULTIPLE_VM
+#include "IsolateCommonClass.h"
+#endif
+
 #endif

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 10:43:10 2008
@@ -62,7 +62,7 @@
     return invokeSpecial(index);
  
 
-#ifndef WITHOUT_VTABLE
+#if !defined(WITHOUT_VTABLE) && !defined(MULTIPLE_VM)
   Constant* zero = mvm::jit::constantZero;
   Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index);
   std::vector<Value*> args; // size = [signature->nbIn + 3];
@@ -70,9 +70,19 @@
   const llvm::FunctionType* virtualType = LSI->getVirtualType();
   FunctionType::param_iterator it  = virtualType->param_end();
   makeArgs(it, index, args, signature->args.size() + 1);
-  
+
+
   JITVerifyNull(args[0]); 
 
+#if defined(MULTIPLE_VM)
+  Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "",
+                               currentBlock);
+
+  Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "",
+                                        currentBlock);
+  args.push_back(newCtpCache);
+#endif
+
   Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "",
                                currentBlock);
   std::vector<Value*> indexes2; //[3];
@@ -159,15 +169,19 @@
   BasicBlock* executeBlock = createBasicBlock("execute");
   endBlock = createBasicBlock("end block");
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
   Value* lastArg = 0;
   for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
        i != e; ++i) {
     lastArg = i;
   }
 #if !defined(SERVICE_VM)
+  ctpCache = lastArg;
+  lastArg--;
   isolateLocal = lastArg;
 #else
+  ctpCache = lastArg;
+  lastArg--;
   if (compilingClass->isolate == Jnjvm::bootstrapVM) {
     isolateLocal = lastArg;
   } else {
@@ -510,8 +524,8 @@
   
   uint32 index = 0;
   uint32 count = 0;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
-  uint32 max = args.size() - 1;
+#if defined(MULTIPLE_VM)
+  uint32 max = args.size() - 2;
 #else
   uint32 max = args.size();
 #endif
@@ -551,12 +565,14 @@
     }
   }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
 #if !defined(SERVICE_VM)
-  isolateLocal = args[args.size() - 1];
+  isolateLocal = args[args.size() - 2];
+  ctpCache = args[args.size() - 1];
 #else
+  ctpCache = args[args.size() - 1];
   if (compilingClass->isolate == Jnjvm::bootstrapVM) {
-    isolateLocal = args[args.size() - 1];
+    isolateLocal = args[args.size() - 2];
   } else {
     JavaObject* loader = compilingClass->classLoader;
     ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader);
@@ -569,7 +585,7 @@
     BranchInst::Create(ifTrue, endBlock, cmp, currentBlock);
     currentBlock = ifTrue;
     std::vector<Value*> Args;
-    Args.push_back(args[args.size()-  1]);
+    Args.push_back(args[args.size()-  2]);
     Args.push_back(isolateLocal);
     CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(),
                      Args.end(), "", currentBlock);
@@ -674,8 +690,8 @@
   
   uint32 index = 0;
   uint32 count = 0;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
-  uint32 max = func->arg_size() - 1;
+#if defined(MULTIPLE_VM)
+  uint32 max = func->arg_size() - 2;
 #else
   uint32 max = func->arg_size();
 #endif
@@ -714,9 +730,11 @@
     }
   }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
 #if !defined(SERVICE_VM)
   isolateLocal = i;
+  i++;
+  ctpCache = i;
 #else
   if (compilingClass->isolate == Jnjvm::bootstrapVM) {
     isolateLocal = i;
@@ -739,6 +757,8 @@
     BranchInst::Create(endBlock, currentBlock);
     currentBlock = endBlock;
   }
+  i++;
+  ctpCache = i;
 #endif
 #endif
   
@@ -912,6 +932,7 @@
 
     ex->catche = reader.readU2();
 
+#ifndef MULTIPLE_VM
     if (ex->catche) {
       JavaObject* exc = 0;
       UserClass* cl = 0; 
@@ -931,13 +952,9 @@
 
       ex->catchClass = cl;
     } else {
-#ifdef MULTIPLE_VM
-      fprintf(stderr, "implement me");
-      abort();
-#else
       ex->catchClass = Classpath::newThrowable;
-#endif
     }
+#endif
     
     ex->test = createBasicBlock("testException");
     
@@ -1028,11 +1045,13 @@
     
     Value* cl = 0;
     currentBlock = cur->realTest;
-    assert(cur->catchClass);
 #ifdef MULTIPLE_VM
-    fprintf(stderr, "implement me");
-    abort();
+    // We're dealing with exceptions, don't catch the exception if the class can
+    // not be found.
+    if (catche) cl = getResolvedClass(cur->catche, false, false);
+    else cl = getJnjvmExceptionClass();
 #else
+    assert(cur->catchClass);
     LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass);
     cl = LCI->getVar(this);
 #endif
@@ -1327,14 +1346,15 @@
 
 void JavaJIT::makeArgs(FunctionType::param_iterator it,
                        uint32 index, std::vector<Value*>& Args, uint32 nb) {
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
-  nb++;
+#if defined(MULTIPLE_VM)
+  nb += 2;
 #endif
   Args.reserve(nb + 2);
   Value** args = (Value**)alloca(nb*sizeof(Value*));
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
-  args[nb - 1] = isolateLocal;
-  sint32 start = nb - 2;
+#if defined(MULTIPLE_VM)
+  args[nb - 2] = isolateLocal;
+  sint32 start = nb - 3;
+  it--;
   it--;
 #else
   sint32 start = nb - 1;
@@ -1509,6 +1529,14 @@
 
 
   if (!val) {
+#if defined(MULTIPLE_VM)
+    uint32 clIndex = ctpInfo->getClassIndexFromMethod(index);
+    Value* cl = getResolvedClass(clIndex, false);
+
+    Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl,
+                                        "", currentBlock);
+    args.push_back(newCtpCache);
+#endif
     Function* func = 
       (Function*)ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_VIRTUAL,
                                                       signature, meth);
@@ -1557,22 +1585,13 @@
       ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_STATIC,
                                            signature, meth);
     
-#ifdef MULTIPLE_VM
-    
+#if defined(MULTIPLE_VM)
     uint32 clIndex = ctpInfo->getClassIndexFromMethod(index);
-    Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex));
-    Value* arg = 0;
-    if (mycl && mycl->isResolved()) {
-      LLVMCommonClassInfo* LCI = module->getClassInfo(mycl);
-      arg = LCI->getVar(this);
-      arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "",
-                   currentBlock);
-    } else {
-      arg = getResolvedClass(clIndex, true);
-    }
-    CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "",
-                     currentBlock);
+    Value* cl = getResolvedClass(clIndex, true);
 
+    Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl,
+                                        "", currentBlock);
+    args.push_back(newCtpCache);
 #endif
 
     if (meth && meth->canBeInlined && meth != compilingMethod && 
@@ -1610,7 +1629,7 @@
   return arg1;
 }
 
-Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) {
+Value* JavaJIT::getResolvedClass(uint16 index, bool clinit, bool doThrow) {
     
     Value* arg1 = getConstantPoolAt(index);
     arg1 = new BitCastInst(arg1, JnjvmModule::JavaClassType, "", currentBlock);
@@ -1633,8 +1652,13 @@
     Args.push_back(v);
     ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index);
     Args.push_back(CI);
-    Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "",
-                        currentBlock);
+    Value* res = 0;
+    if (doThrow) {
+      res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock);
+    } else {
+      res = CallInst::Create(JnjvmModule::ClassLookupFunction, Args.begin(),
+                             Args.end(), "", currentBlock);
+    }
     node->addIncoming(res, currentBlock);
 
     llvm::BranchInst::Create(trueCl, currentBlock);
@@ -1660,18 +1684,23 @@
     VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "",
                           currentBlock);
   } else {
+#ifndef MULTIPLE_VM
     LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl);
     Size = LCI->getVirtualSize(this);
     VT = LCI->getVirtualTable(this);
     Cl = LCI->getVar(this);
-#ifndef MULTIPLE_VM
     if (!cl->isReady()) {
-#endif
+      Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
+      CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "",
+                       currentBlock);
+    }
+#else
+    Cl = getResolvedClass(index, true);
+    Size = LCI->getVirtualSize(this);
+    VT = LCI->getVirtualTable(this);
     Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
     CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "",
                      currentBlock);
-#ifndef MULTIPLE_VM
-    }
 #endif
   }
   std::vector<Value*> args;
@@ -1731,12 +1760,13 @@
 
 #ifndef MULTIPLE_VM
       if (field->classDef->isReady()) {
-#endif
         object = LCI->getStaticVar(this);
         type = LCI->getStaticType();
         return fieldGetter(this, type, object, LFI->getOffset());
-#ifndef MULTIPLE_VM
       }
+#else
+      // In a multi environment, we always need to get the ptr in the constant
+      // pool. Therefore, we do nothing here.
 #endif
     } else {
       type = LCI->getVirtualType();
@@ -2002,6 +2032,15 @@
 
   JITVerifyNull(args[0]);
 
+#if defined(MULTIPLE_VM)
+  Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "",
+                               currentBlock);
+
+  Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "",
+                                        currentBlock);
+  args.push_back(newCtpCache);
+#endif
+
   std::vector<Value*> args1;
   args1.push_back(zero);
   args1.push_back(zero);

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 27 10:43:10 2008
@@ -208,7 +208,7 @@
   llvm::Value* ldResolved(uint16 index, bool stat, llvm::Value* object,
                           const llvm::Type* fieldType, 
                           const llvm::Type* fieldTypePtr);
-  llvm::Value* getResolvedClass(uint16 index, bool clinit);
+  llvm::Value* getResolvedClass(uint16 index, bool clinit, bool doThrow = true);
   
   // methods invoke
   void makeArgs(llvm::FunctionType::param_iterator it,

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Aug 27 10:43:10 2008
@@ -1823,34 +1823,41 @@
         UserClassArray* dcl = 0;
         ConstantInt* sizeElement = 0;
         GlobalVariable* TheVT = 0;
-        JnjvmClassLoader* JCL = compilingClass->classLoader;
+        Value* valCl = 0;
 
         if (bytecodes[i] == NEWARRAY) {
           uint8 id = bytecodes[++i];
           AssessorDesc* ass = AssessorDesc::arrayType(id);
+#ifndef MULTIPLE_VM
           dcl = ass->getArrayClass();
+#else
+          valCl = getJnjvmArrayCacheAt(ass->numId);
+#endif
+
           TheVT = JnjvmModule::JavaObjectVirtualTableGV;
           LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId];
           sizeElement = LAI.sizeInBytesConstant;
         } else {
           uint16 index = readU2(bytecodes, i);
+#ifndef MULTIPLE_VM
           const UTF8* className = 
             compilingClass->ctpInfo->resolveClassName(index);
         
+          JnjvmClassLoader* JCL = compilingClass->classLoader;
           const UTF8* arrayName = 
             AssessorDesc::constructArrayName(JCL, 0, 1, className);
         
           dcl = JCL->constructArray(arrayName);
+#else
+
+          valCl = getResolvedClass(index, true);
+#endif
           TheVT = JnjvmModule::ArrayObjectVirtualTableGV;
           sizeElement = mvm::jit::constantPtrSize;
         }
-#ifdef MULTIPLE_VM
-        llvm::Value* valCl = 0;
-        fprintf(stderr, "implement me");
-        abort();
-#else
+#ifndef MULTIPLE_VM
         LLVMCommonClassInfo* LCI = module->getClassInfo(dcl);
-        llvm::Value* valCl = LCI->getVar(this);
+        valCl = LCI->getVar(this);
 #endif   
         llvm::Value* arg1 = popAsInt();
 
@@ -2066,22 +2073,20 @@
       }
 
       case MULTIANEWARRAY : {
-        JnjvmClassLoader* JCL = compilingClass->classLoader;
         uint16 index = readU2(bytecodes, i);
         uint8 dim = readU1(bytecodes, i);
         
+        
+#ifdef MULTIPLE_VM
+        Value* valCl = getResolvedClass(index, true);
+#else
+        JnjvmClassLoader* JCL = compilingClass->classLoader;
         const UTF8* className = 
           compilingClass->ctpInfo->resolveClassName(index);
 
         UserClassArray* dcl = JCL->constructArray(className);
         
         compilingClass->ctpInfo->loadClass(index);
-        
-#ifdef MULTIPLE_VM
-        llvm::Value* valCl = 0;
-        fprintf(stderr, "implement me %s", dcl->printString());
-        abort();
-#else
         LLVMCommonClassInfo* LCI = module->getClassInfo(dcl);
         Value* valCl = LCI->getVar(this);
 #endif

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Aug 27 10:43:10 2008
@@ -40,10 +40,10 @@
   va_list ap;
   va_start(ap, access);
   if (stat) {
-    method->invokeIntStaticAP(vm, ap);
+    method->invokeIntStaticAP(vm, (UserClass*)cl, ap);
   } else {
     JavaObject* obj = va_arg(ap, JavaObject*);
-    method->invokeIntSpecialAP(vm, obj, ap);
+    method->invokeIntSpecialAP(vm, (UserClass*)cl, obj, ap);
   }
   va_end(ap);
 }
@@ -91,10 +91,10 @@
 #if 1//defined(__PPC__) && !defined(__MACH__)
 #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
 \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   verifyNull(obj); \
   Signdef* sign = getSignature(); \
@@ -102,13 +102,13 @@
   void* _buf = (void*)buf; \
   readArgs(buf, sign, ap); \
   void* func = (((void***)obj)[0])[offset];\
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->name, true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
@@ -117,13 +117,13 @@
   void* _buf = (void*)buf; \
   readArgs(buf, sign, ap); \
   void* func = this->compiledPtr();\
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   Signdef* sign = getSignature(); \
@@ -131,13 +131,13 @@
   void* _buf = (void*)buf; \
   readArgs(buf, sign, ap); \
   void* func = this->compiledPtr();\
-  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, _buf);\
+  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, _buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
@@ -145,52 +145,52 @@
   \
   Signdef* sign = getSignature(); \
   void* func = meth->compiledPtr();\
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\
+  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, JavaObject* obj, ...) { \
+TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \
   va_list ap;\
   va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\
+  TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
   va_end(ap); \
   return res; \
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\
   va_list ap;\
   va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\
+  TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\
   va_end(ap); \
   return res; \
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\
   va_list ap;\
-  va_start(ap, vm);\
-  TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\
+  va_start(ap, cl);\
+  TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\
   va_end(ap); \
   return res; \
 }\
@@ -199,125 +199,125 @@
 
 #define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
 \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj); \
   void* func = (((void***)obj)[0])[offset];\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\
+  return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\
+  return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, func, ap);\
+  return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, cl->getCtpCache(), func, ap);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
   void* func = (((void***)obj)[0])[offset];\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   verifyNull(obj);\
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+  return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
-  if (!classDef->isReady()) { \
-    classDef->classLoader->loadName(classDef->name, true, true); \
-    classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\
+  if (!cl->isReady()) { \
+    cl->classLoader->loadName(cl->getName(), true, true); \
+    cl->initialiseClass(vm); \
   } \
   \
   void* func = this->compiledPtr();\
   Signdef* sign = getSignature(); \
-  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\
+  return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm,JavaObject* obj, ...) { \
+TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \
   va_list ap;\
   va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\
+  TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
   va_end(ap); \
   return res; \
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\
   va_list ap;\
   va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\
+  TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\
   va_end(ap); \
   return res; \
 }\
 \
-TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\
   va_list ap;\
-  va_start(ap, this);\
-  TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\
+  va_start(ap, cl);\
+  TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\
   va_end(ap); \
   return res; \
 }\
 
 #endif
 
-typedef uint32 (*uint32_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef sint64 (*sint64_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef float  (*float_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef double (*double_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef JavaObject* (*object_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-
-typedef uint32 (*uint32_static_ap)(Jnjvm*, void*, va_list);
-typedef sint64 (*sint64_static_ap)(Jnjvm*, void*, va_list);
-typedef float  (*float_static_ap)(Jnjvm*, void*, va_list);
-typedef double (*double_static_ap)(Jnjvm*, void*, va_list);
-typedef JavaObject* (*object_static_ap)(Jnjvm*, void*, va_list);
-
-typedef uint32 (*uint32_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef sint64 (*sint64_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef float  (*float_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef double (*double_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef JavaObject* (*object_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-
-typedef uint32 (*uint32_static_buf)(Jnjvm*, void*, void*);
-typedef sint64 (*sint64_static_buf)(Jnjvm*, void*, void*);
-typedef float  (*float_static_buf)(Jnjvm*, void*, void*);
-typedef double (*double_static_buf)(Jnjvm*, void*, void*);
-typedef JavaObject* (*object_static_buf)(Jnjvm*, void*, void*);
+typedef uint32 (*uint32_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef sint64 (*sint64_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef float  (*float_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef double (*double_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef JavaObject* (*object_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+
+typedef uint32 (*uint32_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef sint64 (*sint64_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef float  (*float_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef double (*double_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef JavaObject* (*object_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+
+typedef uint32 (*uint32_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef sint64 (*sint64_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef float  (*float_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef double (*double_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef JavaObject* (*object_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+
+typedef uint32 (*uint32_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef sint64 (*sint64_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef float  (*float_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef double (*double_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef JavaObject* (*object_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
 
 INVOKE(uint32, Int, uint32_virtual_ap, uint32_static_ap, uint32_virtual_buf, uint32_static_buf)
 INVOKE(sint64, Long, sint64_virtual_ap, sint64_static_ap, sint64_virtual_buf, sint64_static_buf)

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Aug 27 10:43:10 2008
@@ -53,6 +53,7 @@
 JavaField*  Classpath::rootGroup;
 JavaField*  Classpath::vmThread;
 JavaMethod* Classpath::uncaughtException;
+Class*      Classpath::inheritableThreadLocal;
 
 JavaMethod* Classpath::setContextClassLoader;
 JavaMethod* Classpath::getSystemClassLoader;
@@ -87,6 +88,8 @@
 JavaField*  Classpath::bufferAddress;
 JavaField*  Classpath::dataPointer32;
 JavaField*  Classpath::vmdataClassLoader;
+Class*      Classpath::newClassLoader;
+
 
 JavaField*  Classpath::boolValue;
 JavaField*  Classpath::byteValue;
@@ -214,7 +217,7 @@
   JavaObject* Stat = threadGroup->getStaticInstance();
   JavaObject* RG = rootGroup->getObjectField(Stat);
   group->setObjectField(th, RG);
-  groupAddThread->invokeIntSpecial(vm, RG, th);
+  groupAddThread->invokeIntSpecial(vm, threadGroup, RG, th);
 }
 
 void Classpath::mapInitialThread(Jnjvm* vm) {
@@ -227,10 +230,13 @@
   myth->javaThread = th;
   JavaObject* vmth = vmThread->getObjectField(th);
   vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
-  finaliseCreateInitialThread->invokeIntStatic(vm, th);
+  finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
 }
 
 void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
+  newClassLoader = 
+    UPCALL_CLASS(loader, "java/lang/ClassLoader");
+  
   getSystemClassLoader =
     UPCALL_METHOD(loader, "java/lang/ClassLoader", "getSystemClassLoader",
                   "()Ljava/lang/ClassLoader;", ACC_STATIC);
@@ -499,6 +505,9 @@
     UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;",
                  ACC_VIRTUAL);
   
+  inheritableThreadLocal = 
+    UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");
+
   finaliseCreateInitialThread = 
     UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread",
                   "(Ljava/lang/Thread;)V", ACC_STATIC);

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Wed Aug 27 10:43:10 2008
@@ -54,6 +54,7 @@
 
 class Classpath {
 public: 
+  ISOLATE_STATIC Class*      newClassLoader;
   ISOLATE_STATIC JavaMethod* getSystemClassLoader;
   ISOLATE_STATIC JavaMethod* setContextClassLoader;
   ISOLATE_STATIC UserClass* newString;
@@ -131,7 +132,9 @@
   ISOLATE_STATIC JavaField* rootGroup;
   ISOLATE_STATIC JavaField* vmThread;
   ISOLATE_STATIC JavaMethod* uncaughtException;
+  ISOLATE_STATIC Class*      inheritableThreadLocal;
   
+
   ISOLATE_STATIC UserClass* InvocationTargetException;
   ISOLATE_STATIC UserClass* ArrayStoreException;
   ISOLATE_STATIC UserClass* ClassCastException;

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Wed Aug 27 10:43:10 2008
@@ -143,7 +143,7 @@
   JavaMethod* init =
     cl->lookupMethod(Jnjvm::initName, 
                      cl->classLoader->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1);
-  init->invokeIntSpecial(vm, res, vm->asciizToStr(msg));
+  init->invokeIntSpecial(vm, (UserClass*)cl, res, vm->asciizToStr(msg));
   th->pendingException = res;
   th->returnFromNative();
   return 1;
@@ -229,7 +229,7 @@
   UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true);
   Jnjvm* vm = JavaThread::get()->isolate;
   JavaObject* res = cl->doNew(vm);
-  meth->invokeIntSpecialAP(vm, res, ap);
+  meth->invokeIntSpecialAP(vm, cl, res, ap);
   va_end(ap);
   return (jobject)res;
   
@@ -320,7 +320,13 @@
   JavaObject* self = (JavaObject*)obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, self, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = self->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, cl, self, ap);
   va_end(ap);
   return (jobject)res;
 
@@ -352,7 +358,13 @@
   JavaObject* self = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  uint32 res = meth->invokeIntVirtualAP(vm, self, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = self->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  uint32 res = meth->invokeIntVirtualAP(vm, cl, self, ap);
   va_end(ap);
   return res;
 
@@ -444,7 +456,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  uint32 res = meth->invokeIntVirtualAP(vm, obj, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  uint32 res = meth->invokeIntVirtualAP(vm, cl, obj, ap);
   va_end(ap);
   return res;
 
@@ -498,7 +516,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  jfloat res = meth->invokeFloatVirtualAP(vm, obj, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  jfloat res = meth->invokeFloatVirtualAP(vm, cl, obj, ap);
   va_end(ap);
   return res;
 
@@ -531,7 +555,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  jdouble res = meth->invokeDoubleVirtualAP(vm, obj, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  jdouble res = meth->invokeDoubleVirtualAP(vm, cl, obj, ap);
   va_end(ap);
   return res;
 
@@ -548,7 +578,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  return meth->invokeDoubleVirtualAP(vm, obj, args);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  return meth->invokeDoubleVirtualAP(vm, cl, obj, args);
 
   END_EXCEPTION
   return 0.0;
@@ -573,7 +609,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  meth->invokeIntVirtualAP(vm, obj, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  meth->invokeIntVirtualAP(vm, cl, obj, ap);
   va_end(ap);
 
   END_EXCEPTION
@@ -588,7 +630,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  meth->invokeIntVirtualAP(vm, obj, args);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  meth->invokeIntVirtualAP(vm, cl, obj, args);
 
   END_EXCEPTION
 }
@@ -808,7 +856,13 @@
   JavaObject* obj = (JavaObject*)_obj;
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  meth->invokeIntSpecialAP(vm, obj, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+  cl = meth->classDef;
+#endif
+  meth->invokeIntSpecialAP(vm, cl, obj, ap);
   va_end(ap);
 
   END_EXCEPTION
@@ -1120,7 +1174,13 @@
   va_start(ap, methodID);
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  uint32 res = meth->invokeIntStaticAP(vm, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+  cl = meth->classDef;
+#endif
+  uint32 res = meth->invokeIntStaticAP(vm, cl, ap);
   va_end(ap);
   return res;
 
@@ -1295,7 +1355,13 @@
   va_start(ap, methodID);
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  meth->invokeIntStaticAP(vm, ap);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+  cl = meth->classDef;
+#endif
+  meth->invokeIntStaticAP(vm, cl, ap);
   va_end(ap);
 
   END_EXCEPTION
@@ -1309,7 +1375,13 @@
   
   JavaMethod* meth = (JavaMethod*)methodID;
   Jnjvm* vm = JavaThread::get()->isolate;
-  meth->invokeIntStaticAP(vm, args);
+  UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+  cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+  cl = meth->classDef;
+#endif
+  meth->invokeIntStaticAP(vm, cl, args);
 
   END_EXCEPTION
 }

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 27 10:43:10 2008
@@ -165,7 +165,7 @@
 
 void Jnjvm::errorWithExcp(UserClass* cl, JavaMethod* init, const JavaObject* excp) {
   JavaObject* obj = cl->doNew(this);
-  init->invokeIntSpecial(this, obj, excp);
+  init->invokeIntSpecial(this, cl, obj, excp);
   JavaThread::throwException(obj);
 }
 
@@ -177,7 +177,7 @@
   va_end(ap);
   
   JavaObject* obj = cl->doNew(this);
-  init->invokeIntSpecial(this, obj, asciizToStr(tmp));
+  init->invokeIntSpecial(this, cl, obj, asciizToStr(tmp));
   JavaThread::throwException(obj);
 }
 
@@ -333,13 +333,14 @@
 JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) {
   acquire();
   if (!(delegatee)) {
-    JavaObject* delegatee = vm->upcalls->newClass->doNew(vm);
+    UserClass* cl = vm->upcalls->newClass;
+    JavaObject* delegatee = cl->doNew(vm);
     if (!pd) {
-      vm->upcalls->initClass->invokeIntSpecial(vm, delegatee, this);
+      vm->upcalls->initClass->invokeIntSpecial(vm, cl, delegatee, this);
     } else {
-      vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm,
-                                                               delegatee,
-                                                               this, pd);
+      vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm, cl,
+                                                                   delegatee,
+                                                                   this, pd);
     }
     this->delegatee = delegatee;
   }
@@ -646,7 +647,9 @@
 
 JnjvmClassLoader* Jnjvm::loadAppClassLoader() {
   if (appClassLoader == 0) {
-    JavaObject* loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this);
+    UserClass* cl = upcalls->newClassLoader;
+    JavaObject* loader = 
+      upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl);
     appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader);
   }
   return appClassLoader;
@@ -704,8 +707,9 @@
   mapInitialThread();
   loadAppClassLoader();
   JavaObject* obj = JavaThread::currentThread();
-  upcalls->setContextClassLoader->invokeIntSpecial(this, obj,
-                                        appClassLoader->getJavaClassLoader());
+  JavaObject* javaLoader = appClassLoader->getJavaClassLoader();
+  upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread,
+                                                   obj, javaLoader);
   // load and initialise math since it is responsible for dlopen'ing 
   // libjavalang.so and we are optimizing some math operations
   UserCommonClass* math = 
@@ -727,8 +731,8 @@
     JavaObject* group = 
       upcalls->group->getObjectField(obj);
     try{
-      upcalls->uncaughtException->invokeIntSpecial(this, group, obj, 
-                                                           exc);
+      upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup,
+                                                   group, obj, exc);
     }catch(...) {
       printf("Even uncaught exception throwed an exception!\n");
       assert(0);
@@ -834,5 +838,17 @@
   isolate->bootstrapLoader = JnjvmClassLoader::bootstrapLoader;
   isolate->upcalls = isolate->bootstrapLoader->upcalls;
 
+#ifdef MULTIPLE_VM
+  isolate->throwable = isolate->upcalls->newThrowable;
+  isolate->arrayClasses[1] = isolate->upcalls->ArrayOfBool;
+  isolate->arrayClasses[2] = isolate->upcalls->ArrayOfByte;
+  isolate->arrayClasses[3] = isolate->upcalls->ArrayOfChar;
+  isolate->arrayClasses[4] = isolate->upcalls->ArrayOfShort;
+  isolate->arrayClasses[5] = isolate->upcalls->ArrayOfInt;
+  isolate->arrayClasses[6] = isolate->upcalls->ArrayOfFloat;
+  isolate->arrayClasses[7] = isolate->upcalls->ArrayOfLong;
+  isolate->arrayClasses[8] = isolate->upcalls->ArrayOfDouble;
+#endif
+
   return isolate;
 }

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 27 10:43:10 2008
@@ -88,6 +88,17 @@
 /// Jnjvm - A JVM. Each execution of a program allocates a Jnjvm.
 ///
 class Jnjvm : public mvm::VirtualMachine {
+public:
+#ifdef MULTIPLE_GC
+  /// GC - The garbage collector of this JVM.
+  ///
+  Collector* GC;
+#endif
+
+#ifdef MULTIPLE_VM
+  UserClass* throwable;
+  UserClassArray* arrayClasses[9];
+#endif
 private:
   
   /// bootstrapThread - The initial thread of this JVM.
@@ -200,13 +211,7 @@
   static const UTF8* sinh;
   static const UTF8* tanh;
   static const UTF8* finalize;
-
-#ifdef MULTIPLE_GC
-  /// GC - The garbage collector of this JVM.
-  ///
-  Collector* GC;
-#endif
-  
+ 
   /// bootstraLoader - Bootstrap loader for base classes of this virtual
   /// machine.
   ///

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 27 10:43:10 2008
@@ -134,9 +134,15 @@
     const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size);
     JavaString* str = isolate->UTF8ToStr(javaName);
     Classpath* upcalls = bootstrapLoader->upcalls;
+    UserClass* forCtp = 0;
+#ifdef MULTIPLE_VM
+    forCtp = javaLoader->classOf->lookupClassInMethod(upcalls->loadInClassLoader);
+#else
+    forCtp = upcalls->loadInClassLoader->classDef;
+#endif
     JavaObject* obj = (JavaObject*)
-      upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader,
-                                                          str);
+      upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
+                                                          javaLoader, str);
     cl = (UserCommonClass*)(upcalls->vmdataClass->getObjectField(obj));
   }
   

Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55416&r1=55415&r2=55416&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 27 10:43:10 2008
@@ -448,8 +448,8 @@
   return staticType;
 }
 
-Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) {
 #ifndef MULTIPLE_VM
+Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) {
   if (!staticVarGV) {
     getStaticType();
     JavaObject* obj = ((Class*)classDef)->getStaticInstance();
@@ -464,12 +464,8 @@
   }
 
   return new LoadInst(staticVarGV, "", jit->currentBlock);
-
-#else
-  fprintf(stderr, "implement me\n");
-  abort();
-#endif
 }
+#endif
 
 Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) {
   if (!virtualTableGV) {
@@ -570,8 +566,9 @@
       llvmArgs.push_back(LAI.llvmType);
     }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
     llvmArgs.push_back(mvm::jit::ptrType); // domain
+    llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
 #endif
 
     uint8 id = signature->ret->funcs->numId;
@@ -594,8 +591,9 @@
       llvmArgs.push_back(LAI.llvmType);
     }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
     llvmArgs.push_back(mvm::jit::ptrType); // domain
+    llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
 #endif
 
     uint8 id = signature->ret->funcs->numId;
@@ -621,8 +619,9 @@
       llvmArgs.push_back(LAI.llvmType);
     }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
     llvmArgs.push_back(mvm::jit::ptrType); // domain
+    llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
 #endif
 
     uint8 id = signature->ret->funcs->numId;
@@ -647,10 +646,14 @@
   BasicBlock* currentBlock = BasicBlock::Create("enter", res);
   Function::arg_iterator i = res->arg_begin();
   Value *obj, *ptr, *func;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
   Value* vm = i;
 #endif
   ++i;
+#if defined(MULTIPLE_VM)
+  Value* ctp = i;
+#endif
+  ++i;
   func = i;
   ++i;
   if (virt) {
@@ -676,8 +679,9 @@
     }
   }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
   Args.push_back(vm);
+  Args.push_back(ctp);
 #endif
 
   Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock);
@@ -702,10 +706,14 @@
   BasicBlock* currentBlock = BasicBlock::Create("enter", res);
   Function::arg_iterator i = res->arg_begin();
   Value *obj, *ap, *func;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
   Value* vm = i;
 #endif
   ++i;
+#if defined(MULTIPLE_VM)
+  Value* ctp = i;
+#endif
+  ++i;
   func = i;
   ++i;
   if (virt) {
@@ -722,8 +730,9 @@
     Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock));
   }
 
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
   Args.push_back(vm);
+  Args.push_back(ctp);
 #endif
 
   Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock);
@@ -763,6 +772,7 @@
     llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
     std::vector<const llvm::Type*> Args2;
     Args2.push_back(mvm::jit::ptrType); // vm
+    Args2.push_back(mvm::jit::ptr32Type); // ctp
     Args2.push_back(getVirtualPtrType());
     Args2.push_back(JnjvmModule::JavaObjectType);
     Args2.push_back(PointerType::getUnqual(Type::Int32Ty));
@@ -779,6 +789,7 @@
     llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
     std::vector<const llvm::Type*> Args;
     Args.push_back(mvm::jit::ptrType); // vm
+    Args.push_back(mvm::jit::ptr32Type); // ctp
     Args.push_back(getStaticPtrType());
     Args.push_back(PointerType::getUnqual(Type::Int32Ty));
     uint8 id = signature->ret->funcs->numId;





More information about the vmkit-commits mailing list