/* ....[@@@..[@@@..............[@.................. MUD++ is a written from ....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and ....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++. ....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing ....[@......[@..[@@@@@..[@@@@@.................. development project. All ................................................ contributions are welcome. ....Copyright(C).1995.Melvin.Smith.............. Enjoy. ------------------------------------------------------------------------------ Melvin Smith (aka Fusion) msmith@hom.net MUD++ development mailing list mudpp@van.ml.org ------------------------------------------------------------------------------ vmachine.h */ #ifndef _VMACHINE_H #define _VMACHINE_H #include "string.h" #include "llist.h" #include "vmtypes.h" #include "vmobject.h" #include "vmacros.h" #include "memoryblock.h" const int TSTACK_SIZE = 10; const int OSTACK_SIZE = 50; const int VSTACK_SIZE = 50; extern bool vmachine_enabled; typedef struct { int funID; memorycell * focus; int var_count; } vmtrace; class VMachine : public MemoryCellBlock { protected: vmtrace * pstrace; // trace stacks - calls trace vmstack * psobj; // object stack - aritmetic, short-time vars vmstack * psvar; // local variables stack - args, local vars - // - current bottom int var_count; // local variables allocated in current scope vmtrace tStack[TSTACK_SIZE]; vmstack oStack[OSTACK_SIZE]; vmstack vStack[VSTACK_SIZE]; vmtrace * tStackCeiling; vmstack * oStackCeiling; vmstack * vStackCeiling; int funID; memorycell * low_border; memorycell * high_border; String * current_args; int to_sleep; bool live; u8 exitCode; public: VMachine() { tStackCeiling = &tStack[TSTACK_SIZE-1]; oStackCeiling = &oStack[OSTACK_SIZE-1]; vStackCeiling = &vStack[VSTACK_SIZE-1]; defaultValues(); } void defaultValues(); void reset() { defaultValues(); } void run( int funnumber ); void run(); void schedule(); void crit_error(const char *); void collect_trace(); void leave_trace(int offs = 0); void buildStackTrace( String & ); void putToSleep( float seconds ); int tick() { return (--to_sleep); } int bigTick( int ); vmstack * initp( int ); void mark(); // Mark referenced objects for GC void push( vmstack val ) { psobj++; *psobj = val; psobj->val = reference_obj(psobj); } void push( vmtype type, vmptr val ) { psobj++; psobj->type = type; psobj->val = reference_obj( type, val ); } void push_int( int val ) { psobj++; psobj->type = VMT_INT; psobj->val.i = val; } void push_float( float val ) { psobj++; psobj->type = VMT_FLOAT; psobj->val.f = val; } void push_string( const String & str ) { psobj++; psobj->type = VMT_STRING; psobj->val.s = new String( str ); } void push_obj( vmtype type, VMObject * ptr) { psobj++; psobj->type = type; psobj->val.o = ptr; } void push_null_obj( vmtype type) { psobj++; psobj->type = type; psobj->val.o = NULL; } }; VMachine * getFreeVM(); void createVMs(); void VMstatistic( String &); void VMmark4GC(); #endif