Changeset 8468


Ignore:
Timestamp:
Feb 11, 2008, 11:23:28 PM (12 years ago)
Author:
gb
Message:

(On 1.1 branch):Fix X862-NLEXIT: don't pop foreign/temp frames if
nthrow already did, try to coalesce nthrow calls, only adjust stacks
after last catch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/1.1/ccl/compiler/X86/x862.lisp

    r7766 r8468  
    49004900         (cstack *x862-cstack*)
    49014901         (vstack *x862-vstack*)
    4902          (target-cstack)
    49034902         (target-vstack)
    49044903         (lastcatch n)
    4905          (i nil)
    49064904         (returning (eq xfer $backend-return))
    49074905         (junk1 nil)
     
    49334931                     (setq numnthrow 0)
    49344932                     (multiple-value-setq (junk1 cstack vstack)
    4935                        (x862-decode-stack (aref *x862-undo-stack* lastcatch))))))
     4933                       (x862-decode-stack (aref *x862-undo-stack* lastcatch)))))
     4934                 (find-last-catch ()
     4935                   (do* ((n n)
     4936                         (reasons *x862-undo-because*))
     4937                        ((= n dest))
     4938                     (declare (fixnum n))
     4939                     (when (eql $undocatch (aref reasons (decf n)))
     4940                       (incf numnthrow)
     4941                       (setq lastcatch n)))))
     4942                           
     4943            (find-last-catch)
     4944            (throw-through-numnthrow-catch-frames)
     4945            (setq n lastcatch)
    49364946            (while (%i> n dest)
    4937               (cond ((eql $undocatch (setq reason (aref *x862-undo-because* (setq n (%i- n 1)))))
    4938                      (pop-temp-frames)
    4939                      (pop-c-frames)
    4940                      (setq numnthrow (%i+ numnthrow 1) lastcatch n))
    4941                     ((eql $undostkblk reason)
    4942                      (throw-through-numnthrow-catch-frames)
     4947              (setq reason (aref *x862-undo-because* (setq n (%i- n 1))))
     4948              (cond ((eql $undostkblk reason)
    49434949                     (incf num-temp-frames))
    49444950                    ((eql $undo-x86-c-frame reason)
    4945                      (throw-through-numnthrow-catch-frames)
    4946                      (incf num-c-frames))))
    4947             (throw-through-numnthrow-catch-frames)
    4948             (setq i lastcatch)
    4949             (while (%i> i dest)
    4950               (let ((reason (aref *x862-undo-because* (setq i (%i- i 1)))))
    4951                 (if (or (eql reason $undospecial)
     4951                     (incf num-c-frames))
     4952                    ((or (eql reason $undospecial)
    49524953                        (eql reason $undointerruptlevel))
    49534954                  (push reason unbind))))
     
    49694970                      (! slide-values))
    49704971                    (! adjust-vsp vdiff)))))
    4971             (setq num-temp-frames 0 num-c-frames 0)
    4972             (while (%i> lastcatch dest)
    4973               (let ((reason (aref *x862-undo-because* (setq lastcatch (%i- lastcatch 1)))))
    4974                 (setq target-cstack (nth-value 1
    4975                                                (x862-decode-stack (aref *x862-undo-stack* lastcatch))))
    4976                 (if (eq reason $undostkblk)
    4977                   (incf num-temp-frames))
    4978                 (if (eq reason $undo-x86-c-frame)
    4979                   (incf num-c-frames))
    4980                 (if (%i> cstack target-cstack)
    4981                   (error "bug: adjust foreign stack ??"))
    4982                 ;; else what's going on? $sp-stkcons, for one thing
    4983                 (setq cstack target-cstack)))
    49844972            (pop-temp-frames)
    49854973            (pop-c-frames)))
Note: See TracChangeset for help on using the changeset viewer.