Restore tail call optimization subversion.
Restore the essence of 898960247a8b2e6534738b7a3a244855f379faf9, 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…
x
Reference in New Issue
Block a user