[vmkit-commits] [vmkit] r56238 - /vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Sep 15 22:39:44 PDT 2008


Author: geoffray
Date: Tue Sep 16 00:39:44 2008
New Revision: 56238

URL: http://llvm.org/viewvc/llvm-project?rev=56238&view=rev
Log:
Implement getContextClass for isolates.


Modified:
    vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc

Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc?rev=56238&r1=56237&r2=56238&view=diff

==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMStackWalker.cpp.inc Tue Sep 16 00:39:44 2008
@@ -28,7 +28,51 @@
 
 extern "C" {
 
-#ifndef MULTIPLE_VM
+#ifdef MULTIPLE_VM
+uint32 getPools(UserConstantPool** pools, uint32 size) {
+  unsigned int* top;
+  register unsigned int  **cur = ⊤
+  register unsigned int  **max = (unsigned int**)mvm::Thread::get()->baseSP;
+  
+  uint32 i = 0;
+  for(; cur<max && i < size; cur++) {
+    void* obj = (void*)(*cur);
+    obj = Collector::begOf(obj);
+    if (obj && ((mvm::Object*)obj)->getVirtualTable() == UserConstantPool::VT) {
+      UserConstantPool* ctp = (UserConstantPool*)obj;
+      pools[i++] = ctp;
+    }
+  }
+  return i;
+}
+#endif
+
+#ifdef MULTIPLE_VM
+JavaObject* getClassInContext(Jnjvm* vm, Class* cl, UserConstantPool** ctps, uint32& ctpIndex) {
+  for (; ctpIndex < 100; ++ctpIndex) {
+    UserClass* newCl = ctps[ctpIndex]->getClass();
+    if (cl == newCl->classDef) return newCl->getClassDelegatee(vm);
+  }
+  return 0;
+}
+
+ArrayObject* recGetClassContext(Jnjvm* vm, int** stack, uint32 size, uint32 first, uint32 rec, UserConstantPool** ctps, uint32 ctpIndex) {
+  if (size != first) {
+    JavaMethod* meth = JavaJIT::IPToJavaMethod(stack[first]);
+    if (meth) {
+      JavaObject* obj = getClassInContext(vm, meth->classDef, ctps, ctpIndex);
+      ArrayObject* res = recGetClassContext(vm, stack, size, first + 1, rec + 1, ctps, ctpIndex); 
+      res->elements[rec] = obj;
+      assert(res->elements[rec] && "Did not found the user class");
+      return res;
+    } else {
+      return recGetClassContext(vm, stack, size, first + 1, rec, ctps, ctpIndex);
+    }   
+  } else {
+    return ArrayObject::acons(rec, vm->upcalls->classArrayClass, &(vm->allocator));
+  }
+}
+#else
 ArrayObject* recGetClassContext(Jnjvm* vm, int** stack, uint32 size, uint32 first, uint32 rec) {
   if (size != first) {
     JavaMethod* meth = JavaJIT::IPToJavaMethod(stack[first]);
@@ -43,6 +87,7 @@
     return ArrayObject::acons(rec, vm->upcalls->classArrayClass, &(vm->allocator));
   }
 }
+#endif
 
 JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassContext(
 #ifdef NATIVE_JNI
@@ -53,19 +98,32 @@
   Jnjvm* vm = JavaThread::get()->isolate;
   int* ips[100];
   int real_size = mvm::jit::getBacktrace((void**)(void*)ips, 100);
+#ifdef MULTIPLE_VM
+  UserConstantPool* pools[100];
+  getPools(pools, 100);
+#endif
+
   int i = 0;
   int first = 0;
   UserCommonClass* cl = vm->upcalls->vmStackWalker; 
 
   while (i < real_size) {
     JavaMethod* meth = JavaJIT::IPToJavaMethod(ips[i++]);
+#ifdef MULTIPLE_VM
+    if (meth && meth->classDef == cl->classDef) {
+#else
     if (meth && meth->classDef == cl) {
+#endif
       first = i;
       break;
     }   
   }
 
+#ifdef MULTIPLE_VM
+  return (jobject)recGetClassContext(vm, ips, real_size, first, 0, pools, 0);
+#else
   return (jobject)recGetClassContext(vm, ips, real_size, first, 0);
+#endif
 }
 
 JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassLoader(
@@ -79,7 +137,6 @@
   UserCommonClass* cl = (UserCommonClass*)vm->upcalls->vmdataClass->getObjectField(Cl);
   return (jobject)cl->classLoader->getJavaClassLoader();
 }
-#endif
 
 extern "C" JavaObject* getCallingClass() {
   UserClass* cl = JavaJIT::getCallingClass();





More information about the vmkit-commits mailing list