Fix a bunch of problems caused by the call-with-values/values change.
authorChris Hanson <org/chris-hanson/cph>
Wed, 17 Jul 2019 23:28:36 +0000 (19:28 -0400)
committerChris Hanson <org/chris-hanson/cph>
Thu, 18 Jul 2019 00:50:47 +0000 (20:50 -0400)
First, SF was open-coding these, so that the compiled code wasn't using the new
convention.  This caused problems at the boundary between interpreted code and
compiled code, and of course the compiled code was now incorrect.  This is fixed
but requires stuff in host-adapter to make it work.

Second, eliminating the open-coding exposed a couple of places that would no
longer initialize correctly during the cold load because they were initialized
prior to the loading of the multiple-values procedures.  This is fixed by
rewriting those to not use multiple values and have been marked with comments.

Finally, because the host-adapter file is now changing SF, SF must be loaded
prior to loading the host adapter.  There was one case in the make file that
needed to be tweaked to make this guarantee.

Manual cherry-pick of d41c8338f7eaaadcdd96b9cf20364bd76a3d7ed9.

src/Makefile.in
src/runtime/arith.scm
src/runtime/boot.scm
src/runtime/host-adapter.scm
src/runtime/random.scm
src/sf/usiexp.scm

index be14dc7c7055ab626258a203b44d6e0a291fbb51..254232e63a97496d1fd58d55e1af5b55573bfe65 100644 (file)
@@ -90,6 +90,10 @@ HOST_COMPILER = '$(MIT_SCHEME_EXE)' --batch-mode $(HOST_COMPILER_HEAP) --no-init
 HOST_RUNTIME_ONLY = '$(MIT_SCHEME_EXE)' --batch-mode $(HOST_COMPILER_HEAP) \
   --band runtime.com --no-init-file --load runtime/host-adapter.scm
 
+HOST_SF_ONLY = '$(MIT_SCHEME_EXE)' --batch-mode $(HOST_COMPILER_HEAP) \
+  --band runtime.com --no-init-file --eval '(load-option (quote sf))' \
+  --load runtime/host-adapter.scm
+
 # This rule is for LIARC.
 .SUFFIXES: .bld .pkd .c
 .pkd.c .bld.c:
@@ -234,7 +238,7 @@ syntax-compiler: compile-sf
         echo '  (lambda ()' && \
         echo '    $(SF_SETTINGS_CROSS)' && \
         echo '    (load "compiler.sf")))') \
-       | $(HOST_RUNTIME_ONLY) --eval '(load-option (quote SF))'
+       | $(HOST_SF_ONLY)
 
 .PHONY: compile-compiler
 compile-compiler: syntax-compiler
