Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; 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
- (cffi:define-foreign-type pointer-wrapper ()
- ((pointer
- :initarg :pointer
- :initform (cffi:null-pointer)
- :reader pointer))
- (:actual-type :pointer))
- (defmacro define-foreign-pointer-wrapper (name)
- `(progn
- (cffi:define-foreign-type ,name (pointer-wrapper)
- ()
- (:simple-parser ,name))
- (defmethod cffi:translate-to-foreign (value (type ,name))
- (check-type value ,name)
- (pointer value))
- (defmethod cffi:translate-from-foreign (value (type ,name))
- (make-instance ',name :pointer value))))
- (define-foreign-pointer-wrapper ensure-foo)
- (define-foreign-pointer-wrapper ensure-bar)
- (cffi:convert-to-foreign (make-instance 'ensure-bar ) 'ensure-foo) ;check-type error \o/
- (cffi:convert-to-foreign (make-instance 'ensure-bar ) 'ensure-bar)
- (cffi:convert-from-foreign #.(SB-SYS:INT-SAP #X00000123) 'ensure-foo)
- (cffi:convert-from-foreign #.(SB-SYS:INT-SAP #X00000456) 'ensure-bar)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement