From 8ae53d9e8b847138a2facacae0b63eb24c268d72 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 2 Jan 2020 08:46:34 -0700 Subject: [PATCH] fix `_bytes/nul-terminated` for NULL results Closes #2995 --- pkgs/racket-test-core/tests/racket/foreign-test.c | 2 ++ pkgs/racket-test-core/tests/racket/foreign-test.rktl | 5 +++++ racket/collects/ffi/unsafe.rkt | 9 +++++---- racket/src/racket/src/salloc.c | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.c b/pkgs/racket-test-core/tests/racket/foreign-test.c index 389a98d8b4..35f8946def 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.c +++ b/pkgs/racket-test-core/tests/racket/foreign-test.c @@ -12,6 +12,8 @@ typedef unsigned char byte; #define X #endif +X void* return_null() { return NULL; } + X int add1_int_int (int x) { return x + 1; } X int add1_byte_int (byte x) { return x + 1; } X byte add1_int_byte (int x) { return x + 1; } diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.rktl b/pkgs/racket-test-core/tests/racket/foreign-test.rktl index 793318d372..ccbac3e84a 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.rktl +++ b/pkgs/racket-test-core/tests/racket/foreign-test.rktl @@ -575,6 +575,11 @@ free)]) (free p))) +(let ([return_null (get-ffi-obj 'return_null test-lib (_fun -> _bytes/nul-terminated))]) + (test #f return_null)) +(let ([return_null (get-ffi-obj 'return_null test-lib (_fun -> (_bytes/nul-terminated o 20)))]) + (test #f return_null)) + ;; Test equality and hashing of c pointers: (let ([seventeen1 (cast 17 _intptr _pointer)] [seventeen2 (cast 17 _intptr _pointer)] diff --git a/racket/collects/ffi/unsafe.rkt b/racket/collects/ffi/unsafe.rkt index 60dff0b854..1faaf378b1 100644 --- a/racket/collects/ffi/unsafe.rkt +++ b/racket/collects/ffi/unsafe.rkt @@ -1161,16 +1161,17 @@ (define _bytes/nul-terminated (make-ctype _bytes (lambda (bstr) (and bstr (bytes-append bstr #"\0"))) - (lambda (bstr) (bytes-copy bstr)))) + (lambda (bstr) (and bstr (bytes-copy bstr))))) (provide (rename-out [_bytes/nul-terminated* _bytes/nul-terminated])) (define-fun-syntax _bytes/nul-terminated* (syntax-id-rules (o) [(_ o n) (type: _pointer pre: (make-bytes n) ;; post is needed when this is used as a function output type - post: (x => (let ([s (make-bytes n)]) - (memcpy s x n) - s)))] + post: (x => (and x + (let ([s (make-bytes n)]) + (memcpy s x n) + s))))] [(_ . xs) (_bytes/nul-teriminated . xs)] [_ _bytes/nul-terminated])) diff --git a/racket/src/racket/src/salloc.c b/racket/src/racket/src/salloc.c index 91264f34df..09039834d4 100644 --- a/racket/src/racket/src/salloc.c +++ b/racket/src/racket/src/salloc.c @@ -3020,6 +3020,8 @@ Scheme_Object *scheme_dump_gc_stats(int c, Scheme_Object *p[]) # endif #endif + scheme_console_printf("JIT-generated code: %ld\n", scheme_code_page_total); + #if MZ_PRECISE_GC_TRACE if (for_each_struct) { scheme_console_printf("Begin Struct\n");