X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftoplevel.lisp;h=2ce86e7b4987daa983b0b7fd08dc10b755a9f523;hb=7f1e94ae961a198e00daf281eb1dc858e5b2dcc7;hp=71e7d5ea351cacc6de2750f6bd1af8e21bb3d163;hpb=f962bad9a3dcfa165fe359e60be48c636a1622ec;p=sbcl.git diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index 71e7d5e..2ce86e7 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -159,50 +159,21 @@ means to wait indefinitely.") (t (/show0 "returning normally from INFINITE-ERROR-PROTECTOR") nil))) - -;;; FIXME: I had a badly broken version of INFINITE-ERROR-PROTECTOR at -;;; one point (shown below), and SBCL cross-compiled it without -;;; warning about FORMS being undefined. Check whether that problem -;;; (missing warning) is repeatable in the final system and if so, fix -;;; it. -#| -(defun infinite-error-protector () - `(cond ((not *cold-init-complete-p*) - (%primitive print "Argh! error in cold init, halting") - (%primitive sb!c:halt)) - ((or (not (boundp '*current-error-depth*)) - (not (realp *current-error-depth*)) - (not (boundp '*maximum-error-depth*)) - (not (realp *maximum-error-depth*))) - (%primitive print "Argh! corrupted error depth, halting") - (%primitive sb!c:halt)) - ((> *current-error-depth* *maximum-error-depth*) - (/show0 "in INFINITE-ERROR-PROTECTOR, calling ERROR-ERROR") - (error-error "Help! " - *current-error-depth* - " nested errors. " - "SB-KERNEL:*MAXIMUM-ERROR-DEPTH* exceeded.") - (progn ,@forms) - t) - (t - (/show0 "in INFINITE-ERROR-PROTECTOR, returning normally") - nil))) -|# ;;;; miscellaneous external functions (defun split-seconds-for-sleep (seconds) (declare (optimize speed)) + ;; KLUDGE: This whole thing to avoid consing floats (flet ((split-float () - ;; KLUDGE: This whole thing to avoid consing floats (let ((whole-seconds (truly-the fixnum (%unary-truncate seconds)))) (values whole-seconds - (truly-the fixnum - (%unary-truncate (* (- seconds whole-seconds) - (load-time-value 1s9 t)))))))) + (truly-the (integer 0 #.(expt 10 9)) + (%unary-truncate (* (- seconds (float whole-seconds)) + (load-time-value 1f9 t)))))))) (declare (inline split-float)) (typecase seconds - ((single-float 0s0 #.(float most-positive-fixnum 1s0)) + ((single-float 0f0 #.(float most-positive-fixnum 1f0)) (split-float)) ((double-float 0d0 #.(float most-positive-fixnum 1d0)) (split-float)) @@ -210,11 +181,15 @@ means to wait indefinitely.") (multiple-value-bind (quot rem) (truncate (numerator seconds) (denominator seconds)) (values quot - (* rem (/ 1000000000 (denominator seconds)))))) + (* rem + (if (typep 1000000000 'fixnum) + (truncate 1000000000 (denominator seconds)) + ;; Can't truncate a bignum by a fixnum without consing + (* 10 (truncate 100000000 (denominator seconds)))))))) (t (multiple-value-bind (sec frac) (truncate seconds) - (values sec (truncate frac (load-time-value 1s-9 t)))))))) + (values sec (truncate frac (load-time-value 1f-9 t)))))))) (defun sleep (seconds) #!+sb-doc