~ chicken-core (chicken-5) 5bc3b2d25768f9bd89bafa3b9dd4b85376b0c10a
commit 5bc3b2d25768f9bd89bafa3b9dd4b85376b0c10a
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Mon Jun 19 15:01:14 2017 +0200
Commit: Evan Hanson <evhan@foldling.org>
CommitDate: Tue Jun 20 22:09:07 2017 +1200
Add foreign result size computation for enums and enum locations
Also, error out instead of assuming 0 size when encountering an
unknown type, because that is too dangerous an assumption.
Finally, we improve the scrutiny type of "enum" to be "integer" rather
than the nondescript "number".
Signed-off-by: Evan Hanson <evhan@foldling.org>
diff --git a/support.scm b/support.scm
index 233ad961..f1b6d2b4 100644
--- a/support.scm
+++ b/support.scm
@@ -1144,6 +1144,8 @@
;;; Compute foreign result size:
(define (estimate-foreign-result-size type)
+ (define (err t)
+ (quit-compiling "cannot compute size for unknown foreign type `~S' result" type))
(follow-without-loop
type
(lambda (t next)
@@ -1168,8 +1170,9 @@
(case (car t)
((ref nonnull-pointer pointer c-pointer nonnull-c-pointer function instance instance-ref nonnull-instance)
(words->bytes 3) )
- (else 0) ) )
- (else 0) ) ) ) )
+ ((enum) (words->bytes 6)) ; 1 bignum digit on 32-bit (overallocs on 64-bit)
+ (else (err t))))
+ (else (err t))))))
(lambda () (quit-compiling "foreign type `~S' refers to itself" type)) ) )
(define (estimate-foreign-result-location-size type) ; Used only in compiler.scm
@@ -1179,8 +1182,8 @@
type
(lambda (t next)
(case t
- ((char int short bool unsigned-short unsigned-char unsigned-int long unsigned-long byte unsigned-byte
- c-pointer nonnull-c-pointer unsigned-integer integer float c-string symbol
+ ((char int short bool unsigned-short unsigned-char unsigned-int long unsigned-long byte
+ unsigned-byte c-pointer nonnull-c-pointer unsigned-integer integer float c-string symbol
scheme-pointer nonnull-scheme-pointer int32 unsigned-int32 integer32 unsigned-integer32
unsigned-c-string unsigned-c-string* nonnull-unsigned-c-string*
nonnull-c-string c-string* nonnull-c-string* c-string-list c-string-list*)
@@ -1193,7 +1196,7 @@
((pair? t)
(case (car t)
((ref nonnull-pointer pointer c-pointer nonnull-c-pointer function
- scheme-pointer nonnull-scheme-pointer)
+ scheme-pointer nonnull-scheme-pointer enum)
(words->bytes 1))
(else (err t)) ) )
(else (err t)) ) ) ) )
@@ -1293,7 +1296,7 @@
((ref pointer function c-pointer)
'(or boolean pointer locative))
((const) (foreign-type->scrutiny-type (cadr t) mode))
- ((enum) 'number)
+ ((enum) 'integer)
((nonnull-pointer nonnull-c-pointer) 'pointer)
(else '*)))
(else '*))))))
Trap