/* Copyright (c) 1993 Stephen F. White */ #ifdef PROTO extern void gettimeofday(struct timeval *tp, struct timezone *tzp); #endif typedef struct timeval Timeval; typedef struct Event Event; struct Event { int msgid; /* current message id */ int age; /* current message's age */ int ticks; /* current task's ticks */ Objid player; /* current player */ Objid this; /* object to which message was sent */ Object *on; /* object on which method is located */ Objid caller; /* object which sent the message */ List *args; /* arguments to message */ Method *m; /* method which was being executed */ /* the following fields are used when the method gets blocked */ enum { BL_MESSAGE, BL_LOCK, BL_TIMER, BL_SYS_MESSAGE, BL_DEAD } blocked_on; /* what the method is blocked on */ Timeval timeout_at; /* time at which message should time out */ int blocked_msgid; /* message for which MESSAGE event is waiting */ Objid blocked_objid; /* object to which MESSAGE event was sent */ String *msg; /* if sent to remote, text of message */ Timeval retry_at; /* absolute time to retry at */ int retry_interval; /* relative msec on next retry */ String *lock; /* name of lock which LOCK is blocked on */ int sp; /* stack pointer */ int pc; /* program counter */ Var stack[STACK_SIZE]; /* the stack */ int nvars; /* and how many of them */ int last_opcode; /* useful for error recovery */ Event *prev; /* previous event in queue */ Event *next; /* next event in queue */ }; /* * Execution globals */ extern Event frame; /* the currently executing frame */ extern enum state ex_state; /* execution state */ extern Var ex_retval; /* return value (set by op_return()) */ extern Object *this; /* this object, may be 0 */ /* * from execute.c */ extern void push(Var v); extern Var pop(void); extern Var pop_args(int num); /* pop an argument list */ extern void pushn(long i); /* push an integer onto the stack */ extern void pushpc(int i); /* push the PC onto the stack */ extern void raise(Error e); /* raise an error */ extern void send_raise(List *raise_args); /* send the raise msg */ extern Error call_verb(int msgid, int age, int ticks, Objid player, Objid from, Objid to, List *args); extern Method *find_method(Object *o, const char *name); extern void send_message_and_block(Objid from, Objid to, String *msg, List *args, Objid on); extern void resume_method_return(Event *e, Var retval); extern void resume_method_raise(Event *e, List *raise_args); extern void resume_method_halt(Event *e); extern void resume_method(Event *e); extern String *add_traceback_header(String *str, Error e); extern List *make_raise_args(Error e); extern Timeval timer_sub(Timeval t1, Timeval t2); extern Timeval timer_addmsec(Timeval t, int msec); /* * from message.c */ extern Error send_message(int msgid, int age, int ticks, Objid player, Objid from, Objid to, String *message, List *args, Event *e, Objid on); extern void event_add(Event *e); extern void event_rm(Event *e); /* * Prototypes for all the opcodes */ extern void op_numpush(void), op_strpush(void), op_objpush(void), op_errpush(void), op_listpush(void), op_errpush(void), op_pushpc(void), op_if(void), op_elseif(void), op_null(void), op_for(void), op_forrng(void), op_while(void), op_do(void), op_dowhile(void), op_break(void), op_continue(void), op_add(void), op_sub(void), op_mul(void), op_div(void), op_mod(void), op_negate(void), op_message(void), op_message_expr(void), op_and(void), op_or(void), op_not(void), op_index(void), op_subset(void), op_lsubset(void), op_rsubset(void), op_gt(void), op_lt(void), op_ge(void), op_le(void), op_eq(void), op_ne(void), op_echo(void), op_echo_file(void), op_clone(void), op_destroy(void), op_chparents(void), op_time(void), op_ctime(void), op_in(void), op_explode(void), op_strsub(void), op_psub(void), op_random(void), op_pop(void), op_pad(void), op_setadd(void), op_setremove(void), op_listinsert(void), op_listappend(void), op_listdelete(void), op_listassign(void), op_asgnlvar(void), op_asgngvar(void), op_asgngvarexpr(void), op_getlvar(void), op_getgvar(void), op_getgvarexpr(void), op_parents(void), op_this(void), op_player(void), op_caller(void), op_args(void), op_setplayer(void), op_return(void), op_stop(void), op_abort(void), op_crypt(void), op_checkmem(void), op_cache_stats(void), op_lock(void), op_unlock(void), op_at(void), op_tostr(void), op_tonum(void), op_toobj(void), op_toerr(void), op_typeof(void), op_lengthof(void), op_serverof(void), op_servername(void), op_servers(void), op_verbs(void), op_vars(void), op_methods(void), op_verb(void), op_rmverb(void), op_rmmethod(void), op_rmvar(void), op_program(void), op_compile(void), op_find_method(void), op_spew_method(void), op_list_method(void), op_decompile(void), op_hasparent(void), op_objsize(void), op_match(void), op_match_full(void), op_shutdown(void), op_dump(void), op_boot(void), op_writelog(void), op_raise(void), op_pass(void), op_sleep(void), op_ps(void), op_kill(void);