Ignore:
Timestamp:
May 21, 2021, 4:48:10 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum, stuck-waitfor-destruct
Children:
f1bce515
Parents:
5407cdc (diff), 7404cdc (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/andrew_beach_MMath/features.tex

    r5407cdc r8d66610  
    2020\subparagraph{Raise}
    2121The raise is the starting point for exception handling. It marks the beginning
    22 of exception handling by \newterm{raising} an excepion, which passes it to
     22of exception handling by raising an excepion, which passes it to
    2323the EHM.
    2424
    2525Some well known examples include the @throw@ statements of \Cpp and Java and
    26 the \codePy{raise} statement from Python. In real systems a raise may preform
    27 some other work (such as memory management) but for the purposes of this
    28 overview that can be ignored.
     26the \code{Python}{raise} statement from Python. In real systems a raise may
     27preform some other work (such as memory management) but for the
     28purposes of this overview that can be ignored.
    2929
    3030\subparagraph{Handle}
     
    9393A handler labelled with any given exception can handle exceptions of that
    9494type or any child type of that exception. The root of the exception hierarchy
    95 (here \codeC{exception}) acts as a catch-all, leaf types catch single types
     95(here \code{C}{exception}) acts as a catch-all, leaf types catch single types
    9696and the exceptions in the middle can be used to catch different groups of
    9797related exceptions.
     
    101101between different sub-hierarchies.
    102102This design is used in \CFA even though it is not a object-orientated
    103 language using different tools to create the hierarchy.
     103language; so different tools are used to create the hierarchy.
    104104
    105105% Could I cite the rational for the Python IO exception rework?
     
    123123\section{Virtuals}
    124124Virtual types and casts are not part of \CFA's EHM nor are they required for
    125 any EHM. But \CFA uses a hierarchial system of exceptions and this feature
    126 is leveraged to create that.
    127 
    128 % Maybe talk about why the virtual system is so minimal.
    129 % Created for but not a part of the exception system.
     125any EHM.
     126However the \CFA uses a hierarchy built with the virtual system as the basis
     127for exceptions and exception matching.
     128
     129The virtual system would have ideally been part of \CFA before the work
     130on exception handling began, but unfortunately it was not.
     131Because of this only the features and framework needed for the EHM were
     132designed and implemented. Other features were considered to ensure that
     133the structure could accomidate other desirable features but they were not
     134implemented.
     135The rest of this section will only discuss the finalized portion of the
     136virtual system.
    130137
    131138The virtual system supports multiple ``trees" of types. Each tree is
     
    143150It is important to note that these are virtual members, not virtual methods
    144151of object-orientated programming, and can be of any type.
    145 However, since \CFA has function pointers and they are allowed, virtual
    146 members can be used to mimic virtual methods.
     152\CFA still supports virtual methods as a special case of virtual members.
     153Function pointers that take a pointer to the virtual type will be modified
     154with each level of inheritance so that refers to the new type.
     155This means an object can always be passed to a function in its virtual table
     156as if it were a method.
    147157
    148158Each virtual type has a unique id.
     
    175185While much of the virtual infrastructure is created, it is currently only used
    176186internally for exception handling. The only user-level feature is the virtual
    177 cast, which is the same as the \Cpp \lstinline[language=C++]|dynamic_cast|.
     187cast, which is the same as the \Cpp \code{C++}{dynamic_cast}.
    178188\label{p:VirtualCast}
    179189\begin{cfa}
     
    197207\begin{cfa}
    198208trait is_exception(exceptT &, virtualT &) {
    199         virtualT const & get_exception_vtable(exceptT *);
     209        // Numerous imaginary assertions.
    200210};
    201211\end{cfa}
    202212The trait is defined over two types, the exception type and the virtual table
    203 type. This should be one-to-one: each exception type has only one virtual
    204 table type and vice versa. The only assertion in the trait is
    205 @get_exception_vtable@, which takes a pointer of the exception type and
    206 returns a reference to the virtual table type instance.
    207 
    208 % TODO: This section, and all references to get_exception_vtable, are
    209 % out-of-data. Perhaps wait until the update is finished before rewriting it.
    210 The function @get_exception_vtable@ is actually a constant function.
    211 Regardless of the value passed in (including the null pointer) it should
    212 return a reference to the virtual table instance for that type.
    213 The reason it is a function instead of a constant is that it make type
    214 annotations easier to write as you can use the exception type instead of the
    215 virtual table type; which usually has a mangled name.
    216 % Also \CFA's trait system handles functions better than constants and doing
    217 % it this way reduce the amount of boiler plate we need.
     213type. Each exception type should have but a single virtual table type.
     214Now there are no actual assertions in this trait because the trait system
     215actually can't express them (adding such assertions would be part of
     216completing the virtual system). The imaginary assertions would probably come
     217from a trait defined by the virtual system, and state that the exception type
     218is a virtual type, is a decendent of @exception_t@ (the base exception type)
     219and note its virtual table type.
    218220
    219221% I did have a note about how it is the programmer's responsibility to make
     
    235237Both traits ensure a pair of types are an exception type and its virtual table
    236238and defines one of the two default handlers. The default handlers are used
    237 as fallbacks and are discussed in detail in \VRef{s:ExceptionHandling}.
     239as fallbacks and are discussed in detail in \vref{s:ExceptionHandling}.
    238240
    239241However, all three of these traits can be tricky to use directly.
     
    351353for particular exception type.
    352354The global default termination handler performs a cancellation
    353 \see{\VRef{s:Cancellation}} on the current stack with the copied exception.
     355(see \vref{s:Cancellation}) on the current stack with the copied exception.
    354356
    355357\subsection{Resumption}
     
    426428
    427429\subsubsection{Resumption Marking}
     430\label{s:ResumptionMarking}
    428431A key difference between resumption and termination is that resumption does
    429432not unwind the stack. A side effect that is that when a handler is matched
     
    472475The symmetry between resumption termination is why this pattern was picked.
    473476Other patterns, such as marking just the handlers that caught, also work but
    474 lack the symmetry means there are less rules to remember.
     477lack the symmetry means there are more rules to remember.
    475478
    476479\section{Conditional Catch}
     
    557560\end{cfa}
    558561If there are further handlers after this handler only the first version will
    559 check them. If multiple handlers on a single try block could handle the same
    560 exception the translations get more complex but they are equivilantly
     562check them. If multiple handlers on a single try block that could handle the
     563same exception the translations get more complex but they are equivilantly
    561564powerful.
    562565
     
    633636and the current stack is
    634637unwound. After that it depends one which stack is being cancelled.
    635 \begin{description}
    636 \item[Main Stack:]
     638
     639\paragraph{Main Stack}
    637640The main stack is the one used by the program main at the start of execution,
    638641and is the only stack in a sequential program.
     
    645648to, so it would have be explicitly managed.
    646649
    647 \item[Thread Stack:]
     650\paragraph{Thread Stack}
    648651A thread stack is created for a \CFA @thread@ object or object that satisfies
    649652the @is_thread@ trait.
     
    671674Also you can always add an explicit join if that is the desired behaviour.
    672675
    673 \item[Coroutine Stack:]
     676\paragraph{Coroutine Stack}
    674677A coroutine stack is created for a @coroutine@ object or object that
    675678satisfies the @is_coroutine@ trait.
     
    685688(in terms of coroutine state) called resume on this coroutine, so the message
    686689is passed to the latter.
    687 \end{description}
Note: See TracChangeset for help on using the changeset viewer.