Test return QVariant on the stack
Sun May 31 19:37:47 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Test return QVariant on the stack
diff -rN -u old-qt.tests/src/overload.lisp new-qt.tests/src/overload.lisp
--- old-qt.tests/src/overload.lisp 2014-10-28 12:29:10.000000000 +0100
+++ new-qt.tests/src/overload.lisp 2014-10-28 12:29:10.000000000 +0100
@@ -19,3 +19,37 @@
(sleep 3)
(5am:is (= 1 (counter object)))))
|#
+
+(defclass my-list-model (qt:abstract-list-model)
+ ((counter :accessor counter :initform 0))
+ (:metaclass cxx:class))
+
+(defmethod cxx:data ((list my-list-model) index role)
+ (incf (counter list))
+ (if (< (cxx:row index) 2)
+ (qt:make-variant (cxx:row index))
+ (qt:make-variant)))
+
+(defmethod cxx:row-count ((list my-list-model) parent)
+ 2)
+
+(5am:test return-on-stack
+ "Test virtual method return value on stack."
+ (let ((list (make-instance 'my-list-model))
+ (proxy (make-instance 'qt:sort-filter-proxy-model)))
+ (5am:is (= 0 (counter list)))
+ (setf (cxx:source-model proxy) list)
+ (dotimes (i 10) ;; test for faulty ownership transfer
+ (cxx:sort proxy 0)
+ (gc :full t))
+ (5am:is (< 0 (counter list)))))
+
+(5am:test return-on-stack-c++
+ (let ((list (make-instance
+ 'qt:string-list-model :args (list #("foo" "bar"))))
+ (proxy (make-instance 'qt:sort-filter-proxy-model)))
+ (setf (cxx:source-model proxy) list)
+ (dotimes (i 10) ;; test for faulty ownership transfer
+ (cxx:sort proxy 0)
+ (gc :full t))
+ (5am:is (= 2 (cxx:row-count list)))))