[vmkit-commits] [vmkit] r71938 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp Classpath/ClasspathField.cpp Classpath/ClasspathMethod.cpp Classpath/ClasspathVMClass.cpp Classpath/ClasspathVMThread.cpp VMCore/JavaClass.cpp VMCore/JavaObject.h VMCore/JavaUpcalls.cpp VMCore/JavaUpcalls.h VMCore/Jnjvm.cpp VMCore/Jnjvm.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat May 16 04:26:47 PDT 2009


Author: geoffray
Date: Sat May 16 06:26:39 2009
New Revision: 71938

URL: http://llvm.org/viewvc/llvm-project?rev=71938&view=rev
Log:
Optimize String creation when throwing exceptions from VMKit.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
    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=71938&r1=71937&r2=71938&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp Sat May 16 06:26:39 2009
@@ -122,10 +122,10 @@
       }
     
     } else {
-      vm->illegalArgumentExceptionForMethod(meth, 0, 0);
+      vm->illegalArgumentException("class is not a regular class");
     }
   } else {
-    vm->illegalArgumentExceptionForMethod(meth, 0, 0);
+    vm->illegalArgumentException("wrong number of arguments");
   }
  
   return res;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathField.cpp Sat May 16 06:26:39 2009
@@ -95,9 +95,9 @@
     else if (prim->isShort())
       res = (sint32)field->getInt16Field(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -144,9 +144,9 @@
     else if (prim->isLong())
       res = (sint64)field->getLongField(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -183,9 +183,9 @@
     if (prim->isBool())  
       res = (uint8)field->getInt8Field(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -234,9 +234,9 @@
     else if (prim->isFloat())
       res = (jfloat)field->getFloatField(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -273,9 +273,9 @@
     if (prim->isByte())
       res = (sint8)field->getInt8Field(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -313,9 +313,9 @@
     if (prim->isChar())
       res = (uint16)field->getInt16Field(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -356,9 +356,9 @@
     else if (prim->isByte())
       res = (sint16)field->getInt8Field(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
   
   END_NATIVE_EXCEPTION
@@ -407,9 +407,9 @@
     else if (prim->isDouble())
       res = (jdouble)field->getDoubleField(Obj);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -578,9 +578,9 @@
     if (prim->isBool())
       field->setInt8Field(Obj, (uint8)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -624,9 +624,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -666,9 +666,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)(uint64)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -709,9 +709,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -750,9 +750,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -789,9 +789,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -827,9 +827,9 @@
     else if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else 
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION
@@ -862,9 +862,9 @@
     if (prim->isDouble())
       field->setDoubleField(Obj, (double)val);
     else
-      vm->illegalArgumentException("");
+      vm->illegalArgumentException("wrong type");
   } else {
-    vm->illegalArgumentException("");
+    vm->illegalArgumentException("wrong type");
   }
 
   END_NATIVE_EXCEPTION

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp Sat May 16 06:26:39 2009
@@ -115,7 +115,7 @@
       verifyNull(obj);
       UserCommonClass* objCl = obj->getClass();
       if (!(objCl->isAssignableFrom(cl))) {
-        vm->illegalArgumentExceptionForMethod(meth, cl, obj->getClass());
+        vm->illegalArgumentException("<this> is not a valid type");
       }
 
       if (isInterface(cl->access)) {
@@ -214,7 +214,7 @@
       res = val;
     } 
   } else {
-    vm->illegalArgumentExceptionForMethod(meth, 0, 0); 
+    vm->illegalArgumentException("wrong number of arguments"); 
   }
 
   return (jobject)res;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp Sat May 16 06:26:39 2009
@@ -325,7 +325,7 @@
   
   BEGIN_NATIVE_EXCEPTION(0)
 
-  if (!Cl2) JavaThread::get()->getJVM()->nullPointerException("");
+  if (!Cl2) JavaThread::get()->getJVM()->nullPointerException();
 
   UserCommonClass* cl1 = ((JavaObjectClass*)Cl1)->getClass();
   UserCommonClass* cl2 = ((JavaObjectClass*)Cl2)->getClass();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThread.cpp Sat May 16 06:26:39 2009
@@ -88,7 +88,7 @@
   assert(javaThread && "VMThread with no Java equivalent");
  
   JavaThread* th = new JavaThread(javaThread, vmThread, vm);
-  if (!th) vm->outOfMemoryError(0);
+  if (!th) vm->outOfMemoryError();
   th->start((void (*)(mvm::Thread*))start);
 
   END_NATIVE_EXCEPTION

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sat May 16 06:26:39 2009
@@ -297,7 +297,7 @@
   if (n < 0)
     vm->negativeArraySizeException(n);
   else if (n > JavaArray::MaxArraySize)
-    vm->outOfMemoryError(n);
+    vm->outOfMemoryError();
 
   return doNew(n, vm->gcAllocator);
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sat May 16 06:26:39 2009
@@ -192,7 +192,7 @@
   #define verifyNull(obj) {}
 #else
   #define verifyNull(obj) \
-    if (obj == 0) JavaThread::get()->getJVM()->nullPointerException("");
+    if (obj == 0) JavaThread::get()->getJVM()->nullPointerException();
 #endif
   
   virtual void TRACER;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Sat May 16 06:26:39 2009
@@ -177,6 +177,7 @@
 JavaMethod* Classpath::InitClassNotFoundException;
 JavaMethod* Classpath::InitArithmeticException;
 JavaMethod* Classpath::InitObject;
+JavaMethod* Classpath::IntToString;
 
 JavaMethod* Classpath::ErrorWithExcpNoClassDefFoundError;
 JavaMethod* Classpath::ErrorWithExcpExceptionInInitializerError;
@@ -612,6 +613,9 @@
 
   InitObject = UPCALL_METHOD(loader, "java/lang/Object", "<init>", "()V",
                              ACC_VIRTUAL);
+  
+  IntToString = UPCALL_METHOD(loader, "java/lang/Integer", "toString",
+                              "(II)Ljava/lang/String;", ACC_STATIC);
 
   newThread = 
     UPCALL_CLASS(loader, "java/lang/Thread");

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Sat May 16 06:26:39 2009
@@ -208,6 +208,8 @@
   ISOLATE_STATIC JavaMethod* InitUnknownError;
   ISOLATE_STATIC JavaMethod* InitClassNotFoundException;
   ISOLATE_STATIC JavaMethod* InitArithmeticException;
+  
+  ISOLATE_STATIC JavaMethod* IntToString;
 
   ISOLATE_STATIC JavaMethod* InitObject;
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sat May 16 06:26:39 2009
@@ -261,6 +261,13 @@
   return obj;
 }
 
+JavaObject* Jnjvm::CreateError(UserClass* cl, JavaMethod* init,
+                               JavaString* str) {
+  JavaObject* obj = cl->doNew(this);
+  init->invokeIntSpecial(this, cl, obj, str);
+  return obj;
+}
+
 void Jnjvm::error(UserClass* cl, JavaMethod* init, const char* fmt, ...) {
   char* tmp = (char*)alloca(4096);
   if (fmt) {
@@ -278,58 +285,67 @@
   }
 }
 
+void Jnjvm::error(UserClass* cl, JavaMethod* init, JavaString* str) {
+  JavaObject* obj = CreateError(cl, init, str);
+  JavaThread::get()->throwException(obj);
+}
+
 void Jnjvm::arrayStoreException() {
   error(upcalls->ArrayStoreException,
-        upcalls->InitArrayStoreException, "");
+        upcalls->InitArrayStoreException, (JavaString*)0);
 }
 
 void Jnjvm::indexOutOfBounds(const JavaObject* obj, sint32 entry) {
+  JavaString* str = (JavaString*)
+    upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
+                                                 entry, 10);
   error(upcalls->ArrayIndexOutOfBoundsException,
-        upcalls->InitArrayIndexOutOfBoundsException, "%d", entry);
+        upcalls->InitArrayIndexOutOfBoundsException, str);
 }
 
 void Jnjvm::negativeArraySizeException(sint32 size) {
+  JavaString* str = (JavaString*)
+    upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
+                                                 size, 10);
   error(upcalls->NegativeArraySizeException,
-        upcalls->InitNegativeArraySizeException, "%d", size);
+        upcalls->InitNegativeArraySizeException, str);
 }
 
