sourcepawn/compiler/sctracker.c
changeset 115 6301d1fa7143
child 116 4965c485f121
     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