Add error check for positive arguments to signed integer coercion.
authorChris Hanson <org/chris-hanson/cph>
Tue, 26 May 1987 13:24:56 +0000 (13:24 +0000)
committerChris Hanson <org/chris-hanson/cph>
Tue, 26 May 1987 13:24:56 +0000 (13:24 +0000)
v7/src/compiler/back/syntax.scm
v7/src/runtime/bitstr.scm

index b848e7cc06c9df5a475d42a6d161dbdfea1520c9..d5c1d4da09da2f0de4cd9c39bd54dc1c7086fc97 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/syntax.scm,v 1.13 1987/03/19 00:50:43 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/syntax.scm,v 1.14 1987/05/26 13:24:04 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -186,12 +186,14 @@ MIT in each case. |#
   (unsigned-integer->bit-string nbits n))
 
 (define (coerce-signed-integer nbits)
-  (let ((offset (expt 2 nbits)))
+  (let* ((limit (expt 2 (-1+ nbits)))
+        (offset (+ limit limit)))
     (lambda (n)
-      (unsigned-integer->bit-string nbits
-                                   (if (negative? n)
-                                       (+ n offset)
-                                       n)))))
+      (unsigned-integer->bit-string
+       nbits
+       (cond ((negative? n) (+ n offset))
+            ((< n limit) n)
+            (else (error "Integer too large to be encoded" n)))))))
 
 (define (standard-coercion kernel)
   (lambda (nbits)
index 42d49cec26f4943c4df28138dcabfe8b6ace2d30..681e43c9632b1fa9ebb93266a1f530ed877e1e72 100644 (file)
@@ -1,6 +1,6 @@
 ;;; -*-Scheme-*-
 ;;;
-;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/bitstr.scm,v 13.42 1987/04/25 20:18:51 cph Exp $
+;;;    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/runtime/bitstr.scm,v 13.43 1987/05/26 13:24:56 cph Rel $
 ;;;
 ;;;    Copyright (c) 1987 Massachusetts Institute of Technology
 ;;;
     result))
 
 (define (signed-integer->bit-string nbits number)
-  (unsigned-integer->bit-string nbits
-                               (if (negative? number)
-                                   (+ number (expt 2 nbits))
-                                   number)))
+  (unsigned-integer->bit-string
+   nbits
+   (cond ((negative? number) (+ number (expt 2 nbits)))
+        ((< number (expt 2 (-1+ nbits))) number)
+        (else (error "Integer too large to be encoded" number)))))
 
 (define (bit-string->signed-integer bit-string)
   (let ((unsigned-result (bit-string->unsigned-integer bit-string))