/* Data structures and constants to represent executable code */ #ifndef EXEC_H #define EXEC_H #include "alloc.h" #include "mudlib/sys/driver_hook.h" #define TYPE_ANY 0 #define TYPE_NUMBER 1 #define TYPE_FLOAT 2 #define TYPE_STRING 3 #define TYPE_OBJECT 4 #define TYPE_MAPPING 5 #define TYPE_CLOSURE 6 #define TYPE_STRUCT_BUILTIN 7 #define TYPE_LONG (TYPE_STRUCT_BUILTIN+0) #define TYPE_QUOTED_ARRAY (TYPE_STRUCT_BUILTIN+1) #define TYPE_REGEXP (TYPE_STRUCT_BUILTIN+2) #define TYPE_SPACE (TYPE_STRUCT_BUILTIN+3) #define TYPE_SYMBOL (TYPE_STRUCT_BUILTIN+4) #define TYPE_TERM (TYPE_STRUCT_BUILTIN+5) #define TYPE_UNKNOWN 15 #define TYPE_REFERENCE 31 #define TYPE_VOID 32 /* The number zero from a 'void' lfun' */ #define TYPE_NIL 33 /* No return from a void efun. */ #define TYPEMAP_SIZE 15 #define TYPE__ARRAY 0x0010 /* Pointer to a basic type */ #define TYPE__REFERENCE 0x0080 #define TYPE__MASK 0x000000ff #define TYPE__RMASK (TYPE__MASK & ~TYPE__REFERENCE) #define TYPE__STATIC 0x80 #define TYPE__NOMASK 0x40 /* Not redefineable */ #define TYPE__PRIVATE 0x20 /* Can't be inherited */ #define TYPE__PUBLIC 0x10 /* Force inherit through private */ #define TYPE__VARARGS 0x08 /* Used for type checking */ #define TYPE__INITIALIZED 0x08 /* only used for variables */ #define TYPE__VIRTUAL 0x04 /* can be re- and cross- defined */ #define TYPE__PROTECTED 0x02 /* cannot be called externally */ #define TYPE__SHARED 0x02 #define TYPE__CONST 0x01 #define FUNSTART_MASK 0x000fffff #define TYPE__CROSS_DEFINED 0x00080000 #define INHERIT_MASK 0x0003ffff #define TYPE__HIDDEN 0x00000800 /* Not visible for inheritance */ #define TYPE__PROTOTYPE 0x00000400 /* Defined by a prototype only */ #define TYPE__UNDEFINED 0x00000200 /* Not defined yet */ #define TYPE__TYPES_LOST 0x00000100 /* inherited, no save_types */ #define PROG_FUNSTART2NAME(prog,flags) \ (((svalue *)(prog+(flags & (FUNSTART_MASK & ~((sizeof(uint8 *)) - 1)))))[-1]) #define FUNSTART2NARGS(funstart) (funstart[-2]) #define FUNSTART2NLOCAL(funstart) (funstart[-1]) /* Data-structure imposed maximum number of named parameters. */ #define MAX_PARAM 0x100 /* * The RESWORD macros in alloc.h depend on 0x800 being left free from * TYPE_ stuff that appears as value of a keyword ( see lex.c::reswords[] ) */ #define VIRTUAL_VAR_TAG 0x4000 #define TYPE__EXCL_MASK (TYPE__VARARGS|TYPE__CONST|TYPE__SHARED|TYPE__PROTECTED) enum use_lvalue_code{ ULV_ERROR, ULV_PRE_DEC, /* needed: inc/dec code & 4 is 4 for inc. */ ULV_POST_DEC, ULV_DEC, /* needed: ULV_x_DEC + 4 == ULV_x_INC */ ULV_NOP, /* needed: same offsets between pre/post/void inc/dec operators */ ULV_PRE_INC, ULV_POST_INC, ULV_INC, ULV_ASSIGN, ULV_VOID_ASSIGN, ULV_HAIRY_ASSIGN, ULV_VOID_HAIRY_ASSIGN, ULV_ADD, ULV_VOID_ADD, ULV_SUB, ULV_VOID_SUB, ULV_AND, ULV_VOID_AND, ULV_OR, ULV_VOID_OR, ULV_XOR, ULV_VOID_XOR, ULV_MUL, ULV_VOID_MUL, ULV_DIV, ULV_VOID_DIV, ULV_MOD, ULV_VOID_MOD, ULV_RSH, ULV_VOID_RSH, ULV_LSH, ULV_VOID_LSH, ULV_INDEX, ULV_RINDEX, ULV_CINDEX, ULV_CRINDEX, ULV_SINDEX, ULV_SRINDEX, ULV_MAP_INDEX, ULV_MAP_CINDEX, ULV_NN_RANGE, ULV_NR_RANGE, ULV_RN_RANGE, ULV_RR_RANGE, ULV_LV_INDEX, ULV_LV_RINDEX, ULV_LV_CINDEX, ULV_LV_CRINDEX, ULV_LV_SINDEX, ULV_LV_SRINDEX, ULV_LV_MAP_INDEX, ULV_LV_MAP_CINDEX, /* range values have lvalue lifetime protection by default */ ULV_LV_NN_RANGE, ULV_LV_NR_RANGE, ULV_LV_RN_RANGE, ULV_LV_RR_RANGE, ULV_CBR, /* pack an ordinary lvalue for call by reference */ ULV_PLV_INDEX, ULV_PLV_RINDEX, /* needed: same (R)INDEX - LV_(R)INDEX - LV_PLV_(R)INDEX * offsets. */ ULV_PLV_MAP_INDEX, ULV_PRE_DEC_BBRANCH, }; #define ULV_INDEX_FETCH_REQUIRED(code) ((code) < (ULV_LV_INDEX)) #define ULV_ASS_IS_VOID(code) ((code) & 1) #define ULV_CLOSURE_OFFSET 42 /* FIXME */ extern svalue driver_hook[NUM_DRIVER_HOOKS]; #define F_ESCAPE_BITS 7 struct instr { unsigned char ret_type; /* The return type used by the compiler */ unsigned char is_const; short max_arg, /* Maximum number of arguments. */ min_arg, /* Minimum number of arguments. */ check_arg; short Default; /* An efun to use as default for last argument. * -1 for internal stackmachine codes */ short arg_index; /* Indexes the efun_arg_types[] array. */ char *name; }; struct variable { svalue name; uint32 flags; /* All flags, also type of variable. */ }; struct new_function { svalue name; unsigned flags: 8; unsigned start: 24; }; struct program_flags { uint8 many_inherits : 1; uint8 leaf_inherit : 1; uint8 line_numbers_integrated : 1; /* one free flag */ uint8 language : 4; }; struct program { uint8 type, subtype; /* T_INTERNAL IT_PROGRAM */ uint16 global_variables; struct program_flags flag; uint8 auto_variables; uint16 redefine_offset; /* Keep the pointer to the list the of inherited programs right after flag, so that it is likely to be in the same cache line. */ struct inherit *inherit; #define PR_INHERIT_END(p) ((struct inherit *)(p)->variable_names) uint32 ref; svalue dirname; svalue basename; int32 id_number; /* used to associate information with this prog block without needing to increase the reference count */ int32 load_time; /* When has it been compiled ? */ p_int swap_num; /* Swap file offset. -1 is not swapped yet. */ /* All variables defined */ struct variable *variable_name; #define PR_VARIABLE_NAME_END(p) ((struct variable *)(p)->shared) svalue *shared; #define PR_SHARED_END(p) ((svalue *)(p)->new_function) #define PR_FUNCTION_END_8(p) ((uint8 *)(p)->inherit) union { uint16 *name; struct { uint16 base, offset; } search; } function; #define PR_FUNCTION_NAME_SIZE(p) ((p)[-1]) struct new_function *new_function; #define PR_NEW_FUNCTION_END(p) ((struct new_function *)(p)->type_indizes) /* start indizes for arguments into type_block */ #define INDEX_START_NONE 65535 uint16 *type_indizes; #define PR_TYPE_INDIZES_END(p) ((uint16 *)(p)->type_block) uint8 *type_block; #define PR_TYPE_BLOCK_END(p) ((p)->pcode) #define PR_PCODE(p) (uint8 *)p /* The compiled P-code */ uint8 *pcode; #define PR_PROGRAM_END(p) ((p)->line_numbers_integrated ? \ (p)->line_numbers : (p)->end) /* Line number information */ uint8 *line_numbers; #define PR_LINE_NUMBER_END(p) ((p)->end) uint8 *end; union { uint8 function_8[1]; uint16 function_16[1]; uint16 variable[1]; } virtual; }; struct inherit { p_int program; /* struct program * with low bits used for static */ uint16 virtual_offset; uint16 variable_offset; }; struct variable_modifier { uint16 modifier, variable; }; struct function_modifier { uint16 modifier, function; }; struct inherit_modifiers { uint16 kind, inherit, variable, function; }; extern struct simul_efun_table_s { union { uint8 *start; svalue name; } fun; struct program *program; uint16 function_offset; uint16 variable_offset; int16 num_arg; /* -1 for varargs */ uint8 type; uint8 nomask; } *simul_efun_table; struct program *compile_file(uint8 *namestart, mp_int namelen, int language); int find_function(struct program *, svalue); int leaf_inherit_find_function(struct program *, svalue); extern struct program nil_program; #endif /* EXEC_H */