From 0dcc96c5eb4b521d08b381cad0d5e0ed5cb6f227 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 27 Feb 2012 06:57:44 -0700 Subject: [PATCH] fix JIT, `unsafe-struct-ref', chaperone, and procedure property --- collects/tests/racket/unsafe.rktl | 31 ++++++++++++++++++------------- src/racket/src/jitinline.c | 2 ++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/collects/tests/racket/unsafe.rktl b/collects/tests/racket/unsafe.rktl index 8433a9556c..1febc780ef 100644 --- a/collects/tests/racket/unsafe.rktl +++ b/collects/tests/racket/unsafe.rktl @@ -314,22 +314,27 @@ (test-bin 65535 'unsafe-u16vector-ref (u16vector 10 65535 187) 1) (let () - (define-struct posn (x [y #:mutable] z)) - (for ([star (list values (add-star "star"))]) - (test-bin 'a unsafe-struct-ref (make-posn 'a 'b 'c) 0 #:literal-ok? #f) - (test-bin 'b unsafe-struct-ref (make-posn 'a 'b 'c) 1 #:literal-ok? #f) - (let ([p (make-posn 100 200 300)]) - (test-tri 500 (star 'unsafe-struct-set!) p 1 500 + (define (try-struct prop prop-val) + (define-struct posn (x [y #:mutable] z) + #:property prop prop-val) + (for ([star (list values (add-star "star"))]) + (test-bin 'a unsafe-struct-ref (make-posn 'a 'b 'c) 0 #:literal-ok? #f) + (test-bin 'b unsafe-struct-ref (make-posn 'a 'b 'c) 1 #:literal-ok? #f) + (let ([p (make-posn 100 200 300)]) + (test-tri 500 (star 'unsafe-struct-set!) p 1 500 + #:pre (lambda () (set-posn-y! p 0)) + #:post (lambda (x) (posn-y p)) + #:literal-ok? #f))) + (let ([p (chaperone-struct (make-posn 100 200 300) + posn-y (lambda (p v) v) + set-posn-y! (lambda (p v) v))]) + (test-tri 500 'unsafe-struct-set! p 1 500 #:pre (lambda () (set-posn-y! p 0)) #:post (lambda (x) (posn-y p)) #:literal-ok? #f))) - (let ([p (chaperone-struct (make-posn 100 200 300) - posn-y (lambda (p v) v) - set-posn-y! (lambda (p v) v))]) - (test-tri 500 'unsafe-struct-set! p 1 500 - #:pre (lambda () (set-posn-y! p 0)) - #:post (lambda (x) (posn-y p)) - #:literal-ok? #f))) + (define-values (prop:nothing nothing? nothing-ref) (make-struct-type-property 'nothing)) + (try-struct prop:nothing 5) + (try-struct prop:procedure (lambda (s) 'hi!))) ;; test unboxing: (test-tri 5.4 '(lambda (x y z) (unsafe-fl+ x (unsafe-f64vector-ref y z))) 1.2 (f64vector 1.0 4.2 6.7) 1) diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index eeb495abb6..f0d6162bd4 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -1605,6 +1605,8 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int __START_TINY_JUMPS__(1); mz_patch_branch(ref); + if (for_struct && unsafe && can_chaperone) + (void)mz_beqi_t(reffail, JIT_R0, scheme_proc_chaperone_type, JIT_R2); if (!unsafe) { if (!int_ready) (void)jit_bmci_ul(reffail, JIT_R1, 0x1);