84 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
	AB_list[s] holds the actual base of stack frame  s; this
 | 
						|
	is the highest stack pointer of frame  s-1.
 | 
						|
	Segments have the following numbers:
 | 
						|
		-2			DATA_SEGMENT
 | 
						|
		-1			HEAP_SEGMENT
 | 
						|
		0, 1, .., curr_frame	stackframes
 | 
						|
	Note that  AB_list[s] increases for decreasing s.
 | 
						|
*/
 | 
						|
 | 
						|
/* $Header$ */
 | 
						|
 | 
						|
#include	"segcheck.h"
 | 
						|
#include	"global.h"
 | 
						|
#include	"mem.h"
 | 
						|
#include	"alloc.h"
 | 
						|
 | 
						|
#ifdef	SEGCHECK
 | 
						|
 | 
						|
#define	ABLISTSIZE	100L		/* initial AB_list size */
 | 
						|
 | 
						|
#define	DATA_SEGMENT	-2
 | 
						|
#define	HEAP_SEGMENT	-1
 | 
						|
 | 
						|
PRIVATE ptr *AB_list;
 | 
						|
PRIVATE size frame_limit;
 | 
						|
PRIVATE size curr_frame;
 | 
						|
 | 
						|
init_AB_list() {
 | 
						|
	/* Allocate space for AB_list & initialize frame variables */
 | 
						|
 | 
						|
	frame_limit = ABLISTSIZE;
 | 
						|
	curr_frame = 0L;
 | 
						|
	AB_list = (ptr *) Malloc(frame_limit * sizeof (ptr), "AB_list");
 | 
						|
	AB_list[curr_frame] = AB;
 | 
						|
}
 | 
						|
 | 
						|
push_frame(p)
 | 
						|
	ptr p;
 | 
						|
{
 | 
						|
	if (++curr_frame == frame_limit) {
 | 
						|
		frame_limit = allocfrac(frame_limit);
 | 
						|
		AB_list = (ptr *) Realloc((char *) AB_list,
 | 
						|
				frame_limit * sizeof (ptr), "AB_list");
 | 
						|
	}
 | 
						|
	AB_list[curr_frame] = p;
 | 
						|
}
 | 
						|
 | 
						|
pop_frames() {
 | 
						|
	while (AB_list[curr_frame] < AB) {
 | 
						|
		curr_frame--;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
int ptr2seg(p)
 | 
						|
	ptr p;
 | 
						|
{
 | 
						|
	register int s;
 | 
						|
 | 
						|
	if (in_gda(p)) {
 | 
						|
		s = DATA_SEGMENT;
 | 
						|
	}
 | 
						|
	else if (!in_stack(p)) {
 | 
						|
		s = HEAP_SEGMENT;
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		for (s = curr_frame; s > 0; s--) {
 | 
						|
			if (AB_list[s] > p)
 | 
						|
				break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return s;
 | 
						|
}
 | 
						|
 | 
						|
#else	SEGCHECK
 | 
						|
 | 
						|
init_AB_list() {}
 | 
						|
 | 
						|
push_frame() {}
 | 
						|
 | 
						|
pop_frames() {}
 | 
						|
 | 
						|
#endif	SEGCHECK
 | 
						|
 |