blob: a6f36fba15788797b1e82385bfefe7060f7c98eb [file] [log] [blame]
//===- ClasspathVMStackWalker.cpp -----------------------------------------===//
//===------------ GNU classpath gnu/classpath/VMStackWalker ---------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <string.h>
#include "types.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaTypes.h"
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "NativeUtil.h"
#include <execinfo.h>
using namespace jnjvm;
extern "C" JavaMethod* ip_to_meth(int* ip);
extern "C" {
ArrayObject* recGetClassContext(int** stack, uint32 size, uint32 first, uint32 rec) {
if (size != first) {
int *begIp = (int*)gc::begOf(stack[first]);
JavaMethod* meth = ip_to_meth(begIp);
if (meth) {
ArrayObject* res = recGetClassContext(stack, size, first + 1, rec + 1);
res->setAt(rec, meth->classDef->getClassDelegatee());
return res;
} else {
return recGetClassContext(stack, size, first + 1, rec);
}
} else {
return ArrayObject::acons(rec, Classpath::classArrayClass);
}
}
JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassContext(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
) {
int* ips[100];
int real_size = backtrace((void**)(void*)ips, 100);
int i = 0;
int first = 0;
CommonClass* cl = Classpath::vmStackWalker;
while (i < real_size) {
int *begIp = (int*)gc::begOf(ips[i++]);
JavaMethod* meth = ip_to_meth(begIp);
if (meth && meth->classDef == cl) {
first = i;
break;
}
}
return (jobject)recGetClassContext(ips, real_size, first, 0);
}
JNIEXPORT jobject JNICALL Java_gnu_classpath_VMStackWalker_getClassLoader(
#ifdef NATIVE_JNI
JNIEnv *env,
jclass clazz,
#endif
jclass _Cl) {
JavaObject* Cl = (JavaObject*)_Cl;
CommonClass* cl = (CommonClass*)((*Cl)(Classpath::vmdataClass).PointerVal);
return (jobject)cl->classLoader;
}
extern "C" JavaObject* getCallingClass() {
int* ips[10];
int real_size = backtrace((void**)(void*)ips, 100);
int n = 0;
int i = 0;
while (i < real_size) {
int *begIp = (int*)gc::begOf(ips[i++]);
JavaMethod* meth = ip_to_meth(begIp);
if (meth) {
++n;
if (n == 1) return meth->classDef->getClassDelegatee();
}
}
return 0;
}
extern "C" JavaObject* getCallingClassLoader() {
int* ips[10];
int real_size = backtrace((void**)(void*)ips, 100);
int n = 0;
int i = 0;
while (i < real_size) {
int *begIp = (int*)gc::begOf(ips[i++]);
JavaMethod* meth = ip_to_meth(begIp);
if (meth) {
++n;
if (n == 1) return meth->classDef->classLoader;
}
}
return 0;
}
}