/ src /
/src/bindings.lisp
1 (in-package :smoke)
2
3 (defstruct smoke-array
4 "A C array."
5 (pointer (null-pointer) :type foreign-pointer)
6 (length 0 :type (smoke-index 0)))
7
8 (defstruct smoke-module
9 (pointer (null-pointer) :type foreign-pointer)
10
11 (classes (make-smoke-array) :type smoke-array)
12 (methods (make-smoke-array) :type smoke-array)
13 (method-maps (make-smoke-array) :type smoke-array)
14 (method-names (make-smoke-array) :type smoke-array)
15 (types (make-smoke-array) :type smoke-array)
16
17 (inheritance-list (null-pointer) :type foreign-pointer)
18 (argument-list (null-pointer) :type foreign-pointer)
19 (ambiguous-method-list (null-pointer) :type foreign-pointer))
20
21 (defvar *smoke-modules* (make-hash-table)
22 "All loaded Smoke modules.")
23
24 (eval-on-save ()
25 (clrhash *smoke-modules*))
26
27 (defmethod print-object ((smoke-module smoke-module) stream)
28 (if (null-pointer-p (smoke-module-pointer smoke-module))
29 (call-next-method)
30 (print-unreadable-object (smoke-module stream :type t :identity t)
31 (princ (smoke-get-module-name (smoke-module-pointer smoke-module))
32 stream))))
33
34 (defun init-smoke-module (module)
35 (let ((smoke (smoke-module-pointer module)))
36 (setf (gethash (pointer-address smoke) *smoke-modules*)
37 module)
38 (flet ((mk-array (array)
39 (make-smoke-array :pointer (cl-smoke-array smoke array)
40 :length (cl-smoke-array-size smoke array))))
41 (setf (smoke-module-classes module) (mk-array :classes)
42 (smoke-module-methods module) (mk-array :methods)
43 (smoke-module-method-maps module) (mk-array :method-maps)
44 (smoke-module-method-names module) (mk-array :method-names)
45 (smoke-module-types module) (mk-array :types)
46
47 (smoke-module-inheritance-list module)
48 (cl-smoke-array smoke :inheritance-list)
49
50 (smoke-module-argument-list module)
51 (cl-smoke-array smoke :argument-list)
52
53 (smoke-module-ambiguous-method-list module)
54 (cl-smoke-array smoke :ambiguous-method-list)))))