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:
parent
940fdfd5ee
commit
b037a55f36
@ -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); \
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user