(cl:in-package #:sod)
+;;;--------------------------------------------------------------------------
+;;; Walking the layout tree.
+
+(defmethod hook-output progn ((class sod-class) reason sequencer)
+ (with-slots ((ilayout %ilayout) vtables methods effective-methods) class
+ (hook-output ilayout reason sequencer)
+ (dolist (method methods) (hook-output method reason sequencer))
+ (dolist (method effective-methods) (hook-output method reason sequencer))
+ (dolist (vtable vtables) (hook-output vtable reason sequencer))))
+
+(defmethod hook-output progn ((ilayout ilayout) reason sequencer)
+ (with-slots (ichains) ilayout
+ (dolist (ichain ichains) (hook-output ichain reason sequencer))))
+
+(defmethod hook-output progn ((ichain ichain) reason sequencer)
+ (dolist (item (ichain-body ichain))
+ (hook-output item reason sequencer)))
+
+(defmethod hook-output progn ((islots islots) reason sequencer)
+ (dolist (slot (islots-slots islots))
+ (hook-output slot reason sequencer)))
+
+(defmethod hook-output progn ((vtable vtable) reason sequencer)
+ (with-slots (body) vtable
+ (dolist (item body) (hook-output item reason sequencer))))
+
+(defmethod hook-output progn ((vtmsgs vtmsgs) reason sequencer)
+ (with-slots (entries) vtmsgs
+ (dolist (entry entries) (hook-output entry reason sequencer))))
+
;;;--------------------------------------------------------------------------
;;; Classes.
(terpri stream)))))
;; Generate vtmsgs structure for all superclasses.
- (hook-output (car (sod-class-vtables class))
- 'vtmsgs
- sequencer))
-
-(defmethod hook-output progn ((class sod-class) reason sequencer)
- (with-slots ((ilayout %ilayout) vtables methods effective-methods) class
- (hook-output ilayout reason sequencer)
- (dolist (method methods) (hook-output method reason sequencer))
- (dolist (method effective-methods) (hook-output method reason sequencer))
- (dolist (vtable vtables) (hook-output vtable reason sequencer))))
+ (hook-output (car (sod-class-vtables class)) 'vtmsgs sequencer))
;;;--------------------------------------------------------------------------
;;; Instance structure.
(pprint-c-type (sod-slot-type slot) stream (sod-slot-name slot)))
(terpri stream))))
-(defmethod hook-output progn ((ilayout ilayout) reason sequencer)
- (with-slots (ichains) ilayout
- (dolist (ichain ichains) (hook-output ichain reason sequencer))))
-
-(defmethod hook-output progn ((ichain ichain) reason sequencer)
- (dolist (item (ichain-body ichain))
- (hook-output item reason sequencer)))
-
(defmethod hook-output progn ((ilayout ilayout) (reason (eql :h)) sequencer)
(with-slots ((class %class) ichains) ilayout
(sequence-output (stream sequencer)
(format stream " const struct ~A *_vt;~%"
(vtable-struct-tag chain-tail chain-head))))))
-(defmethod hook-output progn ((islots islots) reason sequencer)
- (dolist (slot (islots-slots islots))
- (hook-output slot reason sequencer)))
-
(defmethod hook-output progn ((islots islots) (reason (eql :h)) sequencer)
(with-slots ((class %class) subclass slots) islots
(sequence-output (stream sequencer)
;;;--------------------------------------------------------------------------
;;; Vtable structure.
-(defmethod hook-output progn ((vtable vtable) reason sequencer)
- (with-slots (body) vtable
- (dolist (item body) (hook-output item reason sequencer))))
-
(defmethod hook-output progn ((method sod-method)
(reason (eql :h))
sequencer)
((subclass :vtmsgs class :end)
(format stream "};~2%"))))))
-(defmethod hook-output progn ((vtmsgs vtmsgs) reason sequencer)
- (with-slots (entries) vtmsgs
- (dolist (entry entries) (hook-output entry reason sequencer))))
-
(defmethod hook-output progn ((entry method-entry)
(reason (eql 'vtmsgs))
sequencer)
;;;--------------------------------------------------------------------------
;;; Implementation output.
+(export '*instance-class*)
(defvar *instance-class*)
(defmethod hook-output progn ((class sod-class) (reason (eql :c)) sequencer)
(let ((*instance-class* class))
(hook-output (sod-class-ilayout (sod-class-metaclass class))
- 'class
- sequencer)))
+ 'class sequencer)))
;;;--------------------------------------------------------------------------
;;; Direct and effective methods.