85 |
|
|
86 |
|
|
87 |
|
|
88 |
|
/* {Ilocs} |
89 |
|
* |
90 |
|
* Ilocs are memoized references to variables in local environment frames. |
91 |
|
* They are represented as three values: The relative offset of the |
92 |
|
* environment frame, the number of the binding within that frame, and a |
93 |
|
* boolean value indicating whether the binding is the last binding in the |
94 |
|
* frame. |
95 |
|
*/ |
96 |
|
#define SCM_ILOC00 SCM_MAKE_ITAG8(0L, scm_tc8_iloc) |
97 |
|
#define SCM_IDINC (0x00100000L) |
98 |
|
#define SCM_IDSTMSK (-SCM_IDINC) |
99 |
|
#define SCM_MAKE_ILOC(frame_nr, binding_nr, last_p) \ |
100 |
|
SCM_PACK ( \ |
101 |
|
((frame_nr) << 8) \ |
102 |
|
+ ((binding_nr) << 20) \ |
103 |
|
+ ((last_p) ? SCM_ICDR : 0) \ |
104 |
|
+ scm_tc8_iloc ) |
105 |
|
|
106 |
|
#if (SCM_DEBUG_DEBUGGING_SUPPORT == 1) |
107 |
|
|
108 |
|
SCM scm_dbg_make_iloc (SCM frame, SCM binding, SCM cdrp); |
109 |
|
SCM_DEFINE (scm_dbg_make_iloc, "dbg-make-iloc", 3, 0, 0, |
110 |
|
(SCM frame, SCM binding, SCM cdrp), |
111 |
|
"Return a new iloc with frame offset @var{frame}, binding\n" |
112 |
|
"offset @var{binding} and the cdr flag @var{cdrp}.") |
113 |
|
#define FUNC_NAME s_scm_dbg_make_iloc |
114 |
|
{ |
115 |
|
SCM_VALIDATE_INUM (1, frame); |
116 |
|
SCM_VALIDATE_INUM (2, binding); |
117 |
|
return SCM_MAKE_ILOC (SCM_INUM (frame), |
118 |
|
SCM_INUM (binding), |
119 |
|
!SCM_FALSEP (cdrp)); |
120 |
|
} |
121 |
|
#undef FUNC_NAME |
122 |
|
|
123 |
|
SCM scm_dbg_iloc_p (SCM obj); |
124 |
|
SCM_DEFINE (scm_dbg_iloc_p, "dbg-iloc?", 1, 0, 0, |
125 |
|
(SCM obj), |
126 |
|
"Return @code{#t} if @var{obj} is an iloc.") |
127 |
|
#define FUNC_NAME s_scm_dbg_iloc_p |
128 |
|
{ |
129 |
|
return SCM_BOOL (SCM_ILOCP (obj)); |
130 |
|
} |
131 |
|
#undef FUNC_NAME |
132 |
|
|
133 |
|
#endif |
134 |
|
|
135 |
|
|
136 |
|
|
137 |
#define SCM_VALIDATE_NON_EMPTY_COMBINATION(x) \ |
#define SCM_VALIDATE_NON_EMPTY_COMBINATION(x) \ |
138 |
do { \ |
do { \ |
139 |
if (SCM_EQ_P ((x), SCM_EOL)) \ |
if (SCM_EQ_P ((x), SCM_EOL)) \ |