Update of /project/movitz/cvsroot/movitz/losp/muerte In directory clnet:/tmp/cvs-serv7674
Modified Files: basic-macros.lisp Log Message: Somewhat improved ecase (signal a type-error).
--- /project/movitz/cvsroot/movitz/losp/muerte/basic-macros.lisp 2008/03/20 22:50:01 1.75 +++ /project/movitz/cvsroot/movitz/losp/muerte/basic-macros.lisp 2008/04/09 18:01:34 1.76 @@ -9,7 +9,7 @@ ;;;; Created at: Wed Nov 8 18:44:57 2000 ;;;; Distribution: See the accompanying file COPYING. ;;;; -;;;; $Id: basic-macros.lisp,v 1.75 2008/03/20 22:50:01 ffjeld Exp $ +;;;; $Id: basic-macros.lisp,v 1.76 2008/04/09 18:01:34 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -375,10 +375,17 @@ (t `(compiled-case ,keyform ,@clauses))))
(defmacro ecase (keyform &rest clauses) - ;; "Not quite implemented.." - `(case ,keyform ,@clauses (t (error "~S fell through an ecase where the legal cases were ~S" - ,keyform - ',(mapcar #'first clauses))))) + (let ((ecase-var (gensym))) + `(let ((,ecase-var ,keyform)) + (case ,ecase-var + ,@clauses + (t (ecase-error ,ecase-var + ',(mapcan (lambda (clause) + (let ((x (car clause))) + (if (atom x) + (list x) + (copy-list x)))) + clauses)))))))
(define-compiler-macro asm-register (register-name) (if (member register-name '(:eax :ebx :ecx :untagged-fixnum-ecx :edx)) @@ -1117,11 +1124,17 @@
(define-compiler-macro boundp (symbol) `(with-inline-assembly-case () - (do-case (t :boolean-zf=0 :labels (boundp-done)) + (do-case (t :boolean-zf=0 :labels (boundp-done boundp-restart)) (:compile-form (:result-mode :ebx) ,symbol) + boundp-restart (:leal (:ebx ,(- (movitz:tag :null))) :ecx) (:testb 5 :cl) - (:jne '(:sub-program () (:int 66))) + (:jne '(:sub-program () + (:movl :ebx :eax) + (:load-constant symbol :edx) + (:int 60) + (:movl :eax :ebx) + (:jmp 'boundp-restart))) (:call-local-pf dynamic-variable-lookup) (:globally (:cmpl (:edi (:edi-offset new-unbound-value)) :eax)))))