[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