From 67711f53da3d236cb17b59a67011110480218268 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 3 Nov 2012 07:10:33 -0600 Subject: [PATCH] fix problem with prompts, call/cc, and tail-buffer allocation Merge to v5.3.1 (cherry picked from commit 8079ff6c4f7a1deb0d7b5779cf6b2fd44cebb4d6) --- src/racket/gc2/newgc.c | 21 +++++++++++++++++++++ src/racket/src/eval.c | 2 ++ src/racket/src/fun.c | 13 +++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/racket/gc2/newgc.c b/src/racket/gc2/newgc.c index 3246bca34a..8f59726af8 100644 --- a/src/racket/gc2/newgc.c +++ b/src/racket/gc2/newgc.c @@ -1280,6 +1280,21 @@ inline static uintptr_t allocate_slowpath(NewGC *gc, size_t allocate_size, uintp return newptr; } +static void check_allocation_time_invariants() +{ +#if 0 + Scheme_Thread *p = scheme_current_thread; + if (p) { + if (p->values_buffer) { + memset(p->values_buffer, 0, sizeof(Scheme_Object*) * p->values_buffer_size); + } + if (p->tail_buffer && (p->tail_buffer != p->runstack_tmp_keep)) { + memset(p->tail_buffer, 0, sizeof(Scheme_Object*) * p->tail_buffer_size); + } + } +#endif +} + inline static void *allocate(const size_t request_size, const int type) { size_t allocate_size; @@ -1287,6 +1302,8 @@ inline static void *allocate(const size_t request_size, const int type) if(request_size == 0) return (void *) zero_sized; + check_allocation_time_invariants(); + allocate_size = COMPUTE_ALLOC_SIZE_FOR_OBJECT_SIZE(request_size); if(allocate_size > MAX_OBJECT_SIZE) return allocate_big(request_size, type); @@ -1338,6 +1355,8 @@ inline static void *fast_malloc_one_small_tagged(size_t request_size, int dirty) uintptr_t newptr; const size_t allocate_size = COMPUTE_ALLOC_SIZE_FOR_OBJECT_SIZE(request_size); + check_allocation_time_invariants(); + newptr = GC_gen0_alloc_page_ptr + allocate_size; if(OVERFLOWS_GEN0(newptr)) { @@ -1371,6 +1390,8 @@ void *GC_malloc_pair(void *car, void *cdr) void *pair; const size_t allocate_size = PAIR_SIZE_IN_BYTES; + check_allocation_time_invariants(); + newptr = GC_gen0_alloc_page_ptr + allocate_size; if(OVERFLOWS_GEN0(newptr)) { diff --git a/src/racket/src/eval.c b/src/racket/src/eval.c index 14c2b22409..21c5a19428 100644 --- a/src/racket/src/eval.c +++ b/src/racket/src/eval.c @@ -1580,6 +1580,8 @@ Scheme_Object *scheme_jump_to_continuation(Scheme_Object *obj, int num_rands, Sc else { GC_CAN_IGNORE Scheme_Object *vals; vals = scheme_values(num_rands, (Scheme_Object **)value); + if (SAME_OBJ(p->ku.multiple.array, p->values_buffer)) + p->values_buffer = NULL; c->value = vals; } diff --git a/src/racket/src/fun.c b/src/racket/src/fun.c index a453aae645..d3ba7a5d3e 100644 --- a/src/racket/src/fun.c +++ b/src/racket/src/fun.c @@ -6368,6 +6368,11 @@ static Scheme_Object *call_with_prompt (int in_argc, Scheme_Object *in_argv[]) p = scheme_current_thread; + if (v == SCHEME_MULTIPLE_VALUES) { + if (SAME_OBJ(p->ku.multiple.array, p->values_buffer)) + p->values_buffer = NULL; + } + restore_from_prompt(prompt); p->suspend_break = 0; @@ -6392,6 +6397,10 @@ static Scheme_Object *call_with_prompt (int in_argc, Scheme_Object *in_argv[]) if (v) { /* Got a result: */ + if (v == SCHEME_MULTIPLE_VALUES) { + if (SAME_OBJ(p->ku.multiple.array, p->values_buffer)) + p->values_buffer = NULL; + } prompt_unwind_one_dw(prompt_tag); handler = NULL; } else { @@ -6456,6 +6465,10 @@ static Scheme_Object *call_with_prompt (int in_argc, Scheme_Object *in_argv[]) if (SAME_OBJ(handler, scheme_values_func)) { v = scheme_values(argc, argv); + if (v == SCHEME_MULTIPLE_VALUES) { + if (SAME_OBJ(p->ku.multiple.array, p->values_buffer)) + p->values_buffer = NULL; + } handler = NULL; } else if (SCHEME_FALSEP(handler)) { if (argc == 1) {