From: Nikodemus S. <de...@us...> - 2004-11-08 15:28:09
|
Update of /cvsroot/sbcl/sbcl/src/compiler In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2988/src/compiler Modified Files: ir1-translators.lisp Log Message: 0.8.16.37: fixed #351 * Better error-handling and reporting for malformed LET and LET* forms. Index: ir1-translators.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/ir1-translators.lisp,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- ir1-translators.lisp 26 Oct 2004 17:51:17 -0000 1.62 +++ ir1-translators.lisp 8 Nov 2004 15:27:54 -0000 1.63 @@ -543,23 +543,26 @@ During evaluation of the Forms, bind the Vars to the result of evaluating the Value forms. The variables are bound in parallel after all of the Values are evaluated." - (if (null bindings) - (ir1-translate-locally body start next result) - (multiple-value-bind (forms decls) - (parse-body body :doc-string-allowed nil) - (multiple-value-bind (vars values) (extract-let-vars bindings 'let) - (binding* ((ctran (make-ctran)) - (fun-lvar (make-lvar)) - ((next result) - (processing-decls (decls vars nil next result) - (let ((fun (ir1-convert-lambda-body - forms - vars - :debug-name (debug-namify "LET S" - bindings)))) - (reference-leaf start ctran fun-lvar fun)) - (values next result)))) - (ir1-convert-combination-args fun-lvar ctran next result values)))))) + (cond ((null bindings) + (ir1-translate-locally body start next result)) + ((listp bindings) + (multiple-value-bind (forms decls) + (parse-body body :doc-string-allowed nil) + (multiple-value-bind (vars values) (extract-let-vars bindings 'let) + (binding* ((ctran (make-ctran)) + (fun-lvar (make-lvar)) + ((next result) + (processing-decls (decls vars nil next result) + (let ((fun (ir1-convert-lambda-body + forms + vars + :debug-name (debug-namify "LET S" + bindings)))) + (reference-leaf start ctran fun-lvar fun)) + (values next result)))) + (ir1-convert-combination-args fun-lvar ctran next result values))))) + (t + (compiler-error "Malformed LET bindings: ~S." bindings)))) (def-ir1-translator let* ((bindings &body body) start next result) @@ -567,17 +570,19 @@ "LET* ({(Var [Value]) | Var}*) Declaration* Form* Similar to LET, but the variables are bound sequentially, allowing each Value form to reference any of the previous Vars." - (multiple-value-bind (forms decls) - (parse-body body :doc-string-allowed nil) - (multiple-value-bind (vars values) (extract-let-vars bindings 'let*) - (processing-decls (decls vars nil start next) - (ir1-convert-aux-bindings start - next - result - forms - vars - values))))) - + (if (listp bindings) + (multiple-value-bind (forms decls) + (parse-body body :doc-string-allowed nil) + (multiple-value-bind (vars values) (extract-let-vars bindings 'let*) + (processing-decls (decls vars nil start next) + (ir1-convert-aux-bindings start + next + result + forms + vars + values)))) + (compiler-error "Malformed LET* bindings: ~S." bindings))) + ;;; logic shared between IR1 translators for LOCALLY, MACROLET, ;;; and SYMBOL-MACROLET ;;; |