1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/sourcepawn/compiler/sctracker.c Sun Oct 15 20:26:51 2006 +0000
1.3 @@ -0,0 +1,86 @@
1.4 +#include <malloc.h>
1.5 +#include <assert.h>
1.6 +#include "sc.h"
1.7 +#include "sctracker.h"
1.8 +
1.9 +heapuse_list_t *heapusage = NULL;
1.10 +
1.11 +/**
1.12 +* Creates a new heap allocation tracker entry
1.13 +*/
1.14 +void pushheaplist()
1.15 +{
1.16 + heapuse_list_t *newlist=(heapuse_list_t *)malloc(sizeof(heapuse_list_t));
1.17 + newlist->prev=heapusage;
1.18 + newlist->head=NULL;
1.19 + heapusage=newlist;
1.20 +}
1.21 +
1.22 +/**
1.23 +* Generates code to free all heap allocations on a tracker
1.24 +*/
1.25 +void freeheapusage(heapuse_list_t *heap)
1.26 +{
1.27 + heapuse_t *cur=heap->head;
1.28 + heapuse_t *tmp;
1.29 + while (cur) {
1.30 + if (cur->type == HEAPUSE_STATIC) {
1.31 + modheap((-1)*cur->size*sizeof(cell));
1.32 + } else {
1.33 + modheap_i();
1.34 + }
1.35 + tmp=cur->prev;
1.36 + free(cur);
1.37 + cur=tmp;
1.38 + }
1.39 + heap->head=NULL;
1.40 +}
1.41 +
1.42 +/**
1.43 +* Pops a heap list but does not free it.
1.44 +*/
1.45 +heapuse_list_t *popsaveheaplist()
1.46 +{
1.47 + heapuse_list_t *oldlist=heapusage;
1.48 + heapusage=heapusage->prev;
1.49 + return oldlist;
1.50 +}
1.51 +
1.52 +/**
1.53 +* Pops a heap list and frees it.
1.54 +*/
1.55 +void popheaplist()
1.56 +{
1.57 + heapuse_list_t *oldlist;
1.58 + assert(heapusage!=NULL);
1.59 +
1.60 + freeheapusage(heapusage);
1.61 + assert(heapusage->head==NULL);
1.62 +
1.63 + oldlist=heapusage->prev;
1.64 + free(heapusage);
1.65 + heapusage=oldlist;
1.66 +}
1.67 +
1.68 +/*
1.69 +* Returns the size passed in
1.70 +*/
1.71 +int markheap(int type, int size)
1.72 +{
1.73 + heapuse_t *use;
1.74 + if (type==HEAPUSE_STATIC && size==0)
1.75 + return 0;
1.76 + use=heapusage->head;
1.77 + if (use && (type==HEAPUSE_STATIC)
1.78 + && (use->type == type))
1.79 + {
1.80 + use->size += size;
1.81 + } else {
1.82 + use=(heapuse_t *)malloc(sizeof(heapuse_t));
1.83 + use->type=type;
1.84 + use->size=size;
1.85 + use->prev=heapusage->head;
1.86 + heapusage->head=use;
1.87 + }
1.88 + return size;
1.89 +}
1.90 \ No newline at end of file