/* Sun-$Revision: 23.5 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
// A vframeOop represents a live activation object. It contains enough
// information to construct the corresponding vframe.
class vframeOopClass : public slotsOopClass {
protected:
vframeOop _next; // next in list of live vframeOops
oop _method; // "reflectee"
Process* _process; // process to which I belong
smiOop _descOffset; // offset into nmethod's scopes
frame* _locals; // locals frame of fr(), not the same as
// the frame for this vframe, see
// home_frame_of_vfo_locals
vframeOopClass* addr() { return (vframeOopClass*)slotsOopClass::addr(); }
void kill_vframe(); // Don't call this fct. Call kill() instead.
bool is_live_vframe() { // Don't call this fct. Call is_live() instead.
return locals() != NULL;
}
# ifdef UNUSED
vframeOop clone(bool mustAllocate= true) {
return vframeOop(map()->clone(this, mustAllocate)); }
# endif
vframeOop basic_clone(bool mustAllocate= true, oop genObj= NULL) {
return vframeOop(((vframeMap*)map())->basic_clone(this,
mustAllocate, genObj)); }
frame* fr();
public:
friend vframeOop create_vframeOop(oop method); // for prototype
friend vframeOop new_vframeOop(Process* p,abstract_vframe* vf);
friend vframeOop new_senderVFrameOop(Process* p, vframeOop from,
abstract_vframe* vf);
frame* locals() { return addr()->_locals; }
smiOop descOffset() { return addr()->_descOffset; }
Process* process() { return addr()->_process; }
oop method() { return addr()->_method; }
abstract_vframe* as_vframe();
oop enumeration_target() {
return oop(as_vframe()->fr->block_scope_of_home_frame()); }
bool equal(vframeOop v);
bool is_below(frame* fr); // is receiver below fr on stack?
bool is_equal(frame* fr); // is receiver in frame fr?
bool is_above(frame* fr); // is receiver above fr on stack?
bool is_equal(abstract_vframe* vf);
# ifdef UNUSED
bool is_below(abstract_vframe* vf);
bool is_above(abstract_vframe* vf);
# endif
bool verify();
protected:
// list functions
vframeOop next() { assert(verify_oop(), ""); return addr()->_next; }
void set_next(vframeOop n) { Memory->store((oop*)&addr()->_next, n); }
void insertAfter(vframeOop before) {
set_next(before->next());
before->set_next(this); }
void remove(vframeOop prev) {
assert(prev->next() == this, "not previous");
prev->set_next(next());
}
void set_descOffset(smiOop n) { addr()->_descOffset = n; }
vframeOop set_method(oop n) {
Memory->store(&addr()->_method, n); return this; }
void set_locals(frame* l) {
assert(oop(l)->is_smi(), "not a smi");
addr()->_locals = l; }
void set_process(Process* p) { addr()->_process = p; }
friend class Process;
friend class vframeMap;
friend class processOopClass;
friend class processMap;
friend class Recompilation;
};