projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos/scheme: Use memory manager mark code to note recursive print
[fw/altos]
/
src
/
scheme
/
ao_scheme_cons.c
diff --git
a/src/scheme/ao_scheme_cons.c
b/src/scheme/ao_scheme_cons.c
index 02512e15f895ab36aa46a2dbf1ccb9aa56df4d7f..0b3cbf809dc08666427414f66da42a98b88d0e3c 100644
(file)
--- a/
src/scheme/ao_scheme_cons.c
+++ b/
src/scheme/ao_scheme_cons.c
@@
-24,8
+24,8
@@
static void cons_mark(void *addr)
ao_scheme_poly_mark(cons->car, 1);
if (!cdr)
break;
ao_scheme_poly_mark(cons->car, 1);
if (!cdr)
break;
- if (
ao_scheme_poly_type(cdr) != AO_SCHEME_CONS
) {
- ao_scheme_poly_mark(cdr,
1
);
+ if (
!AO_SCHEME_IS_CONS(cdr)
) {
+ ao_scheme_poly_mark(cdr,
0
);
break;
}
cons = ao_scheme_poly_cons(cdr);
break;
}
cons = ao_scheme_poly_cons(cdr);
@@
-58,7
+58,7
@@
static void cons_move(void *addr)
cdr = cons->cdr;
if (!cdr)
break;
cdr = cons->cdr;
if (!cdr)
break;
- if (
ao_scheme_poly_base_type(cdr) != AO_SCHEME_CONS
) {
+ if (
!AO_SCHEME_IS_CONS(cdr)
) {
(void) ao_scheme_poly_move(&cons->cdr, 0);
break;
}
(void) ao_scheme_poly_move(&cons->cdr, 0);
break;
}
@@
-181,16
+181,17
@@
ao_scheme_cons_write(ao_poly c)
ao_poly cdr;
int first = 1;
ao_poly cdr;
int first = 1;
+ ao_scheme_print_start();
printf("(");
while (cons) {
if (!first)
printf(" ");
printf("(");
while (cons) {
if (!first)
printf(" ");
- ao_scheme_poly_write(cons->car);
- cdr = cons->cdr;
- if (cdr == c) {
- printf(" ...");
+ if (ao_scheme_print_mark_addr(cons)) {
+ printf("...");
break;
}
break;
}
+ ao_scheme_poly_write(cons->car);
+ cdr = cons->cdr;
if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS) {
cons = ao_scheme_poly_cons(cdr);
first = 0;
if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS) {
cons = ao_scheme_poly_cons(cdr);
first = 0;
@@
-201,6
+202,7
@@
ao_scheme_cons_write(ao_poly c)
}
}
printf(")");
}
}
printf(")");
+ ao_scheme_print_stop();
}
void
}
void
@@
-209,13
+211,15
@@
ao_scheme_cons_display(ao_poly c)
struct ao_scheme_cons *cons = ao_scheme_poly_cons(c);
ao_poly cdr;
struct ao_scheme_cons *cons = ao_scheme_poly_cons(c);
ao_poly cdr;
+ ao_scheme_print_start();
while (cons) {
while (cons) {
- ao_scheme_poly_display(cons->car);
- cdr = cons->cdr;
- if (cdr == c) {
+ if (ao_scheme_print_mark_addr(cons)) {
printf("...");
break;
}
printf("...");
break;
}
+ ao_scheme_poly_display(cons->car);
+
+ cdr = cons->cdr;
if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS)
cons = ao_scheme_poly_cons(cdr);
else {
if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS)
cons = ao_scheme_poly_cons(cdr);
else {
@@
-223,6
+227,7
@@
ao_scheme_cons_display(ao_poly c)
cons = NULL;
}
}
cons = NULL;
}
}
+ ao_scheme_print_stop();
}
int
}
int