doc/list-exports: Use `documentation' to find more categories.
[sod] / src / method-impl.lisp
index d0c7a54..f2d71aa 100644 (file)
 
 (export '(basic-effective-method
          effective-method-around-methods effective-method-before-methods
-         effective-method-after-methods))
+         effective-method-after-methods effective-method-functions))
 (defclass basic-effective-method (effective-method)
   ((around-methods :initarg :around-methods :initform nil
                   :type list :reader effective-method-around-methods)
                                                   set "v->kw")))
          (name (effective-method-keyword-parser-function-name method)))
 
+      ;; Deal with the special `kw.' keywords read via varargs.  We're
+      ;; building the dispatch up backwards, so if we do these first, they
+      ;; get checked last, which priviliges the function-specific arguments
+      ;; over these special effects.
+      (codegen-push codegen)
+      (call "vv" "va_arg" "*ap" (c-type (* (struct "kwval" :const))))
+      (call "nn" "va_arg" "*ap" c-type-size-t)
+      (call :void name "kw" *null-pointer* "vv" "nn")
+      (setf va-act (namecheck "k" "kw.tab"
+                             (codegen-pop-block codegen) va-act))
+
+      (codegen-push codegen)
+      (call "aap" "va_arg" "*ap" (c-type (* va-list)))
+      (call :void name "kw" "aap" *null-pointer* 0)
+      (setf va-act (namecheck "k" "kw.valist"
+                             (codegen-pop-block codegen) va-act))
+
+      ;; Deal with the special `kw.' keywords read from a table.
+      (codegen-push codegen)
+      (deliver-expr codegen "t"
+                   (format nil "(~A)v->val"
+                           (c-type (* (struct "kwtab" :const)))))
+      (call :void name "kw" *null-pointer* "t->v" "t->n")
+      (setf tab-act (namecheck "v->kw" "kw.tab"
+                              (codegen-pop-block codegen) tab-act))
+
+      (codegen-push codegen)
+      (convert "aap" (c-type (* va-list)))
+      (call :void name "kw" "aap" *null-pointer* 0)
+      (setf tab-act (namecheck "v->kw" "kw.valist"
+                              (codegen-pop-block codegen) tab-act))
+
       ;; Work through the keywords.  We're going to be building up the
       ;; conditional dispatch from the end, so reverse the (nicely sorted)
       ;; list before processing it.
          (setf tab-act (namecheck "v->kw" key-name
                                   (codegen-pop-block codegen) tab-act))))
 
-      ;; Deal with the special `kw.' keywords read via varargs.
-      (codegen-push codegen)
-      (call "vv" "va_arg" "*ap" (c-type (* (struct "kwval" :const))))
-      (call "nn" "va_arg" "*ap" c-type-size-t)
-      (call :void name "kw" *null-pointer* "vv" "nn")
-      (setf va-act (namecheck "k" "kw.tab"
-                             (codegen-pop-block codegen) va-act))
-
-      (codegen-push codegen)
-      (call "aap" "va_arg" "*ap" (c-type (* va-list)))
-      (call :void name "kw" "aap" *null-pointer* 0)
-      (setf va-act (namecheck "k" "kw.valist"
-                             (codegen-pop-block codegen) va-act))
-
       ;; Finish up the varargs loop.
       (emit-banner codegen "Parse keywords from the variable-length tail.")
       (codegen-push codegen)
        (emit-inst codegen
                   (make-if-inst "ap" (make-block-inst nil (list loop)))))
 
-      ;; Deal with the special `kw.' keywords read from a table.
-      (codegen-push codegen)
-      (deliver-expr codegen "t"
-                   (format nil "(~A)v->val"
-                           (c-type (* (struct "kwtab" :const)))))
-      (call :void name "kw" *null-pointer* "t->v" "t->n")
-      (setf tab-act (namecheck "v->kw" "kw.tab"
-                              (codegen-pop-block codegen) tab-act))
-
-      (emit-banner codegen "Parse keywords from the argument table.")
-      (codegen-push codegen)
-      (convert "aap" (c-type (* va-list)))
-      (call :void name "kw" "aap" *null-pointer* 0)
-      (setf tab-act (namecheck "v->kw" "kw.valist"
-                              (codegen-pop-block codegen) tab-act))
-
       ;; Finish off the table loop.
+      (emit-banner codegen "Parse keywords from the argument table.")
       (codegen-push codegen)
       (emit-inst codegen tab-act)
       (emit-inst codegen (make-expr-inst "v++"))