Changeset 11816


Ignore:
Timestamp:
05/02/09 22:06:36 (14 years ago)
Author:
ehuelsmann
Message:

Selectively clear values in UNWIND-PROTECT:
don't clear if the protected form returns a single value.

File:
1 edited

Legend:

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

    r11814 r11816  
    78757875        (label BEGIN-PROTECTED-RANGE)
    78767876        (compile-form protected-form result-register nil)
    7877         (emit-push-current-thread)
    7878         (emit 'getfield +lisp-thread-class+ "_values" +lisp-object-array+)
    7879         (astore values-register)
     7877        (unless (single-valued-p protected-form)
     7878          (emit-push-current-thread)
     7879          (emit 'getfield +lisp-thread-class+ "_values" +lisp-object-array+)
     7880          (astore values-register))
    78807881        (label END-PROTECTED-RANGE))
    78817882      (dolist (subform cleanup-forms)
     
    78877888      (dolist (subform cleanup-forms)
    78887889        (compile-form subform nil nil))
    7889       (emit-clear-values)
     7890      (maybe-emit-clear-values cleanup-forms)
    78907891      (aload exception-register)
    78917892      (emit 'athrow) ; Re-throw exception.
    78927893      (label EXIT)
    78937894      ;; Restore multiple values returned by protected form.
    7894       (emit-push-current-thread)
    7895       (aload values-register)
    7896       (emit 'putfield +lisp-thread-class+ "_values" +lisp-object-array+)
     7895      (unless (single-valued-p protected-form)
     7896        (emit-push-current-thread)
     7897        (aload values-register)
     7898        (emit 'putfield +lisp-thread-class+ "_values" +lisp-object-array+))
    78977899      ;; Result.
    78987900      (aload result-register)
Note: See TracChangeset for help on using the changeset viewer.