[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