-void Jnjvm::nullPointerException(const char* fmt, ...) {
-  va_list ap;
-  va_start(ap, fmt);
-  char* val = va_arg(ap, char*);
-  va_end(ap);
+void Jnjvm::nullPointerException() {
   error(upcalls->NullPointerException,
-        upcalls->InitNullPointerException, fmt, val);
+        upcalls->InitNullPointerException, (JavaString*)0);
 }
 
 JavaObject* Jnjvm::CreateIndexOutOfBoundsException(sint32 entry) {
-  
-  char* tmp = (char*)alloca(4096);
-  snprintf(tmp, 4096, "%d", entry);
-
+  JavaString* str = (JavaString*)
+    upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
+                                                 entry, 10);
   return CreateError(upcalls->ArrayIndexOutOfBoundsException,
-                     upcalls->InitArrayIndexOutOfBoundsException, tmp);
+                     upcalls->InitArrayIndexOutOfBoundsException, str);
 }
 
 JavaObject* Jnjvm::CreateNegativeArraySizeException() {
   return CreateError(upcalls->NegativeArraySizeException,
-                     upcalls->InitNegativeArraySizeException, 0);
+                     upcalls->InitNegativeArraySizeException,
+                     (JavaString*)0);
 }
 
 JavaObject* Jnjvm::CreateArithmeticException() {
+  JavaString* str = asciizToStr("/ by zero");
   return CreateError(upcalls->ArithmeticException,
-                     upcalls->InitArithmeticException, "/ by zero");
+                     upcalls->InitArithmeticException, str);
 }
 
 JavaObject* Jnjvm::CreateNullPointerException() {
   return CreateError(upcalls->NullPointerException,
-                     upcalls->InitNullPointerException, 0);
+                     upcalls->InitNullPointerException,
+                     (JavaString*)0);
 }
 
 JavaObject* Jnjvm::CreateOutOfMemoryError() {
+  JavaString* str = asciizToStr("Java heap space");
   return CreateError(upcalls->OutOfMemoryError,
-                     upcalls->InitOutOfMemoryError, 
-                     "Java heap space");
+                     upcalls->InitOutOfMemoryError, str);
 }
 
 JavaObject* Jnjvm::CreateStackOverflowError() {
@@ -340,35 +356,40 @@
 }
 
 JavaObject* Jnjvm::CreateArrayStoreException(JavaVirtualTable* VT) {
+  JavaString* str = JavaString::internalToJava(VT->cl->name, this);
   return CreateError(upcalls->ArrayStoreException,
-                     upcalls->InitArrayStoreException,
-                     VT->cl->printString());
+                     upcalls->InitArrayStoreException, str);
 }
 
 JavaObject* Jnjvm::CreateClassCastException(JavaObject* obj,
                                             UserCommonClass* cl) {
   return CreateError(upcalls->ClassCastException,
-                     upcalls->InitClassCastException, "");
+                     upcalls->InitClassCastException,
+                     (JavaString*)0);
 }
 
 JavaObject* Jnjvm::CreateLinkageError(const char* msg) {
+  JavaString* str = asciizToStr(msg);
   return CreateError(upcalls->LinkageError,
-                     upcalls->InitLinkageError, msg);
+                     upcalls->InitLinkageError, str);
 }
 
 void Jnjvm::illegalAccessException(const char* msg) {
+  JavaString* str = asciizToStr(msg);
   error(upcalls->IllegalAccessException,
-        upcalls->InitIllegalAccessException, msg);
+        upcalls->InitIllegalAccessException, str);
 }
 
 void Jnjvm::illegalMonitorStateException(const JavaObject* obj) {
   error(upcalls->IllegalMonitorStateException,
-        upcalls->InitIllegalMonitorStateException, "");
+        upcalls->InitIllegalMonitorStateException,
+        (JavaString*)0);
 }
 
 void Jnjvm::interruptedException(const JavaObject* obj) {
   error(upcalls->InterruptedException,
-        upcalls->InitInterruptedException, "");
+        upcalls->InitInterruptedException,
+        (JavaString*)0);
 }
 
 
