blob: 159a1886259ffcc0762250bf0aabea741cd247f9 [file] [log] [blame]
//===------------ ClassContext.inc -- Implement GetClassContext -----------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
ArrayObject* GetClassContext(uint32 level = 0) {
ArrayObject* result = NULL;
JavaObject* delegatee = NULL;
llvm_gcroot(result, 0);
llvm_gcroot(delegatee, 0);
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
uint32 length = th->getFrameContextLength();
vmkit::ThreadAllocator allocator;
uintptr_t* buffer = (uintptr_t*)allocator.Allocate(length * sizeof(uintptr_t));
uint32 finalSize = th->getJavaFrameContext((void**)buffer);
assert(level < finalSize);
result = (ArrayObject*)
vm->upcalls->classArrayClass->doNew(finalSize - level, vm);
for (uint32 i = level; i != finalSize; ++i) {
JavaMethod* meth = ((JavaMethod**)buffer)[i];
assert(meth && "Wrong stack trace");
delegatee = meth->classDef->getClassDelegatee(vm);;
ArrayObject::setElement(result, delegatee, i - level);
}
return result;
}