From: Mark Wooding Date: Fri, 23 Aug 2019 12:01:41 +0000 (+0100) Subject: doc/output.tex: Replace the old output-item comments with big tables. X-Git-Url: https://git.distorted.org.uk/~mdw/sod/commitdiff_plain/a2a31a5d46c651d36ee2be58fa31588fca4840bd doc/output.tex: Replace the old output-item comments with big tables. Now the output structure is actually documented (somewhat) properly. All I have to do is keep the tables up-to-date somehow. --- diff --git a/doc/output.tex b/doc/output.tex index 456554c..b7bfa74 100644 --- a/doc/output.tex +++ b/doc/output.tex @@ -172,6 +172,449 @@ until the third. So the final processing order is \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/} + % + (: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/} + % + (: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} @@ -243,98 +686,6 @@ until the third. So the final processing order is \>@ @ @}} \end{describe*} -%% output for `h' files -%% -%% prologue -%% guard start -%% typedefs start -%% typedefs -%% typedefs end -%% includes start -%% includes -%% includes end -%% classes start -%% early-user start -%% early-user -%% early-user end -%% 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 -%% user start -%% user -%% user end -%% guard end -%% epilogue - -%% output for `c' files -%% -%% prologue -%% includes start -%% includes -%% includes end -%% early-user start -%% early-user -%% early-user 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 -%% user start -%% user -%% user end -%% epilogue - %%%----- That's all, folks -------------------------------------------------- %%% Local variables: