#define MAX_GLOBAL_VARIABLES 1000 struct node_s { unsigned short token; unsigned short type; long opt_info; short lnum; union { struct svalue sval; struct { union { struct object *ob; char *str; struct node_s *node; struct vector *vec; int number; float fnum; } a,b; } s; } u; }; typedef struct node_s node; #define OPT_A_IS_NODE 0x1 #define OPT_B_IS_NODE 0x2 #define OPT_CONST 0x4 #define OPT_SIDE_EFFECT 0x8 #define OPT_LOCAL_ASSIGNMENT 0x10 #define OPT_GLOBAL_ASSIGNMENT 0x20 #define OPT_RESTORE_OBJECT 0x40 #define OPT_TRY_OPTIMIZE 0x80 #define OPT_OPT_COMPUTED 0x100 #define OPT_CASE 0x200 #define OPT_CONT 0x400 #define OPT_BREAK 0x800 #define OPT_RETURN 0x1000 #define OPT_GLOBAL_DEPEND 0x2000 #define OPT_LVALUE_CHANGE 0x4000 #define OPT_LVALUE_OVERWRITE 0x8000 #define OPT_COULD_BE_CONST 0x10000 #define OPT_OPTIMIZED 0x20000 #define OPT_NOT_THROWABLE (OPT_SIDE_EFFECT | OPT_LOCAL_ASSIGNMENT | \ OPT_GLOBAL_ASSIGNMENT | OPT_RESTORE_OBJECT | \ OPT_CASE | OPT_CONT | OPT_BREAK | OPT_RETURN | \ OPT_LVALUE_CHANGE | OPT_LVALUE_OVERWRITE ) /* NUMPAREAS areas are saved with the program code after compilation. */ #define A_PROGRAM 0 #define A_FUNCTIONS 1 #define A_FUNCTION_PTRS 2 #define A_STRINGS 3 #define A_VARIABLES 4 #define A_LINENUMBERS 5 #define A_INHERITS 6 #define A_ARGUMENT_TYPES 7 #define A_ARGUMENT_INDEX 8 #define A_SWITCH_MAPPINGS 9 #define A_CONSTANTS 10 #define NUMAREAS 11 void dooptcode(node *n,int args); void push_explicit(int); void push_address(); int pop_address(); void setup_fake_program(); INLINE void add_to_mem_block(int n,char *data,int size); node *mknode(short,node *,node *); node *mkintnode(int); node *mkstrnode(char *); node *mkcastnode(int,node *); node *mkfloatnode(float); node *mkconstfunnode(int); node *mkglobalnode(int); node *mklocalnode(int); node *mksimulefunnode(int); node *mkefunnode(int,node *); node *mksvaluenode(struct svalue *); node *copy_node(node *); int get_opt_info(void); void start_line_numbering(void); #define FUNCTION(n) ((struct function *)mem_block[A_FUNCTIONS].block + (n)) #define FUNCTIONP(n) ((struct function_p *)mem_block[A_FUNCTION_PTRS].block + (n)) #define VARIABLE(n) ((struct variable *)mem_block[A_VARIABLES].block + (n)) #define INHERIT(n) ((struct inherit *)mem_block[A_INHERITS].block + (n)) /* * Some good macros to have. */ #define MASK(x) ((x) & TYPE_MOD_MASK) #define BASIC_TYPE(e,t) ((e) == TYPE_ANY ||\ (e) == (t) ||\ (t) == TYPE_ANY) #define SAME_TYPE(e,t) ( MASK(e) != TYPE_ANY && \ (MASK(e) == MASK(t) || \ ((e) & (t) & TYPE_MOD_POINTER)) ) #define TYPE(e,t) (BASIC_TYPE(MASK(e), MASK(t)) ||\ ((e) & (t) & TYPE_MOD_POINTER))