- (let* ((class-name (or name (class-name class)))
- (type-number
- (cond
- ((and alien-name type-init)
- (error
- "Specify either :type-init or :alien-name for class ~A"
- class-name))
- (alien-name (type-number-from-alien-name (first alien-name)))
- (type-init (funcall (mkbinding (first type-init) 'type-number)))
- (t
- (or
- (type-number-from-alien-name
- (default-alien-type-name class-name) nil)
- (funcall
- (mkbinding
- (default-alien-fname (format nil "~A_get_type" class-name))
- 'type-number)))))))
- (setf (find-type-number class) type-number)))
-
-
-(defmethod validate-superclass
- ((class boxed-class) (super pcl::standard-class))
- (subtypep (class-name super) 'boxed))
-
-
-;;;; Initializing type numbers
-
-(setf (alien-type-name 'boxed) "GBoxed")
+(register-derivable-type 'boxed "GBoxed" 'expand-boxed-type)
+
+;;;; Special boxed types
+
+;; (defclass gstring (boxed)
+;; ()
+;; (:metaclass boxed-class)
+;; (:alien-name "GString"))
+
+;; (deftype-method translate-from-alien
+;; gstring (type-spec location &optional weak-ref)
+;; `(let ((location ,location))
+;; (unless (null-pointer-p location)
+;; (prog1
+;; (c-call::%naturalize-c-string location)
+;; ,(unless weak-ref
+;; (unreference-alien type-spec location))))))
+
+;; (deftype-method translate-to-alien
+;; gstring (type-spec string &optional weak-ref)
+;; (declare (ignore weak-ref))
+;; `(let ((string ,string))
+;; ;; Always copy strings to prevent seg fault due to GC
+;; (funcall
+;; ',(proxy-class-copy (find-class type-spec))
+;; ',type-spec
+;; (make-pointer (1+ (kernel:get-lisp-obj-address string))))))
+
+;; (deftype-method cleanup-alien gstring (type-spec c-string &optional weak-ref)
+;; (when weak-ref
+;; (unreference-alien type-spec c-string)))
+
+
+
+;;;; NULL terminated vector of strings
+
+(deftype strings () '(null-terminated-vector string))
+(register-type 'strings "GStrv")