- (let ((location (call-next-method)))
- (if (or (stringp location) (consp location))
- (destructuring-bind (reader &optional writer) (mklist location)
- (with-slots (type) slotd
- (list
- (if (stringp reader)
- (let* ((alien-type (translate-type-spec type))
- (alien
- (alien::%heap-alien
- (alien::make-heap-alien-info
- :type (alien::parse-alien-type
- `(function ,alien-type system-area-pointer))
- :sap-form (system:foreign-symbol-address reader))))
- (translate-return-value
- (intern-return-value-translator type)))
- #'(lambda (object)
- (funcall
- translate-return-value
- (alien-funcall
- alien (proxy-location object)))))
- reader)
- (if (stringp writer)
- (let* ((alien-type (translate-type-spec type))
- (alien
- (alien::%heap-alien
- (alien::make-heap-alien-info
- :type (alien::parse-alien-type
- `(function
- void system-area-pointer ,alien-type))
- :sap-form (system:foreign-symbol-address writer))))
- (translate-argument (intern-argument-translator type))
- (cleanup (intern-cleanup-function type)))
- #'(lambda (value object)
- (let ((tmp (funcall translate-argument value))
- (location (proxy-location object)))
- (alien-funcall alien location tmp)
- (funcall cleanup tmp))))
- writer))))
- location)))
-
+ (destructuring-bind (getter setter) (call-next-method)
+ (let ((class-name (class-name class)))
+ (with-slots (type) slotd
+ (list
+ (if (stringp getter)
+ (let ((getter (mkbinding-late getter type 'pointer)))
+ #'(lambda (object)
+ (funcall getter (proxy-location object))))
+ getter)
+ (if (stringp setter)
+ (let ((setter (mkbinding-late setter 'nil 'pointer type)))
+ #'(lambda (value object)
+ (funcall setter (proxy-location object) value)))
+ setter))))))