diff --git a/compiler/codegen.lisp b/compiler/codegen.lisp index 1b1fd64bb61af1c211a69a81ccc7bf406b310dc6..7383e5bcb180c80f5769c28547b9f761b1ec1273 100644 --- a/compiler/codegen.lisp +++ b/compiler/codegen.lisp @@ -30,21 +30,26 @@ ;;; Generate-Code -- Interface ;;; (defun generate-code (component) - (do-ir2-blocks (block component) - (let ((1block (ir2-block-block block))) - (when (eq (block-info 1block) block) - (emit-label (block-label 1block)))) + (let ((prev-env nil)) + (do-ir2-blocks (block component) + (let* ((1block (ir2-block-block block)) + (lambda (block-lambda 1block))) + (when (and (eq (block-info 1block) block) lambda) + (emit-label (block-label 1block)) + (let ((env (lambda-environment lambda))) + (unless (eq env prev-env) + (let ((lab (gen-label))) + (setf (ir2-environment-elsewhere-start (environment-info env)) + lab) + (emit-label-elsewhere lab)) + (setq prev-env env))))) - (do ((vop (ir2-block-start-vop block) (vop-next vop))) - ((null vop)) - (let ((gen (vop-info-generator-function (vop-info vop)))) - (if gen - (funcall gen vop) - (format t "Missing generator for ~S.~%" - (template-name (vop-info vop))))))) + (do ((vop (ir2-block-start-vop block) (vop-next vop))) + ((null vop)) + (let ((gen (vop-info-generator-function (vop-info vop)))) + (if gen + (funcall gen vop) + (format t "Missing generator for ~S.~%" + (template-name (vop-info vop)))))))) (finish-assembly)) - - -;;;; Post-assembly: -;;;