[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