Initial entry
This commit is contained in:
84
util/int/segment.c
Normal file
84
util/int/segment.c
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user