chiark / gitweb /
Code clean up and propper computation of foreign object sizes
[clg] / glib / gboxed.lisp
CommitLineData
55212af1 1;; Common Lisp bindings for GTK+ v2.x
2;; Copyright 2001-2005 Espen S. Johnsen <espen@users.sf.net>
b44caf77 3;;
55212af1 4;; Permission is hereby granted, free of charge, to any person obtaining
5;; a copy of this software and associated documentation files (the
6;; "Software"), to deal in the Software without restriction, including
7;; without limitation the rights to use, copy, modify, merge, publish,
8;; distribute, sublicense, and/or sell copies of the Software, and to
9;; permit persons to whom the Software is furnished to do so, subject to
10;; the following conditions:
b44caf77 11;;
55212af1 12;; The above copyright notice and this permission notice shall be
13;; included in all copies or substantial portions of the Software.
b44caf77 14;;
55212af1 15;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
7ce0497d 23;; $Id: gboxed.lisp,v 1.20 2006/02/04 12:15:31 espen Exp $
b44caf77 24
25(in-package "GLIB")
26
27
ce63ad97 28(defclass boxed (struct)
6baf860c 29 ()
30 (:metaclass struct-class))
b44caf77 31
29933e83 32(defmethod instance-finalizer ((instance boxed))
7ce0497d 33 (let ((location (foreign-location instance))
29933e83 34 (type-number (type-number-of instance)))
35 #'(lambda ()
36 (remove-cached-instance location)
37 (%boxed-free type-number location))))
38
b44caf77 39
40;;;; Metaclass for boxed classes
41
42(eval-when (:compile-toplevel :load-toplevel :execute)
6baf860c 43 (defclass boxed-class (struct-class)
935a783c 44 ())
b44caf77 45
6baf860c 46 (defmethod validate-superclass ((class boxed-class) (super standard-class))
47 (subtypep (class-name super) 'boxed)))
b44caf77 48
b44caf77 49
dcb31db6 50(defmethod shared-initialize ((class boxed-class) names &key name gtype)
51 (declare (ignore names))
6baf860c 52 (call-next-method)
dcb31db6 53 (let ((class-name (or name (class-name class))))
54 (unless (find-type-number class-name)
55 (register-type class-name
56 (or (first gtype) (default-type-init-name class-name))))))
6baf860c 57
29933e83 58(defbinding %boxed-copy () pointer
59 (type-number type-number)
6baf860c 60 (location pointer))
61
29933e83 62(defbinding %boxed-free () nil
63 (type-number type-number)
6baf860c 64 (location pointer))
65
66(defmethod reference-foreign ((class boxed-class) location)
29933e83 67 (%boxed-copy (find-type-number class) location))
6baf860c 68
69(defmethod unreference-foreign ((class boxed-class) location)
29933e83 70 (%boxed-free (find-type-number class) location))
b44caf77 71
72
3a935dfa 73;;;;
74
e9934f39 75(defun expand-boxed-type (type-number forward-p slots)
3a935dfa 76 `(defclass ,(type-from-number type-number) (boxed)
e9934f39 77 ,(unless forward-p
78 slots)
3a935dfa 79 (:metaclass boxed-class)
80031aba 80 (:gtype ,(register-type-as type-number))))
b44caf77 81
6895c081 82(register-derivable-type 'boxed "GBoxed" 'expand-boxed-type)
888d25fb 83
84;;;; Special boxed types
85
6baf860c 86;; (defclass gstring (boxed)
87;; ()
88;; (:metaclass boxed-class)
89;; (:alien-name "GString"))
90
91;; (deftype-method translate-from-alien
92;; gstring (type-spec location &optional weak-ref)
93;; `(let ((location ,location))
94;; (unless (null-pointer-p location)
95;; (prog1
96;; (c-call::%naturalize-c-string location)
97;; ,(unless weak-ref
98;; (unreference-alien type-spec location))))))
99
100;; (deftype-method translate-to-alien
101;; gstring (type-spec string &optional weak-ref)
102;; (declare (ignore weak-ref))
103;; `(let ((string ,string))
104;; ;; Always copy strings to prevent seg fault due to GC
105;; (funcall
106;; ',(proxy-class-copy (find-class type-spec))
107;; ',type-spec
108;; (make-pointer (1+ (kernel:get-lisp-obj-address string))))))
109
110;; (deftype-method cleanup-alien gstring (type-spec c-string &optional weak-ref)
111;; (when weak-ref
112;; (unreference-alien type-spec c-string)))
888d25fb 113
8574c8ad 114
115
48ae54db 116;;;; NULL terminated vector of strings
8574c8ad 117
48ae54db 118(deftype strings () '(null-terminated-vector string))
dcb31db6 119(register-type 'strings '|g_strv_get_type|)