Restore tail call optimization subversion.

Restore the essence of 898960247a, which
sabotages tail call optimization.  This is necessary even when the
mutually recursive functions are in separate compilation units.
This commit is contained in:
Jason Evans 2014-02-25 16:11:15 -08:00
parent 940fdfd5ee
commit b037a55f36

View File

@ -14,16 +14,22 @@ alloc_n_proto(1)
void * \ void * \
alloc_##n(unsigned bits) \ alloc_##n(unsigned bits) \
{ \ { \
void *p; \
\ \
if (bits == 0) { \ if (bits == 0) \
void *p = mallocx(1, 0); \ p = mallocx(1, 0); \
assert_ptr_not_null(p, "Unexpected mallocx() failure"); \ else { \
return (p); \
} else { \
switch (bits & 0x1U) { \ switch (bits & 0x1U) { \
case 0: return (alloc_0(bits >> 1)); \ case 0: \
case 1: return (alloc_1(bits >> 1)); \ p = (alloc_0(bits >> 1)); \
break; \
case 1: \
p = (alloc_1(bits >> 1)); \
break; \
default: not_reached(); \ default: not_reached(); \
} \ } \
} \ } \
/* Intentionally sabotage tail call optimization. */ \
assert_ptr_not_null(p, "Unexpected mallocx() failure"); \
return (p); \
} }