1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-31 13:52:29 +00:00

Reorganize cdr implementation to move error test to front, early check for (cdr nil), reduce number of else clauses, reduce indentation.

This commit is contained in:
Nick Briggs
2020-09-17 18:58:25 -07:00
parent 2b02c15982
commit 33ad64f45b

View File

@@ -97,39 +97,28 @@ LispPTR cdr(register LispPTR datum)
register DLword cdr_code;
register ConsCell *temp;
if (datum == NIL_PTR) return (NIL_PTR);
if (!Listp(datum)) error("cdr : ARG not list");
datum68k = (ConsCell *)(Addr68k_from_LADDR(datum));
cdr_code = datum68k->cdr_code;
if (Listp(datum)) {
if (cdr_code == CDR_NIL)
return (NIL_PTR); /* cdr is nil */
else if ((cdr_code & CDR_ONPAGE) != 0) /* cdr-samepage */
if (cdr_code == CDR_NIL) return (NIL_PTR); /* cdr is nil */
if ((cdr_code & CDR_ONPAGE) != 0) /* cdr-samepage */
#ifdef NEWCDRCODING
return (datum + ((cdr_code & 7) << 1));
return (datum + ((cdr_code & 7) << 1));
#else
return (POINTER_PAGEBASE(datum) + ((cdr_code & 127) << 1));
return (POINTER_PAGEBASE(datum) + ((cdr_code & 127) << 1));
#endif /* NEWCDRCODING */
else if (cdr_code == CDR_INDIRECT) /* cdr_code > CDR_ONPAGE */
/* cdr-indirect */
return (cdr((LispPTR)(datum68k->car_field)));
else {
/* cdr isn't a CONS, but is stored on this page. */
if (cdr_code == CDR_INDIRECT) /* cdr_code > CDR_ONPAGE cdr-indirect */
return (cdr((LispPTR)(datum68k->car_field)));
/* cdr isn't a CONS, but is stored on this page. */
#ifdef NEWCDRCODING
temp = (ConsCell *)(Addr68k_from_LADDR(datum + (cdr_code << 1)));
temp = (ConsCell *)(Addr68k_from_LADDR(datum + (cdr_code << 1)));
#else
temp = (ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(datum) + (cdr_code << 1)));
temp = (ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(datum) + (cdr_code << 1)));
#endif /* NEWCDRCODING */
return ((LispPTR)temp->car_field);
}
} else if (datum == NIL_PTR)
return (NIL_PTR);
/**** We assume CAR/CDRERR is CDR ****************/
else
error("cdr : ARG not list");
return ((LispPTR)temp->car_field);
} /* end of cdr */
/**********************************************************************/
@@ -366,39 +355,29 @@ LispPTR N_OP_cdr(register LispPTR tos) {
register ConsCell *datum68k;
register DLword cdr_code;
if (tos == NIL_PTR) return (tos);
if (!Listp(tos)) {
ERROR_EXIT(tos);
}
datum68k = (ConsCell *)(Addr68k_from_LADDR(tos));
cdr_code = datum68k->cdr_code;
if (Listp(tos)) {
if (cdr_code == CDR_NIL)
return (NIL_PTR); /* cdr-nil */
else if (cdr_code > CDR_ONPAGE) /* cdr-samepage */
if (cdr_code == CDR_NIL) return (NIL_PTR); /* cdr-nil */
if (cdr_code > CDR_ONPAGE) /* cdr-samepage */
#ifdef NEWCDRCODING
return (tos + ((cdr_code & 7) << 1));
#else
return (POINTER_PAGEBASE(tos) + ((cdr_code & 127) << 1));
#endif /*NEWCDRCODING */
else if (cdr_code == CDR_INDIRECT) /* cdr_code < CDR_ONPAGE */
/* cdr-indirect */
if (cdr_code == CDR_INDIRECT) /* cdr-indirect */
return (cdr((LispPTR)(datum68k->car_field)));
else {
/* cdr-differentpage */
/* cdr-differentpage */
#ifdef NEWCDRCODING
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(tos + (cdr_code << 1))))->car_field);
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(tos + (cdr_code << 1))))->car_field);
#else
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(tos) + (cdr_code << 1))))
->car_field);
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(tos) + (cdr_code << 1))))->car_field);
#endif /*NEWCDRCODING */
}
} else if (tos == NIL_PTR)
return (tos);
else {
ERROR_EXIT(tos);
}
} /* end of N_OP_cdr */
/**********************************************************************/