I do appreciate all your attention to my types GC issue so far but when Wim gave me this untested code:
(defmethod translate-to-foreign ((lisp-value cv-matrix) (c-type cv-mat))
(values (c-pointer lisp-value) lisp-value))
I thought it worked but I still had my mem-aref macro defined to access the c-pointer value so I didn't get a good test?
for example I'm referring to the lisp wrapper for this C function now, but it is identical to the cv-matrix one:
Scalar* cv_create_Scalar(double val0, double val1, double val2, double val3)
{
return new Scalar(val0, val1, val2, val3);
}
I now have my lisp wrapper and types/finalizers for the above c function defined like this:
(defcfun ("cv_create_Scalar" %scalar) scalar
(val0 :double)
(val1 :double)
(val2 :double)
(val3 :double))
(define-foreign-type scalar ()
((garbage-collect :reader garbage-collect :initform nil :initarg
:garbage-collect))
(:actual-type :pointer)
(:simple-parser scalar))
(defclass cv-scalar ()
((c-pointer :reader c-pointer :initarg :c-pointer)))
(defmethod translate-to-foreign ((lisp-value cv-scalar) (c-type scalar))
(values (c-pointer lisp-value) lisp-value)) <--the new version Wim gave me untested
(defmethod translate-from-foreign (c-pointer (c-type scalar))
(let ((scalar (make-instance 'cv-scalar :c-pointer c-pointer)))
(when (garbage-collect c-type)
(tg:finalize scalar (lambda () (del-scalar c-pointer))))
scalar))
When I run (defparameter a (%scalar 1d0 2d0 3d0 4d0)) and (mem-aref a :double) I still get:
The value #<CV-SCALAR {10046BC833}>
is not of type
SB-SYS:SYSTEM-AREA-POINTER.
but when I run (mem-aref (c-pointer a) :double) it works.
What do I have to change in my types so I can mem-aref "A" normally, like this
(mem-aref a :double)...Any help is much appreciated:)