Update of /project/movitz/cvsroot/movitz In directory common-lisp.net:/tmp/cvs-serv29777
Modified Files: image.lisp Log Message: Added function set-file-position that tolerats the behavior of CLisp's file-position (on windows).
Date: Thu Dec 9 15:04:55 2004 Author: ffjeld
Index: movitz/image.lisp diff -u movitz/image.lisp:1.83 movitz/image.lisp:1.84 --- movitz/image.lisp:1.83 Thu Nov 25 19:05:17 2004 +++ movitz/image.lisp Thu Dec 9 15:04:54 2004 @@ -9,7 +9,7 @@ ;;;; Created at: Sun Oct 22 00:22:43 2000 ;;;; Distribution: See the accompanying file COPYING. ;;;; -;;;; $Id: image.lisp,v 1.83 2004/11/25 18:05:17 ffjeld Exp $ +;;;; $Id: image.lisp,v 1.84 2004/12/09 14:04:54 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -846,6 +846,16 @@ *i* (when (boundp '*image*) *image*)) *image*)
+(defun set-file-position (stream position &optional who) + (or (ignore-errors (file-position stream position)) + (let* ((end (file-position stream :end)) + (diff (- position end))) + (assert (< 0 diff 10000)) + (dotimes (i diff) + (write-byte 0 stream)) + (assert (= position (file-position stream))))) + (values)) + (defun dump-image (&key (path *default-image-file*) ((:image *image*) *image*) (multiboot-p t) ignore-dump-count) "When <multiboot-p> is true, include a MultiBoot-compliant header in the image." @@ -959,8 +969,7 @@ :direction :output :if-exists :supersede :if-does-not-exist :create) - (assert (file-position stream 512) () ; leave room for bootblock. - "Couldn't set file-position for ~W." (pathname stream)) + (set-file-position stream 512) ; leave room for bootblock. (let* ((stack-vector (make-instance 'movitz-basic-vector :num-elements #x3ffe :fill-pointer 0 @@ -978,12 +987,12 @@ (kernel-size (- image-end image-start))) (format t "~&;; Kernel size: ~D octets.~%" kernel-size) (unless (zerop (mod image-end 512)) ; Ensure image is multiple of 512 octets - (file-position stream (+ image-end (- 511 (mod image-end 512)))) + (set-file-position stream (+ image-end (- 511 (mod image-end 512))) 'pad-image-tail) (write-byte #x0 stream)) (format t "~&;; Image file size: ~D octets.~%" image-end) ;; Write simple stage1 bootblock into sector 0.. (format t "~&;; Dump count: ~D." (incf (dump-count *image*))) - (assert (file-position stream 0)) + (set-file-position stream 0) (flet ((global-slot-position (slot-name) (+ 512 (image-nil-word *image*) @@ -1004,13 +1013,12 @@ #+ignore(warn "stack-v-pos: ~S => ~S" stack-vector-position stack-vector-word) - (assert (file-position stream (global-slot-position 'stack-vector) - #+ignore stack-vector-position)) + (set-file-position stream (global-slot-position 'stack-vector) 'stack-vector) (write-binary 'word stream stack-vector-word) - (assert (file-position stream (global-slot-position 'stack-bottom))) + (set-file-position stream (global-slot-position 'stack-bottom) 'stack-bottom) (write-binary 'lu32 stream (+ 8 (* 4 4096) ; cushion (- stack-vector-word (tag :other)))) - (assert (file-position stream (global-slot-position 'stack-top))) + (set-file-position stream (global-slot-position 'stack-top) 'stack-top) (write-binary 'lu32 stream (+ 8 (- stack-vector-word (tag :other)) (* 4 (movitz-vector-num-elements stack-vector))))) (if (not multiboot-p) @@ -1030,10 +1038,7 @@ (warn "Multiboot header at position ~D is above the 8KB mark, ~ this image will not be Multiboot compatible." (+ mb-file-position (sizeof mb)))) - (assert (file-position stream mb-file-position) () - "Couldn't set file-position for ~W to ~W." - (pathname stream) - mb-file-position) + (set-file-position stream mb-file-position 'multiboot-header) ;; (format t "~&;; Multiboot load-address: #x~X." load-address) (setf (header-address mb) mb-address (load-address mb) load-address @@ -1077,7 +1082,7 @@ (assert (<= 0 pad-delta 31) () "pad-delta ~S for ~S, p: ~S, new-pos: ~S" pad-delta obj p new-pos)) (incf pad-size pad-delta)) - (assert (file-position stream new-pos))) + (set-file-position stream new-pos obj)) ;; (warn "Dump at address #x~X, filepos #x~X: ~A" p (file-position stream) obj) (let ((old-pos (file-position stream)) (write-size (write-binary-record obj stream))) @@ -1109,10 +1114,10 @@ (sum (+ symbols-size conses-size funobjs-size strings-size simple-vectors-size code-vectors-size pad-size))) (format t "~&;;~%;; ~D symbols (~D gensyms) (~,1F KB ~~ ~,1F%), ~D conses (~,1F KB ~~ ~,1F%), -;; ~D funobjs (~,1F KB ~~ ~,1F%), ~D strings (~,1F KB ~~ ~,1F%), -;; ~D simple-vectors (~,1F KB ~~ ~,1F%), ~D code-vectors (~,1F KB ~~ ~,1F%). -;; ~,1F KB (~,1F%) of padding. -;; In sum this accounts for ~,1F%, or ~D bytes.~%;;~%" +~D funobjs (~,1F KB ~~ ~,1F%), ~D strings (~,1F KB ~~ ~,1F%), +~D simple-vectors (~,1F KB ~~ ~,1F%), ~D code-vectors (~,1F KB ~~ ~,1F%). +~,1F KB (~,1F%) of padding. +In sum this accounts for ~,1F%, or ~D bytes.~%;;~%" symbols-numof gensyms-numof (/ symbols-size 1024) (/ (* symbols-size 100) total-size) conses-numof (/ conses-size 1024) (/ (* conses-size 100) total-size) @@ -1160,13 +1165,13 @@ (t #+ignore (warn "Package ~S ~@[for symbol ~S ~]is not a Movitz package." name symbol) name))) - (ensure-package (package-name lisp-package) + (ensure-package (package-name lisp-package &optional context) (assert (not (member (package-name lisp-package) #+allegro '(excl common-lisp sys aclmop) #-allegro '(common-lisp) :test #'string=)) () - "I don't think you really want to dump the package ~A with Movitz." - lisp-package) + "I don't think you really want to dump the package ~A ~@[for symbol ~S~] with Movitz." + lisp-package context) (setf (gethash lisp-package lisp-to-movitz-package) (or (gethash package-name packages-hash nil) (let ((p (funcall 'muerte::make-package-object @@ -1175,7 +1180,8 @@ :external-symbols (make-hash-table :test #'equal) :internal-symbols (make-hash-table :test #'equal) :use-list (mapcar #'(lambda (up) - (ensure-package (movitz-package-name (package-name up)) up)) + (ensure-package (movitz-package-name (package-name up)) + up context)) (package-use-list lisp-package))))) (setf (gethash package-name packages-hash) p) p))))) @@ -1188,7 +1194,7 @@ as package-name = (and lisp-package (movitz-package-name (package-name lisp-package) symbol)) when package-name - do (let* ((movitz-package (ensure-package package-name lisp-package))) + do (let* ((movitz-package (ensure-package package-name lisp-package symbol))) (multiple-value-bind (symbol status) (find-symbol (symbol-name symbol) (symbol-package symbol)) (ecase status @@ -1219,7 +1225,7 @@ ;;; do (when (string= symbol :method) ;;; (warn "XXXX ~S ~S ~S" symbol lisp-package package-name)) when package-name - do (let* ((movitz-package (ensure-package package-name lisp-package))) + do (let* ((movitz-package (ensure-package package-name lisp-package symbol))) (setf (movitz-symbol-package (movitz-read symbol)) (movitz-read movitz-package)))) movitz-packages))))