index 60b24f7748c494bf3d6691c46283ae569e3c6e5b..280d2df7342fc25168ef5e7ae9528edb4accfaf4 100644 (file)
@@ -68,9 +68,12 @@ USA.
   (object-type? (ucode-type big-flonum) object))
 
 (define (flo:normalize x)
-  (let ((r ((ucode-primitive flonum-normalize 1) x)))
+  (let ((r (%flo:normalize x)))
     (values (car r) (cdr r))))
 
+(define-integrable (%flo:normalize x)
+  ((ucode-primitive flonum-normalize 1) x))
+
 (define-integrable flo:->integer
   flo:truncate->exact)
 
@@ -937,8 +940,11 @@ USA.
          (else (flo:->rational x)))))
 
 (define (flo:->rational x)
-  (with-values (lambda () (flo:normalize x))
-    (lambda (f e-p)
+;;; Don't use multiple-values here because this gets called before they are
+;;; defined.
+  (let ((p (%flo:normalize x)))
+    (let ((f (car p))
+         (e-p (cdr p)))
       (let ((p flo:significand-digits-base-2))
        (rat:* (flo:->integer (flo:denormalize f p))
               (rat:expt 2 (int:- e-p p)))))))
index ecc79ac1fe88b8f32017ce1456ea8cf7fe4a2170..f62cbca00c42829c3120f157c51fc77020d3d8b6 100644 (file)
@@ -447,12 +447,12 @@ USA.
   ;(guarantee thunk? thunk 'make-unforced-promise)
   (make-cell (system-pair-cons (ucode-type delayed) #f thunk)))
 
-(define (%promise-parts promise)
-  (without-interrupts
-   (lambda ()
-     (let ((p (cell-contents promise)))
-       (values (system-pair-car p)
-              (system-pair-cdr p))))))
+;;; Don't use multiple-values here because this gets called before they are
+;;; defined.
+(define-integrable (%promise-parts promise k)
+  (let ((p (cell-contents promise)))
+    (k (system-pair-car p)
+       (system-pair-cdr p))))
 
 (define (promise-forced? promise)
   (guarantee promise? promise 'promise-forced?)
@@ -460,30 +460,32 @@ USA.
 
 (define (promise-value promise)
   (guarantee promise? promise 'promise-value)
-  (receive (forced? value) (%promise-parts promise)
-    (if (not forced?)
-       (error "Promise not yet forced:" promise))
-    value))
+  (%promise-parts promise
+    (lambda (forced? value)
+      (if (not forced?)
+          (error "Promise not yet forced:" promise))
+      value)))
 
 (define (force promise)
   (guarantee promise? promise 'force)
   (%force promise))
 
 (define (%force promise)
-  (receive (forced? value) (%promise-parts promise)
-    (if forced?
-       value
-       (let ((promise* (value)))
-         (guarantee promise? promise* 'force)
-         (without-interrupts
-          (lambda ()
-            (let ((p (cell-contents promise)))
-              (if (not (system-pair-car p))
-                  (let ((p* (cell-contents promise*)))
-                    (system-pair-set-car! p (system-pair-car p*))
-                    (system-pair-set-cdr! p (system-pair-cdr p*))
-                    (set-cell-contents! promise* p))))))
-         (%force promise)))))
+  (%promise-parts promise
+    (lambda (forced? value)
+      (if forced?
+          value
+          (let ((promise* (value)))
+            (guarantee promise? promise* 'force)
+            (without-interrupts
+             (lambda ()
+               (let ((p (cell-contents promise)))
+                 (if (not (system-pair-car p))
+                     (let ((p* (cell-contents promise*)))
+                       (system-pair-set-car! p (system-pair-car p*))
+                       (system-pair-set-cdr! p (system-pair-cdr p*))
+                       (set-cell-contents! promise* p))))))
+            (%force promise))))))
 \f
 ;;;; Miscellany
 
index 6e65a631d1f5d560ab269c784661c8b0371a2274..ede64f56d7077ed6d98f905b4ece6c1b00ac1379 100644 (file)
@@ -163,4 +163,48 @@ USA.
                        (error "MICROCODE-TYPE: Unknown name:" name)))
                 env)
           (link-variables system-global-environment 'microcode-type
-                          env 'microcode-type)))))
\ No newline at end of file
+                          env 'microcode-type)))))
+
+(let ((env (->environment '(scode-optimizer expansion))))
+
+  (define (remove-at-index! index items setter)
+    (if (= index 0)
+       (setter (cdr items))
+       (remove-at-index! (- index 1)
+                         (cdr items)
+                         (pair-setter items))))
+
+  (define (pair-setter pair)
+    (lambda (tail)
+      (set-cdr! pair tail)))
+
+  (define (env-getter env name)
+    (lambda ()
+      (environment-lookup env name)))
+
+  (define (env-setter env name)
+    (lambda (tail)
+      (environment-assign! env name tail)))
+
+  (let ((get-names (env-getter env 'usual-integrations/expansion-names))
+       (set-names! (env-setter env 'usual-integrations/expansion-names))
+       (get-vals (env-getter env 'usual-integrations/expansion-values))
+       (set-vals! (env-setter env 'usual-integrations/expansion-values)))
+
+    (define (remove-one name)
+      (let ((names (get-names)))
+       (let ((i
+              (list-index (lambda (name*) (eq? name* name))
+                          names)))
+         (remove-at-index! i names set-names!)
+         (remove-at-index! i (get-vals) set-vals!))))
+
+    (remove-one 'call-with-values)
+    (remove-one 'with-values)
+    (remove-one 'values)
+
+    (environment-assign! env
+                        'usual-integrations/expansion-alist
+                        (map cons
+                             (get-names)
+                             (get-vals)))))
\ No newline at end of file
index 2b480543b6b07569cd64d71553153352ac897130..25155727b4d998e7b35c06e85916807fceda3c40 100644 (file)
@@ -114,19 +114,17 @@ USA.
 (define (large-random-integer m state)
   ;; This also uses the rejection method, but this time to select a
   ;; subset of B^N where N is the smallest integer s.t. (<= M B^N).
-  (receive (n b^n)
-      (let loop ((n 2) (b^n (int:* b b)))
-       (if (int:<= m b^n)
-           (values n b^n)
-           (loop (fix:+ n 1) (int:* b^n b))))
-    (let ((scale-factor (int:quotient b^n m)))
-      (int:quotient (let ((limit (int:* scale-factor m)))
-                     (let loop ()
-                       (let ((elt (int:large-random-element state n)))
-                         (if (int:< elt limit)
-                             elt
-                             (loop)))))
-                   scale-factor))))
+  (let loop ((n 2) (b^n (int:* b b)))
+    (if (int:<= m b^n)
+        (let ((scale-factor (int:quotient b^n m)))
+          (int:quotient (let ((limit (int:* scale-factor m)))
+                          (let loop ()
+                            (let ((elt (int:large-random-element state n)))
+                              (if (int:< elt limit)
+                                  elt
+                                  (loop)))))
+                        scale-factor))
+        (loop (fix:+ n 1) (int:* b^n b)))))
 
 (define (int:large-random-element state n)
   (let loop ((i 1) (elt (int:random-element state)))
index bfa51a59c01ede5894c5e449467fed7c80c3e0b4..2ac4b06c816298d2395799fb5ba65c9e9c4c730e 100644 (file)
@@ -336,50 +336,6 @@ USA.
        ((null? rest) (constant/make (and expr (object/scode expr)) '()))
        (else (error "Improper list."))))
 \f
-(define (values-expansion expr operands block)
-  (let ((block (block/make block #t '())))
-    (let ((variables
-          (map (lambda (position)
-                 (variable/make&bind!
-                  block
-                  (string->uninterned-symbol
-                   (string-append "value-" (number->string position)))))
-               (iota (length operands)))))
-      (combination/make
-       expr
-       block
-       (procedure/make
-       #f
-       block scode-lambda-name:let variables '() #f
-       (let ((block (block/make block #t '())))
-         (let ((variable (variable/make&bind! block 'receiver)))
-           (procedure/make
-            #f block scode-lambda-name:unnamed (list variable) '() #f
-            (declaration/make
-             #f
-             ;; The receiver is used only once, and all its operand
-             ;; expressions are effect-free, so integrating here is
-             ;; safe.
-             (declarations/parse block '((integrate-operator receiver)))
-             (combination/make #f
-                               block
-                               (reference/make #f block variable)
-                               (map (lambda (variable)
-                                      (reference/make #f block variable))
-                                    variables)))))))
-       operands))))
-
-(define (call-with-values-expansion expr operands block)
-  (if (and (pair? operands)
-          (pair? (cdr operands))
-          (null? (cddr operands)))
-      (combination/make expr
-                       block
-                       (combination/make #f block (car operands) '())
-                       (cdr operands))
-      #f))
-
-\f
 ;;;; General CAR/CDR Encodings
 
 (define (call-to-car? expression)
@@ -720,7 +676,6 @@ USA.
            cadddr
            caddr
            cadr
-           call-with-values
            car
            cdaaar
            cdaadr
@@ -770,9 +725,7 @@ USA.
            string->symbol
            symbol?
            third
-           values
            weak-pair?
-           with-values
            zero?)
          (map car global-primitives)))
 \f
@@ -804,7 +757,6 @@ USA.
           cadddr-expansion
           caddr-expansion
           cadr-expansion
-          call-with-values-expansion
           car-expansion
           cdaaar-expansion
           cdaadr-expansion
@@ -854,9 +806,7 @@ USA.
           string->symbol-expansion
           symbol?-expansion
           third-expansion
-          values-expansion
           weak-pair?-expansion
-          call-with-values-expansion
           zero?-expansion)
          (map (lambda (p)
                 (make-primitive-expander