segment.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. AB_list[s] holds the actual base of stack frame s; this
  3. is the highest stack pointer of frame s-1.
  4. Segments have the following numbers:
  5. -2 DATA_SEGMENT
  6. -1 HEAP_SEGMENT
  7. 0, 1, .., curr_frame stackframes
  8. Note that AB_list[s] increases for decreasing s.
  9. */
  10. /* $Id$ */
  11. #include "segcheck.h"
  12. #include "global.h"
  13. #include "mem.h"
  14. #include "alloc.h"
  15. #ifdef SEGCHECK
  16. #define ABLISTSIZE 100L /* initial AB_list size */
  17. #define DATA_SEGMENT -2
  18. #define HEAP_SEGMENT -1
  19. PRIVATE ptr *AB_list;
  20. PRIVATE size frame_limit;
  21. PRIVATE size curr_frame;
  22. init_AB_list() {
  23. /* Allocate space for AB_list & initialize frame variables */
  24. frame_limit = ABLISTSIZE;
  25. curr_frame = 0L;
  26. AB_list = (ptr *) Malloc(frame_limit * sizeof (ptr), "AB_list");
  27. AB_list[curr_frame] = AB;
  28. }
  29. push_frame(p)
  30. ptr p;
  31. {
  32. if (++curr_frame == frame_limit) {
  33. frame_limit = allocfrac(frame_limit);
  34. AB_list = (ptr *) Realloc((char *) AB_list,
  35. frame_limit * sizeof (ptr), "AB_list");
  36. }
  37. AB_list[curr_frame] = p;
  38. }
  39. pop_frames() {
  40. while (AB_list[curr_frame] < AB) {
  41. curr_frame--;
  42. }
  43. }
  44. int ptr2seg(p)
  45. ptr p;
  46. {
  47. register int s;
  48. if (in_gda(p)) {
  49. s = DATA_SEGMENT;
  50. }
  51. else if (!in_stack(p)) {
  52. s = HEAP_SEGMENT;
  53. }
  54. else {
  55. for (s = curr_frame; s > 0; s--) {
  56. if (AB_list[s] > p)
  57. break;
  58. }
  59. }
  60. return s;
  61. }
  62. #else /* SEGCHECK */
  63. init_AB_list() {}
  64. push_frame() {}
  65. pop_frames() {}
  66. #endif /* SEGCHECK */