Advertisement
Guest User

Untitled

a guest
Jan 18th, 2019
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.06 KB | None | 0 0
  1. ;; idea here is to wrap a pointer with a type so we can avoid passing a pointer to a foo to something that expects a bar
  2.  
  3. (cffi:define-foreign-type pointer-wrapper ()
  4.   ((pointer
  5.     :initarg :pointer
  6.     :initform (cffi:null-pointer)
  7.     :reader pointer))
  8.   (:actual-type :pointer))
  9.  
  10. (defmacro define-foreign-pointer-wrapper (name)
  11.   `(progn
  12.      (cffi:define-foreign-type ,name (pointer-wrapper)
  13.        ()
  14.        (:simple-parser ,name))
  15.  
  16.      (defmethod cffi:translate-to-foreign (value (type ,name))
  17.        (check-type value ,name)
  18.        (pointer value))
  19.  
  20.      (defmethod cffi:translate-from-foreign (value (type ,name))
  21.        (make-instance ',name :pointer value))))
  22.  
  23. (define-foreign-pointer-wrapper ensure-foo)
  24. (define-foreign-pointer-wrapper ensure-bar)
  25.  
  26. (cffi:convert-to-foreign (make-instance 'ensure-bar ) 'ensure-foo) ;check-type error \o/
  27. (cffi:convert-to-foreign (make-instance 'ensure-bar ) 'ensure-bar)
  28. (cffi:convert-from-foreign #.(SB-SYS:INT-SAP #X00000123) 'ensure-foo)
  29. (cffi:convert-from-foreign #.(SB-SYS:INT-SAP #X00000456) 'ensure-bar)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement