~ chicken-core (chicken-5) c3393980e383a8d46c9b335ad6455a8589e5183d
commit c3393980e383a8d46c9b335ad6455a8589e5183d Author: LemonBoy <thatlemon@gmail.com> AuthorDate: Wed Nov 8 15:36:29 2017 +0100 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Sun Nov 12 09:09:55 2017 +1300 Correctly parse FFI types wrapped in `const' forms Keep parsing the cdr when calculating the total size of the type. Signed-off-by: Peter Bex <peter@more-magic.net> Signed-off-by: Evan Hanson <evhan@foldling.org> diff --git a/NEWS b/NEWS index d0927e58..7a495951 100644 --- a/NEWS +++ b/NEWS @@ -161,6 +161,10 @@ - The scrutinizer no longer uses 'fixnum as the type for fixnums that might not fit into a fixnum on 32-bit architectures. +- Foreign function interface + - Correctly calculate memory requirements of Scheme objects produced + from foreign types with "const" qualifiers, avoiding memory + corruption (#1424, thanks to Vasilij Schneidermann and Lemonboy) 4.12.0 diff --git a/support.scm b/support.scm index 905f7ae8..9402309e 100644 --- a/support.scm +++ b/support.scm @@ -1183,6 +1183,7 @@ (case (car t) ((ref nonnull-pointer pointer c-pointer nonnull-c-pointer function instance instance-ref nonnull-instance) (words->bytes 3) ) + ((const) (next (cadr t))) ((enum) (words->bytes 6)) ; 1 bignum digit on 32-bit (overallocs on 64-bit) (else (err t)))) (else (err t)))))) @@ -1211,6 +1212,7 @@ ((ref nonnull-pointer pointer c-pointer nonnull-c-pointer function scheme-pointer nonnull-scheme-pointer enum) (words->bytes 1)) + ((const) (next (cadr t))) (else (err t)) ) ) (else (err t)) ) ) ) ) (lambda () (quit-compiling "foreign type `~S' refers to itself" type)) ) ) diff --git a/tests/compiler-tests.scm b/tests/compiler-tests.scm index a4608279..bd150fe2 100644 --- a/tests/compiler-tests.scm +++ b/tests/compiler-tests.scm @@ -426,3 +426,12 @@ (define (also-do-it arg) (get-value arg 3)) ) + +; let-location with const-wrapped type +(let-location ((foo (const c-string) "boo")) + (assert (equal? foo "boo"))) + +; #1424: a foreign lambda with const return type was wrongly rejected +(let ((v0 ((foreign-lambda* c-string () "C_return(\"str\");"))) + (v1 ((foreign-lambda* (const c-string) () "C_return(\"str\");")))) + (assert (equal? v0 v1)))Trap