X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/bd691e21c3bc73f72bc9cc880cdfc10f05269542..376809b0b0b214c1af07ee37bae74f56e0e1e9a9:/gffi/proxy.lisp diff --git a/gffi/proxy.lisp b/gffi/proxy.lisp index 3bf5095..fac4af6 100644 --- a/gffi/proxy.lisp +++ b/gffi/proxy.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: proxy.lisp,v 1.1 2006/04/25 20:49:16 espen Exp $ +;; $Id: proxy.lisp,v 1.4 2006/08/16 12:09:03 espen Exp $ (in-package "GFFI") @@ -162,7 +162,7 @@ (funcall (instance-finalizer instance))) (slot-makunbound instance 'location) (cancel-finalization instance)) - ;; We can't cached invalidated instances in CLISP beacuse it is + ;; We can't cache invalidated instances in CLISP beacuse it is ;; not possible to cancel finalization #-clisp(cache-invalidated-instance instance)) @@ -241,14 +241,22 @@ (call-next-method)) (call-next-method))) + (defmethod slot-readable-p ((slotd effective-alien-slot-definition)) + (declare (ignore slotd)) + t) - (defmethod compute-slot-reader-function ((slotd effective-alien-slot-definition)) + (defmethod compute-slot-reader-function ((slotd effective-alien-slot-definition) &optional signal-unbound-p) + (declare (ignore signal-unbound-p)) (let* ((type (slot-definition-type slotd)) (offset (slot-definition-offset slotd)) (reader (reader-function type))) #'(lambda (object) (funcall reader (foreign-location object) offset)))) + (defmethod slot-writable-p ((slotd effective-alien-slot-definition)) + (declare (ignore slotd)) + t) + (defmethod compute-slot-writer-function ((slotd effective-alien-slot-definition)) (let* ((type (slot-definition-type slotd)) (offset (slot-definition-offset slotd)) @@ -260,7 +268,8 @@ (funcall writer value location offset)) value))) - (defmethod compute-slot-reader-function ((slotd effective-virtual-alien-slot-definition)) + (defmethod compute-slot-reader-function ((slotd effective-virtual-alien-slot-definition) &optional signal-unbound-p) + (declare (ignore signal-unbound-p)) (if (and (slot-boundp slotd 'getter) (stringp (slot-definition-getter slotd))) (let ((getter (slot-definition-getter slotd)) (type (slot-definition-type slotd)) @@ -282,12 +291,11 @@ (funcall writer (foreign-location object) value))) (call-next-method))) - (defconstant +struct-alignmen+ (size-of 'pointer)) - - (defun align-offset (size &optional packed-p) - (if (or packed-p (zerop (mod size +struct-alignmen+))) - size - (+ size (- +struct-alignmen+ (mod size +struct-alignmen+))))) + (defun adjust-offset (offset type &optional packed-p) + (let ((alignment (type-alignment type))) + (if (or packed-p (zerop (mod offset alignment))) + offset + (+ offset (- alignment (mod offset alignment)))))) (defmethod compute-slots ((class proxy-class)) (let ((alien-slots (remove-if-not @@ -297,17 +305,16 @@ (when alien-slots (loop with packed-p = (foreign-slots-packed-p class) - as offset = (align-offset + for slotd in alien-slots + as offset = (adjust-offset (foreign-size (most-specific-proxy-superclass class)) + (slot-definition-type slotd) packed-p) - then (align-offset - (+ - (slot-definition-offset slotd) - (size-of (slot-definition-type slotd))) - packed-p) - for slotd in alien-slots - unless (slot-boundp slotd 'offset) - do (setf (slot-value slotd 'offset) offset)))) + then (adjust-offset offset (slot-definition-type slotd) packed-p) + do (if (slot-boundp slotd 'offset) + (setf offset (slot-value slotd 'offset)) + (setf (slot-value slotd 'offset) offset)) + (incf offset (size-of (slot-definition-type slotd)))))) (call-next-method)) (defmethod validate-superclass ((class proxy-class) (super standard-class)) @@ -327,6 +334,10 @@ (assert-not-inlined type inlined) (size-of 'pointer)) +(define-type-method type-alignment ((type proxy) &key inlined) + (assert-not-inlined type inlined) + (type-alignment 'pointer)) + (define-type-method from-alien-form ((type proxy) form &key (ref :free)) (let ((class (type-expand type))) (ecase ref @@ -365,10 +376,6 @@ (funcall ref (foreign-location instance)))) #'foreign-location)) -(define-type-method size-of ((type proxy) &key inlined) - (assert-not-inlined type inlined) - (size-of 'pointer)) - (define-type-method writer-function ((type proxy) &key temp inlined) (assert-not-inlined type inlined) (if temp @@ -549,15 +556,15 @@ object at the give location.")) (when (and #?-(or (sbcl>= 0 9 8) (featurep :clisp))(class-finalized-p class) (not (slot-boundp class 'size))) - (let ((size (or - (loop - for slotd in slots - when (eq (slot-definition-allocation slotd) :alien) - maximize (+ - (slot-definition-offset slotd) - (size-of (slot-definition-type slotd)))) - 0))) - (setf (slot-value class 'size) (+ size (mod size +struct-alignmen+))))) + (setf (slot-value class 'size) + (or + (loop + for slotd in slots + when (eq (slot-definition-allocation slotd) :alien) + maximize (+ + (slot-definition-offset slotd) + (size-of (slot-definition-type slotd)))) + 0))) slots)) (define-type-method callback-wrapper ((type struct) var arg form) @@ -572,6 +579,15 @@ object at the give location.")) (foreign-size type) (size-of 'pointer))) +(define-type-method type-alignment ((type struct) &key inlined) + (if inlined + (let ((slot1 (find-if + #'(lambda (slotd) + (eq (slot-definition-allocation slotd) :alien)) + (class-slots (find-class type))))) + (type-alignment (slot-definition-type slot1))) + (type-alignment 'pointer))) + (define-type-method writer-function ((type struct) &key temp inlined) (if inlined (if temp