Changeset 14058


Ignore:
Timestamp:
08/05/12 20:27:10 (9 years ago)
Author:
ehuelsmann
Message:

Follow up to r14054, efficient arguments option variable references
for &rest and &key.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/clos.lisp

    r14055 r14058  
    12551255        (whole required optional rest keys aux)
    12561256      (parse-define-method-combination-args-lambda-list args-lambda-list)
     1257    (unless rest
     1258      (when keys
     1259        (setf rest (gensym))))
    12571260    (let* ((gf-lambda-list (gensym))
    12581261           (args-var (gensym))
     
    12731276                              `((,whole ',args-var)))
    12741277                      ,@(when rest
    1275                               `((,rest `(subseq ,',args-var
    1276                                                 (+ ,nreq ,nopt)))))
     1278                              `((,rest (progn
     1279                                         (push `(,',rest
     1280                                                 (subseq ,',args-var
     1281                                                          ,(+ nreq nopt)))
     1282                                               ,binding-forms)
     1283                                         ',rest))))
    12771284                        ,@(loop for var in required
    12781285                             and i upfrom 0
     
    13081315                                                    ,binding-forms)
    13091316                                              ',var-binding)))
    1310                         ,@(loop for ((key var) initform) in keys
     1317                        ,@(loop for ((key var) initform supplied-var) in keys
     1318                             for supplied-binding = (or supplied-var (gensym))
     1319                             for var-binding = (gensym)
    13111320                             ;; Same as optional parameters:
    13121321                             ;; even though keywords can't be supplied in
    13131322                             ;; excess, we should bind "supplied-p" in case
    13141323                             ;; the key isn't supplied in the arguments list
    1315                              collect `(,var `(getk (subseq ,',args-var
    1316                                                            (+ ,nreq ,nopt)) ,',key
    1317                                                            ,',initform)))
     1324                             collect `(,supplied-binding
     1325                                       (progn
     1326                                         (push `(,',supplied-binding
     1327                                                 (member ,',key ,',rest)))
     1328                                         ',supplied-binding))
     1329                             collect `(,var (progn
     1330                                              (push `(,',var-binding
     1331                                                      (if ,',supplied-binding
     1332                                                          (cadr ,',supplied-binding)
     1333                                                          ,',initform))
     1334                                                    ,binding-forms))))
    13181335                        ,@(loop for (var initform) in aux
    13191336                             for var-binding = (gensym)
Note: See TracChangeset for help on using the changeset viewer.