removing debugging code
This commit is contained in:
parent
36cdfcb77a
commit
fbb419a9fa
|
@ -32,11 +32,6 @@ void scheme_init_letrec_check()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEBUG_LEVEL 0
|
|
||||||
#define DEBUG(stmt) if (DEBUG_LEVEL) { stmt; }
|
|
||||||
#define VERBOSE_DEBUG(stmt) if (DEBUG_LEVEL > 1) { stmt; }
|
|
||||||
#define MODNAME_DEBUG(stmt) if (0 || (DEBUG_LEVEL > 1)) { stmt; }
|
|
||||||
|
|
||||||
#define LET_RHS_EXPR 0x1
|
#define LET_RHS_EXPR 0x1
|
||||||
#define LET_BODY_EXPR (0x1 << 1)
|
#define LET_BODY_EXPR (0x1 << 1)
|
||||||
#define LET_NO_EXPR (0x1 << 2)
|
#define LET_NO_EXPR (0x1 << 2)
|
||||||
|
@ -118,18 +113,6 @@ typedef struct {
|
||||||
|
|
||||||
} Scheme_Deferred_Expr;
|
} Scheme_Deferred_Expr;
|
||||||
|
|
||||||
void print_frame(Letrec_Check_Frame *frame)
|
|
||||||
{
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
printf("frame: [ ");
|
|
||||||
while(frame != NULL) {
|
|
||||||
printf("[%d %d %d] ", frame->frame_type, frame->count, (int)SCHEME_INT_VAL(frame->subexpr));
|
|
||||||
frame = frame->next;
|
|
||||||
}
|
|
||||||
printf("]");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initializes a Letrec_Check_Frame */
|
/* initializes a Letrec_Check_Frame */
|
||||||
Letrec_Check_Frame *init_letrec_check_frame(int frame_type,
|
Letrec_Check_Frame *init_letrec_check_frame(int frame_type,
|
||||||
mzshort count,
|
mzshort count,
|
||||||
|
@ -185,23 +168,6 @@ Letrec_Check_Frame *init_letrec_check_frame(int frame_type,
|
||||||
frame->deferred_with_body_ref = scheme_false;
|
frame->deferred_with_body_ref = scheme_false;
|
||||||
frame->deferred_with_no_ref = scheme_false;
|
frame->deferred_with_no_ref = scheme_false;
|
||||||
|
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf("init_letrec_check_frame: type: %d; ", frame->frame_type);
|
|
||||||
print_frame(frame->next);
|
|
||||||
printf(" -> ");
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("init_letrec_check_frame: frame is not a frame");
|
|
||||||
}
|
|
||||||
if ((prev != NULL) && (prev->type != scheme_rt_letrec_check_frame)) {
|
|
||||||
scheme_signal_error("init_letrec_check_frame: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,12 +191,6 @@ Letrec_Check_Frame *get_nearest_rhs(Letrec_Check_Frame *frame) {
|
||||||
changes pos to be relative to that frame */
|
changes pos to be relative to that frame */
|
||||||
Letrec_Check_Frame *get_relative_frame(int *pos, Letrec_Check_Frame *frame)
|
Letrec_Check_Frame *get_relative_frame(int *pos, Letrec_Check_Frame *frame)
|
||||||
{
|
{
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf("get_relative_frame\n pos_int: %d\n ", *pos);
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we've gone wrong if pos_int is negative or if the frame has
|
/* we've gone wrong if pos_int is negative or if the frame has
|
||||||
become NULL because pos should have be a valid LHS variable
|
become NULL because pos should have be a valid LHS variable
|
||||||
reference */
|
reference */
|
||||||
|
@ -284,15 +244,6 @@ void update_frame(Letrec_Check_Frame *outer, Letrec_Check_Frame *inner,
|
||||||
{
|
{
|
||||||
Scheme_Object *prev_def;
|
Scheme_Object *prev_def;
|
||||||
|
|
||||||
DEBUG(printf("deferring closure at position %d\n", position));
|
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf(" outer: ");
|
|
||||||
print_frame(outer);
|
|
||||||
printf("\n inner: ");
|
|
||||||
print_frame(inner);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position >= outer->count) {
|
if (position >= outer->count) {
|
||||||
scheme_signal_error("update_frame: position exceeds binding count");
|
scheme_signal_error("update_frame: position exceeds binding count");
|
||||||
}
|
}
|
||||||
|
@ -317,8 +268,6 @@ Scheme_Object *frame_to_subexpr_ls(Letrec_Check_Frame *frame) {
|
||||||
|
|
||||||
for (; frame != NULL; frame = frame->next) {
|
for (; frame != NULL; frame = frame->next) {
|
||||||
if (frame->subexpr < 0) {
|
if (frame->subexpr < 0) {
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
scheme_signal_error("frame_to_subexpr_ls: frame->subexpr is negative");
|
scheme_signal_error("frame_to_subexpr_ls: frame->subexpr is negative");
|
||||||
}
|
}
|
||||||
ls = scheme_make_pair(scheme_make_integer(frame->subexpr), ls);
|
ls = scheme_make_pair(scheme_make_integer(frame->subexpr), ls);
|
||||||
|
@ -377,26 +326,14 @@ void letrec_check_lets_resume(Letrec_Check_Frame *frame)
|
||||||
Scheme_Let_Header *head;
|
Scheme_Let_Header *head;
|
||||||
int was_checked;
|
int was_checked;
|
||||||
|
|
||||||
DEBUG(printf("letrec_check_lets_resume\n "));
|
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_lets_resume: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
head = frame->head;
|
head = frame->head;
|
||||||
|
|
||||||
DEBUG(print_frame(frame));
|
|
||||||
DEBUG(printf("\n attempting to resume, waiting is %d\n", frame->waiting));
|
|
||||||
|
|
||||||
if (frame->waiting != 0) {
|
if (frame->waiting != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame->subexpr = LET_BODY_EXPR;
|
frame->subexpr = LET_BODY_EXPR;
|
||||||
process_deferred_bindings(frame);
|
process_deferred_bindings(frame);
|
||||||
frame->subexpr = -1;
|
|
||||||
|
|
||||||
frame->subexpr = LET_NO_EXPR;
|
frame->subexpr = LET_NO_EXPR;
|
||||||
process_deferred_bindings(frame);
|
process_deferred_bindings(frame);
|
||||||
|
@ -404,7 +341,6 @@ void letrec_check_lets_resume(Letrec_Check_Frame *frame)
|
||||||
|
|
||||||
body = head->body;
|
body = head->body;
|
||||||
if (frame->frame_type == FRAME_TYPE_LETREC) {
|
if (frame->frame_type == FRAME_TYPE_LETREC) {
|
||||||
DEBUG(printf("updating flags\n"));
|
|
||||||
/* loops through every right hand side again to update the flags
|
/* loops through every right hand side again to update the flags
|
||||||
that we have invalidated; i.e., adding check-undefineds around
|
that we have invalidated; i.e., adding check-undefineds around
|
||||||
references means there is one (more) instance where the LHS
|
references means there is one (more) instance where the LHS
|
||||||
|
@ -417,7 +353,6 @@ void letrec_check_lets_resume(Letrec_Check_Frame *frame)
|
||||||
for (j = 0; j < clv->count; j++) {
|
for (j = 0; j < clv->count; j++) {
|
||||||
was_checked = frame->checked[k + j];
|
was_checked = frame->checked[k + j];
|
||||||
if (was_checked) {
|
if (was_checked) {
|
||||||
DEBUG(printf("%d had check inserted\n", k));
|
|
||||||
clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_ONLY_APPLIED);
|
clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_ONLY_APPLIED);
|
||||||
clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_APPLIED_EXCEPT_ONCE);
|
clv_flags[j] -= (clv_flags[j] & SCHEME_WAS_APPLIED_EXCEPT_ONCE);
|
||||||
}
|
}
|
||||||
|
@ -431,15 +366,6 @@ void letrec_check_lets_resume(Letrec_Check_Frame *frame)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_vars(Scheme_Object *vars)
|
|
||||||
{
|
|
||||||
fflush(stdout);
|
|
||||||
scheme_display(vars, scheme_orig_stdout_port);
|
|
||||||
scheme_flush_output(scheme_orig_stdout_port);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* appends two nested lists of variables that are always the same length, e.x.
|
/* appends two nested lists of variables that are always the same length, e.x.
|
||||||
merge_vars( ((1) () (0)) , (() (2) (1)) ) => ((1) (2) (0 1)) */
|
merge_vars( ((1) () (0)) , (() (2) (1)) ) => ((1) (2) (0 1)) */
|
||||||
|
@ -482,20 +408,6 @@ void check_inner_vars(Scheme_Object *ls) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_vars(Scheme_Object *vars) {
|
|
||||||
DEBUG(printf("check_vars\n"));
|
|
||||||
|
|
||||||
while(!SCHEME_NULLP(vars)) {
|
|
||||||
if (!SCHEME_PAIRP(vars)) {
|
|
||||||
scheme_signal_error("check_vars: vars is not a list");
|
|
||||||
}
|
|
||||||
check_inner_vars(SCHEME_CAR(vars));
|
|
||||||
vars = SCHEME_CDR(vars);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* looks up an absolute position in a nested list of vars, where we
|
/* looks up an absolute position in a nested list of vars, where we
|
||||||
only care about the outermost dimension; e.x.:
|
only care about the outermost dimension; e.x.:
|
||||||
|
|
||||||
|
@ -507,21 +419,11 @@ int lookup_var(int position, Scheme_Object *vars, Letrec_Check_Frame *frame)
|
||||||
{
|
{
|
||||||
Scheme_Object *vars_car, *caar;
|
Scheme_Object *vars_car, *caar;
|
||||||
|
|
||||||
check_vars(vars);
|
|
||||||
|
|
||||||
if (frame == NULL) {
|
if (frame == NULL) {
|
||||||
scheme_signal_error("lookup_var: frame == NULL");
|
scheme_signal_error("lookup_var: frame == NULL");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf("lookup_var: %d in ", position);
|
|
||||||
print_vars(vars);
|
|
||||||
printf(" and ");
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SCHEME_NULLP(vars)) {
|
if (SCHEME_NULLP(vars)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -557,7 +459,6 @@ int lookup_var(int position, Scheme_Object *vars, Letrec_Check_Frame *frame)
|
||||||
|
|
||||||
if (frame->frame_type == FRAME_TYPE_LETREC) {
|
if (frame->frame_type == FRAME_TYPE_LETREC) {
|
||||||
if (frame->subexpr & LET_BODY_EXPR) {
|
if (frame->subexpr & LET_BODY_EXPR) {
|
||||||
VERBOSE_DEBUG(printf(" didn't find %d in vars\n", position));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,14 +472,12 @@ int lookup_var(int position, Scheme_Object *vars, Letrec_Check_Frame *frame)
|
||||||
while(!SCHEME_NULLP(vars_car)) {
|
while(!SCHEME_NULLP(vars_car)) {
|
||||||
caar = SCHEME_CAR(vars_car);
|
caar = SCHEME_CAR(vars_car);
|
||||||
if (SCHEME_INT_VAL(caar) == position) {
|
if (SCHEME_INT_VAL(caar) == position) {
|
||||||
VERBOSE_DEBUG(printf(" found %d in vars\n", position));
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
vars_car = SCHEME_CDR(vars_car);
|
vars_car = SCHEME_CDR(vars_car);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VERBOSE_DEBUG(printf(" didn't find %d in vars\n", position));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,12 +488,9 @@ void record_ref(Scheme_Local *loc, Letrec_Check_Frame *frame)
|
||||||
Letrec_Check_Frame *inner;
|
Letrec_Check_Frame *inner;
|
||||||
int position = SCHEME_LOCAL_POS(loc);
|
int position = SCHEME_LOCAL_POS(loc);
|
||||||
|
|
||||||
DEBUG(printf("recording reference for %d\n", position));
|
|
||||||
|
|
||||||
inner = frame;
|
inner = frame;
|
||||||
frame = get_relative_frame(&position, frame);
|
frame = get_relative_frame(&position, frame);
|
||||||
|
|
||||||
DEBUG(printf(" checking for LET_NO_EXPR\n"));
|
|
||||||
for(; inner != frame; inner = inner->next) {
|
for(; inner != frame; inner = inner->next) {
|
||||||
if (inner->subexpr < 0) {
|
if (inner->subexpr < 0) {
|
||||||
scheme_signal_error("record_ref: subexpr is negative");
|
scheme_signal_error("record_ref: subexpr is negative");
|
||||||
|
@ -615,8 +511,6 @@ void record_ref(Scheme_Local *loc, Letrec_Check_Frame *frame)
|
||||||
!SCHEME_FALSEP(deferred_with_body_ref)) {
|
!SCHEME_FALSEP(deferred_with_body_ref)) {
|
||||||
Scheme_Object **def, *defls, *tmp;
|
Scheme_Object **def, *defls, *tmp;
|
||||||
|
|
||||||
DEBUG(printf("record_ref: adding something to a frame deferred list\n"));
|
|
||||||
|
|
||||||
def = frame->def;
|
def = frame->def;
|
||||||
defls = def[position];
|
defls = def[position];
|
||||||
|
|
||||||
|
@ -629,9 +523,6 @@ void record_ref(Scheme_Local *loc, Letrec_Check_Frame *frame)
|
||||||
frame->deferred_with_body_ref = tmp;
|
frame->deferred_with_body_ref = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf("adding %d existing deferred expression(s) to deferred list\n",
|
|
||||||
scheme_list_length(def[position])));
|
|
||||||
|
|
||||||
(frame->def)[position] = scheme_null;
|
(frame->def)[position] = scheme_null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,16 +536,8 @@ Scheme_Object *record_checked(Scheme_Local *loc, Letrec_Check_Frame *frame)
|
||||||
Scheme_Object *obj;
|
Scheme_Object *obj;
|
||||||
|
|
||||||
frame = get_relative_frame(&position, frame);
|
frame = get_relative_frame(&position, frame);
|
||||||
DEBUG(printf("recording check for (relative position) %d\n", position));
|
|
||||||
DEBUG(print_frame(frame));
|
|
||||||
DEBUG(printf("\n"));
|
|
||||||
|
|
||||||
DEBUG(printf(" old value: %d\n", (frame->checked)[position]));
|
|
||||||
|
|
||||||
(frame->checked)[position] = 1;
|
(frame->checked)[position] = 1;
|
||||||
|
|
||||||
DEBUG(printf(" new value: %d\n", (frame->checked)[position]));
|
|
||||||
|
|
||||||
obj = frame->head->body;
|
obj = frame->head->body;
|
||||||
k = frame->head->count;
|
k = frame->head->count;
|
||||||
|
|
||||||
|
@ -682,7 +565,6 @@ Scheme_Object *record_checked(Scheme_Local *loc, Letrec_Check_Frame *frame)
|
||||||
Scheme_Object *rem_vars(Scheme_Object *vars)
|
Scheme_Object *rem_vars(Scheme_Object *vars)
|
||||||
{
|
{
|
||||||
Scheme_Object *tmp, *new;
|
Scheme_Object *tmp, *new;
|
||||||
DEBUG(printf("rem_vars: removing vars from a list of vars\n"));
|
|
||||||
|
|
||||||
new = scheme_null;
|
new = scheme_null;
|
||||||
tmp = vars;
|
tmp = vars;
|
||||||
|
@ -704,20 +586,8 @@ Scheme_Object *letrec_check_local(Scheme_Object *o, Letrec_Check_Frame *frame,
|
||||||
Scheme_Local *loc = (Scheme_Local *)o;
|
Scheme_Local *loc = (Scheme_Local *)o;
|
||||||
int position;
|
int position;
|
||||||
|
|
||||||
DEBUG(printf("letrec_check_local\n"));
|
|
||||||
|
|
||||||
position = SCHEME_LOCAL_POS(loc);
|
position = SCHEME_LOCAL_POS(loc);
|
||||||
|
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf(" position: %d\n ", position);
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n uvars: ");
|
|
||||||
print_vars(uvars);
|
|
||||||
printf("\n pvars: ");
|
|
||||||
print_vars(pvars);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* record that we saw this local in the frame, so later we know to
|
/* record that we saw this local in the frame, so later we know to
|
||||||
process its deferred bindings if there are any */
|
process its deferred bindings if there are any */
|
||||||
record_ref(loc, frame);
|
record_ref(loc, frame);
|
||||||
|
@ -732,7 +602,6 @@ Scheme_Object *letrec_check_local(Scheme_Object *o, Letrec_Check_Frame *frame,
|
||||||
Scheme_App3_Rec *app3;
|
Scheme_App3_Rec *app3;
|
||||||
Scheme_Object *name;
|
Scheme_Object *name;
|
||||||
|
|
||||||
DEBUG(printf("adding a check around this reference because loc is %d\n", position));
|
|
||||||
name = record_checked(loc, frame);
|
name = record_checked(loc, frame);
|
||||||
|
|
||||||
app3 = MALLOC_ONE_TAGGED(Scheme_App3_Rec);
|
app3 = MALLOC_ONE_TAGGED(Scheme_App3_Rec);
|
||||||
|
@ -745,7 +614,6 @@ Scheme_Object *letrec_check_local(Scheme_Object *o, Letrec_Check_Frame *frame,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* our reference is protected, so we're fine */
|
/* our reference is protected, so we're fine */
|
||||||
DEBUG(printf("local was neither unprotected nor protectable\n"));
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -896,15 +764,6 @@ Scheme_Object *letrec_check_closure_compilation(Scheme_Object *o, Letrec_Check_F
|
||||||
num_params = data->num_params;
|
num_params = data->num_params;
|
||||||
new_frame = init_letrec_check_frame(FRAME_TYPE_CLOSURE, num_params, frame, NULL);
|
new_frame = init_letrec_check_frame(FRAME_TYPE_CLOSURE, num_params, frame, NULL);
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if ((frame != NULL) && (frame->type != scheme_rt_letrec_check_frame)) {
|
|
||||||
scheme_signal_error("letrec_check_closure_compilation: frame is not a frame");
|
|
||||||
}
|
|
||||||
if (new_frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_closure_compilation: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (num_params < 0) {
|
if (num_params < 0) {
|
||||||
scheme_signal_error("lambda has negative arguments what do");
|
scheme_signal_error("lambda has negative arguments what do");
|
||||||
}
|
}
|
||||||
|
@ -912,13 +771,6 @@ Scheme_Object *letrec_check_closure_compilation(Scheme_Object *o, Letrec_Check_F
|
||||||
pvars = new_pvars;
|
pvars = new_pvars;
|
||||||
val = letrec_check_expr(data->code, new_frame, uvars, pvars, pos);
|
val = letrec_check_expr(data->code, new_frame, uvars, pvars, pos);
|
||||||
data->code = val;
|
data->code = val;
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf("letrec_check_closure_compilation: ");
|
|
||||||
print_frame(new_frame);
|
|
||||||
printf(" <- ");
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -934,7 +786,7 @@ Scheme_Object *letrec_check_closure_compilation(Scheme_Object *o, Letrec_Check_F
|
||||||
int position = SCHEME_INT_VAL(pos);
|
int position = SCHEME_INT_VAL(pos);
|
||||||
clos = make_deferred_expr_closure(data, frame, position, uvars, pvars);
|
clos = make_deferred_expr_closure(data, frame, position, uvars, pvars);
|
||||||
|
|
||||||
/* get the correct frame and stick it up there */
|
/* get the correct frame and stick the deferred_expr_closure up there */
|
||||||
outer_frame = get_nearest_rhs(frame);
|
outer_frame = get_nearest_rhs(frame);
|
||||||
update_frame(outer_frame, frame, position, clos);
|
update_frame(outer_frame, frame, position, clos);
|
||||||
|
|
||||||
|
@ -967,20 +819,11 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
|
|
||||||
subexpr_ls_to_frame(subexpr_ls, inner);
|
subexpr_ls_to_frame(subexpr_ls, inner);
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (outer->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (scheme_proper_list_length(uvars) !=
|
if (scheme_proper_list_length(uvars) !=
|
||||||
scheme_proper_list_length(pvars)) {
|
scheme_proper_list_length(pvars)) {
|
||||||
scheme_signal_error("letrec_check_deferred_expr: vars different lengths");
|
scheme_signal_error("letrec_check_deferred_expr: vars different lengths");
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf(" preparing to process deferred expression for %d in subexpr %d\n",
|
|
||||||
position, outer->subexpr));
|
|
||||||
|
|
||||||
after_i = scheme_null;
|
after_i = scheme_null;
|
||||||
for (i = position - 1; i >= 0; i--) {
|
for (i = position - 1; i >= 0; i--) {
|
||||||
i_wrapped = scheme_make_integer(i);
|
i_wrapped = scheme_make_integer(i);
|
||||||
|
@ -998,11 +841,9 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type & LET_NO_EXPR) {
|
if (type & LET_NO_EXPR) {
|
||||||
/* otherwise, it is not referenced anywhere in an unsafe context,
|
/* variable is not referenced anywhere in an unsafe
|
||||||
so we're pretty much good. still have to check it for letrecs
|
context, so we're pretty much good. still have to
|
||||||
in its sub-expressions */
|
check for troublesome letrecs in its sub-expressions */
|
||||||
DEBUG(printf(" building NO environment\n"));
|
|
||||||
|
|
||||||
deferred_uvars = scheme_make_pair(scheme_null, SCHEME_CDR(uvars));
|
deferred_uvars = scheme_make_pair(scheme_null, SCHEME_CDR(uvars));
|
||||||
tmp = rem_vars(SCHEME_CDR(pvars));
|
tmp = rem_vars(SCHEME_CDR(pvars));
|
||||||
deferred_pvars = scheme_make_pair(scheme_null, tmp);
|
deferred_pvars = scheme_make_pair(scheme_null, tmp);
|
||||||
|
@ -1015,10 +856,8 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
we treat 1 thru i as protected, because this reference must
|
we treat 1 thru i as protected, because this reference must
|
||||||
occur in a binding after i (and therefore 1 thru i have
|
occur in a binding after i (and therefore 1 thru i have
|
||||||
values). the rest of the LHS variables and those LHS
|
values). the rest of the LHS variables and those LHS
|
||||||
variables from outer letrecs are considered unprotected.
|
variables from outer letrecs are unprotected.
|
||||||
*/
|
*/
|
||||||
DEBUG(printf(" building RHS environment\n"));
|
|
||||||
|
|
||||||
deferred_uvars = merge_vars(uvars, pvars);
|
deferred_uvars = merge_vars(uvars, pvars);
|
||||||
tmp = scheme_make_pair(after_i, SCHEME_CDR(deferred_uvars));
|
tmp = scheme_make_pair(after_i, SCHEME_CDR(deferred_uvars));
|
||||||
deferred_uvars = tmp;
|
deferred_uvars = tmp;
|
||||||
|
@ -1030,11 +869,10 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
is referenced during the body, where a variable from an
|
is referenced during the body, where a variable from an
|
||||||
outer letrec might appear.
|
outer letrec might appear.
|
||||||
|
|
||||||
all LHS variables of the current letrec are protected, but
|
all LHS variables of the current letrec are protected
|
||||||
the LHS variables from outer letrecs are unprotected.
|
(since we got through the RHS okay already), but the
|
||||||
|
LHS variables from outer letrecs are unprotected.
|
||||||
*/
|
*/
|
||||||
DEBUG(printf(" building BODY environment\n"));
|
|
||||||
|
|
||||||
tmp = scheme_make_pair(scheme_null, SCHEME_CDR(uvars));
|
tmp = scheme_make_pair(scheme_null, SCHEME_CDR(uvars));
|
||||||
deferred_uvars = tmp;
|
deferred_uvars = tmp;
|
||||||
|
|
||||||
|
@ -1066,7 +904,8 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
until (and including) it's own LHS variables, and then we
|
until (and including) it's own LHS variables, and then we
|
||||||
switch over to the deferred expression's environment. so, we
|
switch over to the deferred expression's environment. so, we
|
||||||
compute the length difference of the two lists and chop off
|
compute the length difference of the two lists and chop off
|
||||||
what we need to */
|
what we need to from the uvars/pvars we currently have, then
|
||||||
|
append the lists together */
|
||||||
length_diff = scheme_list_length(uvars) - scheme_list_length(deferred_uvars);
|
length_diff = scheme_list_length(uvars) - scheme_list_length(deferred_uvars);
|
||||||
|
|
||||||
tmp_uvars = scheme_null;
|
tmp_uvars = scheme_null;
|
||||||
|
@ -1086,28 +925,14 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
uvars = scheme_append(tmp_uvars, deferred_uvars);
|
uvars = scheme_append(tmp_uvars, deferred_uvars);
|
||||||
pvars = scheme_append(tmp_pvars, deferred_pvars);
|
pvars = scheme_append(tmp_pvars, deferred_pvars);
|
||||||
|
|
||||||
DEBUG(printf(" calculated: uvars: "));
|
|
||||||
DEBUG(print_vars(uvars);)
|
|
||||||
DEBUG(printf(" pvars: "));
|
|
||||||
DEBUG(print_vars(pvars);)
|
|
||||||
DEBUG(printf("\n"));
|
|
||||||
|
|
||||||
/* establish that we actually get a lambda back */
|
/* establish that we actually get a lambda back */
|
||||||
if (SCHEME_TYPE(data) != scheme_compiled_unclosed_procedure_type) {
|
if (SCHEME_TYPE(data) != scheme_compiled_unclosed_procedure_type) {
|
||||||
printf("SCHEME_TYPE(data): %d\n", SCHEME_TYPE(data));
|
|
||||||
scheme_signal_error("deferred expression does not contain a lambda");
|
scheme_signal_error("deferred expression does not contain a lambda");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hopefully we know how to deal with this lambda */
|
|
||||||
num_params = data->num_params;
|
num_params = data->num_params;
|
||||||
if (num_params < 0) {
|
|
||||||
scheme_signal_error("process_deferred_bindings: lambda has negative arguments");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outer->subexpr < 0) {
|
if ((outer->subexpr < 0) || (inner->subexpr < 0)) {
|
||||||
scheme_signal_error("letrec_check_deferred_expr: subexpr is negative");
|
|
||||||
}
|
|
||||||
if (inner->subexpr < 0) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: subexpr is negative");
|
scheme_signal_error("letrec_check_deferred_expr: subexpr is negative");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1119,53 +944,18 @@ void letrec_check_deferred_expr(Scheme_Object *o, Letrec_Check_Frame *outer, int
|
||||||
new_frame->subexpr |= LET_NO_EXPR;
|
new_frame->subexpr |= LET_NO_EXPR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (new_frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
if (inner->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
val = letrec_check_expr(data->code, new_frame, uvars, pvars, scheme_false);
|
val = letrec_check_expr(data->code, new_frame, uvars, pvars, scheme_false);
|
||||||
data->code = val;
|
data->code = val;
|
||||||
|
|
||||||
outer->subexpr = old_subexpr;
|
outer->subexpr = old_subexpr;
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (outer->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
if (new_frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* decrement the waiting count between the current frame and the
|
/* decrement the waiting count between the current frame and the
|
||||||
outer frame */
|
outer frame */
|
||||||
DEBUG(printf(" expression processed, checking between %p and %p\n", outer, inner));
|
|
||||||
for (; outer != inner; inner = inner->next) {
|
for (; outer != inner; inner = inner->next) {
|
||||||
DEBUG(printf(" %p decrementing waiting and resuming letrecs\n", inner));
|
|
||||||
if (inner == NULL) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: inner is null");
|
|
||||||
}
|
|
||||||
if (outer == NULL) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: outer is null");
|
|
||||||
}
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (inner->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
if (outer->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_deferred_expr: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
(inner->waiting)--;
|
(inner->waiting)--;
|
||||||
letrec_check_lets_resume(inner);
|
letrec_check_lets_resume(inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf("done waking things up\n"));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1220,45 +1010,27 @@ void process_deferred_bindings_rhs(Letrec_Check_Frame *frame) {
|
||||||
def = frame->def;
|
def = frame->def;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
||||||
DEBUG(printf(" adding bindings for %d\n", i));
|
|
||||||
tmp = scheme_append(def[i], frame->deferred_with_rhs_ref);
|
tmp = scheme_append(def[i], frame->deferred_with_rhs_ref);
|
||||||
frame->def[i] = scheme_null;
|
frame->def[i] = scheme_null;
|
||||||
frame->deferred_with_rhs_ref = tmp;
|
frame->deferred_with_rhs_ref = tmp;
|
||||||
}
|
}
|
||||||
else if (SCHEME_NULLP(def[i])) {
|
else if (SCHEME_NULLP(def[i])) {
|
||||||
DEBUG(printf(" bindings for %d are null\n", i));
|
|
||||||
}
|
}
|
||||||
else if (!(pos_has_ref(i, frame, subexpr))) {
|
else if (!(pos_has_ref(i, frame, subexpr))) {
|
||||||
DEBUG(printf(" no ref to %d\n", i));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n",
|
|
||||||
scheme_list_length(frame->deferred_with_rhs_ref)));
|
|
||||||
while (!SCHEME_NULLP(frame->deferred_with_rhs_ref)) {
|
while (!SCHEME_NULLP(frame->deferred_with_rhs_ref)) {
|
||||||
DEBUG(printf(" checking one expr\n"));
|
|
||||||
if (!SCHEME_PAIRP(frame->deferred_with_rhs_ref)) {
|
if (!SCHEME_PAIRP(frame->deferred_with_rhs_ref)) {
|
||||||
scheme_signal_error("process_deferred_bindings_rhs: ls is not a ls");
|
scheme_signal_error("process_deferred_bindings_rhs: ls is not a ls");
|
||||||
}
|
}
|
||||||
tmp = SCHEME_CAR(frame->deferred_with_rhs_ref);
|
tmp = SCHEME_CAR(frame->deferred_with_rhs_ref);
|
||||||
frame->deferred_with_rhs_ref = SCHEME_CDR(frame->deferred_with_rhs_ref);
|
frame->deferred_with_rhs_ref = SCHEME_CDR(frame->deferred_with_rhs_ref);
|
||||||
VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n",
|
|
||||||
scheme_list_length(frame->deferred_with_rhs_ref)));
|
|
||||||
letrec_check_deferred_expr(tmp, frame, subexpr);
|
letrec_check_deferred_expr(tmp, frame, subexpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf(" putting ls to false\n"));
|
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("process_deferred_bindings_rhs: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* put the accumulator back to false before leaving */
|
/* put the accumulator back to false before leaving */
|
||||||
frame->deferred_with_rhs_ref = scheme_false;
|
frame->deferred_with_rhs_ref = scheme_false;
|
||||||
|
|
||||||
DEBUG(printf(" done processing deferred bindings\n"));
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1277,47 +1049,23 @@ void process_deferred_bindings_body(Letrec_Check_Frame *frame) {
|
||||||
def = frame->def;
|
def = frame->def;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
||||||
DEBUG(printf(" adding bindings for %d\n", i));
|
|
||||||
tmp = scheme_append(def[i], frame->deferred_with_body_ref);
|
tmp = scheme_append(def[i], frame->deferred_with_body_ref);
|
||||||
frame->def[i] = scheme_null;
|
frame->def[i] = scheme_null;
|
||||||
frame->deferred_with_body_ref = tmp;
|
frame->deferred_with_body_ref = tmp;
|
||||||
}
|
}
|
||||||
else if (SCHEME_NULLP(def[i])) {
|
|
||||||
DEBUG(printf(" bindings for %d are null\n", i));
|
|
||||||
}
|
}
|
||||||
else if (!(pos_has_ref(i, frame, subexpr))) {
|
|
||||||
DEBUG(printf(" no ref to %d\n", i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n",
|
|
||||||
scheme_list_length(frame->deferred_with_body_ref)));
|
|
||||||
while (!SCHEME_NULLP(frame->deferred_with_body_ref)) {
|
while (!SCHEME_NULLP(frame->deferred_with_body_ref)) {
|
||||||
DEBUG(printf(" checking one expr\n"));
|
|
||||||
DEBUG(print_frame(frame));
|
|
||||||
DEBUG(printf("\n"));
|
|
||||||
if (!SCHEME_PAIRP(frame->deferred_with_body_ref)) {
|
if (!SCHEME_PAIRP(frame->deferred_with_body_ref)) {
|
||||||
scheme_signal_error("process_deferred_bindings_body: ls is not a ls");
|
scheme_signal_error("process_deferred_bindings_body: ls is not a ls");
|
||||||
}
|
}
|
||||||
tmp = SCHEME_CAR(frame->deferred_with_body_ref);
|
tmp = SCHEME_CAR(frame->deferred_with_body_ref);
|
||||||
frame->deferred_with_body_ref = SCHEME_CDR(frame->deferred_with_body_ref);
|
frame->deferred_with_body_ref = SCHEME_CDR(frame->deferred_with_body_ref);
|
||||||
VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n",
|
|
||||||
scheme_list_length(frame->deferred_with_body_ref)));
|
|
||||||
letrec_check_deferred_expr(tmp, frame, subexpr);
|
letrec_check_deferred_expr(tmp, frame, subexpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf(" putting ls to false\n"));
|
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("process_deferred_bindings_body: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* put the accumulator back to false before leaving */
|
/* put the accumulator back to false before leaving */
|
||||||
frame->deferred_with_body_ref = scheme_false;
|
frame->deferred_with_body_ref = scheme_false;
|
||||||
|
|
||||||
DEBUG(printf(" done processing deferred bindings\n"));
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1336,72 +1084,38 @@ void process_deferred_bindings_no(Letrec_Check_Frame *frame) {
|
||||||
def = frame->def;
|
def = frame->def;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
if (!SCHEME_NULLP(def[i]) && pos_has_ref(i, frame, subexpr)) {
|
||||||
DEBUG(printf(" adding bindings for %d\n", i));
|
|
||||||
tmp = scheme_append(def[i], frame->deferred_with_no_ref);
|
tmp = scheme_append(def[i], frame->deferred_with_no_ref);
|
||||||
frame->def[i] = scheme_null;
|
frame->def[i] = scheme_null;
|
||||||
frame->deferred_with_no_ref = tmp;
|
frame->deferred_with_no_ref = tmp;
|
||||||
}
|
}
|
||||||
else if (SCHEME_NULLP(def[i])) {
|
|
||||||
DEBUG(printf(" bindings for %d are null\n", i));
|
|
||||||
}
|
}
|
||||||
else if (!(pos_has_ref(i, frame, subexpr))) {
|
|
||||||
DEBUG(printf(" no ref to %d\n", i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
VERBOSE_DEBUG(printf(" %d expressions to be processed initially\n",
|
|
||||||
scheme_list_length(frame->deferred_with_no_ref)));
|
|
||||||
while (!SCHEME_NULLP(frame->deferred_with_no_ref)) {
|
while (!SCHEME_NULLP(frame->deferred_with_no_ref)) {
|
||||||
DEBUG(printf(" checking one expr\n"));
|
|
||||||
if (!SCHEME_PAIRP(frame->deferred_with_no_ref)) {
|
if (!SCHEME_PAIRP(frame->deferred_with_no_ref)) {
|
||||||
scheme_signal_error("process_deferred_bindings_no: ls is not a ls");
|
scheme_signal_error("process_deferred_bindings_no: ls is not a ls");
|
||||||
}
|
}
|
||||||
tmp = SCHEME_CAR(frame->deferred_with_no_ref);
|
tmp = SCHEME_CAR(frame->deferred_with_no_ref);
|
||||||
frame->deferred_with_no_ref = SCHEME_CDR(frame->deferred_with_no_ref);
|
frame->deferred_with_no_ref = SCHEME_CDR(frame->deferred_with_no_ref);
|
||||||
VERBOSE_DEBUG(printf(" popping one expression (%d left to be processed)\n",
|
|
||||||
scheme_list_length(frame->deferred_with_no_ref)));
|
|
||||||
letrec_check_deferred_expr(tmp, frame, subexpr);
|
letrec_check_deferred_expr(tmp, frame, subexpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf(" putting ls to false\n"));
|
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("process_deferred_bindings_no: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* put the accumulator back to false before leaving */
|
/* put the accumulator back to false before leaving */
|
||||||
frame->deferred_with_no_ref = scheme_false;
|
frame->deferred_with_no_ref = scheme_false;
|
||||||
|
|
||||||
DEBUG(printf(" done processing deferred bindings\n"));
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_deferred_bindings(Letrec_Check_Frame *frame) {
|
void process_deferred_bindings(Letrec_Check_Frame *frame) {
|
||||||
int subexpr;
|
int subexpr;
|
||||||
|
|
||||||
DEBUG(printf("processing deferred bindings\n"));
|
|
||||||
if (DEBUG_LEVEL > 1) {
|
|
||||||
printf(" ");
|
|
||||||
print_frame(frame);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
subexpr = frame->subexpr;
|
subexpr = frame->subexpr;
|
||||||
|
|
||||||
VERBOSE_DEBUG(printf(" subexpr: %d\n", subexpr));
|
|
||||||
|
|
||||||
if (subexpr & LET_NO_EXPR) {
|
if (subexpr & LET_NO_EXPR) {
|
||||||
VERBOSE_DEBUG(printf(" checking deferred bindings with NO reference\n"));
|
|
||||||
return process_deferred_bindings_no(frame);
|
return process_deferred_bindings_no(frame);
|
||||||
}
|
}
|
||||||
else if (subexpr & LET_RHS_EXPR) {
|
else if (subexpr & LET_RHS_EXPR) {
|
||||||
VERBOSE_DEBUG(printf(" checking deferred bindings with RHS reference\n"));
|
|
||||||
return process_deferred_bindings_rhs(frame);
|
return process_deferred_bindings_rhs(frame);
|
||||||
}
|
}
|
||||||
else if (subexpr & LET_BODY_EXPR) {
|
else if (subexpr & LET_BODY_EXPR) {
|
||||||
VERBOSE_DEBUG(printf(" checking deferred bindings with BODY reference\n"));
|
|
||||||
return process_deferred_bindings_body(frame);
|
return process_deferred_bindings_body(frame);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1441,15 +1155,12 @@ Scheme_Object *letrec_check_lets(Scheme_Object *o, Letrec_Check_Frame *old_frame
|
||||||
|
|
||||||
/* compute and record the type, either let let* or letrec */
|
/* compute and record the type, either let let* or letrec */
|
||||||
if (header_flags & SCHEME_LET_RECURSIVE) {
|
if (header_flags & SCHEME_LET_RECURSIVE) {
|
||||||
DEBUG(printf("LETREC_CHECK_LETREC\n"));
|
|
||||||
frame_type = FRAME_TYPE_LETREC;
|
frame_type = FRAME_TYPE_LETREC;
|
||||||
}
|
}
|
||||||
else if (header_flags & SCHEME_LET_STAR) {
|
else if (header_flags & SCHEME_LET_STAR) {
|
||||||
DEBUG(printf("LETREC_CHECK_LETSTAR\n"));
|
|
||||||
frame_type = FRAME_TYPE_LETSTAR;
|
frame_type = FRAME_TYPE_LETSTAR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
DEBUG(printf("LETREC_CHECK_LET\n"));
|
|
||||||
frame_type = FRAME_TYPE_LET;
|
frame_type = FRAME_TYPE_LET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1457,14 +1168,6 @@ Scheme_Object *letrec_check_lets(Scheme_Object *o, Letrec_Check_Frame *old_frame
|
||||||
this is ok because get_relative_frame knows how to look up
|
this is ok because get_relative_frame knows how to look up
|
||||||
variables properly given the subexpr */
|
variables properly given the subexpr */
|
||||||
frame = init_letrec_check_frame(frame_type, count, old_frame, head);
|
frame = init_letrec_check_frame(frame_type, count, old_frame, head);
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_lets: frame is not a frame");
|
|
||||||
}
|
|
||||||
if ((old_frame != NULL) && (old_frame->type != scheme_rt_letrec_check_frame)) {
|
|
||||||
scheme_signal_error("letrec_check_lets: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* add a new level to our uvars and pvars if this is a letrec */
|
/* add a new level to our uvars and pvars if this is a letrec */
|
||||||
if (frame_type == FRAME_TYPE_LETREC) {
|
if (frame_type == FRAME_TYPE_LETREC) {
|
||||||
|
@ -1543,7 +1246,6 @@ Scheme_Object *letrec_check_lets(Scheme_Object *o, Letrec_Check_Frame *old_frame
|
||||||
|
|
||||||
/* body is already the right value thanks to the for */
|
/* body is already the right value thanks to the for */
|
||||||
frame->subexpr = LET_BODY_EXPR;
|
frame->subexpr = LET_BODY_EXPR;
|
||||||
DEBUG(printf("processing let body\n"));
|
|
||||||
val = letrec_check_expr(body, frame, uvars, pvars, pos);
|
val = letrec_check_expr(body, frame, uvars, pvars, pos);
|
||||||
|
|
||||||
/* put the new body in the right place: after the last RHS if the
|
/* put the new body in the right place: after the last RHS if the
|
||||||
|
@ -1552,20 +1254,8 @@ Scheme_Object *letrec_check_lets(Scheme_Object *o, Letrec_Check_Frame *old_frame
|
||||||
if (num_clauses > 0) clv->body = val;
|
if (num_clauses > 0) clv->body = val;
|
||||||
else head->body = val;
|
else head->body = val;
|
||||||
|
|
||||||
#ifdef MZTAG_REQUIRED
|
|
||||||
if (frame->type != scheme_rt_letrec_check_frame) {
|
|
||||||
scheme_signal_error("letrec_check_lets: frame is not a frame");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
letrec_check_lets_resume(frame);
|
letrec_check_lets_resume(frame);
|
||||||
|
|
||||||
DEBUG(printf("letrec_check_lets: "));
|
|
||||||
DEBUG(print_frame(old_frame));
|
|
||||||
DEBUG(printf(" <- "));
|
|
||||||
DEBUG(print_frame(frame));
|
|
||||||
DEBUG(printf("\n"));
|
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1581,20 +1271,7 @@ Scheme_Object *letrec_check_define_values(Scheme_Object *data, Letrec_Check_Fram
|
||||||
else {
|
else {
|
||||||
Scheme_Object *vars = SCHEME_VEC_ELS(data)[0];
|
Scheme_Object *vars = SCHEME_VEC_ELS(data)[0];
|
||||||
Scheme_Object *val = SCHEME_VEC_ELS(data)[1];
|
Scheme_Object *val = SCHEME_VEC_ELS(data)[1];
|
||||||
DEBUG(printf("letrec_check_define_values\n"));
|
|
||||||
|
|
||||||
DEBUG(printf(" size: %d\n position 0: ", (int)SCHEME_VEC_SIZE(data)));
|
|
||||||
DEBUG(fflush(stdout));
|
|
||||||
DEBUG(scheme_display(vars, scheme_orig_stdout_port));
|
|
||||||
DEBUG(scheme_flush_output(scheme_orig_stdout_port));
|
|
||||||
DEBUG(printf("\n position 1: "));
|
|
||||||
DEBUG(fflush(stdout));
|
|
||||||
DEBUG(scheme_display(val, scheme_orig_stdout_port));
|
|
||||||
DEBUG(scheme_flush_output(scheme_orig_stdout_port));
|
|
||||||
DEBUG(printf("\n"));
|
|
||||||
|
|
||||||
if(!SCHEME_PAIRP(vars) && !SCHEME_NULLP(vars)) {
|
if(!SCHEME_PAIRP(vars) && !SCHEME_NULLP(vars)) {
|
||||||
printf("vars: %d, val: %d\n", SCHEME_TYPE(vars), SCHEME_TYPE(val));
|
|
||||||
scheme_signal_error("letrec_check_define_values: processing resolved code");
|
scheme_signal_error("letrec_check_define_values: processing resolved code");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1724,12 +1401,6 @@ Scheme_Object *letrec_check_module(Scheme_Object *o, Letrec_Check_Frame *frame,
|
||||||
return (Scheme_Object *)m;
|
return (Scheme_Object *)m;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG(printf("letrec_check_module:\n "));
|
|
||||||
MODNAME_DEBUG(fflush(stdout));
|
|
||||||
MODNAME_DEBUG(scheme_display(m->modname, scheme_orig_stdout_port));
|
|
||||||
MODNAME_DEBUG(scheme_flush_output(scheme_orig_stdout_port));
|
|
||||||
MODNAME_DEBUG(printf("\n"));
|
|
||||||
|
|
||||||
cnt = SCHEME_VEC_SIZE(m->bodies[0]);
|
cnt = SCHEME_VEC_SIZE(m->bodies[0]);
|
||||||
for(i = 0; i < cnt; i++) {
|
for(i = 0; i < cnt; i++) {
|
||||||
val = SCHEME_VEC_ELS(m->bodies[0])[i];
|
val = SCHEME_VEC_ELS(m->bodies[0])[i];
|
||||||
|
@ -1763,8 +1434,6 @@ Scheme_Object *letrec_check_expr(Scheme_Object *expr, Letrec_Check_Frame *frame,
|
||||||
|
|
||||||
SCHEME_USE_FUEL(1);
|
SCHEME_USE_FUEL(1);
|
||||||
|
|
||||||
VERBOSE_DEBUG(printf ("letrec_check_expr: type %d\n", type));
|
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case scheme_local_type:
|
case scheme_local_type:
|
||||||
return letrec_check_local(expr, frame, uvars, pvars, pos);
|
return letrec_check_local(expr, frame, uvars, pvars, pos);
|
||||||
|
@ -1825,11 +1494,7 @@ Scheme_Object *scheme_letrec_check_expr(Scheme_Object *expr)
|
||||||
Scheme_Object *init_pvars = scheme_null;
|
Scheme_Object *init_pvars = scheme_null;
|
||||||
Scheme_Object *init_pos = scheme_false;
|
Scheme_Object *init_pos = scheme_false;
|
||||||
|
|
||||||
DEBUG(printf("Entry\n"));
|
|
||||||
val = letrec_check_expr(expr, NULL, init_uvars, init_pvars, init_pos);
|
val = letrec_check_expr(expr, NULL, init_uvars, init_pvars, init_pos);
|
||||||
DEBUG(printf("Exit\n"));
|
|
||||||
|
|
||||||
DEBUG(fflush(stdout));
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user