/* Sun-$Revision: 23.6 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface // A stack is a part of a process. It contains the memory area used for // the stack frames and provides iteration methods etc. extern int32 FrameChainNesting; // are nmethods on stacks chained? (>0 = yes) const int32 PrimStackSize = 32*K; // max. stack size used by primitives const int32 StackMarkOffset = 2*K; // to detect stack overflows in the VM class Stack: public StackObj { public: Process* process; char* base; int32 size; Stack() {} // stacks are created implicitly as part of processes void init(Process* p, char* b, int32 s) { process = p; base = b; size = s; } bool allocate(); void deallocate(); char* end() { return base + size; } bool contains(void* sp) { return base <= (char*)sp && (char*)sp < end(); } char* spLimit() { return base + PrimStackSize; } bool isStackOverflow(void* spVal) { return base <= (char*)spVal && (char*)spVal < spLimit(); } protected: int32* mark_addr() { return (int32*)(base + StackMarkOffset); } public: void mark(); // mark end of stack to detect overflows bool markDestroyed(); // answer true if stack mark was overwritten // frame operations frame* last_self_frame(bool includePrologue, RegisterLocator** = NULL); // return last (most recent) Self frame, & optionally a RegisterLocator frame* callee_of(const frame* f); frame* first_VM_frame(); // frame called by last_self_frame() void consistencyCheck(primDoFn f, frame* firstVmFrame = NULL); frame* interpreter_frame_for_continuing_NLR_from_primitive(); frame* interpreter_frame_for_continuing_from_return_trap(); protected: frame* find_frame_entering(char* ep); public: // memory operations void chainFrames(); void unchainFrames(); void scavenge_contents(); void gc_mark_contents(); void gc_unmark_contents(); void enumerate_references(enumeration *e); void enumerate_families(enumeration *e); void verify(); void switch_pointers(oop from, oop to); void remove_patches(); protected: void enumerate_block_references(); public: void frames_do(framesDoFn f, primDoFn pfn = NULL); // apply f to all Self frames; pfn is for consistency check void vframes_do(vframesDoFn fn, frame* f = NULL); // apply fn to all Self vframes, or start at f if non-null // programming operations void convert(); public: // printing operations void print(); int32 depth(); int32 vdepth(frame* f = NULL); }; extern "C" { void print_stack(); void CallFramesDo(Stack*, framesDoFn, primDoFn); }