fix "fixing letrec" pass

Adjust the compiler pass to insert checks for #<unsafe-undefined>.
The chanegs amount to throwing out the old attempt to follow the
implementation sketched in "Fixing Letrec", and instead use a
simpler abstract interpretation.
This commit is contained in:
Matthew Flatt 2014-08-03 10:46:00 +01:00
parent ac428f89fa
commit 926e64f5f1
4 changed files with 470 additions and 895 deletions

View File

@ -150,4 +150,14 @@
c)
letrec-exn?)
(test '(1)
'complex-forcing-path
(let-values (((_tri)
(letrec-values (((all-types) 1))
(lambda (x) all-types))))
(letrec-values (((quad-super-type) _tri)
((offsets) (map quad-super-type (list 1))))
offsets)))
(report-errs)

File diff suppressed because it is too large Load Diff

View File

@ -11,11 +11,8 @@ static int mark_letrec_check_frame_MARK(void *p, struct NewGC *gc) {
gcMARK2(frame->def, gc);
gcMARK2(frame->next, gc);
gcMARK2(frame->ref, gc);
gcMARK2(frame->checked, gc);
gcMARK2(frame->head, gc);
gcMARK2(frame->deferred_with_rhs_ref, gc);
gcMARK2(frame->deferred_with_body_ref, gc);
gcMARK2(frame->deferred_with_no_ref, gc);
gcMARK2(frame->deferred_chain, gc);
return
gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame));
@ -27,11 +24,8 @@ static int mark_letrec_check_frame_FIXUP(void *p, struct NewGC *gc) {
gcFIXUP2(frame->def, gc);
gcFIXUP2(frame->next, gc);
gcFIXUP2(frame->ref, gc);
gcFIXUP2(frame->checked, gc);
gcFIXUP2(frame->head, gc);
gcFIXUP2(frame->deferred_with_rhs_ref, gc);
gcFIXUP2(frame->deferred_with_body_ref, gc);
gcFIXUP2(frame->deferred_with_no_ref, gc);
gcFIXUP2(frame->deferred_chain, gc);
return
gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame));
@ -51,9 +45,7 @@ static int mark_scheme_deferred_expr_MARK(void *p, struct NewGC *gc) {
gcMARK2(clos->expr, gc);
gcMARK2(clos->frame, gc);
gcMARK2(clos->uvars, gc);
gcMARK2(clos->pvars, gc);
gcMARK2(clos->subexpr_ls, gc);
gcMARK2(clos->chain_next, gc);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr));
@ -64,9 +56,7 @@ static int mark_scheme_deferred_expr_FIXUP(void *p, struct NewGC *gc) {
gcFIXUP2(clos->expr, gc);
gcFIXUP2(clos->frame, gc);
gcFIXUP2(clos->uvars, gc);
gcFIXUP2(clos->pvars, gc);
gcFIXUP2(clos->subexpr_ls, gc);
gcFIXUP2(clos->chain_next, gc);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr));

View File

@ -1335,11 +1335,8 @@ mark_letrec_check_frame {
gcMARK2(frame->def, gc);
gcMARK2(frame->next, gc);
gcMARK2(frame->ref, gc);
gcMARK2(frame->checked, gc);
gcMARK2(frame->head, gc);
gcMARK2(frame->deferred_with_rhs_ref, gc);
gcMARK2(frame->deferred_with_body_ref, gc);
gcMARK2(frame->deferred_with_no_ref, gc);
gcMARK2(frame->deferred_chain, gc);
size:
gcBYTES_TO_WORDS(sizeof(Letrec_Check_Frame));
@ -1351,9 +1348,7 @@ mark_scheme_deferred_expr {
gcMARK2(clos->expr, gc);
gcMARK2(clos->frame, gc);
gcMARK2(clos->uvars, gc);
gcMARK2(clos->pvars, gc);
gcMARK2(clos->subexpr_ls, gc);
gcMARK2(clos->chain_next, gc);
size:
gcBYTES_TO_WORDS(sizeof(Scheme_Deferred_Expr));