[vmkit-commits] [vmkit] r70851 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp VMCore/JavaUpcalls.cpp VMCore/JavaUpcalls.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon May 4 04:44:56 PDT 2009


Author: geoffray
Date: Mon May  4 06:44:49 2009
New Revision: 70851

URL: http://llvm.org/viewvc/llvm-project?rev=70851&view=rev
Log:
Throw an instantiation exception when wanting to instantiate
an abstract class.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Mon May  4 06:44:49 2009
@@ -73,11 +73,14 @@
   jobject res = 0;
   Jnjvm* vm = JavaThread::get()->getJVM();
   JavaMethod* meth = cons->getInternalMethod();
+  UserClass* cl = cons->getClass();
   JavaArray* args = (JavaArray*)_args;
   sint32 nbArgs = args ? args->size : 0;
   Signdef* sign = meth->getSignature();
   sint32 size = sign->nbArguments;
 
+  if (isAbstract(cl->access)) vm->instantiationException();
+
   // Allocate a buffer to store the arguments.
   uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0;
   // Record the beginning of the buffer.

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Mon May  4 06:44:49 2009
@@ -129,6 +129,7 @@
 Class* Classpath::NoSuchFieldError;
 Class* Classpath::NoSuchMethodError;
 Class* Classpath::InstantiationError;
+Class* Classpath::InstantiationException;
 Class* Classpath::IllegalAccessError;
 Class* Classpath::IllegalAccessException;
 Class* Classpath::VerifyError;
@@ -161,6 +162,7 @@
 JavaMethod* Classpath::InitNoSuchFieldError;
 JavaMethod* Classpath::InitNoSuchMethodError;
 JavaMethod* Classpath::InitInstantiationError;
+JavaMethod* Classpath::InitInstantiationException;
 JavaMethod* Classpath::InitIllegalAccessError;
 JavaMethod* Classpath::InitIllegalAccessException;
 JavaMethod* Classpath::InitVerifyError;
@@ -553,6 +555,7 @@
   UPCALL_CLASS_EXCEPTION(loader, NoSuchFieldError);
   UPCALL_CLASS_EXCEPTION(loader, NoSuchMethodError);
   UPCALL_CLASS_EXCEPTION(loader, InstantiationError);
+  UPCALL_CLASS_EXCEPTION(loader, InstantiationException);
   UPCALL_CLASS_EXCEPTION(loader, IllegalAccessError);
   UPCALL_CLASS_EXCEPTION(loader, IllegalAccessException);
   UPCALL_CLASS_EXCEPTION(loader, VerifyError);
@@ -585,6 +588,7 @@
   UPCALL_METHOD_EXCEPTION(loader, NoSuchFieldError);
   UPCALL_METHOD_EXCEPTION(loader, NoSuchMethodError);
   UPCALL_METHOD_EXCEPTION(loader, InstantiationError);
+  UPCALL_METHOD_EXCEPTION(loader, InstantiationException);
   UPCALL_METHOD_EXCEPTION(loader, IllegalAccessError);
   UPCALL_METHOD_EXCEPTION(loader, IllegalAccessException);
   UPCALL_METHOD_EXCEPTION(loader, VerifyError);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Mon May  4 06:44:49 2009
@@ -161,6 +161,7 @@
   ISOLATE_STATIC UserClass* NoSuchFieldError;
   ISOLATE_STATIC UserClass* NoSuchMethodError;
   ISOLATE_STATIC UserClass* InstantiationError;
+  ISOLATE_STATIC UserClass* InstantiationException;
   ISOLATE_STATIC UserClass* IllegalAccessError;
   ISOLATE_STATIC UserClass* IllegalAccessException;
   ISOLATE_STATIC UserClass* VerifyError;
@@ -193,6 +194,7 @@
   ISOLATE_STATIC JavaMethod* InitNoSuchFieldError;
   ISOLATE_STATIC JavaMethod* InitNoSuchMethodError;
   ISOLATE_STATIC JavaMethod* InitInstantiationError;
+  ISOLATE_STATIC JavaMethod* InitInstantiationException;
   ISOLATE_STATIC JavaMethod* InitIllegalAccessError;
   ISOLATE_STATIC JavaMethod* InitIllegalAccessException;
   ISOLATE_STATIC JavaMethod* InitVerifyError;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Mon May  4 06:44:49 2009
@@ -263,13 +263,15 @@
 
 void Jnjvm::error(UserClass* cl, JavaMethod* init, const char* fmt, ...) {
   char* tmp = (char*)alloca(4096);
-  va_list ap;
-  va_start(ap, fmt);
-  vsnprintf(tmp, 4096, fmt, ap);
-  va_end(ap);
+  if (fmt) {
+    va_list ap;
+    va_start(ap, fmt);
+    vsnprintf(tmp, 4096, fmt, ap);
+    va_end(ap);
+  }
   
   if (cl && !bootstrapLoader->getCompiler()->isStaticCompiling()) {
-    JavaObject* obj = CreateError(cl, init, tmp);
+    JavaObject* obj = CreateError(cl, init, fmt ? fmt : 0);
     JavaThread::get()->throwException(obj);
   } else {
     throw std::string(tmp);
@@ -456,6 +458,11 @@
         str->strToAsciiz());
 }
 
+void Jnjvm::instantiationException() {
+  error(upcalls->InstantiationException,
+        upcalls->InitInstantiationException, 0);
+}
+
 void Jnjvm::unknownError(const char* fmt, ...) {
   error(upcalls->UnknownError,
         upcalls->InitUnknownError,  

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Mon May  4 06:44:49 2009
@@ -276,6 +276,7 @@
   void noClassDefFoundError(JavaObject* obj);
   void noClassDefFoundError(const UTF8* name);
   void classNotFoundException(JavaString* str);
+  void instantiationException();
 
   /// asciizToStr - Constructs a java/lang/String object from the given asciiz.
   ///





More information about the vmkit-commits mailing list