chiark / gitweb /
src/method-proto.lisp: Set `*keyword-struct-disposition*' properly.
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)
No idea where this one came from.

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

index 048c9249d3471f0f67eb402e419fd1a0b30d85fe..d0199975742c01efb6d11b010b3af8db20f7c756 100644 (file)
@@ -428,7 +428,8 @@ (defun make-trampoline (codegen super body)
                           (cons (make-argument *sod-key-pointer*
                                                (c-type (* (void :const))))
                                 raw-args))))
-        (*keyword-struct-disposition* t))
+        (*keyword-struct-disposition* (if (effective-method-keywords method)
+                                          :pointer :null)))
     (codegen-push codegen)
     (ensure-ilayout-var codegen super)
     (when (and (keyword-message-p message)
index f7f35378fe53c56554893bdc460bfe6ca647c63e..6bc775b1f3d9f0ea26fd6c0fa1bfa6e9b21deec4 100644 (file)
@@ -225,4 +225,27 @@ code c : tests {
   }
 }
 
+/*----- Keyword argument propagation --------------------------------------*/
+
+[link = SodObject, nick = base]
+class T3Base : SodObject {
+  void m0(?int x) { STEP(x); }
+  void m1(?) { }
+}
+
+[link = T3Base, nick = sub]
+class T3Sub : T3Base {
+  void base.m0(?int z) { STEP(z); CALL_NEXT_METHOD; }
+  void base.m1(?int z) { STEP(z); CALL_NEXT_METHOD; }
+}
+
+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);
+  }
+}
+
 /*----- That's all, folks -------------------------------------------------*/