~ chicken-core (chicken-5) a82aa3b22559d63d998dd0d8da8ebaa5039edcad


commit a82aa3b22559d63d998dd0d8da8ebaa5039edcad
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Sep 28 16:50:03 2021 +0200
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Wed Oct 6 07:27:02 2021 +0200

    Ensure required-libraries always contains loadable units
    
    which was dropped in 41a1decf. This should fix #1788.
    Added flimsy little test.
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/NEWS b/NEWS
index 0ce3a1bd..110a0329 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,9 @@
 5.3.0rc4
 
+- Compiler
+  - Statically linked programs using built-in libraries are supported
+    again (fixes #1788, a regression from 5.2.0).
+
 - Core libraries
   - In (chicken process-context posix), the setters for current-user-id,
     current-effective-user-id and current-group-id now check that the
diff --git a/batch-driver.scm b/batch-driver.scm
index 3f456531..6f1d5f56 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -676,7 +676,7 @@
 	       (initialize-analysis-database)
 
 	       ;; collect requirements and load inline files
-	       (let ((extensions (remove chicken.load#core-unit? required-libraries)))
+	       (let ((extensions required-libraries))
 		 (when enable-inline-files
 		   (for-each
 		    (lambda (id)
@@ -851,7 +851,7 @@
 
                               ;; generate link file
 			      (when emit-link-file
-				(let ((exts (remove chicken.load#core-unit? required-libraries)))
+				(let ((exts required-libraries))
 				  (dribble "generating link file `~a' ..." emit-link-file)
 				  (with-output-to-file emit-link-file (cut pp exts))))
 
diff --git a/core.scm b/core.scm
index 630bfd04..0b980913 100644
--- a/core.scm
+++ b/core.scm
@@ -738,13 +738,17 @@
 			((##core#require)
 			 (let ((lib (cadr x))
 			       (mod (and (pair? (cddr x)) (caddr x))))
-			   (set! required-libraries (lset-adjoin/eq? required-libraries lib))
-			   (walk (##sys#process-require
-				  lib mod
-				  (if (or (memq lib linked-libraries) static-extensions)
-				      'static
-				      'dynamic))
-				 e dest ldest h ln #f)))
+			   (let-values (((reqform builtin) 
+                                          (##sys#process-require
+						    lib mod
+			                    (if (or (memq lib linked-libraries) 
+			                            static-extensions)
+				              'static
+				              'dynamic))))
+                             (unless builtin
+				(set! required-libraries 
+                                 (lset-adjoin/eq? required-libraries lib)))
+                             (walk reqform e dest ldest h ln #f))))
 
 			((##core#let)
 			 (let* ((bindings (cadr x))
diff --git a/eval.scm b/eval.scm
index 9421e83d..ce388eb1 100644
--- a/eval.scm
+++ b/eval.scm
@@ -596,8 +596,9 @@
 
 			 [(##core#require)
 			  (let ((lib (cadr x))
-				(mod (and (pair? (cddr x)) (caddr x))))
-			    (compile (##sys#process-require lib mod #f) e #f tf cntr #f))]
+			  	 (mod (and (pair? (cddr x)) (caddr x))))
+                            (let-values (((reqform _) (##sys#process-require lib mod #f)))
+			      (compile reqform e #f tf cntr #f)))]
 
 			 [(##core#elaborationtimeonly ##core#elaborationtimetoo) ; <- Note this!
 			  (##sys#eval/meta (cadr x))
@@ -1250,20 +1251,26 @@
 (define (##sys#process-require lib mod compile-mode)
   (let ((mod (or (eq? lib mod) mod)))
     (cond
-      ((assq lib core-unit-requirements) => cdr)
-      ((memq lib builtin-features) '(##core#undefined))
+      ((assq lib core-unit-requirements) => 
+        (lambda (a) (values (cdr a) #f)))
+      ((memq lib builtin-features) 
+        (values '(##core#undefined) #t))
       ((memq lib core-units)
-       (if compile-mode
-	   `(##core#callunit ,lib)
-	   `(chicken.load#load-unit (##core#quote ,lib)
-				    (##core#quote #f)
-				    (##core#quote #f))))
+        (values
+          (if compile-mode
+   	      `(##core#callunit ,lib)
+	      `(chicken.load#load-unit (##core#quote ,lib)
+	  			       (##core#quote #f)
+				       (##core#quote #f)))
+          #t))
       ((eq? compile-mode 'static)
-       `(##core#callunit ,lib))
+       (values `(##core#callunit ,lib) #f))
       (else
-       `(chicken.load#load-extension (##core#quote ,lib)
-				     (##core#quote ,mod)
-				     (##core#quote #f))))))
+       (values
+          `(chicken.load#load-extension (##core#quote ,lib)
+				        (##core#quote ,mod)
+				        (##core#quote #f))
+          #f)))))
 
 ;;; Find included file:
 
diff --git a/tests/sample-module.scm b/tests/sample-module.scm
index 32ac627f..75b3e3f6 100644
--- a/tests/sample-module.scm
+++ b/tests/sample-module.scm
@@ -1,3 +1,4 @@
 (module sample-module (foo)
 (import scheme)
+(import (srfi 9))  ; ensure builtin feature doesn't appear in .link file
 (define foo 42))
Trap