dvander@115: #ifndef _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_ dvander@115: #define _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_ dvander@115: dvander@116: #define MEMUSE_STATIC 0 dvander@116: #define MEMUSE_DYNAMIC 1 dvander@115: dvander@116: typedef struct memuse_s { dvander@116: int type; /* MEMUSE_STATIC or MEMUSE_DYNAMIC */ dvander@116: int size; /* size of array for static (0 for dynamic) */ dvander@116: struct memuse_s *prev; /* previous block on the list */ dvander@116: } memuse_t; dvander@115: dvander@116: typedef struct memuse_list_s { dvander@116: struct memuse_list_s *prev; /* last used list */ dvander@117: int list_id; dvander@116: memuse_t *head; /* head of the current list */ dvander@116: } memuse_list_t; dvander@115: dvander@132: typedef struct funcarg_s dvander@132: { dvander@132: int tagcount; dvander@132: int tags[sTAGS_MAX]; dvander@132: int dimcount; dvander@132: cell dims[sDIMEN_MAX]; dvander@132: int ident; dvander@132: int fconst; dvander@132: int ommittable; dvander@132: } funcarg_t; dvander@132: dvander@132: typedef struct functag_s dvander@132: { dvander@132: int ret_tag; dvander@132: int type; dvander@132: int argcount; dvander@132: int ommittable; dvander@132: funcarg_t args[sARGS_MAX]; dvander@132: struct functag_s *next; dvander@132: } functag_t; dvander@132: dvander@132: typedef struct funcenum_s dvander@132: { dvander@132: int value; dvander@132: char name[sNAMEMAX+1]; dvander@132: functag_t *first; dvander@132: functag_t *last; dvander@132: struct funcenum_s *next; dvander@132: } funcenum_t; dvander@132: dvander@167: typedef struct structarg_s dvander@167: { dvander@167: int tag; dvander@167: int dimcount; dvander@167: cell dims[sDIMEN_MAX]; dvander@167: char name[sNAMEMAX+1]; dvander@167: int fconst; dvander@167: int ident; dvander@167: unsigned int offs; dvander@167: int index; dvander@167: } structarg_t; dvander@167: dvander@167: typedef struct pstruct_s dvander@167: { dvander@167: int argcount; dvander@167: char name[sNAMEMAX+1]; dvander@167: structarg_t **args; dvander@167: struct pstruct_s *next; dvander@167: } pstruct_t; dvander@167: dvander@167: /** dvander@167: * Pawn Structs dvander@167: */ dvander@167: pstruct_t *pstructs_add(const char *name); dvander@167: void pstructs_free(); dvander@167: pstruct_t *pstructs_find(const char *name); dvander@167: structarg_t *pstructs_addarg(pstruct_t *pstruct, const structarg_t *arg); dvander@167: structarg_t *pstructs_getarg(pstruct_t *pstruct, const char *member); dvander@167: dvander@132: /** dvander@132: * Function enumeration tags dvander@132: */ dvander@132: void funcenums_free(); dvander@132: funcenum_t *funcenums_add(const char *name); dvander@132: funcenum_t *funcenums_find_byval(int value); dvander@132: functag_t *functags_add(funcenum_t *en, functag_t *src); dvander@132: dvander@116: /** dvander@116: * Heap functions dvander@116: */ dvander@115: void pushheaplist(); dvander@116: memuse_list_t *popsaveheaplist(); dvander@115: void popheaplist(); dvander@115: int markheap(int type, int size); dvander@115: dvander@116: /** dvander@116: * Stack functions dvander@116: */ dvander@116: void pushstacklist(); dvander@459: void popstacklist(int codegen); dvander@116: int markstack(int type, int size); dvander@117: /** dvander@118: * Generates code to free mem usage, but does not pop the list. dvander@117: * This is used for code like dobreak()/docont()/doreturn(). dvander@117: * stop_id is the list at which to stop generating. dvander@117: */ dvander@117: void genstackfree(int stop_id); dvander@118: void genheapfree(int stop_id); dvander@117: dvander@117: /** dvander@118: * Resets a mem list by freeing everything dvander@117: */ dvander@117: void resetstacklist(); dvander@118: void resetheaplist(); dvander@116: dvander@116: extern memuse_list_t *heapusage; dvander@116: extern memuse_list_t *stackusage; dvander@116: dvander@115: #endif //_INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_