[vmkit-commits] [vmkit] r199546 - Uncaught exceptions are now printed.

Gael Thomas gael.thomas at lip6.fr
Sat Jan 18 05:20:32 PST 2014


Author: gthomas
Date: Sat Jan 18 07:20:31 2014
New Revision: 199546

URL: http://llvm.org/viewvc/llvm-project?rev=199546&view=rev
Log:
Uncaught exceptions are now printed.

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
    vmkit/branches/mcjit/lib/j3/vm/j3.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199546&r1=199545&r2=199546&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sat Jan 18 07:20:31 2014
@@ -105,6 +105,9 @@ namespace j3 {
 
 		J3Field*         throwableClassBacktrace;
 
+		J3Class*         stackTraceElementClass;
+		J3Method*        stackTraceElementClassInit;
+
 		llvm::Type* typeJNIEnvPtr;
 		llvm::Type* typeJ3VirtualTablePtr;
 		llvm::Type* typeJ3Type;

Modified: vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc?rev=199546&r1=199545&r2=199546&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Sat Jan 18 07:20:31 2014
@@ -14,6 +14,7 @@
 #include <sys/time.h>
 #include <stdlib.h>
 #include <fcntl.h>
+#include <cxxabi.h>
 
 using namespace j3;
 
@@ -374,8 +375,98 @@ void JNICALL JVM_FillInStackTrace(JNIEnv
 	leaveJVM(); 
 }
 
-jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); }
-jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { enterJVM(); leaveJVM(); NYI(); }
+jint JNICALL JVM_GetStackTraceDepth(JNIEnv* env, jobject throwable) { 
+	jint res = 0;
+	enterJVM(); 
+	J3* vm = J3Thread::get()->vm();
+	J3ObjectHandle* backtrace = throwable->getObject(vm->throwableClassBacktrace);
+
+	bool simplify = 1;
+
+	if(simplify) {
+		uint32_t max = backtrace->arrayLength();
+		int64_t buf[max];
+
+		for(uint32_t i=0; i<max; i++) {
+			uint64_t cur = backtrace->getLongAt(i);
+
+			if(vm->getSafepoint((void*)cur))
+				buf[res++] = cur;
+		}
+
+		jobject newBt = J3ObjectHandle::doNewArray(backtrace->vt()->type()->asArrayClass(), res);
+		newBt->setRegionLong(0, buf, 0, res);
+		throwable->setObject(vm->throwableClassBacktrace, newBt);
+
+	} else
+		res = backtrace->arrayLength();
+
+	leaveJVM(); 
+
+	return res;
+}
+
+jobject JNICALL JVM_GetStackTraceElement(JNIEnv* env, jobject throwable, jint index) { 
+	jobject res;
+
+	enterJVM(); 
+	J3* vm = J3Thread::get()->vm();
+	uintptr_t ip = (uintptr_t)throwable->getObject(vm->throwableClassBacktrace)->getLongAt(index);
+	J3ObjectHandle* className;
+	J3ObjectHandle* methodName;
+	J3ObjectHandle* fileName;
+	uint32_t lineNumber;
+
+	res = J3ObjectHandle::doNewObject(vm->stackTraceElementClass);
+
+	vmkit::Safepoint* sf = vm->getSafepoint((void*)ip);
+
+	if(!sf) {
+		lineNumber = -1;
+		className = vm->utfToString("<j3>");
+		Dl_info info;
+		
+		if(dladdr((void*)(ip-1), &info)) {
+			int   status;
+			const char* demangled = abi::__cxa_demangle(info.dli_sname, 0, 0, &status);
+			const char* name = demangled ? demangled : info.dli_sname;
+			methodName = vm->utfToString(name);
+			fileName = vm->utfToString(info.dli_fname);
+		} else {
+			char buf[256];
+			snprintf(buf, 256, "??@%p", (void*)ip);
+			methodName = vm->utfToString(buf);
+			fileName = vm->utfToString("??");
+		}
+	} else {
+		J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self;
+		const vmkit::Name* cn = m->cl()->name();
+		uint32_t length = cn->length()+6;
+		uint32_t lastToken = 0;
+		char buf[length];
+
+		for(uint32_t i=0; i<cn->length(); i++) {
+			if(cn->cStr()[i] == '/') {
+				buf[i] = '.';
+				lastToken = i+1;
+			} else
+				buf[i] = cn->cStr()[i];
+		}
+		buf[cn->length()] = 0;
+
+		lineNumber = sf->sourceIndex();
+		className = vm->utfToString(buf);
+		methodName = m->name() == vm->initName ? vm->utfToString(buf+lastToken) : vm->nameToString(m->name());
+		
+		snprintf(buf, length, "%s.java", cn->cStr());
+		fileName = vm->utfToString(buf);
+	}
+
+	vm->stackTraceElementClassInit->invokeSpecial(res, className, methodName, fileName, lineNumber);
+
+	leaveJVM(); 
+	return res;
+}
 
 /*
  * java.lang.Compiler

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199546&r1=199545&r2=199546&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sat Jan 18 07:20:31 2014
@@ -147,6 +147,10 @@ void J3::run() {
 
 	throwableClassBacktrace  = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass);
 
+	stackTraceElementClass   = z_class("java/lang/StackTraceElement");
+	stackTraceElementClassInit = z_method(0, stackTraceElementClass, initName,
+																				names()->get("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"));
+
 #define defJavaClassPrimitive(name, ctype, llvmtype, scale)	\
 	type##name->defineJavaClass("java/lang/"#name);
 	onJavaTypes(defJavaClassPrimitive)





More information about the vmkit-commits mailing list