Changeset 11704


Ignore:
Timestamp:
03/13/09 22:21:13 (13 years ago)
Author:
ehuelsmann
Message:

Restore lastSpecialBinding upon exception-driven LET/LET* block exit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp

    r11703 r11704  
    44694469         (form (block-form block))
    44704470         (*visible-variables* *visible-variables*)
    4471          (specialp nil))
     4471         (specialp nil)
     4472         (label-START (gensym))
     4473         (label-END (gensym))
     4474         (label-EXIT (gensym)))
    44724475    ;; Walk the variable list looking for special bindings and unused lexicals.
    44734476    (dolist (variable (block-vars block))
     
    44824485      (emit-push-current-thread)
    44834486      (emit 'getfield +lisp-thread-class+ "lastSpecialBinding" +lisp-special-binding+)
    4484       (astore (block-environment-register block)))
     4487      (astore (block-environment-register block))
     4488      (label label-START))
    44854489    (propagate-vars block)
    44864490    (ecase (car form)
     
    44974501      (compile-progn-body (cddr form) target representation))
    44984502    (when specialp
     4503      (emit 'goto label-EXIT)
     4504      (label label-END)
    44994505      ;; Restore dynamic environment.
    45004506      (aload *thread*)
    45014507      (aload (block-environment-register block))
    4502       (emit 'putfield +lisp-thread-class+ "lastSpecialBinding" +lisp-special-binding+))))
     4508      (emit 'putfield +lisp-thread-class+ "lastSpecialBinding"
     4509            +lisp-special-binding+)
     4510      (emit 'athrow)
     4511
     4512      (label label-EXIT)
     4513      (aload *thread*)
     4514      (aload (block-environment-register block))
     4515      (emit 'putfield +lisp-thread-class+ "lastSpecialBinding"
     4516            +lisp-special-binding+)
     4517
     4518      (push (make-handler :from label-START
     4519                          :to label-END
     4520                          :code label-END
     4521                          :catch-type 0) *handlers*))))
    45034522
    45044523(defun p2-locally (form target representation)
Note: See TracChangeset for help on using the changeset viewer.