@@ -384,84 +405,168 @@
                 excp);
 }
 
-void Jnjvm::outOfMemoryError(sint32 n) {
+void Jnjvm::outOfMemoryError() {
+  JavaString* str = asciizToStr("Java heap space");
   error(upcalls->OutOfMemoryError,
-        upcalls->InitOutOfMemoryError, "%d", n);
-}
-
-void Jnjvm::illegalArgumentExceptionForMethod(JavaMethod* meth, 
-                                              UserCommonClass* required,
-                                              UserCommonClass* given) {
-  error(upcalls->IllegalArgumentException, 
-        upcalls->InitIllegalArgumentException, 
-        "for method %s", meth->printString());
-}
-
-void Jnjvm::illegalArgumentExceptionForField(JavaField* field, 
-                                             UserCommonClass* required,
-                                             UserCommonClass* given) {
-  error(upcalls->IllegalArgumentException, 
-        upcalls->InitIllegalArgumentException, 
-        "for field %s", field->printString());
+        upcalls->InitOutOfMemoryError, str);
 }
 
 void Jnjvm::illegalArgumentException(const char* msg) {
+  JavaString* str = asciizToStr(msg);
   error(upcalls->IllegalArgumentException,
-        upcalls->InitIllegalArgumentException,
-        msg);
+        upcalls->InitIllegalArgumentException, str);
 }
 
 void Jnjvm::classCastException(JavaObject* obj, UserCommonClass* cl) {
   error(upcalls->ClassCastException,
         upcalls->InitClassCastException,
-        "");
+        (JavaString*)0);
 }
 
