~ 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