From c43e42c903621be4fa46f96f05fa66a18ff1d190 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 12 Oct 2018 11:06:16 -0600 Subject: [PATCH] cify: fix a GC problem --- racket/src/cify/generate.rkt | 3 ++- racket/src/cify/inline.rkt | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/racket/src/cify/generate.rkt b/racket/src/cify/generate.rkt index 236e654290..e70820add2 100644 --- a/racket/src/cify/generate.rkt +++ b/racket/src/cify/generate.rkt @@ -283,9 +283,10 @@ (out-close!))) e env) (generate (multiple-return "") `(begin . ,r) env) + (runstack-sync! runstack) (out-open "if (~a_count != 1)" vals-id) (return ret runstack #:can-omit? #t - (format "scheme_values(~a_count, (Scheme_Object **)~a)" vals-id (runstack-ref runstack vals-id))) + (format "scheme_values(~a_count, (Scheme_Object **)~a)" vals-id (runstack-ref runstack vals-id #:values-ok? #t))) (cond [(return-can-omit-single? ret) (out-close!)] diff --git a/racket/src/cify/inline.rkt b/racket/src/cify/inline.rkt index ded7d4222c..dd00846d02 100644 --- a/racket/src/cify/inline.rkt +++ b/racket/src/cify/inline.rkt @@ -21,10 +21,12 @@ [(box unsafe-make-place-local) (and (= n 1) can-gc? 'c_make_box)] [(unbox unsafe-unbox unbox* unsafe-unbox* unsafe-place-local-ref) (and (= n 1) 'c_box_ref)] [(weak-box-value) (and (or (= n 1) (= n 2)) 'c_weak_box_value)] - [(set-box! set-box*! unsafe-set-box! unsafe-set-box*! unsafe-place-local-set!) (and (= n 2) 'c_box_set)] - [(vector-ref unsafe-vector-ref) (and (= n 2) 'c_vector_ref)] + [(set-box! unsafe-set-box!) (and (= n 2) can-gc? 'c_box_set)] + [(set-box*! unsafe-set-box*! unsafe-place-local-set!) (and (= n 2) 'c_box_set)] + [(vector-ref unsafe-vector-ref) (and (= n 2) can-gc? 'c_vector_ref)] [(vector*-ref unsafe-vector*-ref) (and (= n 2) 'c_authentic_vector_ref)] - [(vector-set! unsafe-vector-set! vector*-set! unsafe-vector*-set!) (and (= n 3) 'c_vector_set)] + [(vector-set! unsafe-vector-set!) (and (= n 3) can-gc? 'c_vector_set)] + [(vector*-set! unsafe-vector*-set!) (and (= n 3) 'c_vector_set)] [(vector-length unsafe-vector-length vector*-length unsafe-vector*-length) (and (= n 1) 'c_vector_length)] [(string-ref unsafe-string-ref) (and (= n 2) can-gc? 'c_string_ref)] [(bytes-ref unsafe-bytes-ref) (and (= n 2) 'c_bytes_ref)]