1.0.29.27: add shebang line to fasls
[sbcl.git] / src / code / toplevel.lisp
index 135028c..ba8c00c 100644 (file)
@@ -20,6 +20,7 @@
 (progn
   (defvar sb!vm::*current-catch-block*)
   (defvar sb!vm::*current-unwind-protect-block*)
+  #!+hpux (defvar sb!vm::*c-lra*)
   (defvar *free-interrupt-context-index*))
 \f
 ;;; specials initialized by !COLD-INIT
@@ -207,7 +208,7 @@ command-line.")
          (initial-offset (logand csp (1- bytes-per-scrub-unit)))
          (end-of-stack
           (- (sap-int (sb!di::descriptor-sap sb!vm:*control-stack-end*))
-             sb!c:*backend-page-size*)))
+             (* 2 sb!c:*backend-page-bytes*))))
     (labels
         ((scrub (ptr offset count)
            (declare (type system-area-pointer ptr)
@@ -239,8 +240,9 @@ command-line.")
 
   #!+stack-grows-downward-not-upward
   (let* ((csp (sap-int (sb!c::control-stack-pointer-sap)))
-         (end-of-stack (+ (sap-int (sb!di::descriptor-sap sb!vm:*control-stack-start*))
-                          sb!c:*backend-page-size*))
+         (end-of-stack (+ (sap-int
+                           (sb!di::descriptor-sap sb!vm:*control-stack-start*))
+                          (* 2 sb!c:*backend-page-bytes*)))
          (initial-offset (logand csp (1- bytes-per-scrub-unit))))
     (labels
         ((scrub (ptr offset count)
@@ -289,13 +291,13 @@ command-line.")
 (defvar +++ nil #!+sb-doc "the previous value of ++")
 (defvar -   nil #!+sb-doc "the form currently being evaluated")
 
-(defun interactive-eval (form)
+(defun interactive-eval (form &key (eval #'eval))
   #!+sb-doc
   "Evaluate FORM, returning whatever it returns and adjusting ***, **, *,
 +++, ++, +, ///, //, /, and -."
   (setf - form)
   (unwind-protect
-       (let ((results (multiple-value-list (eval form))))
+       (let ((results (multiple-value-list (funcall eval form))))
          (setf /// //
                // /
                / results
@@ -381,29 +383,13 @@ command-line.")
       (dolist (option options)
         (process-1 option)))))
 
-;;; Skips past the shebang line on stream, if any.
-(defun maybe-skip-shebang-line (stream)
-  (let ((p (file-position stream)))
-    (flet ((next () (read-byte stream nil)))
-      (unwind-protect
-           (when (and (eq (next) (char-code #\#))
-                      (eq (next) (char-code #\!)))
-             (setf p nil)
-             (loop for x = (next)
-                   until (or (not x) (eq x (char-code #\newline)))))
-        (when p
-          (file-position stream p))))
-    t))
-
 (defun process-script (script)
-  (let ((pathname (native-pathname script))
-        (ok nil))
-    (unwind-protect
-         (with-open-file (f pathname :element-type :default)
-           (maybe-skip-shebang-line f)
-           (load f :verbose nil :print nil)
-           (setf ok t))
-      (quit :unix-status (if ok 0 1)))))
+  (let ((pathname (native-pathname script)))
+    (handling-end-of-the-world
+      (with-open-file (f pathname :element-type :default)
+        (sb!fasl::maybe-skip-shebang-line f)
+        (load f :verbose nil :print nil)
+        (quit)))))
 
 ;; Errors while processing the command line cause the system to QUIT,
 ;; instead of trying to go into the Lisp debugger, because trying to
@@ -619,7 +605,6 @@ that provides the REPL for the system. Assumes that *STANDARD-INPUT* and
                (with-simple-restart
                    (abort "~@<Exit debugger, returning to top level.~@:>")
                  (catch 'toplevel-catcher
-                   #!-win32 (sb!unix::reset-signal-mask)
                    ;; In the event of a control-stack-exhausted-error, we
                    ;; should have unwound enough stack by the time we get
                    ;; here that this is now possible.
@@ -637,6 +622,11 @@ that provides the REPL for the system. Assumes that *STANDARD-INPUT* and
 ;;; handle the Unix-style EOF-is-end-of-process convention.
 (defun repl-read-form-fun (in out)
   (declare (type stream in out) (ignore out))
+  ;; KLUDGE: *READ-SUPPRESS* makes the REPL useless, and cannot be
+  ;; recovered from -- flip it here.
+  (when *read-suppress*
+    (warn "Setting *READ-SUPPRESS* to NIL to restore toplevel usability.")
+    (setf *read-suppress* nil))
   (let* ((eof-marker (cons nil nil))
          (form (read in nil eof-marker)))
     (if (eq form eof-marker)