[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