Changeset 12089
- Timestamp:
- 08/08/09 20:43:10 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp
r12087 r12089 61 61 62 62 ;; Returns a list of declared free specials, if any are found. 63 (declaim (ftype (function (list list) list) process-declarations-for-vars)) 64 (defun process-declarations-for-vars (body variables) 63 (declaim (ftype (function (list list block-node) list) 64 process-declarations-for-vars)) 65 (defun process-declarations-for-vars (body variables block) 65 66 (let ((free-specials '())) 66 67 (dolist (subform body) … … 85 86 (t 86 87 (dformat t "adding free special ~S~%" name) 87 (push (make-variable :name name :special-p t) 88 (push (make-variable :name name :special-p t 89 :block block) 88 90 free-specials)))))) 89 91 (TYPE … … 150 152 151 153 (defmacro p1-let/let*-vars 152 ( varlist variables-var var body1 body2)154 (block varlist variables-var var body1 body2) 153 155 (let ((varspec (gensym)) 154 156 (initform (gensym)) … … 166 168 (,initform (p1 (%cadr ,varspec))) 167 169 (,var (make-variable :name (check-name ,name) 168 :initform ,initform))) 170 :initform ,initform 171 :block ,block))) 169 172 (push ,var ,variables-var) 170 173 ,@body1)) 171 174 (t 172 (let ((,var (make-variable :name (check-name ,varspec)))) 175 (let ((,var (make-variable :name (check-name ,varspec) 176 :block ,block))) 173 177 (push ,var ,variables-var) 174 178 ,@body1)))) … … 176 180 177 181 (defknown p1-let-vars (t) t) 178 (defun p1-let-vars ( varlist)179 (p1-let/let*-vars 182 (defun p1-let-vars (block varlist) 183 (p1-let/let*-vars block 180 184 varlist vars var 181 185 () … … 187 191 188 192 (defknown p1-let*-vars (t) t) 189 (defun p1-let*-vars ( varlist)190 (p1-let/let*-vars 193 (defun p1-let*-vars (block varlist) 194 (p1-let/let*-vars block 191 195 varlist vars var 192 196 ((push var *visible-variables*) … … 213 217 (return))))) 214 218 (let ((vars (if (eq op 'LET) 215 (p1-let-vars varlist)216 (p1-let*-vars varlist))))219 (p1-let-vars block varlist) 220 (p1-let*-vars block varlist)))) 217 221 ;; Check for globally declared specials. 218 222 (dolist (variable vars) … … 224 228 ;; with the specified name. 225 229 (setf (block-free-specials block) 226 (process-declarations-for-vars body (reverse vars) ))230 (process-declarations-for-vars body (reverse vars) block)) 227 231 (setf (block-vars block) vars) 228 232 ;; Make free specials visible. … … 236 240 (let* ((*visible-variables* *visible-variables*) 237 241 (block (make-block-node '(LOCALLY))) 238 (free-specials (process-declarations-for-vars (cdr form) nil )))242 (free-specials (process-declarations-for-vars (cdr form) nil block))) 239 243 (setf (block-free-specials block) free-specials) 240 244 (dolist (special free-specials) … … 262 266 (let ((vars ())) 263 267 (dolist (symbol varlist) 264 (let ((var (make-variable :name symbol )))268 (let ((var (make-variable :name symbol :block block))) 265 269 (push var vars) 266 270 (push var *visible-variables*) … … 272 276 (block-environment-register block) t))) 273 277 (setf (block-free-specials block) 274 (process-declarations-for-vars body vars ))278 (process-declarations-for-vars body vars block)) 275 279 (dolist (special (block-free-specials block)) 276 280 (push special *visible-variables*)) … … 643 647 (*visible-variables* *visible-variables*)) 644 648 (setf (block-free-specials block) 645 (process-declarations-for-vars body nil ))649 (process-declarations-for-vars body nil block)) 646 650 (dolist (special (block-free-specials block)) 647 651 (push special *visible-variables*)) … … 673 677 (*visible-variables* *visible-variables*)) 674 678 (setf (block-free-specials block) 675 (process-declarations-for-vars body nil ))679 (process-declarations-for-vars body nil block)) 676 680 (dolist (special (block-free-specials block)) 677 681 (push special *visible-variables*)) … … 771 775 ;; We've already checked argument count in PRECOMPILE-PROGV. 772 776 773 ;; ### FIXME: we need to return a block here, so that774 ;; (local) GO in p2 can restore the lastSpecialBinding environment775 777 (let ((new-form (rewrite-progv form))) 776 778 (when (neq new-form form) … … 781 783 (*blocks* (cons block *blocks*)) 782 784 (body (cdddr form))) 785 ;; The (commented out) block below means to detect compile-time 786 ;; enumeration of bindings to be created (a quoted form in the symbols 787 ;; position). 788 ;; (when (and (quoted-form-p symbols-form) 789 ;; (listp (second symbols-form))) 790 ;; (dolist (name (second symbols-form)) 791 ;; (let ((variable (make-variable :name name :special-p t))) 792 ;; (push 783 793 (setf (block-form block) 784 794 `(progv ,symbols-form ,values-form ,@(p1-body body)) … … 1110 1120 (push var *visible-variables*))) 1111 1121 (setf (compiland-arg-vars compiland) (nreverse vars)) 1112 (let ((free-specials (process-declarations-for-vars body vars )))1122 (let ((free-specials (process-declarations-for-vars body vars nil))) 1113 1123 (setf (compiland-free-specials compiland) free-specials) 1114 1124 (dolist (var free-specials)
Note: See TracChangeset
for help on using the changeset viewer.