[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