(in-package :smoke) (defstruct smoke-array "A C array." (pointer (null-pointer) :type foreign-pointer) (length 0 :type (smoke-index 0))) (defstruct smoke-module (pointer (null-pointer) :type foreign-pointer) (classes (make-smoke-array) :type smoke-array) (methods (make-smoke-array) :type smoke-array) (method-maps (make-smoke-array) :type smoke-array) (method-names (make-smoke-array) :type smoke-array) (types (make-smoke-array) :type smoke-array) (inheritance-list (null-pointer) :type foreign-pointer) (argument-list (null-pointer) :type foreign-pointer) (ambiguous-method-list (null-pointer) :type foreign-pointer)) (defvar *smoke-modules* (make-hash-table) "All loaded Smoke modules.") (eval-on-save () (clrhash *smoke-modules*)) (defmethod print-object ((smoke-module smoke-module) stream) (if (null-pointer-p (smoke-module-pointer smoke-module)) (call-next-method) (print-unreadable-object (smoke-module stream :type t :identity t) (princ (smoke-get-module-name (smoke-module-pointer smoke-module)) stream)))) (defun init-smoke-module (module) (let ((smoke (smoke-module-pointer module))) (setf (gethash (pointer-address smoke) *smoke-modules*) module) (flet ((mk-array (array) (make-smoke-array :pointer (cl-smoke-array smoke array) :length (cl-smoke-array-size smoke array)))) (setf (smoke-module-classes module) (mk-array :classes) (smoke-module-methods module) (mk-array :methods) (smoke-module-method-maps module) (mk-array :method-maps) (smoke-module-method-names module) (mk-array :method-names) (smoke-module-types module) (mk-array :types) (smoke-module-inheritance-list module) (cl-smoke-array smoke :inheritance-list) (smoke-module-argument-list module) (cl-smoke-array smoke :argument-list) (smoke-module-ambiguous-method-list module) (cl-smoke-array smoke :ambiguous-method-list)))))