123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- 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 */
|