[vmkit-commits] [vmkit] r139532 - in /vmkit/trunk/lib/J3: Classpath/ClasspathVMClass.inc Classpath/JavaUpcalls.cpp Classpath/JavaUpcalls.h Compiler/JavaJITCompiler.cpp VMCore/JavaClass.cpp VMCore/JavaRuntimeJIT.cpp VMCore/Jnjvm.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Sep 12 13:19:54 PDT 2011


Author: geoffray
Date: Mon Sep 12 15:19:54 2011
New Revision: 139532

URL: http://llvm.org/viewvc/llvm-project?rev=139532&view=rev
Log:
Some small compatibility fixes.


Modified:
    vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.h
    vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc Mon Sep 12 15:19:54 2011
@@ -168,6 +168,7 @@
       JavaMethod* meth = &realCl->virtualMethods[i];
       bool pub = isPublic(meth->access);
       if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && 
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) && 
           (!publicOnly || pub)) {
         ++size; 
       }
@@ -182,6 +183,7 @@
       JavaMethod* meth = &realCl->virtualMethods[i];
       bool pub = isPublic(meth->access);
       if (!(meth->name->equals(classLoader->bootstrapLoader->initName)) && 
+          !(meth->name->equals(classLoader->bootstrapLoader->clinitName)) && 
           (!publicOnly || pub)) {
         // TODO: check parameter types
         UserClass* Meth = vm->upcalls->newMethod;

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Mon Sep 12 15:19:54 2011
@@ -37,6 +37,7 @@
 JavaField*  Classpath::vmdataVMThread;
 JavaMethod* Classpath::finaliseCreateInitialThread;
 JavaMethod* Classpath::initVMThread;
+JavaMethod* Classpath::initThread;
 JavaMethod* Classpath::groupAddThread;
 JavaField*  Classpath::threadName;
 JavaField*  Classpath::groupName;
@@ -48,6 +49,7 @@
 Class*      Classpath::threadGroup;
 JavaField*  Classpath::rootGroup;
 JavaField*  Classpath::vmThread;
+JavaMethod* Classpath::getUncaughtExceptionHandler;
 JavaMethod* Classpath::uncaughtException;
 Class*      Classpath::inheritableThreadLocal;
 
@@ -240,10 +242,8 @@
   myth->javaThread = th;
   vmth = (JavaObjectVMThread*)newVMThread->doNew(vm);
   name = vm->asciizToStr(thName);
-  
-  threadName->setInstanceObjectField(th, name);
-  priority->setInstanceInt32Field(th, (uint32)1);
-  daemon->setInstanceInt8Field(th, (uint32)0);
+
+  initThread->invokeIntSpecial(vm, newThread, th, &vmth, &name, 1, 0); 
   vmThread->setInstanceObjectField(th, vmth);
   assocThread->setInstanceObjectField(vmth, th);
   running->setInstanceInt8Field(vmth, (uint32)1);
@@ -862,6 +862,10 @@
     UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread",
                   "(Ljava/lang/Thread;)V", ACC_STATIC);
   
+  initThread = 
+    UPCALL_METHOD(loader, "java/lang/Thread", "<init>",
+                  "(Ljava/lang/VMThread;Ljava/lang/String;IZ)V", ACC_VIRTUAL);
+  
   initVMThread = 
     UPCALL_METHOD(loader, "java/lang/VMThread", "<init>",
                   "(Ljava/lang/Thread;)V", ACC_VIRTUAL);
@@ -911,8 +915,13 @@
     UPCALL_FIELD(loader, "java/lang/Thread", "vmThread",
                  "Ljava/lang/VMThread;", ACC_VIRTUAL);
   
+  getUncaughtExceptionHandler = 
+    UPCALL_METHOD(loader, "java/lang/Thread", "getUncaughtExceptionHandler",
+                  "()Ljava/lang/Thread$UncaughtExceptionHandler;", ACC_VIRTUAL);
+  
   uncaughtException = 
