chiark / gitweb /
src/method-proto.lisp (make-trampoline): Ignore unused keyword pointers.
authorMark Wooding <mdw@distorted.org.uk>
Sun, 26 Mar 2017 14:16:18 +0000 (15:16 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 22 Jul 2017 17:12:57 +0000 (18:12 +0100)
If we're not going to need a keyword pointer (because the applicable
methods have no keyword arguments) then ignore it explicitly.  (We can't
just omit the arguments, because direct-method functions may have to
work as part of an effective method which /does/ have keyword arguments
-- maybe even downstream -- and the trampoline functions must have the
same signature either way.)

src/method-proto.lisp

index 637c29e01561cf4025812fbb5715eb22fd677e70..6f8dc02c75396601e4cb36d07b4350bd2519fec2 100644 (file)
@@ -432,11 +432,13 @@ (defun make-trampoline (codegen super body)
                                           :pointer :null)))
     (codegen-push codegen)
     (ensure-ilayout-var codegen super)
-    (when (and (keyword-message-p message)
-              (not (eq *keyword-struct-disposition* :null)))
-      (let ((tag (effective-method-keyword-struct-tag method)))
-       (ensure-var codegen *sod-keywords* (c-type (* (struct tag :const)))
-                   *sod-key-pointer*)))
+    (when (keyword-message-p message)
+      (if (eq *keyword-struct-disposition* :null)
+         (deliver-call codegen :void "SOD__IGNORE" *sod-key-pointer*)
+         (let ((tag (effective-method-keyword-struct-tag method)))
+           (ensure-var codegen *sod-keywords*
+                       (c-type (* (struct tag :const)))
+                       *sod-key-pointer*))))
     (funcall body (codegen-target codegen))
     (codegen-pop-function codegen (temporary-function)
                          (c-type (fun (lisp return-type)