altos/scheme: Use AO_SCHEME_IS_CONS in cons memory funcs
authorKeith Packard <keithp@keithp.com>
Mon, 18 Dec 2017 06:19:38 +0000 (22:19 -0800)
committerKeith Packard <keithp@keithp.com>
Mon, 18 Dec 2017 06:19:38 +0000 (22:19 -0800)
More efficient than ao_scheme_poly_type as it doesn't care about
non-prim types.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/scheme/ao_scheme.h
src/scheme/ao_scheme_cons.c

index 521ec10505296a70b3782679b821237e1fc0cff3..48d0149bebacb263281eefb75cb5c31d964d514c 100644 (file)
@@ -150,6 +150,7 @@ ao_scheme_is_const(ao_poly poly) {
 #define AO_SCHEME_IS_CONST(a)  (ao_scheme_const <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_const + AO_SCHEME_POOL_CONST)
 #define AO_SCHEME_IS_POOL(a)   (ao_scheme_pool <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_pool + AO_SCHEME_POOL)
 #define AO_SCHEME_IS_INT(p)    (ao_scheme_poly_base_type(p) == AO_SCHEME_INT)
 #define AO_SCHEME_IS_CONST(a)  (ao_scheme_const <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_const + AO_SCHEME_POOL_CONST)
 #define AO_SCHEME_IS_POOL(a)   (ao_scheme_pool <= ((uint8_t *) (a)) && ((uint8_t *) (a)) < ao_scheme_pool + AO_SCHEME_POOL)
 #define AO_SCHEME_IS_INT(p)    (ao_scheme_poly_base_type(p) == AO_SCHEME_INT)
+#define AO_SCHEME_IS_CONS(p)   (ao_scheme_poly_base_type(p) == AO_SCHEME_CONS)
 
 void *
 ao_scheme_ref(ao_poly poly);
 
 void *
 ao_scheme_ref(ao_poly poly);
index 02512e15f895ab36aa46a2dbf1ccb9aa56df4d7f..912100a934297137c37160f55a88d11284a16c08 100644 (file)
@@ -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;
                }