//===------------ 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; }