diff options
author | Andy Wingo <wingo@pobox.com> | 2025-04-18 15:11:40 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2025-04-18 15:11:40 +0200 |
commit | b6236fdcdc551e4f6f5b32ba723bf3323dd09feb (patch) | |
tree | 1555d45288e2ec270708a075ae3ad4024f00df70 /libguile/whippet/src/gc-stack.c | |
parent | 9b7f7f7554af58296dc88cfaa8d74dd0d8933254 (diff) | |
parent | 2dab407ec156edd90d64663e1abae284a0578e10 (diff) | |
download | guile-b6236fdcdc551e4f6f5b32ba723bf3323dd09feb.tar.gz |
Merge remote-tracking branch 'whippet/main' into wip-whippet
Diffstat (limited to 'libguile/whippet/src/gc-stack.c')
-rw-r--r-- | libguile/whippet/src/gc-stack.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/libguile/whippet/src/gc-stack.c b/libguile/whippet/src/gc-stack.c index 318f5757f..e4e170505 100644 --- a/libguile/whippet/src/gc-stack.c +++ b/libguile/whippet/src/gc-stack.c @@ -26,40 +26,37 @@ static uintptr_t current_thread_hot_stack_addr(void) { // FIXME: check platform stack growth direction. #define HOTTER_THAN <= -static void capture_current_thread_hot_stack_addr(struct gc_stack_addr *addr) { - addr->addr = current_thread_hot_stack_addr(); +static struct gc_stack_addr capture_current_thread_hot_stack_addr(void) { + return gc_stack_addr(current_thread_hot_stack_addr()); } -static void capture_current_thread_cold_stack_addr(struct gc_stack_addr *addr) { - addr->addr = gc_platform_current_thread_stack_base(); +static struct gc_stack_addr capture_current_thread_cold_stack_addr(void) { + return gc_stack_addr(gc_platform_current_thread_stack_base()); } -void gc_stack_init(struct gc_stack *stack, struct gc_stack_addr *base) { - if (base) - stack->cold = *base; - else - capture_current_thread_cold_stack_addr(&stack->cold); - stack->hot = stack->cold; +void gc_stack_init(struct gc_stack *stack, struct gc_stack_addr base) { + if (gc_stack_addr_is_empty (base)) + base = capture_current_thread_cold_stack_addr(); + stack->cold = stack->hot = base; } void gc_stack_capture_hot(struct gc_stack *stack) { - capture_current_thread_hot_stack_addr(&stack->hot); + stack->hot = capture_current_thread_hot_stack_addr(); setjmp(stack->registers); GC_ASSERT(stack->hot.addr HOTTER_THAN stack->cold.addr); } -static void* call_with_stack(void* (*)(struct gc_stack_addr*, void*), - struct gc_stack_addr*, void*) GC_NEVER_INLINE; -static void* call_with_stack(void* (*f)(struct gc_stack_addr *, void *), - struct gc_stack_addr *addr, void *arg) { +static void* call_with_stack(void* (*)(struct gc_stack_addr, void*), + struct gc_stack_addr, void*) GC_NEVER_INLINE; +static void* call_with_stack(void* (*f)(struct gc_stack_addr, void *), + struct gc_stack_addr addr, void *arg) { return f(addr, arg); } -void* gc_call_with_stack_addr(void* (*f)(struct gc_stack_addr *base, +void* gc_call_with_stack_addr(void* (*f)(struct gc_stack_addr base, void *arg), void *arg) { - struct gc_stack_addr base; - capture_current_thread_hot_stack_addr(&base); - return call_with_stack(f, &base, arg); + struct gc_stack_addr base = capture_current_thread_hot_stack_addr(); + return call_with_stack(f, base, arg); } void gc_stack_visit(struct gc_stack *stack, |