/* Sun-$Revision: 23.5 $ */
/* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University.
See the LICENSE file for license information. */
# pragma interface
// A processOop is the Self-level half of a process descriptor. It contains
// a pointer to the C++ Process structure. It is also used to keep track
// of all live activation mirrors for the process.
class processOopClass: public slotsOopClass {
protected:
Process* _process;
vframeOop _vframeList;
oop _return_oop; // Contains the return value when after the
// process has terminated.
processOopClass* addr() { return (processOopClass*)slotsOopClass::addr();}
oop get_result(oop resultArg);
void kill_process(); // Don't call this fct. Call kill() instead.
bool is_live_process(); // Don't call this fct. Call is_live() instead.
vframeOop clone_vframeOop(abstract_vframe* vf, Process* p, bool mustAllocate= true);
public:
Process* process() { return addr()->_process; }
void set_process(Process* p) {
assert(oop(p)->is_smi(), "not a smi");
addr()->_process = p; }
processOop clone(bool mustAllocate= true) {
return (processOop) slotsOopClass::clone(mustAllocate); }
vframeOop vframeList() { return addr()->_vframeList; }
# ifdef UNUSED
processOop set_vframeList(vframeOop p) {
Memory->store((oop*)&addr()->_vframeList, p); return this; }
# endif
friend class processMap;
// process primitives
oop NewProcess_prim(smi stackSize, oop rcvr, stringOop sel,
objVectorOop args, void *FH);
oop AbortProcess_prim(void *FH);
oop PrintProcessStack_prim(void *FH);
oop TWAINS_prim(objVectorOop resultArg, bool stepping, oop stop, void *FH);
protected: // Twains helpers:
Process* TWAINS_receiver_check(void* FH);
bool TWAINS_result_vector_check(objVectorOop resultArg, void* FH);
vframeOop TWAINS_stop_activation_check(Process* proc, oop stop, void* FH);
bool TWAINS_parallel_check(void* FH);
void TWAINS_await_signal();
void TWAINS_transfer_to_another_process(
Process* proc,
objVectorOop& resultArg,
bool stepping,
vframeOop stop_vfo);
public:
oop ProcessReturnValue_prim(void *FH);
// debugging primitives
smi StackDepth_prim(void *FH);
// Returns all the vframeOops of this process in a vector.
oop ActivationStack_prim(void *FH);
void set_return_oop(oop ret) { Memory->store((oop*)&addr()->_return_oop, ret); }
oop get_return_oop() { return addr()->_return_oop; }
protected:
abstract_vframe* vframe_at(smi index, void *FH, Process*& p, frame*& last);
public:
oop ActivationAt_prim(smi index, void *FH);
oop KillUpTo_prim(smi index, void *FH);
oop GotoByteCode_prim(smi index, objVectorOop exprStack, void *FH);
oop set_current_hash_prim(smi val) {
process()->current_hash = val;
return this;
}
void switch_return_oop(oop* where, oop to) {
if (where == &addr()->_return_oop)
set_return_oop(to);
}
};
smi TWAINSResultSize_prim();
oop ThisProcess_prim(oop rcvr);
oop Yield_prim(oop rcvr, oop arg);