[vmkit-commits] [vmkit] r86476 - in /vmkit/trunk: include/mvm/Threads/Thread.h lib/JnJVM/Classpath/ClasspathVMStackWalker.inc lib/JnJVM/Classpath/ClasspathVMThrowable.inc lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaThread.h lib/Mvm/CommonThread/ctthread.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Nov 8 09:22:31 PST 2009
Author: geoffray
Date: Sun Nov 8 11:22:31 2009
New Revision: 86476
URL: http://llvm.org/viewvc/llvm-project?rev=86476&view=rev
Log:
Remove the last use of the addresses vector. Next step is to remove the vector
from the thread fields.
Modified:
vmkit/trunk/include/mvm/Threads/Thread.h
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Sun Nov 8 11:22:31 2009
@@ -327,6 +327,10 @@
/// printBacktrace - Print the backtrace.
///
void printBacktrace();
+
+ /// getFrameContext - Fill the vector with frames currently on the stack.
+ ///
+ void getFrameContext(std::vector<void*>& context);
/// addresses - The list of return addresses which represent native/app cross
/// calls.
@@ -369,6 +373,7 @@
}
void operator++();
+ void* operator*();
MethodInfo* get();
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc Sun Nov 8 11:22:31 2009
@@ -37,19 +37,18 @@
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
- std::vector<void*> stack;
+ std::vector<JavaMethod*> stack;
th->getJavaFrameContext(stack);
result = (ArrayObject*)
vm->upcalls->stackTraceArray->doNew(stack.size(), vm);
- std::vector<void*>::iterator i = stack.begin(), e = stack.end();
+ std::vector<JavaMethod*>::iterator i = stack.begin(), e = stack.end();
uint32 index = 0;
for (; i != e; ++i) {
- mvm::MethodInfo* MI = vm->IPToMethodInfo(*i);
- JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
+ JavaMethod* meth = *i;
assert(meth && "Wrong stack trace");
result->elements[index++] = meth->classDef->getClassDelegatee(vm);
}
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc Sun Nov 8 11:22:31 2009
@@ -40,7 +40,7 @@
std::vector<void*> stack;
// Get the frame context.
- th->getJavaFrameContext(stack);
+ th->getFrameContext(stack);
ClassArray* cl = sizeof(void*) == 4 ? vm->upcalls->ArrayOfInt :
vm->upcalls->ArrayOfLong;
@@ -137,21 +137,35 @@
sint32 index = 1;;
while (index != stack->size) {
mvm::MethodInfo* MI = vm->IPToMethodInfo(stack->elements[index]);
- JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
- assert(meth && "Wrong stack trace");
- if (meth->classDef->isAssignableFrom(vm->upcalls->newThrowable)) {
- ++index;
- } else break;
+ if (MI->MethodType != 1) ++index;
+ else {
+ JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
+ assert(meth && "Wrong stack trace");
+ if (meth->classDef->isAssignableFrom(vm->upcalls->newThrowable)) {
+ ++index;
+ } else break;
+ }
+ }
+
+ sint32 size = 0;
+ sint32 cur = index;
+ while (cur < stack->size) {
+ mvm::MethodInfo* MI = vm->IPToMethodInfo(stack->elements[cur]);
+ ++cur;
+ if (MI->MethodType == 1) ++size;
}
result = (ArrayObject*)
- vm->upcalls->stackTraceArray->doNew(stack->size - index, vm);
+ vm->upcalls->stackTraceArray->doNew(size, vm);
- for (sint32 i = 0; i < result->size; ++i) {
- mvm::MethodInfo* MI = vm->IPToMethodInfo(stack->elements[i + index]);
- JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
- assert(meth && "Wrong stack trace");
- result->elements[i] = consStackElement(meth, stack->elements[i + index]);
+ cur = 0;
+ for (sint32 i = index; i < stack->size; ++i) {
+ mvm::MethodInfo* MI = vm->IPToMethodInfo(stack->elements[i]);
+ if (MI->MethodType == 1) {
+ JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
+ result->elements[cur] = consStackElement(meth, stack->elements[i]);
+ cur++;
+ }
}
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Sun Nov 8 11:22:31 2009
@@ -109,42 +109,16 @@
addresses.push_back(cur);
}
-
-
-void JavaThread::getJavaFrameContext(std::vector<void*>& context) {
- std::vector<void*>::iterator it = addresses.end();
+void JavaThread::getJavaFrameContext(std::vector<JavaMethod*>& context) {
+ mvm::StackWalker Walker(this);
- // Loop until we cross the first Java frame.
- while (it != addresses.begin()) {
-
- // Get the last Java frame.
- void** addr = (void**)*(--it);
-
- // Set the iterator to the next native -> Java call.
- --it;
-
- // See if we're from JNI.
- if (*it == 0) {
- --it;
- addr = (void**)*it;
- --it;
- if (*it == 0) {
- addr = (void**)addr[0];
- continue;
- }
+ while (mvm::MethodInfo* MI = Walker.get()) {
+ if (MI->MethodType == 1) {
+ JavaMethod* M = (JavaMethod*)MI->getMetaInfo();
+ context.push_back(M);
}
-
- do {
- void* ip = FRAME_IP(addr);
- bool isStub = ((unsigned char*)ip)[0] == 0xCE;
- if (isStub) ip = addr[2];
- context.push_back(ip);
- addr = (void**)addr[0];
- // We end walking the stack when we cross a native -> Java call. Here
- // the iterator points to a native -> Java call. We dereference addr twice
- // because a native -> Java call always contains the signature function.
- } while (((void***)addr)[0][0] != *it);
+ ++Walker;
}
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Sun Nov 8 11:22:31 2009
@@ -289,11 +289,11 @@
///
void printJavaBacktrace();
- /// getJavaFrameContext - Fill the vector with Java frames
- /// currently on the stack.
+ /// getJavaFrameContext - Fill the vector with Java methods currently on
+ /// the stack.
///
- void getJavaFrameContext(std::vector<void*>& context);
-
+ void getJavaFrameContext(std::vector<JavaMethod*>& context);
+
private:
/// internalClearException - Clear the C++ and Java exceptions
/// currently pending.
Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=86476&r1=86475&r2=86476&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Sun Nov 8 11:22:31 2009
@@ -70,6 +70,15 @@
}
}
+void Thread::getFrameContext(std::vector<void*>& context) {
+ mvm::StackWalker Walker(this);
+
+ while (void* ip = *Walker) {
+ context.push_back(ip);
+ ++Walker;
+ }
+}
+
MethodInfo* StackWalker::get() {
if (addr == thread->baseSP) return 0;
ip = FRAME_IP(addr);
@@ -78,6 +87,14 @@
return thread->MyVM->IPToMethodInfo(ip);
}
+void* StackWalker::operator*() {
+ if (addr == thread->baseSP) return 0;
+ ip = FRAME_IP(addr);
+ bool isStub = ((unsigned char*)ip)[0] == 0xCE;
+ if (isStub) ip = addr[2];
+ return ip;
+}
+
void StackWalker::operator++() {
if (addr < thread->baseSP && addr < addr[0]) {
if (frame && addr == frame->currentFP) {
More information about the vmkit-commits
mailing list