It seems to be compiling a new lambda on every call. I'll walk through my logic below:
So I am looking at how (gen-buffers) is implemented.
(defun gen-buffers (count)
(with-foreign-object (buffer-array '%gl:uint count)
(%gl:gen-buffers count buffer-array)
(loop for i below count
collecting (mem-aref buffer-array '%gl:uint i))))
%gl:gen-buffers is deifned as
(defglextfun ("glGenBuffers" gen-buffers) :void
(n sizei)
(buffers (:pointer uint)))
which expands to:
(progn
(declaim (notinline gen-buffers))
(defun gen-buffers (n buffers)
(generate-gl-function "glgenbuffers" 'gen-buffers ':void
'((n sizei) (buffers (:pointer uint))) n buffers))
(setf (get 'gen-buffers 'proc-address-dummy) #'gen-buffers)
'gen-buffers)
and generate-gl-function
(defun generate-gl-function (foreign-name lisp-name result-type body &rest args)
(let ((address (gl-get-proc-address foreign-name))
(arg-list (mapcar #'first body)))
(when (or (not (pointerp address)) (null-pointer-p address))
(error "Couldn't find function ~A" foreign-name))
(compile lisp-name
`(lambda ,arg-list
(multiple-value-prog1
(foreign-funcall-pointer
,address
(:library opengl)
,@(loop for i in body
collect (second i)
collect (first i))
,result-type)
#-cl-opengl-no-check-error
(check-error ',lisp-name))))
(apply lisp-name args)))
What is going on here? I don't believe that it is recompiling the wrapper function on every call, but I'm having issues working out how else this works.
Hope someone can help me out here.
Cheers
Baggers