[vmkit-commits] [vmkit] r86982 - 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
Thu Nov 12 03:06:56 PST 2009
Author: geoffray
Date: Thu Nov 12 05:06:56 2009
New Revision: 86982
URL: http://llvm.org/viewvc/llvm-project?rev=86982&view=rev
Log:
Avoid creating std::vectors while getting methods on the stack.
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=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Thu Nov 12 05:06:56 2009
@@ -12,7 +12,6 @@
#include <cassert>
#include <stdlib.h>
-#include <vector>
#include "types.h"
@@ -328,9 +327,13 @@
///
void printBacktrace();
- /// getFrameContext - Fill the vector with frames currently on the stack.
+ /// getFrameContext - Fill the buffer with frames currently on the stack.
///
- void getFrameContext(std::vector<void*>& context);
+ void getFrameContext(void** buffer);
+
+ /// getFrameContextLength - Get the length of the frame context.
+ ///
+ uint32_t getFrameContextLength();
/// lastKnownFrame - The last frame that we know of, before resuming to JNI.
///
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc?rev=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMStackWalker.inc Thu Nov 12 05:06:56 2009
@@ -37,20 +37,19 @@
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
- std::vector<JavaMethod*> stack;
+ uint32 length = th->getFrameContextLength();
- th->getJavaFrameContext(stack);
+ void** buffer = (void**)alloca(length * sizeof(void*));
+
+ uint32 finalSize = th->getJavaFrameContext(buffer);
result = (ArrayObject*)
- vm->upcalls->stackTraceArray->doNew(stack.size(), vm);
-
- std::vector<JavaMethod*>::iterator i = stack.begin(), e = stack.end();
- uint32 index = 0;
-
- for (; i != e; ++i) {
- JavaMethod* meth = *i;
+ vm->upcalls->stackTraceArray->doNew(finalSize, vm);
+
+ for (uint32 i = 0; i != finalSize; ++i) {
+ JavaMethod* meth = (JavaMethod*)buffer[i];
assert(meth && "Wrong stack trace");
- result->elements[index++] = meth->classDef->getClassDelegatee(vm);
+ result->elements[i] = meth->classDef->getClassDelegatee(vm);
}
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc?rev=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc Thu Nov 12 05:06:56 2009
@@ -7,8 +7,6 @@
//
//===----------------------------------------------------------------------===//
-#include <vector>
-
#include "types.h"
#include "Classpath.h"
@@ -35,22 +33,16 @@
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
-
- // Allocate the temporary data.
- std::vector<void*> stack;
+
+ uint32 length = th->getFrameContextLength();
- // Get the frame context.
- th->getFrameContext(stack);
-
ClassArray* cl = sizeof(void*) == 4 ? vm->upcalls->ArrayOfInt :
vm->upcalls->ArrayOfLong;
- JavaArray* result = (JavaArray*) cl->doNew(stack.size(), vm);
+ JavaArray* result = (JavaArray*) cl->doNew(length, vm);
void** tab = (void**)result->elements;
- uint32 index = 0;
- for (std::vector<void*>::iterator i = stack.begin(), e = stack.end();
- i != e; ++i, ++index) {
- tab[index] = *i;
- }
+
+ // Get the frame context.
+ th->getFrameContext(tab);
// Set the tempory data in the new VMThrowable object.
vmThrowable = vm->upcalls->newVMThrowable->doNew(vm);
@@ -133,8 +125,9 @@
JavaField* field = vm->upcalls->vmDataVMThrowable;
JavaArray* stack = (JavaArray*)field->getObjectField(vmthrow);
- // remove the VMThrowable.fillInStackTrace method
- sint32 index = 1;;
+ // remove the VMThrowable.fillInStackTrace method and the last method
+ // on the stack.
+ sint32 index = 2;;
while (index != stack->size) {
mvm::MethodInfo* MI = vm->IPToMethodInfo(stack->elements[index]);
if (MI->MethodType != 1) ++index;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Thu Nov 12 05:06:56 2009
@@ -87,16 +87,18 @@
enterUncooperativeCode(level);
}
-void JavaThread::getJavaFrameContext(std::vector<JavaMethod*>& context) {
+uint32 JavaThread::getJavaFrameContext(void** buffer) {
mvm::StackWalker Walker(this);
+ uint32 i = 0;
while (mvm::MethodInfo* MI = Walker.get()) {
if (MI->MethodType == 1) {
JavaMethod* M = (JavaMethod*)MI->getMetaInfo();
- context.push_back(M);
+ buffer[i++] = M;
}
++Walker;
}
+ return i;
}
JavaMethod* JavaThread::getCallingMethodLevel(uint32 level) {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Thu Nov 12 05:06:56 2009
@@ -11,7 +11,6 @@
#define JNJVM_JAVA_THREAD_H
#include <csetjmp>
-#include <vector>
#include "mvm/Object.h"
#include "mvm/Threads/Cond.h"
@@ -261,10 +260,10 @@
///
void printJavaBacktrace();
- /// getJavaFrameContext - Fill the vector with Java methods currently on
+ /// getJavaFrameContext - Fill the buffer with Java methods currently on
/// the stack.
///
- void getJavaFrameContext(std::vector<JavaMethod*>& context);
+ uint32 getJavaFrameContext(void** buffer);
private:
/// internalClearException - Clear the C++ and Java exceptions
Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=86982&r1=86981&r2=86982&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Thu Nov 12 05:06:56 2009
@@ -71,15 +71,27 @@
}
}
-void Thread::getFrameContext(std::vector<void*>& context) {
+void Thread::getFrameContext(void** buffer) {
mvm::StackWalker Walker(this);
+ uint32_t i = 0;
while (void* ip = *Walker) {
- context.push_back(ip);
+ buffer[i++] = ip;
++Walker;
}
}
+uint32_t Thread::getFrameContextLength() {
+ mvm::StackWalker Walker(this);
+ uint32_t i = 0;
+
+ while (void* ip = *Walker) {
+ ++i;
+ ++Walker;
+ }
+ return i;
+}
+
MethodInfo* StackWalker::get() {
if (addr == thread->baseSP) return 0;
ip = FRAME_IP(addr);
More information about the vmkit-commits
mailing list