[cl-opengl-devel] Extension functions re-defining themselves

Jocelyn Fréchot jocelyn_frechot at yahoo.fr
Sat Mar 17 11:28:32 UTC 2012


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




More information about the cl-opengl-devel mailing list