/* execute.h: Declarations for executing C-- tasks. */ #ifndef EXECUTE_H #define EXECUTE_H #include <sys/types.h> #include <stdarg.h> #include "data.h" #include "object.h" #include "io.h" /* We use the MALLOC_DELTA defines to keep table sizes thirty-two bytes less * than a power of two, which is helpful on buddy systems. */ #define STACK_MALLOC_DELTA 4 #define ARG_STACK_MALLOC_DELTA 8 typedef struct frame Frame; typedef struct error_action_specifier Error_action_specifier; typedef struct handler_info Handler_info; struct frame { Object *object; long sender; long caller; Method *method; long *opcodes; int pc; int last_opcode; int ticks; int stack_start; int var_start; Error_action_specifier *specifiers; Handler_info *handler_info; Frame *caller_frame; }; struct error_action_specifier { int type; int stack_pos; union { struct { int end; } critical; struct { int end; } propagate; struct { int error_list; int handler; } catch; } u; Error_action_specifier *next; }; struct handler_info { List *traceback; Data arg; long id; Handler_info *next; }; extern Frame *cur_frame, *suspend_frame; extern Connection *cur_conn; extern Data *stack; extern int stack_pos, stack_size; extern int *arg_starts, arg_pos, arg_size; extern String *numargs_str; extern long task_id; void init_execute(void); void task(Connection *conn, long dbref, long message, int num_args, ...); void task_eval(Connection *conn, Object *obj, Method *method); long frame_start(Object *obj, Method *method, long caller, long caller_definer, int stack_start, int arg_start); void frame_return(void); void anticipate_assignment(void); long pass_message(int stack_start, int arg_start); long send_message(long dbref, long message, int stack_start, int arg_start); void pop(int n); void check_stack(int n); void push_int(long n); void push_string(String *str); void push_dbref(long dbref); void push_list(List *list); void push_symbol(long id); void push_error(long id); void push_dict(Dict *dict); int func_init_0(); int func_init_1(Data **args, int type1); int func_init_2(Data **args, int type1, int type2); int func_init_3(Data **args, int type1, int type2, int type3); int func_init_0_or_1(Data **args, int *num_args, int type1); int func_init_1_or_2(Data **args, int *num_args, int type1, int type2); int func_init_2_or_3(Data **args, int *num_args, int type1, int type2, int type3); int func_init_1_to_3(Data **args, int *num_args, int type1, int type2, int type3); void func_num_error(int num_args, char *required); void func_type_error(char *which, Data *wrong, char *required); void func_error(long id, char *fmt, ...); void throw(long id, char *fmt, ...); void unignorable_error(long id, String *str); void interp_error(long id, String *str); void user_error(long id, String *str, Data *arg); void propagate_error(List *traceback, long id, Data *arg); void pop_error_action_specifier(void); void pop_handler_info(void); #endif