mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
Make __demangle() heap 10% more compact
This commit is contained in:
parent
2ca491dc56
commit
b003888696
1 changed files with 16 additions and 8 deletions
|
@ -68,11 +68,11 @@ Copyright (c) 2024 Justine Tunney <jtunney@gmail.com>");
|
||||||
* and 100% lockless, and uses absolutely no writable static memory.
|
* and 100% lockless, and uses absolutely no writable static memory.
|
||||||
* That makes it also great for kernel and embedded development.
|
* That makes it also great for kernel and embedded development.
|
||||||
*
|
*
|
||||||
* - We made it go 3x faster. It's almost as fast as libcxxabi now. The
|
* - We made it go 2x faster. It's almost as fast as libcxxabi now. The
|
||||||
* lightweight Dennis Ritchie style demangle_malloc() implementation
|
* lightweight Dennis Ritchie style demangle_malloc() implementation
|
||||||
* helped. What also helped is introducing stack_str and strlcpy().
|
* helped. What also helped is introducing stack_str and strlcpy().
|
||||||
*
|
*
|
||||||
* - We made it use 4x less memory. This came with the tradeoff of
|
* - We made it use 3x less memory. This came with the tradeoff of
|
||||||
* imposing limitations similar to embedded software. Rather than
|
* imposing limitations similar to embedded software. Rather than
|
||||||
* using pointers, we use 16-bit indexes into a heap that can grow no
|
* using pointers, we use 16-bit indexes into a heap that can grow no
|
||||||
* larger than 64kb. Please note that a buffer size of 20kb is more
|
* larger than 64kb. Please note that a buffer size of 20kb is more
|
||||||
|
@ -383,7 +383,7 @@ static privileged returnspointerwithnoaliases returnsnonnull void *
|
||||||
demangle_malloc(struct demangle_data *h, int a, int n)
|
demangle_malloc(struct demangle_data *h, int a, int n)
|
||||||
{
|
{
|
||||||
uintptr_t ptr;
|
uintptr_t ptr;
|
||||||
int next, next2;
|
int rem, next, next2;
|
||||||
index_t *link, *link2;
|
index_t *link, *link2;
|
||||||
int b = sizeof(index_t);
|
int b = sizeof(index_t);
|
||||||
|
|
||||||
|
@ -397,12 +397,20 @@ demangle_malloc(struct demangle_data *h, int a, int n)
|
||||||
next = h->free;
|
next = h->free;
|
||||||
link = &h->free;
|
link = &h->free;
|
||||||
while (next) {
|
while (next) {
|
||||||
next2 = *(index_t *)(h->heap + next);
|
|
||||||
link2 = (index_t *)(h->heap + next);
|
link2 = (index_t *)(h->heap + next);
|
||||||
if (!(next & (a - 1)) &&
|
next2 = *link2;
|
||||||
n <= ((index_t *)(h->heap + next))[-1]) {
|
if (!(next & (a - 1)) && (rem = link2[-1] - n) >= 0) {
|
||||||
*link = next2;
|
if (rem < (b << 1)) {
|
||||||
return (void *)(h->heap + next);
|
*link = next2;
|
||||||
|
} else {
|
||||||
|
/* Split chunk. */
|
||||||
|
link2[-1] = n;
|
||||||
|
*link = next + n + b;
|
||||||
|
link = (index_t *)(h->heap + next + n + b);
|
||||||
|
link[-1] = rem - b;
|
||||||
|
link[0] = next2;
|
||||||
|
}
|
||||||
|
return link2;
|
||||||
}
|
}
|
||||||
next = next2;
|
next = next2;
|
||||||
link = link2;
|
link = link2;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue