chiark / gitweb /
src/method-proto.lisp (invoke-delegation-chain): Pass keyword args correctly.
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)
It's not correct to commit to `&sod__kw' or `sod__kw' for the entire
chain.  Typically, the first method gets called with `&sod__kw', but the
rest want plain `sod__kw'.

src/method-proto.lisp
test/test.sod

index d0199975742c01efb6d11b010b3af8db20f7c756..637c29e01561cf4025812fbb5715eb22fd677e70 100644 (file)
@@ -500,11 +500,9 @@ (defun invoke-delegation-chain (codegen target basic-tail chain kernel)
    nil."
 
   (let* ((message (codegen-message codegen))
-        (argument-tail (cond ((varargs-message-p message)
-                              (cons *sod-tmp-ap* basic-tail))
-                             ((keyword-message-p message)
-                              (cons (keyword-struct-pointer) basic-tail))
-                             (t basic-tail))))
+        (argument-tail (if (varargs-message-p message)
+                           (cons *sod-tmp-ap* basic-tail)
+                           basic-tail)))
     (labels ((next-trampoline (method chain)
               (if (or kernel chain)
                   (make-trampoline codegen (sod-method-class method)
@@ -515,9 +513,13 @@ (defun invoke-delegation-chain (codegen target basic-tail chain kernel)
               (if (null chain)
                   (funcall kernel target)
                   (let ((trampoline (next-trampoline (car chain)
-                                                     (cdr chain))))
+                                                     (cdr chain)))
+                        (tail (if (keyword-message-p message)
+                                  (cons (keyword-struct-pointer)
+                                        argument-tail)
+                                  argument-tail)))
                     (invoke-method codegen target
-                                   (cons trampoline argument-tail)
+                                   (cons trampoline tail)
                                    (car chain))))))
       (invoke chain target))))
 
index 6bc775b1f3d9f0ea26fd6c0fa1bfa6e9b21deec4..776228b11d4770cecc872e02f6980e5e006ab493 100644 (file)
@@ -233,8 +233,14 @@ class T3Base : SodObject {
   void m1(?) { }
 }
 
-[link = T3Base, nick = sub]
-class T3Sub : T3Base {
+[link = T3Base, nick = mid]
+class T3Mid : T3Base {
+  void base.m0(?int y) { STEP(y); CALL_NEXT_METHOD; }
+  void base.m1(?) { STEP(4); CALL_NEXT_METHOD; }
+}
+
+[link = T3Mid, nick = sub]
+class T3Sub : T3Mid {
   void base.m0(?int z) { STEP(z); CALL_NEXT_METHOD; }
   void base.m1(?int z) { STEP(z); CALL_NEXT_METHOD; }
 }
@@ -242,9 +248,9 @@ class T3Sub : T3Base {
 code c : tests {
   prepare("kwargs");
   { SOD_DECL(T3Sub, t, NO_KWARGS);
-    T3Base_m0(t, KWARGS(K(z, 0) K(x, 1)));
-    T3Base_m1(t, KWARGS(K(z, 2)));
-    DONE(3);
+    T3Base_m0(t, KWARGS(K(z, 0) K(y, 1) K(x, 2)));
+    T3Base_m1(t, KWARGS(K(z, 3)));
+    DONE(5);
   }
 }