2 * Copyright © 2016 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
17 #define OFFSET(a) ((int) ((uint8_t *) (a) - ao_lisp_const))
20 static int cons_depth;
21 #define DBG(...) do { int d; for (d = 0; d < cons_depth; d++) printf (" "); printf(__VA_ARGS__); } while(0)
22 #define DBG_IN() (cons_depth++)
23 #define DBG_OUT() (cons_depth--)
24 #define DBG_PR(c) ao_lisp_cons_print(ao_lisp_cons_poly(c))
25 #define DBG_PRP(p) ao_lisp_poly_print(p)
34 static void cons_mark(void *addr)
36 struct ao_lisp_cons *cons = addr;
39 ao_lisp_poly_mark(cons->car);
40 cons = ao_lisp_poly_cons(cons->cdr);
43 if (ao_lisp_mark_memory(cons, sizeof (struct ao_lisp_cons)))
48 static int cons_size(void *addr)
51 return sizeof (struct ao_lisp_cons);
54 static void cons_move(void *addr)
56 struct ao_lisp_cons *cons = addr;
59 DBG("move cons start %d\n", OFFSET(cons));
61 struct ao_lisp_cons *cdr;
64 car = ao_lisp_poly_move(cons->car);
65 DBG(" moved car %d -> %d\n", OFFSET(ao_lisp_ref(cons->car)), OFFSET(ao_lisp_ref(car)));
67 cdr = ao_lisp_poly_cons(cons->cdr);
68 cdr = ao_lisp_move_memory(cdr, sizeof (struct ao_lisp_cons));
71 DBG(" moved cdr %d -> %d\n", OFFSET(ao_lisp_poly_cons(cons->cdr)), OFFSET(cdr));
72 cons->cdr = ao_lisp_cons_poly(cdr);
75 DBG("move cons end\n");
79 const struct ao_lisp_type ao_lisp_cons_type = {
86 ao_lisp_cons_cons(ao_poly car, struct ao_lisp_cons *cdr)
88 struct ao_lisp_cons *cons = ao_lisp_alloc(sizeof (struct ao_lisp_cons));
92 cons->cdr = ao_lisp_cons_poly(cdr);
97 ao_lisp_cons_print(ao_poly c)
99 struct ao_lisp_cons *cons = ao_lisp_poly_cons(c);
105 ao_lisp_poly_print(cons->car);
106 cons = ao_lisp_poly_cons(cons->cdr);