chiark
/
gitweb
/
~mdw
/
clg
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
bddc0ce
)
Misc changes the type query code
author
espen
<espen>
Tue, 29 May 2001 15:49:23 +0000
(15:49 +0000)
committer
espen
<espen>
Tue, 29 May 2001 15:49:23 +0000
(15:49 +0000)
glib/gobject.lisp
patch
|
blob
|
blame
|
history
glib/gtype.lisp
patch
|
blob
|
blame
|
history
diff --git
a/glib/gobject.lisp
b/glib/gobject.lisp
index be77962556d33081d828eb285650dcf9b2eef0c7..8b9a6515245b80320d6547d3dd804b6a8f50d825 100644
(file)
--- a/
glib/gobject.lisp
+++ b/
glib/gobject.lisp
@@
-15,7
+15,7
@@
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: gobject.lisp,v 1.
7 2001-05-11 16:08:08
espen Exp $
+;; $Id: gobject.lisp,v 1.
8 2001-05-29 15:50:31
espen Exp $
(in-package "GLIB")
(in-package "GLIB")
@@
-99,6
+99,7
@@
(defclass direct-gobject-slot-definition (direct-virtual-slot-definition)
(defclass effective-gobject-slot-definition
(effective-virtual-slot-definition)))
(defclass effective-gobject-slot-definition
(effective-virtual-slot-definition)))
+
; (defbinding object-class-install-param () nil
; (class pointer)
; (defbinding object-class-install-param () nil
; (class pointer)
@@
-133,30
+134,33
@@
(defmethod compute-virtual-slot-accessors
direct-slotds)
(with-slots (type) slotd
(let ((param-name (slot-definition-param (first direct-slotds)))
direct-slotds)
(with-slots (type) slotd
(let ((param-name (slot-definition-param (first direct-slotds)))
- (type-number (find-type-number type))
- (getter (intern-reader-function type))
- (setter (intern-writer-function type))
- (destroy (intern-destroy-function type)))
+ (type-number (find-type-number type)))
(list
#'(lambda (object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
(%object-get-property object param-name gvalue)
(prog1
(list
#'(lambda (object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
(%object-get-property object param-name gvalue)
(prog1
- (funcall getter gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-reader-function type) gvalue +gvalue-value-offset+)
(gvalue-free gvalue t)))))
#'(lambda (value object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
(gvalue-free gvalue t)))))
#'(lambda (value object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
- (funcall setter value gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-writer-function type)
+ value gvalue +gvalue-value-offset+)
(%object-set-property object param-name gvalue)
(%object-set-property object param-name gvalue)
- (funcall destroy gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-destroy-function type)
+ gvalue +gvalue-value-offset+)
(gvalue-free gvalue nil)
value)))))))
(defmethod validate-superclass ((class gobject-class)
(super pcl::standard-class))
(gvalue-free gvalue nil)
value)))))))
(defmethod validate-superclass ((class gobject-class)
(super pcl::standard-class))
- (subtypep (class-name super) 'gobject))
+; (subtypep (class-name super) 'gobject)
+ t)
@@
-166,13
+170,13
@@
(defbinding %object-class-properties () pointer
(class pointer)
(n-properties unsigned-int :out))
(class pointer)
(n-properties unsigned-int :out))
-(defun query-object-class-properties (type)
- (let ((class (type-class-ref type)))
+(defun query-object-class-properties (type
-number
)
+ (let ((class (type-class-ref type
-number
)))
(multiple-value-bind (array length)
(%object-class-properties class)
(map-c-array 'list #'identity array 'param length))))
(multiple-value-bind (array length)
(%object-class-properties class)
(map-c-array 'list #'identity array 'param length))))
-(defun query-object-
class-dependencies (class
)
+(defun query-object-
type-dependencies (type-number
)
(delete-duplicates
(reduce
#'nconc
(delete-duplicates
(reduce
#'nconc
@@
-180,11
+184,11
@@
(defun query-object-class-dependencies (class)
#'(lambda (param)
;; A gobject does not depend on it's supertypes due to forward
;; referenced superclasses
#'(lambda (param)
;; A gobject does not depend on it's supertypes due to forward
;; referenced superclasses
- (delete-if
- #'(lambda (type)
- (type-is-p
class
type))
+ (delete-if
+ #'(lambda (type)
+ (type-is-p
type-number
type))
(type-hierarchy (param-type param))))
(type-hierarchy (param-type param))))
- (query-object-class-properties
class
)))))
+ (query-object-class-properties
type-number
)))))
(defun default-slot-name (name)
(defun default-slot-name (name)
@@
-194,9
+198,10
@@
(defun default-slot-accessor (class-name slot-name type)
(intern
(format
nil "~A-~A~A" class-name slot-name
(intern
(format
nil "~A-~A~A" class-name slot-name
- (if (eq 'boolean type) "-
p
" ""))))
+ (if (eq 'boolean type) "-
P
" ""))))
-(defun expand-gobject-type (type-number &optional slots)
+(defun expand-gobject-type (type-number &optional slots
+ (metaclass 'gobject-class))
(let* ((super (supertype type-number))
(class (type-from-number type-number))
(expanded-slots
(let* ((super (supertype type-number))
(class (type-from-number type-number))
(expanded-slots
@@
-204,17
+209,24
@@
(defun expand-gobject-type (type-number &optional slots)
#'(lambda (param)
(with-slots (name flags type documentation) param
(let* ((slot-name (default-slot-name name))
#'(lambda (param)
(with-slots (name flags type documentation) param
(let* ((slot-name (default-slot-name name))
- (slot-type (type-from-number type))
+ (slot-type (type-from-number type
#|t|#
))
(accessor
(default-slot-accessor class slot-name slot-type)))
`(,slot-name
:allocation :param
:param ,name
(accessor
(default-slot-accessor class slot-name slot-type)))
`(,slot-name
:allocation :param
:param ,name
- ,@(when (member :writable flags)
+ ,@(cond
+ ((and
+ (member :writable flags)
+ (member :readable flags))
+ (list :accessor accessor))
+ ((member :writable flags)
(list :writer `(setf ,accessor)))
(list :writer `(setf ,accessor)))
- ,@(when (member :readable flags)
- (list :reader accessor))
- ,@(when (member :construct flags)
+ ((member :readable flags)
+ (list :reader accessor)))
+ ,@(when (or
+ (member :construct flags)
+ (member :writable flags))
(list :initarg (intern (string slot-name) "KEYWORD")))
:type ,slot-type
,@(when documentation
(list :initarg (intern (string slot-name) "KEYWORD")))
:type ,slot-type
,@(when documentation
@@
-223,11
+235,11
@@
(default-slot-accessor class slot-name slot-type)))
`(defclass ,class (,super)
,expanded-slots
`(defclass ,class (,super)
,expanded-slots
- (:metaclass
gobject-
class)
+ (:metaclass
,meta
class)
(:alien-name ,(find-type-name type-number)))))
(register-derivable-type
'gobject "GObject"
(:alien-name ,(find-type-name type-number)))))
(register-derivable-type
'gobject "GObject"
- :query 'query-object-
class
-dependencies
+ :query 'query-object-
type
-dependencies
:expand 'expand-gobject-type)
:expand 'expand-gobject-type)
diff --git
a/glib/gtype.lisp
b/glib/gtype.lisp
index b5c434b3032c5840f45684299dca18e31ace7458..f6d27f73b0ffb9bba8965f0cd65f5c927fb262ef 100644
(file)
--- a/
glib/gtype.lisp
+++ b/
glib/gtype.lisp
@@
-15,7
+15,7
@@
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: gtype.lisp,v 1.1
0 2001-05-11 16:04:3
3 espen Exp $
+;; $Id: gtype.lisp,v 1.1
1 2001-05-29 15:49:2
3 espen Exp $
(in-package "GLIB")
(in-package "GLIB")
@@
-93,8
+93,15
@@
(defun find-type-number (type &optional error)
(and error (error "Type not registered: ~A" type)))))
(pcl::class (find-type-number (class-name type) error))))
(and error (error "Type not registered: ~A" type)))))
(pcl::class (find-type-number (class-name type) error))))
-(defun type-from-number (type-number)
- (gethash type-number *number-to-type-hash*))
+(defun type-from-number (type-number &optional error)
+ (multiple-value-bind (type found)
+ (gethash type-number *number-to-type-hash*)
+ (when (and error (not found))
+ (let ((name (find-type-name type-number)))
+ (if name
+ (error "Type number not registered: ~A (~A)" type-number name)
+ (error "Invalid type number: ~A" type-number))))
+ type))
(defun type-from-name (name)
(etypecase name
(defun type-from-name (name)
(etypecase name
@@
-112,7
+119,7
@@
(defun init-type (init)
(funcall (mkbinding fname 'type-number)))
(mklist init)))
(funcall (mkbinding fname 'type-number)))
(mklist init)))
-(def
macro init-types-in-library (pathnam
e)
+(def
un %init-types-in-library (pathname ignor
e)
(let ((process (ext:run-program
"nm" (list (namestring (truename pathname)))
:output :stream :wait nil))
(let ((process (ext:run-program
"nm" (list (namestring (truename pathname)))
:output :stream :wait nil))
@@
-120,13
+127,20
@@
(defmacro init-types-in-library (pathname)
(labels ((read-symbols ()
(let ((line (read-line (ext:process-output process) nil)))
(when line
(labels ((read-symbols ()
(let ((line (read-line (ext:process-output process) nil)))
(when line
- (when (search "_get_type" line)
- (push (subseq line 11) fnames))
+ (let ((symbol (subseq line 11)))
+ (when (and
+ (search "_get_type" symbol)
+ (not (member symbol ignore :test #'string=)))
+ (push symbol fnames)))
(read-symbols)))))
(read-symbols)
(ext:process-close process)
`(init-type ',fnames))))
(read-symbols)))))
(read-symbols)
(ext:process-close process)
`(init-type ',fnames))))
+(defmacro init-types-in-library (pathname &key ignore)
+ (%init-types-in-library pathname ignore))
+
+
;;;; Superclass for wrapping types in the glib type system
;;;; Superclass for wrapping types in the glib type system
@@
-162,9
+176,10
@@
(defmethod shared-initialize ((class ginstance-class) names
(let* ((class-name (or name (class-name class)))
(type-number
(find-type-number
(let* ((class-name (or name (class-name class)))
(type-number
(find-type-number
- (or (first alien-name) (default-alien-type-name class-name)))))
+ (or (first alien-name) (default-alien-type-name class-name))
t
)))
(register-type class-name type-number)
(let ((size (or size (type-instance-size type-number))))
(register-type class-name type-number)
(let ((size (or size (type-instance-size type-number))))
+ (declare (special size))
(call-next-method)))
(when ref
(call-next-method)))
(when ref
@@
-201,7
+216,7
@@
(register-type 'long "glong")
(register-type 'unsigned-long "gulong")
(register-type 'single-float "gfloat")
(register-type 'double-float "gdouble")
(register-type 'unsigned-long "gulong")
(register-type 'single-float "gfloat")
(register-type 'double-float "gdouble")
-(register-type 'string "
GString
")
+(register-type 'string "
gchararray
")
;;;;
;;;;
@@
-218,18
+233,20
@@
(defun register-derivable-type (type id &key query expand)
(list type-number query expand)
*derivable-type-info*))))
(list type-number query expand)
*derivable-type-info*))))
+(defun find-type-info (type)
+ (dolist (super (cdr (type-hierarchy type)))
+ (let ((info (assoc super *derivable-type-info*)))
+ (return-if info))))
+
(defun type-dependencies (type)
(defun type-dependencies (type)
- (let ((query (second (assoc (car (last (type-hierarchy type)))
- *derivable-type-info*))))
+ (let ((query (second (find-type-info type))))
(when query
(funcall query (find-type-number type t)))))
(defun expand-type-definition (type)
(when query
(funcall query (find-type-number type t)))))
(defun expand-type-definition (type)
- (let ((expander (third (assoc (car (last (type-hierarchy type)))
- *derivable-type-info*))))
+ (let ((expander (third (find-type-info type))))
(funcall expander (find-type-number type t))))
(funcall expander (find-type-number type t))))
-
(defbinding type-parent (type) type-number
((find-type-number type t) type-number))
(defbinding type-parent (type) type-number
((find-type-number type t) type-number))
@@
-269,7
+286,7
@@
(defun find-types (prefix)
(dolist (type-info *derivable-type-info*)
(map-subtypes
#'(lambda (type-number)
(dolist (type-info *derivable-type-info*)
(map-subtypes
#'(lambda (type-number)
- (push type-number type-list))
+ (push
new
type-number type-list))
(first type-info) prefix))
type-list))
(first type-info) prefix))
type-list))
@@
-295,12
+312,20
@@
(defun %sort-types-topologicaly (unsorted)
(defun expand-type-definitions (prefix &optional args)
(flet ((type-options (type-number)
(let ((name (find-type-name type-number)))
(defun expand-type-definitions (prefix &optional args)
(flet ((type-options (type-number)
(let ((name (find-type-name type-number)))
- (cdr (assoc name args
s
:test #'string=)))))
+ (cdr (assoc name args :test #'string=)))))
(let ((type-list
(delete-if
#'(lambda (type-number)
(let ((type-list
(delete-if
#'(lambda (type-number)
- (getf (type-options type-number) :ignore nil))
+ (let ((name (find-type-name type-number)))
+ (or
+ (getf (type-options type-number) :ignore)
+ (find-if
+ #'(lambda (options)
+ (and
+ (string-prefix-p (first options) name)
+ (getf (cdr options) :ignore-prefix)))
+ args))))
(find-types prefix))))
(dolist (type-number type-list)
(find-types prefix))))
(dolist (type-number type-list)
@@
-315,5
+340,4
@@
(defun expand-type-definitions (prefix &optional args)
(%sort-types-topologicaly type-list))))))
(defmacro define-types-by-introspection (prefix &rest args)
(%sort-types-topologicaly type-list))))))
(defmacro define-types-by-introspection (prefix &rest args)
- `(eval-when (:compile-toplevel :load-toplevel :execute)
- ,(expand-type-definitions prefix args)))
\ No newline at end of file
+ (expand-type-definitions prefix args))