sourcepawn/compiler/sctracker.h
author David Anderson <dvander@alliedmods.net>
Fri Nov 03 06:14:43 2006 +0000 (2006-11-03)
changeset 132 dabef847cd2c
parent 118 0cfeb76486a2
child 167 4db3481b6db7
permissions -rw-r--r--
Expanded weak function pointers with type checking
Added function typing enumeration
dvander@115
     1
#ifndef _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
dvander@115
     2
#define _INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_
dvander@115
     3
dvander@116
     4
#define MEMUSE_STATIC      0
dvander@116
     5
#define MEMUSE_DYNAMIC     1
dvander@115
     6
dvander@116
     7
typedef struct memuse_s {
dvander@116
     8
  int type;   /* MEMUSE_STATIC or MEMUSE_DYNAMIC */
dvander@116
     9
  int size;   /* size of array for static (0 for dynamic) */
dvander@116
    10
  struct memuse_s *prev; /* previous block on the list */
dvander@116
    11
} memuse_t;
dvander@115
    12
dvander@116
    13
typedef struct memuse_list_s {
dvander@116
    14
  struct memuse_list_s *prev;   /* last used list */
dvander@117
    15
  int list_id;
dvander@116
    16
  memuse_t *head;               /* head of the current list */
dvander@116
    17
} memuse_list_t;
dvander@115
    18
dvander@132
    19
typedef struct funcarg_s
dvander@132
    20
{
dvander@132
    21
  int tagcount;
dvander@132
    22
  int tags[sTAGS_MAX];
dvander@132
    23
  int dimcount;
dvander@132
    24
  cell dims[sDIMEN_MAX];
dvander@132
    25
  int ident;
dvander@132
    26
  int fconst;
dvander@132
    27
  int ommittable;
dvander@132
    28
} funcarg_t;
dvander@132
    29
dvander@132
    30
typedef struct functag_s
dvander@132
    31
{
dvander@132
    32
  int ret_tag;
dvander@132
    33
  int type;
dvander@132
    34
  int argcount;
dvander@132
    35
  int ommittable;
dvander@132
    36
  funcarg_t args[sARGS_MAX];
dvander@132
    37
  struct functag_s *next;
dvander@132
    38
} functag_t;
dvander@132
    39
dvander@132
    40
typedef struct funcenum_s
dvander@132
    41
{
dvander@132
    42
  int value;
dvander@132
    43
  char name[sNAMEMAX+1];
dvander@132
    44
  functag_t *first;
dvander@132
    45
  functag_t *last;
dvander@132
    46
  struct funcenum_s *next;
dvander@132
    47
} funcenum_t;
dvander@132
    48
dvander@132
    49
/**
dvander@132
    50
 * Function enumeration tags
dvander@132
    51
 */
dvander@132
    52
void funcenums_free();
dvander@132
    53
funcenum_t *funcenums_add(const char *name);
dvander@132
    54
funcenum_t *funcenums_find_byval(int value);
dvander@132
    55
functag_t *functags_add(funcenum_t *en, functag_t *src);
dvander@132
    56
dvander@116
    57
/**
dvander@116
    58
 * Heap functions
dvander@116
    59
 */
dvander@115
    60
void pushheaplist();
dvander@116
    61
memuse_list_t *popsaveheaplist();
dvander@115
    62
void popheaplist();
dvander@115
    63
int markheap(int type, int size);
dvander@115
    64
dvander@116
    65
/**
dvander@116
    66
 * Stack functions
dvander@116
    67
 */
dvander@116
    68
void pushstacklist();
dvander@116
    69
void popstacklist();
dvander@116
    70
int markstack(int type, int size);
dvander@117
    71
/**
dvander@118
    72
 * Generates code to free mem usage, but does not pop the list.  
dvander@117
    73
 *  This is used for code like dobreak()/docont()/doreturn().
dvander@117
    74
 * stop_id is the list at which to stop generating.
dvander@117
    75
 */
dvander@117
    76
void genstackfree(int stop_id);
dvander@118
    77
void genheapfree(int stop_id);
dvander@117
    78
dvander@117
    79
/**
dvander@118
    80
 * Resets a mem list by freeing everything
dvander@117
    81
 */
dvander@117
    82
void resetstacklist();
dvander@118
    83
void resetheaplist();
dvander@116
    84
dvander@116
    85
extern memuse_list_t *heapusage;
dvander@116
    86
extern memuse_list_t *stackusage;
dvander@116
    87
dvander@115
    88
#endif //_INCLUDE_SOURCEPAWN_COMPILER_TRACKER_H_