Changeset 8461


Ignore:
Timestamp:
Feb 11, 2008, 6:54:25 AM (12 years ago)
Author:
gb
Message:

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
  • trunk/source/compiler/X86/x862.lisp

    r8355 r8461  
    49394939         (cstack *x862-cstack*)
    49404940         (vstack *x862-vstack*)
    4941          (target-cstack)
    49424941         (target-vstack)
    49434942         (lastcatch n)
    4944          (i nil)
    49454943         (returning (eq xfer $backend-return))
    49464944         (junk1 nil)
     
    49724970                     (setq numnthrow 0)
    49734971                     (multiple-value-setq (junk1 cstack vstack)
    4974                        (x862-decode-stack (aref *x862-undo-stack* lastcatch))))))
     4972                       (x862-decode-stack (aref *x862-undo-stack* lastcatch)))))
     4973                 (find-last-catch ()
     4974                   (do* ((n n)
     4975                         (reasons *x862-undo-because*))
     4976                        ((= n dest))
     4977                     (declare (fixnum n))
     4978                     (when (eql $undocatch (aref reasons (decf n)))
     4979                       (incf numnthrow)
     4980                       (setq lastcatch n)))))
     4981                           
     4982            (find-last-catch)
     4983            (throw-through-numnthrow-catch-frames)
     4984            (setq n lastcatch)
    49754985            (while (%i> n dest)
    4976               (cond ((eql $undocatch (setq reason (aref *x862-undo-because* (setq n (%i- n 1)))))
    4977                      (pop-temp-frames)
    4978                      (pop-c-frames)
    4979                      (setq numnthrow (%i+ numnthrow 1) lastcatch n))
    4980                     ((eql $undostkblk reason)
    4981                      (throw-through-numnthrow-catch-frames)
     4986              (setq reason (aref *x862-undo-because* (setq n (%i- n 1))))
     4987              (cond ((eql $undostkblk reason)
    49824988                     (incf num-temp-frames))
    49834989                    ((eql $undo-x86-c-frame reason)
    4984                      (throw-through-numnthrow-catch-frames)
    4985                      (incf num-c-frames))))
    4986             (throw-through-numnthrow-catch-frames)
    4987             (setq i lastcatch)
    4988             (while (%i> i dest)
    4989               (let ((reason (aref *x862-undo-because* (setq i (%i- i 1)))))
    4990                 (if (or (eql reason $undospecial)
     4990                     (incf num-c-frames))
     4991                    ((or (eql reason $undospecial)
    49914992                        (eql reason $undointerruptlevel))
    49924993                  (push reason unbind))))
     
    50085009                      (! slide-values))
    50095010                    (! adjust-vsp vdiff)))))
    5010             (setq num-temp-frames 0 num-c-frames 0)
    5011             (while (%i> lastcatch dest)
    5012               (let ((reason (aref *x862-undo-because* (setq lastcatch (%i- lastcatch 1)))))
    5013                 (setq target-cstack (nth-value 1
    5014                                                (x862-decode-stack (aref *x862-undo-stack* lastcatch))))
    5015                 (if (eq reason $undostkblk)
    5016                   (incf num-temp-frames))
    5017                 (if (eq reason $undo-x86-c-frame)
    5018                   (incf num-c-frames))
    5019                 (if (%i> cstack target-cstack)
    5020                   (compiler-bug "bug: adjust foreign stack ??"))
    5021                 ;; else what's going on? $sp-stkcons, for one thing
    5022                 (setq cstack target-cstack)))
    50235011            (pop-temp-frames)
    50245012            (pop-c-frames)))
Note: See TracChangeset for help on using the changeset viewer.