[vmkit-commits] [vmkit] r77674 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Jul 31 05:24:39 PDT 2009


Author: geoffray
Date: Fri Jul 31 07:24:31 2009
New Revision: 77674

URL: http://llvm.org/viewvc/llvm-project?rev=77674&view=rev
Log:
Fix memory leak.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc?rev=77674&r1=77673&r2=77674&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMThrowable.inc Fri Jul 31 07:24:31 2009
@@ -37,15 +37,25 @@
   Jnjvm* vm = th->getJVM();
   
   // Allocate the temporary data.
-  std::vector<void*>* stack = new std::vector<void*>();
+  std::vector<void*> stack;
 
   // Get the frame context.
-  th->getJavaFrameContext(*stack);
+  th->getJavaFrameContext(stack);
+  
+  ClassArray* cl = sizeof(void*) == 4 ? vm->upcalls->ArrayOfInt : 
+                                        vm->upcalls->ArrayOfLong;
+  JavaArray* result = (JavaArray*) cl->doNew(stack.size(), 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;
+  }
   
   // Set the tempory data in the new VMThrowable object.
   vmThrowable = vm->upcalls->newVMThrowable->doNew(vm);
   uint64 ptr = (uint64)vmThrowable + vm->upcalls->vmDataVMThrowable->ptrOffset;
-  ((JavaObject**)ptr)[0] = (JavaObject*)stack;
+  ((JavaObject**)ptr)[0] = result;
   return vmThrowable;
 }
 
@@ -121,34 +131,27 @@
   BEGIN_NATIVE_EXCEPTION(0)
   Jnjvm* vm = JavaThread::get()->getJVM();
   JavaField* field = vm->upcalls->vmDataVMThrowable;
-  std::vector<void*>* stack = (std::vector<void*>*)
-    field->getObjectField(vmthrow);
+  JavaArray* stack = (JavaArray*)field->getObjectField(vmthrow);
   
-  std::vector<void*>::iterator i = stack->begin(), e = stack->end();
   // remove the VMThrowable.fillInStackTrace method
-  uint32 index = 1;
-  ++i;
-  while (i != e) {
-    JavaMethod* meth = vm->IPToMethod<JavaMethod>(*i);
+  sint32 index = 1;;
+  while (index != stack->size) {
+    JavaMethod* meth = vm->IPToMethod<JavaMethod>(stack->elements[index]);
     assert(meth && "Wrong stack trace");
     if (meth->classDef->isAssignableFrom(vm->upcalls->newThrowable)) {
-      ++i;
       ++index;
     } else break;
   }
 
   result = (ArrayObject*)
-    vm->upcalls->stackTraceArray->doNew(stack->size() - index, vm);
+    vm->upcalls->stackTraceArray->doNew(stack->size - index, vm);
   
-  index = 0;
-  for (; i != e; ++i) {
-    JavaMethod* meth = vm->IPToMethod<JavaMethod>(*i);
+  for (sint32 i = 0; i < result->size; ++i) {
+    JavaMethod* meth = vm->IPToMethod<JavaMethod>(stack->elements[i + index]);
     assert(meth && "Wrong stack trace");
-    result->elements[index++] = consStackElement(meth, *i);
+    result->elements[i] = consStackElement(meth, stack->elements[i + index]);
   }
   
-  delete stack;
-
   END_NATIVE_EXCEPTION
 
   return result;





More information about the vmkit-commits mailing list