X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/1818107e8198734df843841a51bca3713bd37596..00d59354c311fb28730b7c9b117b0d91aac092cc:/doc/output.tex diff --git a/doc/output.tex b/doc/output.tex index 29a8b4d..1615119 100644 --- a/doc/output.tex +++ b/doc/output.tex @@ -7,7 +7,7 @@ %%%----- Licensing notice --------------------------------------------------- %%% -%%% This file is part of the Sensble Object Design, an object system for C. +%%% This file is part of the Sensible Object Design, an object system for C. %%% %%% SOD is free software; you can redistribute it and/or modify %%% it under the terms of the GNU General Public License as published by @@ -25,87 +25,722 @@ \chapter{The output system} \label{ch:output} +This chapter deals with actually generating output files. It will be of +interest to programmers introducing new layout object classes, or new kinds +of output files. An understanding of the material in +\xref{sec:structures.layout} will prove valuable. + +%%%-------------------------------------------------------------------------- +\section{Output sequencing} \label{sec:output.sequencer} + +C compilers are picky about the order in which things are presented to them +in their input; but information about the structure of our classes is +scattered among a variety of different layout objects. It's not the case +that a layout object only contributes to a single localized portion of the +output: for example, a @|vtmsgs| layout object is responsible for declaring +both the appropriate @|struct $C$__vtmsgs_$a$| structure in the header file, +populated with method entry pointers, but also declaring its member in the +enclosing @|struct $C$__vt_$i$| structure. + +One approach would be to have the various layout objects just know how to +call each other in the right order so as to have everything come out +properly. That would make extending the translator, e.g., to add new kinds +of layout objects, rather difficult. And it doesn't let users insert custom +C fragments in flexible ways. + +Instead, there's a clear separation between which things need to be output, +and the order in which they're produced. + +Ordering is handled by a \emph{sequencer} object. A sequencer doesn't know +anything particular about output: its job is simply to do things in a +particular order. It's described here because Sod only uses it for output +scheduling. + +A sequencer maintains a collection of named \emph{items}, each of which has a +name and a list of functions associated with it. A name can be any Lisp +object. Names are compared using @|equal|, so lists can be used to construct +a hierarchical namespace. + +The sequencer also maintains a collection of \emph{constraints}, which take +the form of lists of item names. A constraint of the form @|($N_1$, $N_2$, +$\ldots$, $N_k$)| requires that the item named $N_1$ must be scheduled before +the item named $N_2$, and so on, all of which must be scheduled before the +item named $N_k$. Items with these names do not need to exist or be known to +the sequencer. An item name may appear in any number of constraints, all of +which apply. + +It might be that a collection of constraints is impossible to satisfy: for +example, the set +\begin{center} \codeface + (alice bob) \qquad (bob carol) \qquad (carol alice) +\end{center} +can't be satisfied, since the first constraint requires that @|alice| +precedes @|bob|, but the third says that @|alice| must come after @|carol|, +and the second that @|carol| comes after @|bob|: it's not possible that +@|alice| comes before @|bob| and after @|bob|. In this case, the sequencer +fails and signals an error of type @|inconsistent-merge-error|. + +It is possible, but tedious, to explicitly order an entire collection of +items by adding constraints. In the absence of explicit constraints to order +them, items are ordered according to the order in which constraints naming +them were first added to the sequencer. Items not named in any constraint +are not processed at all. + +For example, suppose we have the following constraints. +\begin{center} \codeface + (perl java) \qquad + (lisp java) \qquad + (python icon) \qquad + (icon perl) +\end{center} +The constraints give us that $@|python| < @|icon| < @|perl| < @|java|$, and +also $@|lisp| < @|java|$. In this case, @|lisp| precedes @|python| because +@|lisp| is mentioned in the second constraint while @|python| isn't mentioned +until the third. So the final processing order is +\begin{center} + @|lisp|, \quad + @|python|, \quad + @|icon|, \quad + @|perl|, \quad + @|java| +\end{center} + + +\begin{describe}{cls}{sequencer-item} + An object of class @|sequencer-item| represents a sequencer item. + Sequencer items maintain a \emph{name} and a list of \emph{functions}. + Names are compared using @|equal|. + + The functions are maintained in \emph{reverse order}, because it's + convenient to be able to add new functions using @|push|. +\end{describe} + +\begin{describe}{fun}{sequencer-item-p @ @> @} + Return non-nil if and only if @ is a @|sequencer-item|. +\end{describe} + +\begin{describe}{fun} + {make-sequencer-item @ \&optional @ @> @} + Create and return a new sequencer item with the given @ and list of + @; the list of functions defaults to nil if omitted. +\end{describe} + +\begin{describe*} + {\dhead{fun}{sequencer-item-name @ @> @} + \dhead{fun}{sequencer-item-functions @ @> @} + \dhead{fun}{setf (sequencer-item-functions @) @}} + These functions read or modify the state of a sequencer @, as + originally established by @|make-sequencer-item|. + + It is an error to modify an item's list of functions during a call to + @|invoke-sequencer-items| on the item's owning sequencer. +\end{describe*} + +\begin{describe}{cls}{sequencer () \&key :constraints} +\end{describe} + +\begin{describe*} + {\dhead{fun}{sequencer-constraints @ @> @} + \dhead{fun}{setf (sequencer-constraints @) @} + \dhead{fun}{sequencer-table @ @> @}} +\end{describe*} + +\begin{describe}{fun}{ensure-sequencer-item @ @ @> @} +\end{describe} + +\begin{describe}{fun}{add-sequencer-constraint @ @} +\end{describe} + +\begin{describe}{fun} + {add-sequencer-item-function @ @ @} +\end{describe} + +\begin{describe}{fun} + {invoke-sequencer-items @ \&rest @} +\end{describe} + +\begin{describe}{gf}{hook-output @ @ @} + \begin{describe}{meth}{t,t} + {hook-output (@ t) (@ t) @} + \end{describe} +\end{describe} + +\begin{describe}{mac} + {sequence-output (@ @) \\ \ind + @[ :constraint (@^*) @] \\ + @{ (@ @
^*) @}^*} +\end{describe} + +%%%-------------------------------------------------------------------------- +\section{Output structure} \label{output.structure} + +The structures of the header and implementation files produced by the +translator are detailed in tables~\ref{tab:output.structure.header} +and~\ref{tab:output.structure.impl}, respectively. + +The following notes may be helpful. +\begin{itemize} +\item The `specializers' shown in the tables identify the method of the + @|hook-output| function responsible for producing the corresponding + `contents'. Subclasses can extend or override the listed methods (with + appropriate care). +\item A row showing an `item' but no `specializers' indicate that the + translator does not prodice output for that item. It may be present for + ordering purposes, or as a place for user output. +\item A row showing `specializers' but (apparently) no `contents' indicates + that a blank line is emitted at that point. +\end{itemize} + +\begingroup +\LTleft=-\leftindent plus 1fil minus 1fil +\LTright=0pt plus 1fil minus 1fil +\small +\def\banner#1{\hbox to\hsize{/*@-@-@-@-@- #1 + \rlap{@-}\leaders\hbox{@-}\hfil\llap{@-}*/}} +\def\fmtspecs#1, #2 {@|#1|, @|(eql #2)|} +\def\slotlabel#1#2{\leavevmode\hbox to30mm{\kern#1em/* #2\hfil= */}} + +\clearpage +\begin{longtable}{>{\codeface}p{41mm}>{\fmtspecs}l>{\codeface}p{65mm}} + \caption{Header file output structure} + \label{tab:output.structure.header} \\ \hlx{hv} + \thd{Sequencer item} & \thd{@|hook-output| specializers} + & \thd{Output} \\ \hlx{vhv} + \endfirsthead + \caption[]{Header file output structure \emph{(cont.)}} \\ \hlx{hv} + \thd{Sequencer item} & \thd{@|hook-output| specializers} + & \thd{Contents} \\ \hlx{vhv} + \endhead + \hlx{vh} + \endfoot + x & sod-class-effective-slot, 'class & x \kill + % + :prologue & module, :h + & \begin{nprog} + /\=* @-*@- mode: c; indent-tabs-mode: nil @-*@- \\ + \>* \\ + \>* Header file generated by SOD for @ \\ + \>*/ \\ + \end{nprog} \\ \hlx{v/} + (:guard :start) & module, :h + & \begin{nprog} + \#ifndef @{}_H \\ + \#define @{}_H \\+ + \#ifdef __cplusplus \\ \ind + extern "C" \{ \-\\ + \#endif \\ + \end{nprog} \\ \hlx{v/} + % + (:typedefs :start) & module, :h + & \begin{nprog} \banner{Forward type declarations} \\ \end{nprog} + \\*\hlx{v} + :typedefs & sod-class, :h + & typedef struct @{}__ichain_@ @; \\*\hlx{v} + (:typedefs :end) & module, :h \\ \hlx{v/} + % + (:includes :start) & module, :h + & \begin{nprog} \banner{External header files} \\ \end{nprog} + \\*\hlx{v} + :includes \\*\hlx{v} + :early-decls & sod-class, :h + & SOD__VARARGS_MACRO_PREAMBLE \\*\hlx{v} + (:includes :end) & module, :h \\*\hlx{v} + % + (:early-user :start) \\* + :early \\* + (:early-user :end) \\ \hlx{v/} + % + (:classes :start) \\*\hlx{v} + % + (@ :banner) & sod-class, :h + & \begin{nprog} \banner{Class @} \\ \end{nprog} \\*\hlx{v} + % + (@ :islots :start) & sod-class, :h + & \begin{nprog} + /* Instance slots. */ \\ + struct @{}__islots \{ + \end{nprog} \\*\hlx{v} + (@ :islots :slots) & sod-slot, 'islots + & \quad @ @; \\*\hlx{v} + (@ :islots :end) & sod-class, :h + & \begin{nprog} \}; \\ \end{nprog} \\ \hlx{v/} + % + (@ :vtmsgs :start) \\* + (@ :vtmsgs @ :start) & vtmsgs, 'vtmsgs + & \begin{nprog} + /* Messages protocol from class @. */ \\* + struct @{}__vtmsgs_@ \{ + \end{nprog} \\*\hlx{v} + (@ :vtmsgs @ :slots) & method-entry, 'vtmsgs + & \quad @ (*msg)(@ *, \dots); \\*\hlx{v} + (@ :vtmsgs @ :end) & vtmsgs, 'vtmsgs + & \begin{nprog} \}; \\ \end{nprog} \\* + (@ :vtmsgs :end) \\ \hlx{v/} + % + (@ :vtables :start) \\* + \begin{nprog} + (@ \=:vtable \\ + \>@ :start) + \end{nprog} & vtable, :h + & \begin{nprog} + /* Vtable structure. */ \\* + struct @{}__vt_@ \{ + \end{nprog} \\*\hlx{v} + \begin{nprog} + (@ \=:vtable \\ + \>@ :slots) + \end{nprog} & class-pointer, :h + & \quad const @ *_class; \\* + \begin{nprog} + (@ \=:vtable \\ + \>@ :slots) + \end{nprog} & class-pointer, :h + & \quad const @ *_cls_@; \\* + \begin{nprog} + (@ \=:vtable \\ + \>@ :slots) + \end{nprog} & base-offset, :h + & \quad size_t _base; \\* + \begin{nprog} + (@ \=:vtable \\ + \>@ :slots) + \end{nprog} & chain-offset, :h + & \quad ptrdiff_t _off_@; \\* + \begin{nprog} + (@ \=:vtable \\ + \>@ :slots) + \end{nprog} & vmsgs, :h + & \quad struct @{}__vtmsgs_@ @; \\*\hlx{v} + \begin{nprog} + (@ \=:vtable \\ + \>@ :end) + \end{nprog} & vtable, :h + & \begin{nprog} + \}; \\+ + /* Union of equivalent superclass vtables. */ \\ + union @{}__vtu_@ \{ \\ \ind + struct @{}__vt_@ @; \\ + \quad $\vdots$ \-\\ + \}; \\ + \end{nprog} \\* + (@ :vtables :end) \\ + % + (@ :vtable-externs) & sod-class, :h + & /* Vtable structures. */ \\* + (@ :vtable-externs) & vtable, :h + & extern const union @{}__vtu_@ @{}__vtable_@; + \\* + (@ :vtable-externs-after) & sod-class, :h \\ \hlx{v/} + % + (@ :methods :start) & sod-class, :h + & /* Direct methods. */ \\* + (@ :methods :defs) & sod-method, :h + & \begin{nprog} + struct @{}__@{}_suppliedp_@{}__@ \{ \\ \ind + unsigned @: 1; \\ + \quad $\vdots$ \-\\ + \}; \\ + \end{nprog} \\*\hlx{v} + (@ :methods) & sod-method, :h + & struct @{}__@{}_method_@{}__@(\dots); + \\*\hlx{v} + (@ :methods :end) & sod-class, :h \\ \hlx{v/} + % + (@ :ichains :start) \\* + \begin{nprog} + (@ \=:ichains \\ + \>@ :start) + \end{nprog} & ichain, :h + & \begin{nprog} + /* Instance chain structure. */ \\ + struct @{}__ichain_@ \{ + \end{nprog} \\*\hlx{v} + \begin{nprog} + (@ \=:ichains \\ + \>@ :slots) + \end{nprog} & vtable-pointer, :h + & \quad const struct @{}__vt_@ *_vt; \\* + \begin{nprog} + (@ \=:ichains \\ + \>@ :slots) + \end{nprog} & islots, :h + & \quad struct @{}__islots @; \\*\hlx{v} + \begin{nprog} + (@ \=:ichains \\ + \>@ :end) + \end{nprog} & vtable, :h + & \begin{nprog} + \}; \\+ + /* Union of equivalent superclass chains. */ \\ + union @{}__ichainu_@ \{ \\ \ind + struct @{}__ichain_@ @; \\ + \quad $\vdots$ \-\\ + \}; \\ + \end{nprog} \\* + (@ :ichains :end) \\ \hlx{v/} + % + (@ :ilayout :start) & ilayout, :h + & \begin{nprog} + /* Instance layout. */ \\ + struct @{}__ilayout \{ + \end{nprog} \\*\hlx{v} + (@ :ilayout :slots) & ichain, 'ilayout + & \quad union @{}__ichainu_@; \\*\hlx{v} + (@ :ilayout :end) & ilayout, :h + & \begin{nprog} \}; \\ \end{nprog} \\ \hlx{v/} + % + (@ :conversions) & sod-class, :h + & \begin{nprog} + /* Conversion macros. */ \\ + \#define @{}__CONV_@(_obj) \dots \\ + \quad $\vdots$ \\ + \end{nprog} \\ \hlx{v/} + % + (@ :message-macros) & sod-class, :h + & \begin{nprog} + /* Message invocation macros. */ \\ + \#define @{}_@(me, \dots) \dots \\ + \quad $\vdots$ \\ + \end{nprog} \\ \hlx{v/} + % + (@ :object) & sod-class, :h + & \begin{nprog} + /* The class object. */ \\ + extern const struct @{}__ilayout @{}__classobj; \\ + \#define @{}__class (\&\dots) \\ + \#define @{}__cls_@ (\&\dots) \\ + \quad $\vdots$ \\ + \end{nprog} \\*\hlx{v} + % + (:classes :end) \\ \hlx{v/} + % + (:static-instances :start) & static-instance, :h + & \begin{nprog} \banner{Public static instances} \\ \end{nprog} + \\*\hlx{v} + :static-instances & static-instance, :h + & \begin{nprog} + extern $[@"const"]$ struct @{}__ilayout + @{}__instance; \\ + \#define @ (\&@{}__instance.@.@) + \end{nprog} \\* + (:static-instances :end) & static-instance, :h + & \\ \hlx{v/} + % + (:user :start) \\* + :user \\* + (:user :end) \\ \hlx{v/} + % + (:guard :end) & module, :h + & \begin{nprog} + \banner{That's all, folks} \\+ + \#ifdef __cplusplus \\ \ind + \} \-\\ + \#endif \\+ + \#endif + \end{nprog} \\*\hlx{v} + % + :epilogue \\ +\end{longtable} + +\clearpage +\begin{longtable}{>{\codeface}p{41mm}>{\fmtspecs}l>{\codeface}p{65mm}} + \caption{Implementation file output structure} + \label{tab:output.structure.impl} \\ \hlx{hv} + \thd{Sequencer item} & \thd{@|hook-output| specializers} + & \thd{Contents} \\ \hlx{vhv} + \endfirsthead + \caption[]{Implementation file output structure \emph{(cont.)}} + \\ \hlx{hv} + \thd{Sequencer item} & \thd{@|hook-output| specializers} + & \thd{Contents} \\ \hlx{vhv} + \endhead + \hlx{vh} + \endfoot + % + :prologue & module, :c + & \begin{nprog} + /\=* @-*@- mode: c; indent-tabs-mode: nil @-*@- \\ + \>* \\ + \>* Implementation file generated by SOD for @ \\ + \>*/ \\ + \end{nprog} \\ \hlx{v/} + % + (:includes :start) & module, :c + & \begin{nprog} + \banner{External header files} \\ + \end{nprog} \\*\hlx{v} + :includes \\*\hlx{v} + (:includes :end) & module, :c \\*\hlx{v} + % + (:early-user :start) \\* + :early \\* + (:early-user :end) \\ \hlx{v/} + % + (:static-instances :start) & static-instance, :c + & \begin{nprog} \banner{Static instance definitions} \\ \end{nprog} + \\*\hlx{v} + (:static-instances :decls) & static-instance, :c + & \begin{nprog} + /* Forward declarations. */ \\+ + static $[@"const"]$ struct @{}__ilayout + @{}__instance; \\ + \#define @ (\&@{}__instance.@.@) + \end{nprog} \\* + (:static-instances :gap) & static-instance, :c + & \\ + (@ :start) & sod-class, 'static-instance + & \begin{nprog} + /* Static instance `@'. */ \\ + $[@"static"]$ $[@"const"]$ struct @{}__ilayout + @{}__instance = \{ + \end{nprog} \\*\hlx{v} + (@ :chain @ :start) & ichain, 'static-instance + & \quad \{ \{ /* @ ichain */ \\* + (@ :vtable @) & vtable-pointer, 'static-instance + & \slotlabel{3}{_vt} \&@{}__vtable_@.@, \\* + (@ :slots @ :start) & islots, 'static-instance + & \quad\quad \{ /* Class @ */ \\* + (@ :slots @) & effective-slot, 'static-instance + & \slotlabel{4}{@} @, \\* + (@ :slots @ :end) & islots, 'static-instance + & \quad\quad \}, \\* + (@ :chain @ :end) & ichain, 'static-instance + & \quad \} \}, \\* + (@ :end) & sod-class, 'static-instance + & \begin{nprog} \}; \\ \end{nprog} \\ \hlx{v/} + % + (:classes :start) \\*\hlx{v} + % + (@ :banner) & sod-class, :c + & \begin{nprog} \banner{Class @} \\ \end{nprog} \\*\hlx{v} + % + (@ :direct-methods :start) \\*\hlx{v} + \begin{nprog} + (@ \=:direct-method \\ + \>@ :banner) + \end{nprog} & sod-method, :c + & /* Direct @ method on `@.@' defined by @. */ + \\*\hlx{v} + \begin{nprog} + (@ \=:direct-method \\ + \>@ :start) + \end{nprog} & delegating-direct-method, :c + & \#define CALL_NEXT_METHOD (next_method(\dots)) \\*\hlx{v} + \begin{nprog} + (@ \=:direct-method \\ + \>@ :body) + \end{nprog} & sod-method, :c + & \begin{nprog} + @ @{}__@{}_method_@{}__@(\dots) \\ + \{ \\ \ind + $\vdots$ \-\\ + \} + \end{nprog} \\*\hlx{v} + \begin{nprog} + (@ \=:direct-method \\ + \>@ :end) + \end{nprog} & delegating-direct-method, :c + & \#undef CALL_NEXT_METHOD \\* + \begin{nprog} + (@ \=:direct-method \\ + \>@ :end) + \end{nprog} & sod-method, :c \\*\hlx{v} + (@ :direct-methods :end) \\ \hlx{v/} + % + (@ :effective-methods) & basic-effective-method, :c + & \begin{nprog} + /\=* Keyword argument structure for `@.@' defined \\ + \>* on class @. \\ + \>*/ \\ + struct @{}__keywords_@{}__@ \{ \\ \ind + unsigned @{}__suppliedp: 1; \\ + \quad $\vdots$ \\ + @ @; \\ + \quad $\vdots$ \-\\ + \}; \\+ + @ \\ + \end{nprog} \\ \hlx{v/} + % + (@ :vtables :start) \\*\hlx{v} + (@ :vtable @ :start) & vtable, :c + & \begin{nprog} + /* Vtable for @ chain. */ \\ + const union @{}__vtu_@ @{}__vtable_@ = \{ + \end{nprog} \\*\hlx{v} + \begin{nprog} + (@ \=:vtable @ \\ + \>:class-pointer @) + \end{nprog} & class-pointer, :c + & \slotlabel{1}{_class} \&@{}__classobj.@.@, \\* + \begin{nprog} + (@ \=:vtable @ \\ + \>:class-pointer @) + \end{nprog} & class-pointer, :c + & \slotlabel{1}{_cls_@} \&@{}__classobj.@.@, \\* + \begin{nprog} + (@ \=:vtable @ \\ + \>:base-offset) + \end{nprog} & base-offset, :c + & \slotlabel{1}{_base} offsetof(\dots), \\* + \begin{nprog} + (@ \=:vtable @ \\ + \>:chain-offset @) + \end{nprog} & chain-offset, :c + & \slotlabel{1}{_off_@} SOD_OFFSETDIFF(\dots), \\* + \begin{nprog} + (@ \=:vtable @ \\ + \>:vtmsgs @ :start) + \end{nprog} & vtmsgs, :c + & \quad \{ /* Method entries for @ messags. */ \\* + \begin{nprog} + (@ \=:vtable @ \\ + \>:vtmsgs @ :slots) + \end{nprog} & method-entry, :c + & \slotlabel{2}{@} @, \\ + \begin{nprog} + (@ \=:vtable @ \\ + \>:vtmsgs @ :end) + \end{nprog} & vtmsgs, :c + & \quad \}, \\* + (@ :vtable @ :end) & vtable, :c + & \}; \\*\hlx{v} + (@ :vtables :end) \\ \hlx{v/} + % + (@ :object :prepare) & sod-class-effective-slot, 'class + & @ \\*\hlx{v} + % + (@ :object :start) & sod-class, :c + & \begin{nprog} + /* The class object. */ \\ + const struct @{}__ilayout @{}__classobj = \{ + \end{nprog} \\*\hlx{v} + % + \begin{nprog} + (@ \=:object \\ + \>@ :ichain :start) + \end{nprog} & ichain, 'class + & \quad \{ \{ /* @ ichain */ \\* + \begin{nprog} + (@ \=:object \\ + \>@ :ichain :start) + \end{nprog} & vtable-pointer, 'class + & \slotlabel{3}{_vt} \&@{}__vtable_@.@, \\* + \begin{nprog} + (@ \=:object \\ + \>@ :slots :start) + \end{nprog} & islots, 'class + & \quad\quad\quad \{ /* Class @ */ \\* + \begin{nprog} + (@ \=:object \\ + \>@ :slots) + \end{nprog} & effective-slot, 'class + & \slotlabel{4}{@} @ \\* + \begin{nprog} + (@ \=:object \\ + \>@ :slots :end) + \end{nprog} & islots, 'class + & \quad\quad\quad \} \\* + \begin{nprog} + (@ \=:object \\ + \>@ :ichain :end) + \end{nprog} & ichain, 'class + & \quad \} \}, \\* + (@ :object :end) & sod-class, :c + & \}; \\*\hlx{v} + % + (:classes :end) \\ \hlx{v/} + % + (:user :start) \\* + :user \\* + (:user :end) \\ \hlx{v/} + % + :epilogue & module, :c + & \banner{That's all, folks} \\ +\end{longtable} +\endgroup + +%%%-------------------------------------------------------------------------- +\section{Module output} \label{output.module} + +\subsection{Producing output} + +\begin{describe}{gf} + {module-output-file @ @ @ + @> @} + \begin{describe*} + {\dhead{meth}{module,symbol} + {module-output-file \=(@ module) \\ + \>(@ symbol) \\ + \>@ + \nlret @} + \dhead{meth}{module,pathname} + {module-output-file \=(@ module) \\ + \>(@ pathname) \\ + \>@ + \nlret @}} + \end{describe*} +\end{describe} + +\begin{describe}{gf}{write-dependency-file @ @ @} +\end{describe} + +\begin{describe}{fun}{output-module @ @ @} +\end{describe} + + +\subsection{Managing output types} \label{output.module.manage} + +\begin{describe}{fun}{declare-output-type @ @} +\end{describe} + +\begin{describe}{fun}{output-type-pathname @ @> @} +\end{describe} + + +\subsection{Utilities} \label{output.module.utilities} + +\begin{describe}{fun}{banner @ @<output> \&key :blank-line-p} +\end{describe} + +\begin{describe}{fun}{guard-name @<filename> @> @<string>} +\end{describe} + +\begin{describe}{fun} + {one-off-output @<token> @<sequencer> @<item-name> @<function>} +\end{describe} + %%%-------------------------------------------------------------------------- +\section{Class output} \label{output.class} + +\begin{describe}{var}{*instance-class*} +\end{describe} + +\begin{describe}{gf}{emit-class-typedef @<class> @<stream>} +\end{describe} + +\begin{describe}{gf}{emit-class-object-decl @<class> @<stream>} +\end{describe} + +\begin{describe}{gf}{emit-class-conversion-macro @<class> @<super> @<stream>} +\end{describe} + +\begin{describe*} + {\dhead{gf}{emit-message-macro @<class> @<entry> @<stream>} + \dhead{gf}{emit-message-macro-defn + \=@<class> @<entry> @<varargsp> @<me> \\ + \>@<in-names> @<out-names> @<stream>}} +\end{describe*} + +\begin{describe}{var}{*static-instance*} +\end{describe} + +\begin{describe}{gf}{declare-static-instance @<static-instance> @<stream>} +\end{describe} -%% output for `h' files -%% -%% prologue -%% guard start -%% typedefs start -%% typedefs -%% typedefs end -%% includes start -%% includes -%% includes end -%% classes start -%% CLASS banner -%% CLASS islots start -%% CLASS islots slots -%% CLASS islots end -%% CLASS vtmsgs start -%% CLASS vtmsgs CLASS start -%% CLASS vtmsgs CLASS slots -%% CLASS vtmsgs CLASS end -%% CLASS vtmsgs end -%% CLASS vtables start -%% CLASS vtables CHAIN-HEAD start -%% CLASS vtables CHAIN-HEAD slots -%% CLASS vtables CHAIN-HEAD end -%% CLASS vtables end -%% CLASS vtable-externs -%% CLASS vtable-externs-after -%% CLASS methods start -%% CLASS methods -%% CLASS methods end -%% CLASS ichains start -%% CLASS ichains CHAIN-HEAD start -%% CLASS ichains CHAIN-HEAD slots -%% CLASS ichains CHAIN-HEAD end -%% CLASS ichains end -%% CLASS ilayout start -%% CLASS ilayout slots -%% CLASS ilayout end -%% CLASS conversions -%% CLASS object -%% classes end -%% guard end -%% epilogue - -%% output for `c' files -%% -%% prologue -%% includes start -%% includes -%% includes end -%% classes start -%% CLASS banner -%% CLASS direct-methods start -%% CLASS direct-methods METHOD start -%% CLASS direct-methods METHOD body -%% CLASS direct-methods METHOD end -%% CLASS direct-methods end -%% CLASS effective-methods -%% CLASS vtables start -%% CLASS vtables CHAIN-HEAD start -%% CLASS vtables CHAIN-HEAD class-pointer METACLASS -%% CLASS vtables CHAIN-HEAD base-offset -%% CLASS vtables CHAIN-HEAD chain-offset TARGET-HEAD -%% CLASS vtables CHAIN-HEAD vtmsgs CLASS start -%% CLASS vtables CHAIN-HEAD vtmsgs CLASS slots -%% CLASS vtables CHAIN-HEAD vtmsgs CLASS end -%% CLASS vtables CHAIN-HEAD end -%% CLASS vtables end -%% CLASS object prepare -%% CLASS object start -%% CLASS object CHAIN-HEAD ichain start -%% CLASS object SUPER slots start -%% CLASS object SUPER slots -%% CLASS object SUPER vtable -%% CLASS object SUPER slots end -%% CLASS object CHAIN-HEAD ichain end -%% CLASS object end -%% classes end -%% epilogue +\begin{describe}{gf} + {output-static-instance-initializer @<static-instance> @<effective-slot> + @<stream>} +\end{describe} %%%----- That's all, folks --------------------------------------------------