[vmkit-commits] [vmkit] r199375 - Implement FillInStackTrace
Gael Thomas
gael.thomas at lip6.fr
Thu Jan 16 04:18:40 PST 2014
Author: gthomas
Date: Thu Jan 16 06:18:40 2014
New Revision: 199375
URL: http://llvm.org/viewvc/llvm-project?rev=199375&view=rev
Log:
Implement FillInStackTrace
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=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Thu Jan 16 06:18:40 2014
@@ -103,6 +103,8 @@ namespace j3 {
J3Field* constructorClassSlot;
J3Method* constructorClassInit;
+ J3Field* throwableClassBacktrace;
+
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=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc (original)
+++ vmkit/branches/mcjit/lib/j3/openjdk/j3openjdk.cc Thu Jan 16 06:18:40 2014
@@ -342,7 +342,38 @@ jboolean JNICALL JVM_IsNaN(jdouble d) {
/*
* java.lang.Throwable
*/
-void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) { enterJVM(); leaveJVM(); NYI(); }
+void JNICALL JVM_FillInStackTrace(JNIEnv* env, jobject throwable) {
+ enterJVM();
+ uint32_t cur = 0;
+ uint32_t max = 1024;
+ int64_t _buf[max];
+ int64_t* buf = _buf;
+ vmkit::StackWalker walker;
+
+ while(walker.next()) {
+ if(cur == max) {
+ void* prev = buf;
+ buf = (int64_t*)malloc((max<<1)*sizeof(int64_t));
+ memcpy(buf, prev, max*sizeof(int64_t));
+ max <<= 1;
+ if(prev != _buf)
+ free(prev);
+ }
+ buf[cur++] = (int64_t)(uintptr_t)walker.ip();
+ }
+
+ J3* vm = J3Thread::get()->vm();
+ jobject backtrace = J3ObjectHandle::doNewArray(vm->typeLong->getArray(), cur);
+ backtrace->setRegionLong(0, buf, 0, cur);
+
+ if(buf != _buf)
+ free(buf);
+
+ throwable->setObject(vm->throwableClassBacktrace, backtrace);
+
+ 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(); }
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=199375&r1=199374&r2=199375&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Thu Jan 16 06:18:40 2014
@@ -145,6 +145,8 @@ void J3::run() {
constructorClassInit = z_method(0, constructorClass, initName,
names()->get("(Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Class;IILjava/lang/String;[B[B)V"));
+ throwableClassBacktrace = z_field(0, z_class("java/lang/Throwable"), "backtrace", objectClass);
+
#define defJavaClassPrimitive(name, ctype, llvmtype, scale) \
type##name->defineJavaClass("java/lang/"#name);
onJavaTypes(defJavaClassPrimitive)
More information about the vmkit-commits
mailing list