-void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) {
-  error(upcalls->NoSuchFieldError,
-        upcalls->InitNoSuchFieldError, 
-        "unable to find %s in %s",
-        name->UTF8ToAsciiz(), cl->name->UTF8ToAsciiz());
+void Jnjvm::noClassDefFoundError(JavaObject* obj) {
+  errorWithExcp(upcalls->NoClassDefFoundError,
+        upcalls->ErrorWithExcpNoClassDefFoundError, 
+        obj);
+}
 
+void Jnjvm::instantiationException() {
+  error(upcalls->InstantiationException,
+        upcalls->InitInstantiationException,
+        (JavaString*)0);
 }
+  
 
-void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) {
-  error(upcalls->NoSuchMethodError,
-        upcalls->InitNoSuchMethodError, 
-        "unable to find %s in %s",
-        name->UTF8ToAsciiz(), cl->name->UTF8ToAsciiz());
+static JavaString* CreateNoSuchMsg(CommonClass* cl, const UTF8* name,
+                                   Jnjvm* vm) {
+  ArrayUInt16* msg = (ArrayUInt16*)
+    vm->upcalls->ArrayOfChar->doNew(19 + cl->name->size + name->size, vm);
+  uint32 i = 0;
+
+
+  msg->elements[i++] = 'u';
+  msg->elements[i++] = 'n';
+  msg->elements[i++] = 'a';
+  msg->elements[i++] = 'b';
+  msg->elements[i++] = 'l';
+  msg->elements[i++] = 'e';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 't';
+  msg->elements[i++] = 'o';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 'f';
+  msg->elements[i++] = 'i';
+  msg->elements[i++] = 'n';
+  msg->elements[i++] = 'd';
+  msg->elements[i++] = ' ';
+
+  for (sint32 j = 0; j < name->size; ++j)
+    msg->elements[i++] = name->elements[j];
+
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 'i';
+  msg->elements[i++] = 'n';
+  msg->elements[i++] = ' ';
+  
+  for (sint32 j = 0; j < cl->name->size; ++j) {
+    if (cl->name->elements[j] == '/') msg->elements[i++] = '.';
+    else msg->elements[i++] = cl->name->elements[j];
+  }
+
+  JavaString* str = vm->constructString(msg);
 
+  return str;
 }
 
-void Jnjvm::classFormatError(const char* msg, ...) {
-  error(upcalls->ClassFormatError,
-        upcalls->InitClassFormatError, 
-        msg);
+void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) { 
+  JavaString* str = CreateNoSuchMsg(cl, name, this);
+  error(upcalls->NoSuchFieldError,
+        upcalls->InitNoSuchFieldError, str);
 }
 
-void Jnjvm::noClassDefFoundError(JavaObject* obj) {
-  errorWithExcp(upcalls->NoClassDefFoundError,
-        upcalls->ErrorWithExcpNoClassDefFoundError, 
-        obj);
+void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) {
+  JavaString* str = CreateNoSuchMsg(cl, name, this);
+  error(upcalls->NoSuchMethodError,
+        upcalls->InitNoSuchMethodError, str);
 }
 
+static JavaString* CreateUnableToLoad(const UTF8* name, Jnjvm* vm) {
+  ArrayUInt16* msg = (ArrayUInt16*)
+    vm->upcalls->ArrayOfChar->doNew(15 + name->size, vm);
+  uint32 i = 0;
+
+
+  msg->elements[i++] = 'u';
+  msg->elements[i++] = 'n';
+  msg->elements[i++] = 'a';
+  msg->elements[i++] = 'b';
+  msg->elements[i++] = 'l';
+  msg->elements[i++] = 'e';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 't';
+  msg->elements[i++] = 'o';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 'l';
+  msg->elements[i++] = 'o';
+  msg->elements[i++] = 'a';
+  msg->elements[i++] = 'd';
+  msg->elements[i++] = ' ';
+
+  for (sint32 j = 0; j < name->size; ++j) {
+    if (name->elements[j] == '/') msg->elements[i++] = '.';
+    else msg->elements[i++] = name->elements[j];
+  }
+
+  JavaString* str = vm->constructString(msg);
+
+  return str;
+}
+
+static JavaString* CreateUnableToLoad(JavaString* name, Jnjvm* vm) {
+  ArrayUInt16* msg = (ArrayUInt16*)
+    vm->upcalls->ArrayOfChar->doNew(15 + name->count, vm);
+  uint32 i = 0;
+
+
+  msg->elements[i++] = 'u';
+  msg->elements[i++] = 'n';
+  msg->elements[i++] = 'a';
+  msg->elements[i++] = 'b';
+  msg->elements[i++] = 'l';
+  msg->elements[i++] = 'e';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 't';
+  msg->elements[i++] = 'o';
+  msg->elements[i++] = ' ';
+  msg->elements[i++] = 'l';
+  msg->elements[i++] = 'o';
+  msg->elements[i++] = 'a';
+  msg->elements[i++] = 'd';
+  msg->elements[i++] = ' ';
+
+  for (sint32 j = name->offset; j < name->offset + name->count; ++j) {
+    if (name->value->elements[j] == '/') msg->elements[i++] = '.';
+    else msg->elements[i++] = name->value->elements[j];
+  }
+
+  JavaString* str = vm->constructString(msg);
+
+  return str;
+}
+
+
+
 void Jnjvm::noClassDefFoundError(const UTF8* name) {
+  JavaString* str = CreateUnableToLoad(name, this);
   error(upcalls->NoClassDefFoundError,
-        upcalls->InitNoClassDefFoundError, 
-        "Unable to load %s", name->UTF8ToAsciiz());
+        upcalls->InitNoClassDefFoundError, str);
 }
 
