Ignore:
Timestamp:
Jan 25, 2008, 10:21:30 AM (13 years ago)
Author:
gb
Message:

Be a little more defensive about null relative PC.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0711/ccl/lib/backtrace-lds.lisp

    r8023 r8284  
    3939(defun frame-supplied-args (frame lfun pc child context)
    4040  (declare (ignore child))
    41   (if (<= pc target::arg-check-trap-pc-limit)
    42     (values (arg-check-call-arguments frame lfun) nil nil)
    43     (let* ((arglist (arglist-from-map lfun))
    44            (args (arguments-and-locals context frame lfun pc))
    45            (state :required))
    46       (collect ((arg-values)
    47                 (types)
    48                 (names))
    49         (dolist (arg arglist)
    50           (if (or (member arg lambda-list-keywords)
    51                   (eq arg '&lexpr))
    52             (setq state arg)
    53             (let* ((pair (pop args)))
    54               (case state
    55                 (&lexpr
    56                  (with-list-from-lexpr (rest (cdr pair))
    57                    (dolist (r rest) (arg-values r) (names nil) (types nil)))
    58                  (return))
    59                 (&rest
    60                  (dolist (r (cdr pair)) (arg-values r) (names nil) (types nil))
    61                  (return))
    62                 (&key
    63                  (arg-values arg)
    64                  (names nil)
    65                  (types nil)))
    66               (let* ((value (cdr pair)))
    67                 (if (eq value (%unbound-marker))
    68                   (return))
    69                 (names (car pair))
    70                 (arg-values value)
    71                 (types nil)))))
    72         (values (arg-values) (types) (names))))))
     41  (if (null pc)
     42    (values nil nil nil)
     43    (if (<= pc target::arg-check-trap-pc-limit)
     44      (values (arg-check-call-arguments frame lfun) nil nil)
     45      (let* ((arglist (arglist-from-map lfun))
     46             (args (arguments-and-locals context frame lfun pc))
     47             (state :required))
     48        (collect ((arg-values)
     49                  (types)
     50                  (names))
     51          (dolist (arg arglist)
     52            (if (or (member arg lambda-list-keywords)
     53                    (eq arg '&lexpr))
     54              (setq state arg)
     55              (let* ((pair (pop args)))
     56                (case state
     57                  (&lexpr
     58                   (with-list-from-lexpr (rest (cdr pair))
     59                     (dolist (r rest) (arg-values r) (names nil) (types nil)))
     60                   (return))
     61                  (&rest
     62                   (dolist (r (cdr pair)) (arg-values r) (names nil) (types nil))
     63                   (return))
     64                  (&key
     65                   (arg-values arg)
     66                   (names nil)
     67                   (types nil)))
     68                (let* ((value (cdr pair)))
     69                  (if (eq value (%unbound-marker))
     70                    (return))
     71                  (names (car pair))
     72                  (arg-values value)
     73                  (types nil)))))
     74          (values (arg-values) (types) (names)))))))
    7375
    7476
Note: See TracChangeset for help on using the changeset viewer.