-    UPCALL_METHOD(loader, "java/lang/ThreadGroup",  "uncaughtException",
+    UPCALL_METHOD(loader, "java/lang/Thread$UncaughtExceptionHandler",
+                  "uncaughtException",
                   "(Ljava/lang/Thread;Ljava/lang/Throwable;)V", ACC_VIRTUAL);
 
   

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.h?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.h Mon Sep 12 15:19:54 2011
@@ -137,6 +137,7 @@
   ISOLATE_STATIC JavaField* assocThread;
   ISOLATE_STATIC JavaField* vmdataVMThread;
   ISOLATE_STATIC JavaMethod* finaliseCreateInitialThread;
+  ISOLATE_STATIC JavaMethod* initThread;
   ISOLATE_STATIC JavaMethod* initVMThread;
   ISOLATE_STATIC JavaMethod* runVMThread;
   ISOLATE_STATIC JavaMethod* groupAddThread;
@@ -150,6 +151,7 @@
   ISOLATE_STATIC UserClass* threadGroup;
   ISOLATE_STATIC JavaField* rootGroup;
   ISOLATE_STATIC JavaField* vmThread;
+  ISOLATE_STATIC JavaMethod* getUncaughtExceptionHandler;
   ISOLATE_STATIC JavaMethod* uncaughtException;
   ISOLATE_STATIC UserClass*  inheritableThreadLocal;
   

Modified: vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp Mon Sep 12 15:19:54 2011
@@ -217,7 +217,28 @@
 }
 
 extern "C" void ThrowUnfoundInterface() {
-  abort();
+  JavaThread *th = JavaThread::get();
+
+  BEGIN_NATIVE_EXCEPTION(1);
+
+  // Lookup the caller of this class.
+  mvm::StackWalker Walker(th);
+  mvm::FrameInfo* FI = Walker.get();
+  assert(FI->Metadata != NULL && "Wrong stack trace");
+  JavaMethod* meth = (JavaMethod*)FI->Metadata;
+
+  // Lookup the method info in the constant pool of the caller.
+  uint16 ctpIndex = meth->lookupCtpIndex(FI);
+  assert(ctpIndex && "No constant pool index");
+  JavaConstantPool* ctpInfo = meth->classDef->getConstantPool();
+  CommonClass* ctpCl = 0;
+  const UTF8* utf8 = 0;
+  Signdef* sign = 0;
+  ctpInfo->resolveMethod(ctpIndex, ctpCl, utf8, sign);
+
+  JavaThread::get()->getJVM()->abstractMethodError(ctpCl, utf8);
+
+  END_NATIVE_EXCEPTION
 }
 
 void JavaJITCompiler::makeIMT(Class* cl) {

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Mon Sep 12 15:19:54 2011
@@ -247,7 +247,8 @@
   uint32 size = JavaVirtualTable::getBaseSize();
   virtualVT = new(loader->allocator, size) JavaVirtualTable(this);
   
-  access = ACC_FINAL | ACC_ABSTRACT | ACC_PUBLIC | JNJVM_ARRAY;
+  access = ACC_FINAL | ACC_ABSTRACT | JNJVM_ARRAY | base->getAccess();
+  access &= ~ACC_INTERFACE;
 }
 
 JavaObject* UserClassArray::doNew(sint32 n, Jnjvm* vm) {

Modified: vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaRuntimeJIT.cpp Mon Sep 12 15:19:54 2011
@@ -579,6 +579,10 @@
   UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
   JavaMethod* Virt = lookup->lookupMethod(utf8, sign->keyName, false, true, 0);
 
+  if (isAbstract(Virt->access)) {
+    JavaThread::get()->getJVM()->abstractMethodError(Virt->classDef, Virt->name);
+  }
+
   // Compile the found method.
   result = Virt->compiledPtr();
 
@@ -678,6 +682,9 @@
   if (!callee) {
     th->getJVM()->noSuchMethodError(lookup, utf8);
   }
+  if (isAbstract(callee->access)) {
+    JavaThread::get()->getJVM()->abstractMethodError(callee->classDef, callee->name);
+  }
 
   // Compile the found method.
   result = callee->compiledPtr();

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=139532&r1=139531&r2=139532&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Mon Sep 12 15:19:54 2011
@@ -506,7 +506,7 @@
       ArrayUInt16::setElement(msg, '.', i);
       i++;
     } else {
-      ArrayUInt16::setElement(msg, cl->name->elements[i], i);
+      ArrayUInt16::setElement(msg, cl->name->elements[j], i);
       i++;
     }
   }
@@ -1166,12 +1166,12 @@
 void Jnjvm::executeClass(const char* className, ArrayObject* args) {
   JavaObject* exc = NULL;
   JavaObject* obj = NULL;
-  JavaObject* group = NULL;
+  JavaObject* handler = NULL;
   
   llvm_gcroot(args, 0);
   llvm_gcroot(exc, 0);
   llvm_gcroot(obj, 0);
-  llvm_gcroot(group, 0);
+  llvm_gcroot(handler, 0);
 
   TRY {
     // First try to see if we are a self-contained executable.
@@ -1203,10 +1203,10 @@
     JavaThread* th = JavaThread::get();
     th->clearException();
     obj = th->currentThread();
-    group = upcalls->group->getInstanceObjectField(obj);
     TRY {
-      upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup,
-                                                   group, &obj, &exc);
+      handler = upcalls->getUncaughtExceptionHandler->invokeJavaObjectVirtual(this, upcalls->newThread, obj);
+      verifyNull(handler);
+      upcalls->uncaughtException->invokeIntVirtual(this, upcalls->uncaughtException->classDef, handler, &obj, &exc);
     } CATCH {
       fprintf(stderr, "Exception in thread \"main\": "
                       "Can not print stack trace.\n");





More information about the vmkit-commits mailing list