Tweak EDWIN-STRING-ALLOCATE so that it doesn't rely on range-checking
authorTaylor R. Campbell <net/mumble/campbell>
Thu, 5 Apr 2007 22:24:42 +0000 (22:24 +0000)
committerTaylor R. Campbell <net/mumble/campbell>
Thu, 5 Apr 2007 22:24:42 +0000 (22:24 +0000)
being disabled when NUL-terminating the string.

v7/src/edwin/utils.scm

index 9705f6d74a3feb35fe5112060a1fb2f60e87dd52..6a089d5638d47a2d0a322aee5d716c8636b8232f 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: utils.scm,v 1.60 2007/04/01 17:33:07 riastradh Exp $
+$Id: utils.scm,v 1.61 2007/04/05 22:24:42 riastradh Exp $
 
 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
     1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -105,7 +105,7 @@ USA.
   (with-interrupt-mask interrupt-mask/none
     (lambda (mask)
       (let ((n-words                   ;Add two, for manifest & length.
-            (fix:+ 2 (chars->words n-chars))))
+            (fix:+ 2 (chars->words (fix:+ n-chars 1)))))
        (if (not ((ucode-primitive heap-available? 1) n-words))
            (with-interrupt-mask interrupt-mask/gc-normal
              (lambda (ignore)
@@ -119,9 +119,9 @@ USA.
           ((ucode-primitive primitive-object-set-type 2)
            (ucode-type manifest-nm-vector)
            (fix:- n-words 1)))         ;Subtract one for the manifest.
-         (set-string-length! result n-chars)
-         ;; This won't work if range-checking is turned on.
+         (set-string-length! result (fix:+ n-chars 1))
          (string-set! result n-chars #\nul)
+         (set-string-length! result n-chars)
          ((ucode-primitive primitive-increment-free 1) n-words)
          (set-interrupt-enables! mask)
          result)))))