Hello Jocelyn,

I tried it out as well and got similar results. I also tried using load-time-value for the pointer cache in the hopes that making the DEFUN a top-level form would appease SBCL but that help too much.

Have you tried using a less smart compiler such as CCL ou CLISP?

--
Luís Oliveira
http://r42.eu/~luis

On Mar 17, 2012 11:28 AM, "Jocelyn Fréchot" <jocelyn_frechot@yahoo.fr> wrote:
On 17/03/2012 11:01, Luís Oliveira wrote:

At the end of gl/bindings.lisp there's an alternative implementation
of DEFGLEXTFUN that doesn't call compile or redefine anything. Does
that work better for you?

I tried this version:

(defmacro defglextfun ((cname lname) return-type &body args)
 (alexandria:with-unique-names (pointer)
   `(let ((,pointer (null-pointer)))
      (defun ,lname ,(mapcar #'car args)
        (when (null-pointer-p ,pointer)
          (setf ,pointer (gl-get-proc-address ,cname))
          (assert (not (null-pointer-p ,pointer)) ()
                  "Couldn't load symbol ~A~%" ,cname)
          (format t "Loaded function pointer for ~A: ~A~%" ,cname ,pointer)
          (push (lambda () (setf ,pointer (null-pointer)))
                *gl-extension-resetter-list*))
        (foreign-funcall-pointer
         ,pointer
         (:library opengl)
         ,@(loop for arg in args collect (second arg) collect (first arg))
         ,return-type)))))

However, compilation of gl/funcs.lisp fails due to heap exhaustion
(using SBCL 1.0.55).

--
Jocelyn