summaryrefslogtreecommitdiff
path: root/libguile/whippet/src/gc-stack.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2025-04-18 15:11:40 +0200
committerAndy Wingo <wingo@pobox.com>2025-04-18 15:11:40 +0200
commitb6236fdcdc551e4f6f5b32ba723bf3323dd09feb (patch)
tree1555d45288e2ec270708a075ae3ad4024f00df70 /libguile/whippet/src/gc-stack.c
parent9b7f7f7554af58296dc88cfaa8d74dd0d8933254 (diff)
parent2dab407ec156edd90d64663e1abae284a0578e10 (diff)
downloadguile-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.c35
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,