1.0.9.19: Less magic constants in the mips backend.
[sbcl.git] / src / compiler / ir1tran-lambda.lisp
index 2486661..d882195 100644 (file)
       (binding* (((*lexenv* result-type post-binding-lexenv)
                   (process-decls decls (append aux-vars vars) nil
                                  :binding-form-p t))
-                 (forms (if (and maybe-add-debug-catch
-                                 *allow-instrumenting*
-                                 (policy *lexenv* (>= insert-debug-catch 2)))
+                 (debug-catch-p (and maybe-add-debug-catch
+                                     *allow-instrumenting*
+                                     (policy *lexenv*
+                                             (>= insert-debug-catch 2))))
+                 (forms (if debug-catch-p
                             (wrap-forms-in-debug-catch forms)
                             forms))
                  (forms (if (eq result-type *wild-type*)
         res))))
 
 (defun wrap-forms-in-debug-catch (forms)
+  #!+unwind-to-frame-and-call-vop
+  `((multiple-value-prog1
+      (progn
+        ,@forms)
+      ;; Just ensure that there won't be any tail-calls, IR2 magic will
+      ;; handle the rest.
+      (values)))
+  #!-unwind-to-frame-and-call-vop
   `( ;; Normally, we'll return from this block with the below RETURN-FROM.
     (block
         return-value-tag
                                      `(,(car x) .
                                        (macro . ,(coerce (cdr x) 'function))))
                                    macros)
+                     ;; Inherit MUFFLE-CONDITIONS from the call-site lexenv
+                     ;; rather than the definition-site lexenv, since it seems
+                     ;; like a much more common case.
+                     :handled-conditions (lexenv-handled-conditions *lexenv*)
                      :policy (lexenv-policy *lexenv*)))
           (*allow-instrumenting* (and (not system-lambda) *allow-instrumenting*)))
       (ir1-convert-lambda `(lambda ,@body)