Patch requires bootstrap to regenerate C source file(s).
See also:
* https://git.adelielinux.org/adelie/packages/-/issues/926
* https://github.com/gambit/gambit/issues/806
From eb287205c10b3bcf5f497b33b520f468837a18ec Mon Sep 17 00:00:00 2001
From: Marc Feeley <feeley@iro.umontreal.ca>
Date: Sun, 18 Dec 2022 07:39:38 -0500
Subject: [PATCH] Avoid fixnum overflow on 32 bit machines in
port-settings-set!
diff --git a/lib/_io#.scm b/lib/_io#.scm
index e205e8ad..f55124dc 100644
--- a/lib/_io#.scm
+++ b/lib/_io#.scm
@@ -2,7 +2,7 @@
;;; File: "_io#.scm"
-;;; Copyright (c) 1994-2021 by Marc Feeley, All Rights Reserved.
+;;; Copyright (c) 1994-2022 by Marc Feeley, All Rights Reserved.
;;;============================================================================
@@ -817,36 +817,37 @@
(##define-macro (macro-default-readtable) #f)
-(##define-macro (macro-char-encoding-shift) 1)
-(##define-macro (macro-char-encoding-range) 32)
-(##define-macro (macro-default-char-encoding) 0)
-(##define-macro (macro-char-encoding-ASCII) 1)
-(##define-macro (macro-char-encoding-ISO-8859-1) 2)
-(##define-macro (macro-char-encoding-UTF-8) 3)
-(##define-macro (macro-char-encoding-UTF-16) 4)
-(##define-macro (macro-char-encoding-UTF-16BE) 5)
-(##define-macro (macro-char-encoding-UTF-16LE) 6)
-(##define-macro (macro-char-encoding-UTF-fallback-ASCII) 7)
-(##define-macro (macro-char-encoding-UTF-fallback-ISO-8859-1) 8)
-(##define-macro (macro-char-encoding-UTF-fallback-UTF-8) 9)
-(##define-macro (macro-char-encoding-UTF-fallback-UTF-16) 10)
-(##define-macro (macro-char-encoding-UTF-fallback-UTF-16BE) 11)
-(##define-macro (macro-char-encoding-UTF-fallback-UTF-16LE) 12)
-(##define-macro (macro-char-encoding-UCS-2) 13)
-(##define-macro (macro-char-encoding-UCS-2BE) 14)
-(##define-macro (macro-char-encoding-UCS-2LE) 15)
-(##define-macro (macro-char-encoding-UCS-4) 16)
-(##define-macro (macro-char-encoding-UCS-4BE) 17)
-(##define-macro (macro-char-encoding-UCS-4LE) 18)
-(##define-macro (macro-char-encoding-wchar) 19)
-(##define-macro (macro-char-encoding-native) 20)
+(##define-macro (macro-char-encoding-shift) 0)
+(##define-macro (macro-char-encoding-mask) (* 31 (expt 2 0)))
+(##define-macro (macro-default-char-encoding) 0)
+(##define-macro (macro-char-encoding-ASCII) 1)
+(##define-macro (macro-char-encoding-ISO-8859-1) 2)
+(##define-macro (macro-char-encoding-UTF-8) 3)
+(##define-macro (macro-char-encoding-UTF-16) 4)
+(##define-macro (macro-char-encoding-UTF-16BE) 5)
+(##define-macro (macro-char-encoding-UTF-16LE) 6)
+(##define-macro (macro-char-encoding-UTF-fallback-ASCII) 7)
+(##define-macro (macro-char-encoding-UTF-fallback-ISO-8859-1)8)
+(##define-macro (macro-char-encoding-UTF-fallback-UTF-8) 9)
+(##define-macro (macro-char-encoding-UTF-fallback-UTF-16) 10)
+(##define-macro (macro-char-encoding-UTF-fallback-UTF-16BE) 11)
+(##define-macro (macro-char-encoding-UTF-fallback-UTF-16LE) 12)
+(##define-macro (macro-char-encoding-UCS-2) 13)
+(##define-macro (macro-char-encoding-UCS-2BE) 14)
+(##define-macro (macro-char-encoding-UCS-2LE) 15)
+(##define-macro (macro-char-encoding-UCS-4) 16)
+(##define-macro (macro-char-encoding-UCS-4BE) 17)
+(##define-macro (macro-char-encoding-UCS-4LE) 18)
+(##define-macro (macro-char-encoding-wchar) 19)
+(##define-macro (macro-char-encoding-native) 20)
(##define-macro (macro-char-encoding-UTF)
`(macro-char-encoding-UTF-fallback-UTF-8))
(##define-macro (macro-max-unescaped-char options)
- `(let ((e (##fxmodulo (##fxquotient ,options (macro-char-encoding-shift))
- (macro-char-encoding-range))))
+ `(let ((e (##fxarithmetic-shift-right
+ (##fxand ,options (macro-char-encoding-mask))
+ (macro-char-encoding-shift))))
(cond ((##fx<= e (macro-char-encoding-ISO-8859-1))
(if (##fx= e (macro-char-encoding-ISO-8859-1))
(##integer->char #xff)
@@ -857,21 +858,21 @@
(else
(##integer->char #x10ffff)))))
-(##define-macro (macro-char-encoding-errors-shift) 32)
-(##define-macro (macro-char-encoding-errors-range) 4)
+(##define-macro (macro-char-encoding-errors-shift) 5)
+(##define-macro (macro-char-encoding-errors-mask) (* 3 (expt 2 5)))
(##define-macro (macro-default-char-encoding-errors) 0)
(##define-macro (macro-char-encoding-errors-on) 1)
(##define-macro (macro-char-encoding-errors-off) 2)
-(##define-macro (macro-eol-encoding-shift) 128)
-(##define-macro (macro-eol-encoding-range) 4)
+(##define-macro (macro-eol-encoding-shift) 7)
+(##define-macro (macro-eol-encoding-mask) (* 3 (expt 2 7)))
(##define-macro (macro-default-eol-encoding) 0)
(##define-macro (macro-eol-encoding-lf) 1)
(##define-macro (macro-eol-encoding-cr) 2)
(##define-macro (macro-eol-encoding-crlf) 3)
-(##define-macro (macro-buffering-shift) 512)
-(##define-macro (macro-buffering-range) 4)
+(##define-macro (macro-buffering-shift) 9)
+(##define-macro (macro-buffering-mask) (* 3 (expt 2 9)))
(##define-macro (macro-default-buffering) 0)
(##define-macro (macro-no-buffering) 1)
(##define-macro (macro-line-buffering) 2)
@@ -883,14 +884,14 @@
(##define-macro (macro-fully-buffered? options)
`(##not (##fx< (##fxand ,options 2047) 1536)))
-(##define-macro (macro-decode-state-shift) 2048)
-(##define-macro (macro-decode-state-range) 4)
+(##define-macro (macro-decode-state-shift) 11)
+(##define-macro (macro-decode-state-mask) (* 3 (expt 2 11)))
(##define-macro (macro-decode-state-none) 0)
(##define-macro (macro-decode-state-lf) 1)
(##define-macro (macro-decode-state-cr) 2)
-(##define-macro (macro-open-state-shift) 8192)
-(##define-macro (macro-open-state-range) 2)
+(##define-macro (macro-open-state-shift) 13)
+(##define-macro (macro-open-state-mask) (* 1 (expt 2 13)))
(##define-macro (macro-open-state-open) 0)
(##define-macro (macro-open-state-closed) 1)
@@ -903,15 +904,15 @@
(##define-macro (macro-unclose! options)
`(##fxand ,options -8193))
-(##define-macro (macro-permanent-close-shift) 16384)
-(##define-macro (macro-permanent-close-range) 2)
+(##define-macro (macro-permanent-close-shift) 14)
+(##define-macro (macro-permanent-close-mask) (* 1 (expt 2 14)))
(##define-macro (macro-permanent-close-no) 0)
(##define-macro (macro-permanent-close-yes) 1)
(##define-macro (macro-perm-close? options)
`(##not (##fx= (##fxand ,options 16384) 0)))
-(##define-macro (macro-direction-shift) 16)
+(##define-macro (macro-direction-shift) 4)
(##define-macro (macro-direction-in) 1)
(##define-macro (macro-direction-out) 2)
(##define-macro (macro-direction-inout) 3)
@@ -926,18 +927,18 @@
(##define-macro (macro-default-directory) #f)
-(##define-macro (macro-append-shift) 8)
+(##define-macro (macro-append-shift) 3)
(##define-macro (macro-no-append) 0)
(##define-macro (macro-append) 1)
(##define-macro (macro-default-append) 2)
-(##define-macro (macro-create-shift) 2)
+(##define-macro (macro-create-shift) 1)
(##define-macro (macro-no-create) 0)
(##define-macro (macro-maybe-create) 1)
(##define-macro (macro-create) 2)
(##define-macro (macro-default-create) 3)
-(##define-macro (macro-truncate-shift) 1)
+(##define-macro (macro-truncate-shift) 0)
(##define-macro (macro-no-truncate) 0)
(##define-macro (macro-truncate) 1)
(##define-macro (macro-default-truncate) 2)
diff --git a/lib/_io.scm b/lib/_io.scm
index d9387536..563d9664 100644
--- a/lib/_io.scm
+++ b/lib/_io.scm
@@ -1046,17 +1046,22 @@
(else
(error-improper-list))))))
-(##define-macro (macro-stream-options-output-shift) 32768)
+(##define-macro (macro-stream-options-output-shift) 15)
+(##define-macro (macro-stream-options-input-mask) 32767)
(define-prim (##psettings->roptions psettings default-options)
(##psettings-options->options
(macro-psettings-roptions psettings)
- (##fxmodulo default-options (macro-stream-options-output-shift))))
+ (##fxand
+ default-options
+ (macro-stream-options-input-mask))))
(define-prim (##psettings->woptions psettings default-options)
(##psettings-options->options
(macro-psettings-woptions psettings)
- (##fxquotient default-options (macro-stream-options-output-shift))))
+ (##fxwraplogical-shift-right
+ default-options
+ (macro-stream-options-output-shift))))
(define-prim (##psettings->input-readtable psettings)
(or (macro-psettings-options-readtable
@@ -1081,45 +1086,52 @@
(macro-psettings-options-char-encoding-errors options)))
(##fx+
(##fx+
- (##fx* (macro-char-encoding-shift)
- (if (##fx= char-encoding (macro-default-char-encoding))
- (##fxmodulo
- (##fxquotient default-options
- (macro-char-encoding-shift))
- (macro-char-encoding-range))
- char-encoding))
- (##fx* (macro-char-encoding-errors-shift)
- (if (##fx= char-encoding-errors (macro-default-char-encoding-errors))
- (##fxmodulo
- (##fxquotient default-options
- (macro-char-encoding-errors-shift))
- (macro-char-encoding-errors-range))
- char-encoding-errors))
+ (##fxarithmetic-shift-left
+ (if (##fx= char-encoding (macro-default-char-encoding))
+ (##fxarithmetic-shift-right
+ (##fxand
+ default-options
+ (macro-char-encoding-mask))
+ (macro-char-encoding-shift))
+ char-encoding)
+ (macro-char-encoding-shift))
+ (##fxarithmetic-shift-left
+ (if (##fx= char-encoding-errors (macro-default-char-encoding-errors))
+ (##fxarithmetic-shift-right
+ (##fxand
+ default-options
+ (macro-char-encoding-errors-mask))
+ (macro-char-encoding-errors-shift))
+ char-encoding-errors)
+ (macro-char-encoding-errors-shift))
(##fx+
(##fx+
- (##fx* (macro-eol-encoding-shift)
- (if (##fx= eol-encoding (macro-default-eol-encoding))
- (##fxmodulo
- (##fxquotient default-options
- (macro-eol-encoding-shift))
- (macro-eol-encoding-range))
- eol-encoding))
+ (##fxarithmetic-shift-left
+ (if (##fx= eol-encoding (macro-default-eol-encoding))
+ (##fxarithmetic-shift-right
+ (##fxand
+ default-options
+ (macro-eol-encoding-mask))
+ (macro-eol-encoding-shift))
+ eol-encoding)
+ (macro-eol-encoding-shift))
(##fx+
- (##fx* (macro-open-state-shift)
- (##fxmodulo
- (##fxquotient default-options
- (macro-open-state-shift))
- (macro-open-state-range)))
+ (##fxand
+ default-options
+ (macro-open-state-mask))
(##fx+
- (##fx* (macro-permanent-close-shift)
- permanent-close)
- (##fx* (macro-buffering-shift)
- (if (##fx= buffering (macro-default-buffering))
- (##fxmodulo
- (##fxquotient default-options
- (macro-buffering-shift))
- (macro-buffering-range))
- buffering))))))))))
+ (##fxarithmetic-shift-left
+ permanent-close
+ (macro-permanent-close-shift))
+ (##fxarithmetic-shift-left
+ (if (##fx= buffering (macro-default-buffering))
+ (##fxarithmetic-shift-right
+ (##fxand
+ default-options
+ (macro-buffering-mask))
+ (macro-buffering-shift))
+ buffering)
+ (macro-buffering-shift))))))))))
(define-prim (##psettings->device-flags psettings)
(let ((direction
@@ -1131,30 +1143,34 @@
(truncate
(macro-psettings-truncate psettings)))
(##fx+
- (##fx* (macro-direction-shift)
- direction)
+ (##fxarithmetic-shift-left
+ direction
+ (macro-direction-shift))
(##fx+
- (##fx* (macro-append-shift)
- (if (##not (##fx= append (macro-default-append)))
- append
- (macro-no-append)))
+ (##fxarithmetic-shift-left
+ (if (##not (##fx= append (macro-default-append)))
+ append
+ (macro-no-append))
+ (macro-append-shift))
(##fx+
- (##fx* (macro-create-shift)
- (cond ((##not (##fx= create (macro-default-create)))
- create)
- ((##fx= direction (macro-direction-out))
- (macro-maybe-create))
- (else
- (macro-no-create))))
- (##fx* (macro-truncate-shift)
- (cond ((##not (##fx= truncate (macro-default-truncate)))
- truncate)
- ((##fx= direction (macro-direction-out))
- (if (##fx= append (macro-append))
- (macro-no-truncate)
- (macro-truncate)))
- (else
- (macro-no-truncate)))))))))
+ (##fxarithmetic-shift-left
+ (cond ((##not (##fx= create (macro-default-create)))
+ create)
+ ((##fx= direction (macro-direction-out))
+ (macro-maybe-create))
+ (else
+ (macro-no-create)))
+ (macro-create-shift))
+ (##fxarithmetic-shift-left
+ (cond ((##not (##fx= truncate (macro-default-truncate)))
+ truncate)
+ ((##fx= direction (macro-direction-out))
+ (if (##fx= append (macro-append))
+ (macro-no-truncate)
+ (macro-truncate)))
+ (else
+ (macro-no-truncate)))
+ (macro-truncate-shift)))))))
(define-prim (##psettings->permissions psettings default-permissions)
(let ((permissions (macro-psettings-permissions psettings)))
@@ -3282,12 +3298,14 @@
(##psettings-options->options
options
(##fx+
- (##fx* (macro-open-state-shift)
- (if (##fx= kind (macro-none-kind))
- (macro-open-state-closed)
- (macro-open-state-open)))
- (##fx* (macro-buffering-shift)
- buffering))))
+ (##fxarithmetic-shift-left
+ (if (##fx= kind (macro-none-kind))
+ (macro-open-state-closed)
+ (macro-open-state-open))
+ (macro-open-state-shift))
+ (##fxarithmetic-shift-left
+ buffering
+ (macro-buffering-shift)))))
;;;----------------------------------------------------------------------------
@@ -6690,8 +6708,9 @@
(macro-port-woptions port))
(woptions
(##psettings->woptions psettings
- (##fx* old-woptions
- (macro-stream-options-output-shift)))))
+ (##fxarithmetic-shift-left
+ old-woptions
+ (macro-stream-options-output-shift)))))
(let ((code
(and (macro-output-port? port)
(##not (##fx= woptions old-woptions))
@@ -6716,8 +6735,9 @@
(##options-set!
port
(##fx+ roptions
- (##fx* woptions
- (macro-stream-options-output-shift)))))))
+ (##fxarithmetic-shift-left
+ woptions
+ (macro-stream-options-output-shift)))))))
(if (##fixnum? result)
(begin
(macro-port-mutex-unlock! port)
diff --git a/lib/_kernel#.scm b/lib/_kernel#.scm
index 9d3578f2..e00a4bba 100644
--- a/lib/_kernel#.scm
+++ b/lib/_kernel#.scm
@@ -249,28 +249,28 @@
;;; Debug settings.
-(##define-macro (macro-debug-settings-level-mask) 15)
+(##define-macro (macro-debug-settings-level-mask) (* 15 (expt 2 0)))
(##define-macro (macro-debug-settings-level-shift) 0)
-(##define-macro (macro-debug-settings-uncaught-mask) 16)
+(##define-macro (macro-debug-settings-uncaught-mask) (* 1 (expt 2 4)))
(##define-macro (macro-debug-settings-uncaught-primordial) 0)
(##define-macro (macro-debug-settings-uncaught-all) 1)
(##define-macro (macro-debug-settings-uncaught-shift) 4)
-(##define-macro (macro-debug-settings-error-mask) 96)
+(##define-macro (macro-debug-settings-error-mask) (* 3 (expt 2 5)))
(##define-macro (macro-debug-settings-error-repl) 0)
(##define-macro (macro-debug-settings-error-single-step) 1)
(##define-macro (macro-debug-settings-error-quit) 2)
(##define-macro (macro-debug-settings-error-shift) 5)
-(##define-macro (macro-debug-settings-repl-mask) 896)
+(##define-macro (macro-debug-settings-repl-mask) (* 7 (expt 2 7)))
(##define-macro (macro-debug-settings-repl-console) 0)
(##define-macro (macro-debug-settings-repl-stdio) 1)
(##define-macro (macro-debug-settings-repl-stdio-and-err) 2)
(##define-macro (macro-debug-settings-repl-client) 3)
(##define-macro (macro-debug-settings-repl-shift) 7)
-(##define-macro (macro-debug-settings-user-intr-mask) 3072)
+(##define-macro (macro-debug-settings-user-intr-mask) (* 3 (expt 2 10)))
(##define-macro (macro-debug-settings-user-intr-repl) 0)
(##define-macro (macro-debug-settings-user-intr-defer) 1)
(##define-macro (macro-debug-settings-user-intr-quit) 2)
--
2.25.1