-void Jnjvm::classNotFoundException(JavaString* str) {
+void Jnjvm::classNotFoundException(JavaString* name) {
+  JavaString* str = CreateUnableToLoad(name, this);
   error(upcalls->ClassNotFoundException,
-        upcalls->InitClassNotFoundException, 
-        "unable to load %s",
-        str->strToAsciiz());
+        upcalls->InitClassNotFoundException, str);
 }
 
-void Jnjvm::instantiationException() {
-  error(upcalls->InstantiationException,
-        upcalls->InitInstantiationException, 0);
-}
 
 void Jnjvm::unknownError(const char* fmt, ...) {
   error(upcalls->UnknownError,
@@ -469,6 +574,12 @@
         fmt);
 }
 
+void Jnjvm::classFormatError(const char* msg, ...) {
+  error(upcalls->ClassFormatError,
+        upcalls->InitClassFormatError,
+        msg);
+}
+
 JavaString* Jnjvm::internalUTF8ToStr(const UTF8* utf8) {
   JavaString* res = hashStr.lookup(utf8);
   if (!res) {
@@ -492,6 +603,7 @@
 }
 
 JavaString* Jnjvm::asciizToStr(const char* asciiz) {
+  assert(asciiz && "No asciiz given");
   ArrayUInt16* var = asciizToArray(asciiz);
   return constructString(var);
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Sat May 16 06:26:39 2009
@@ -121,12 +121,14 @@
   /// and calling its <init> function.
   ///
   JavaObject* CreateError(UserClass* cl, JavaMethod* meth, const char* str);
+  JavaObject* CreateError(UserClass* cl, JavaMethod* meth, JavaString* str);
 
   /// error - Throws an exception in the execution of a JVM for the thread
   /// that calls this functions. This is used internally by Jnjvm to control
   /// which pair class/method are used.
   ///
   void error(UserClass* cl, JavaMethod* meth, const char* fmt, ...);
+  void error(UserClass* cl, JavaMethod* meth, JavaString*);
   
   /// errorWithExcp - Throws an exception whose cause is the Java object excp.
   ///
@@ -246,38 +248,35 @@
   JavaObject* CreateIndexOutOfBoundsException(sint32 entry);
   JavaObject* CreateNegativeArraySizeException();
   JavaObject* CreateClassCastException(JavaObject* obj, UserCommonClass* cl);
-  JavaObject* CreateLinkageError(const char* msg = "");
-  JavaObject* CreateArrayStoreException(JavaVirtualTable* VT);
   JavaObject* CreateArithmeticException();
   JavaObject* CreateStackOverflowError();
+  JavaObject* CreateLinkageError(const char* msg);
+  JavaObject* CreateArrayStoreException(JavaVirtualTable* VT);
   
   /// Exceptions - These are the only exceptions VMKit will make.
   ///
   void arrayStoreException();
   void indexOutOfBounds(const JavaObject* obj, sint32 entry);
   void negativeArraySizeException(int size);
-  void nullPointerException(const char* fmt, ...);
+  void nullPointerException();
   void illegalAccessException(const char* msg);
   void illegalMonitorStateException(const JavaObject* obj);
   void interruptedException(const JavaObject* obj);
   void initializerError(const JavaObject* excp);
   void invocationTargetException(const JavaObject* obj);
-  void outOfMemoryError(sint32 n);
-  void illegalArgumentExceptionForMethod(JavaMethod* meth, UserCommonClass* required,
-                                         UserCommonClass* given);
-  void illegalArgumentExceptionForField(JavaField* field, UserCommonClass* required,
-                                        UserCommonClass* given);
+  void outOfMemoryError();
+  void noClassDefFoundError(JavaObject* obj);
+  void instantiationException();
   void illegalArgumentException(const char* msg);
   void classCastException(JavaObject* obj, UserCommonClass* cl);
-  void unknownError(const char* fmt, ...); 
   void noSuchFieldError(CommonClass* cl, const UTF8* name);
-  void noSuchMethodError(CommonClass* cl, const UTF8* name);
-  void classFormatError(const char* fmt, ...);
-  void noClassDefFoundError(JavaObject* obj);
+  void noSuchMethodError(CommonClass* cl, const UTF8* name); 
   void noClassDefFoundError(const UTF8* name);
   void classNotFoundException(JavaString* str);
-  void instantiationException();
 
+  void unknownError(const char* fmt, ...); 
+  void classFormatError(const char* fmt, ...);
+  
   /// asciizToStr - Constructs a java/lang/String object from the given asciiz.
   ///
   JavaString* asciizToStr(const char* asciiz);





More information about the vmkit-commits mailing list