[movitz-cvs] CVS movitz

ffjeld ffjeld at common-lisp.net
Fri May 5 18:37:32 UTC 2006


Update of /project/movitz/cvsroot/movitz
In directory clnet:/tmp/cvs-serv16165

Modified Files:
	compiler.lisp 
Log Message:
For &key args parsing, check that we have an even number of
keyword/value args.


--- /project/movitz/cvsroot/movitz/compiler.lisp	2006/05/02 19:59:55	1.169
+++ /project/movitz/cvsroot/movitz/compiler.lisp	2006/05/05 18:37:32	1.170
@@ -8,7 +8,7 @@
 ;;;; Created at:    Wed Oct 25 12:30:49 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: compiler.lisp,v 1.169 2006/05/02 19:59:55 ffjeld Exp $
+;;;; $Id: compiler.lisp,v 1.170 2006/05/05 18:37:32 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -4257,11 +4257,12 @@
 (defun add-bindings-from-lambda-list (lambda-list env)
   "From a (normal) <lambda-list>, add bindings to <env>."
   (let ((arg-pos 0))
-    (multiple-value-bind (required-vars optional-vars rest-var key-vars auxes allow-p min-args max-args edx-var)
+    (multiple-value-bind (required-vars optional-vars rest-var key-vars auxes allow-p min-args max-args edx-var oddeven)
 	(decode-normal-lambda-list lambda-list)
       (declare (ignore auxes))
       (setf (min-args env) min-args
 	    (max-args env) max-args
+	    (oddeven-args env) oddeven
 	    (allow-other-keys-p env) allow-p)
       (flet ((shadow-when-special (formal env)
 	       "Iff <formal> is special, return a fresh variable-name that takes <formal>'s place
@@ -4590,22 +4591,37 @@
 	    eax-ebx-code
 	    (make-stack-setup-code stack-setup-size)
 	    (when need-normalized-ecx-p
-	      (cond
-	       ;; normalize arg-count in ecx..
-	       ((and max-args (= min-args max-args))
-		(error "huh?"))
-	       ((and max-args (<= 0 min-args max-args #x7f))
-		`((:andl #x7f :ecx)))
-	       ((>= min-args #x80)
-		`((:shrl 8 :ecx)))
-	       (t (let ((normalize (make-symbol "normalize-ecx"))
-			(normalize-done (make-symbol "normalize-ecx-done")))
-		    `((:testb :cl :cl)
-		      (:js '(:sub-program (,normalize)
-			     (:shrl 8 :ecx)
-			     (:jmp ',normalize-done)))
-		      (:andl #x7f :ecx)
-		      ,normalize-done)))))
+	      (let ((oddeven-ok (gensym "oddeven-ok-")))
+		(append (cond
+			 ;; normalize arg-count in ecx..
+			 ((and max-args (= min-args max-args))
+			  (error "huh?"))
+			 ((and max-args (<= 0 min-args max-args #x7f))
+			  `((:andl #x7f :ecx)))
+			 ((>= min-args #x80)
+			  `((:shrl 8 :ecx)))
+			 (t (let ((normalize (make-symbol "normalize-ecx"))
+				  (normalize-done (make-symbol "normalize-ecx-done")))
+			      `((:testb :cl :cl)
+				(:js '(:sub-program (,normalize)
+				       (:shrl 8 :ecx)
+				       (:jmp ',normalize-done)))
+				(:andl #x7f :ecx)
+				,normalize-done))))
+			(when (and (oddeven-args env)
+				   (optional-vars env))
+			  `((:cmpl ,(length (optional-vars env)) :ecx)
+			    (:jbe ',oddeven-ok)))
+			(case (oddeven-args env)
+			  (:even
+			   `((:testb 1 :cl)
+			     (:jnz '(:sub-program () (:int 102)))))
+			  (:odd
+			   `((:testb 1 :cl)
+			     (:jz '(:sub-program () (:int 102))))))
+			(when (and (oddeven-args env)
+				   (optional-vars env))
+			  (list oddeven-ok)))))
 	    (when edx-needs-saving-p
 	      `((:movl :edx (:ebp ,(stack-frame-offset (new-binding-location (edx-var env) frame-map))))))
 	    eax-ebx-code-post-stackframe
@@ -6790,15 +6806,15 @@
 			 (append (make-load-lexical binding tmp-register funobj nil frame-map)
 				 `((:leal (,tmp-register -1) :ecx)
 				   (:testb 3 :cl)
-				   (:jnz '(:sub-program (,(gensym "endp-not-cons-"))
-					   (:int 66)))))))))
+				   (:jnz '(:sub-program (,(gensym "endp-not-list-"))
+					   (:int 61)))))))))
 	    (t (let ((tmp-register (or tmp-register :eax)))
 		 (append (make-load-lexical binding tmp-register funobj nil frame-map)
 			 (unless binding-is-list-p
 			   `((:leal (,tmp-register -1) :ecx)
 			     (:testb 3 :cl)
-			     (:jnz '(:sub-program (,(gensym "endp-not-cons-"))
-				     (:int 66)))))
+			     (:jnz '(:sub-program (,(gensym "endp-not-list-"))
+				     (:int 61)))))
 			 `((:cmpl :edi ,tmp-register))
 			 (make-result-and-returns-glue result-mode :boolean-zf=1)))))))))))
 	  




More information about the Movitz-cvs mailing list