Changeset 761e146 for doc


Ignore:
Timestamp:
Sep 2, 2021, 2:04:56 PM (3 years ago)
Author:
Jacob Prud'homme <jafprudhomme@…>
Branches:
ADT, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, pthread-emulation, qualifiedEnum
Children:
81e0c61
Parents:
24ebddac (diff), b183717 (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' into jacob/cs343-translation

Location:
doc/theses/andrew_beach_MMath
Files:
1 added
1 deleted
16 edited
10 moved

Legend:

Unmodified
Added
Removed
  • doc/theses/andrew_beach_MMath/code/FixupEmpty.java

    r24ebddac r761e146  
    1 public class ResumeFixupEmpty {
     1public class FixupEmpty {
    22        public interface Fixup {
    33                public int op(int fixup);
  • doc/theses/andrew_beach_MMath/code/FixupOther.java

    r24ebddac r761e146  
    1 public class ResumeFixupOther {
     1public class FixupOther {
    22        public interface Fixup {
    33                public int op(int fixup);
  • doc/theses/andrew_beach_MMath/code/cond-catch.py

    r24ebddac r761e146  
    3232
    3333    end_time = thread_time_ns()
    34     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     34    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    3535
    3636
  • doc/theses/andrew_beach_MMath/code/fixup-empty.py

    r24ebddac r761e146  
    2525
    2626    end_time = thread_time_ns()
    27     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     27    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    2828
    2929
  • doc/theses/andrew_beach_MMath/code/fixup-other.py

    r24ebddac r761e146  
    2727
    2828    end_time = thread_time_ns()
    29     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     29    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    3030
    3131
  • doc/theses/andrew_beach_MMath/code/run.sh

    r24ebddac r761e146  
    11#!/usr/bin/env bash
    22
    3 readonly ALL_TESTS=(raise-{empty,detor,finally,other} try-{catch,finally} cond-match-{all,none} \
    4                     raise-{fixup-empty,fixup-other})
     3readonly ALL_TESTS=(raise-{empty,detor,finally,other} try-{catch,finally} \
     4                        cond-match-{all,none} fixup-{empty,other})
    55
    66gen-file-name() (
     
    1818)
    1919
    20 #readonly N=${1:-5}
    2120readonly N=${1:-1}
    2221readonly OUT_FILE=$(gen-file-name ${2:-run-%-$N})
  • doc/theses/andrew_beach_MMath/code/test.sh

    r24ebddac r761e146  
    1313#   View the result from TEST in LANGUAGE stored in FILE.
    1414
    15 readonly ITERS_1M=1000000 # 1 000 000, one million
    16 readonly ITERS_10M=10000000 # 10 000 000, ten million
    17 readonly ITERS_100M=100000000 # 100 000 000, hundred million
    18 readonly ITERS_1000M=1000000000 # 1 000 000 000, billion
     15readonly MIL=000000
     16# Various preset values used as arguments.
     17readonly ITERS_1M=1$MIL
     18readonly ITERS_10M=10$MIL
     19readonly ITERS_100M=100$MIL
     20readonly ITERS_1000M=1000$MIL
    1921readonly STACK_HEIGHT=100
    2022
     
    3032        case "$1" in
    3133        *.cfa)
    32                 # Requires a symbolic link.
    33                 mmake "${1%.cfa}" "$1" cfa -DNDEBUG -nodebug -O3 "$1" -o "${1%.cfa}"
     34                # A symbolic link/local copy can be used as an override.
     35                cmd=./cfa
     36                if [ ! -x $cmd ]; then
     37                        cmd=cfa
     38                fi
     39                mmake "${1%.cfa}" "$1" $cmd -DNDEBUG -nodebug -O3 "$1" -o "${1%.cfa}"
    3440                ;;
    3541        *.cpp)
     
    8389raise-empty)
    8490        CFAT="./throw-empty $ITERS_1M $STACK_HEIGHT"
    85 # see resume-fixup-empty-r      CFAR="./resume-empty $ITERS_1M $STACK_HEIGHT"
     91        CFAR="./resume-empty $ITERS_1M $STACK_HEIGHT"
    8692        CPP="./throw-empty-cpp $ITERS_1M $STACK_HEIGHT"
    8793        JAVA="java ThrowEmpty $ITERS_1M $STACK_HEIGHT"
     
    9096raise-detor)
    9197        CFAT="./throw-detor $ITERS_1M $STACK_HEIGHT"
    92 # N/A   CFAR="./resume-detor $ITERS_1M $STACK_HEIGHT"
     98        CFAR="./resume-detor $ITERS_1M $STACK_HEIGHT"
    9399        CPP="./throw-detor-cpp $ITERS_1M $STACK_HEIGHT"
    94100        JAVA=unsupported
     
    97103raise-finally)
    98104        CFAT="./throw-finally $ITERS_1M $STACK_HEIGHT"
    99 # N/A   CFAR="./resume-finally $ITERS_1M $STACK_HEIGHT"
     105        CFAR="./resume-finally $ITERS_1M $STACK_HEIGHT"
    100106        CPP=unsupported
    101107        JAVA="java ThrowFinally $ITERS_1M $STACK_HEIGHT"
     
    104110raise-other)
    105111        CFAT="./throw-other $ITERS_1M $STACK_HEIGHT"
    106 # N/A   CFAR="./resume-other $ITERS_1M $STACK_HEIGHT"
     112        CFAR="./resume-other $ITERS_1M $STACK_HEIGHT"
    107113        CPP="./throw-other-cpp $ITERS_1M $STACK_HEIGHT"
    108114        JAVA="java ThrowOther $ITERS_1M $STACK_HEIGHT"
     
    137143        PYTHON="./cond-catch.py $ITERS_10M 0"
    138144        ;;
    139 raise-fixup-empty)
    140         CFAT="./resume-fixup-empty-f $ITERS_10M $STACK_HEIGHT"
    141         CFAR="./resume-fixup-empty-r $ITERS_10M $STACK_HEIGHT"
    142         CPP="./resume-fixup-empty-cpp $ITERS_10M $STACK_HEIGHT"
    143         JAVA="java ResumeFixupEmpty $ITERS_10M $STACK_HEIGHT"
    144         PYTHON="./resume-fixup-empty.py $ITERS_10M $STACK_HEIGHT"
     145fixup-empty)
     146        CFAT="./fixup-empty-f $ITERS_10M $STACK_HEIGHT"
     147        CFAR="./fixup-empty-r $ITERS_10M $STACK_HEIGHT"
     148        CPP="./fixup-empty-cpp $ITERS_10M $STACK_HEIGHT"
     149        JAVA="java FixupEmpty $ITERS_10M $STACK_HEIGHT"
     150        PYTHON="./fixup-empty.py $ITERS_10M $STACK_HEIGHT"
    145151        ;;
    146 raise-fixup-other)
    147         CFAT="./resume-fixup-other-f $ITERS_10M $STACK_HEIGHT"
    148         CFAR="./resume-fixup-other-r $ITERS_10M $STACK_HEIGHT"
    149         CPP="./resume-fixup-other-cpp $ITERS_10M $STACK_HEIGHT"
    150         JAVA="java ResumeFixupOther $ITERS_10M $STACK_HEIGHT"
    151         PYTHON="./resume-fixup-other.py $ITERS_10M $STACK_HEIGHT"
     152fixup-other)
     153        CFAT="./fixup-other-f $ITERS_10M $STACK_HEIGHT"
     154        CFAR="./fixup-other-r $ITERS_10M $STACK_HEIGHT"
     155        CPP="./fixup-other-cpp $ITERS_10M $STACK_HEIGHT"
     156        JAVA="java FixupOther $ITERS_10M $STACK_HEIGHT"
     157        PYTHON="./fixup-other.py $ITERS_10M $STACK_HEIGHT"
    152158        ;;
    153159*)
  • doc/theses/andrew_beach_MMath/code/throw-empty.py

    r24ebddac r761e146  
    3333
    3434    end_time = thread_time_ns()
    35     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     35    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    3636
    3737
  • doc/theses/andrew_beach_MMath/code/throw-finally.py

    r24ebddac r761e146  
    3636
    3737    end_time = thread_time_ns()
    38     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     38    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    3939
    4040
  • doc/theses/andrew_beach_MMath/code/throw-other.py

    r24ebddac r761e146  
    4040
    4141    end_time = thread_time_ns()
    42     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     42    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    4343
    4444
  • doc/theses/andrew_beach_MMath/code/throw-with.py

    r24ebddac r761e146  
    4343
    4444    end_time = thread_time_ns()
    45     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     45    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    4646
    4747
  • doc/theses/andrew_beach_MMath/code/try-catch.py

    r24ebddac r761e146  
    2323
    2424    end_time = thread_time_ns()
    25     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     25    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    2626
    2727
  • doc/theses/andrew_beach_MMath/code/try-finally.py

    r24ebddac r761e146  
    2222
    2323    end_time = thread_time_ns()
    24     print('Run-Time (s) {:.1f}:'.format((end_time - start_time) / 1_000_000_000.))
     24    print('Run-Time (s): {:.1f}'.format((end_time - start_time) / 1_000_000_000.))
    2525
    2626
  • doc/theses/andrew_beach_MMath/features.tex

    r24ebddac r761e146  
    162162type a child of that type and part of the same tree. The parent may itself
    163163be a child or a root type and may have any number of existing children.
     164
     165% OK, for some reason the b and t positioning options are reversed here.
     166\begin{minipage}[b]{0.6\textwidth}
    164167\begin{cfa}
    165168trait child_a(T) virtual(root_type) {}
     
    167170trait child_b(T) virtual(root_type) {}
    168171\end{cfa}
    169 \todo{Update the diagram in vtable.fig to show the new type tree.}
     172\end{minipage}
     173\begin{minipage}{0.4\textwidth}
     174\begin{center}
     175\input{virtual-tree}
     176\end{center}
     177\end{minipage}
    170178
    171179Every virtual type also has a list of virtual members and a unique id,
     
    499507throwResume EXPRESSION;
    500508\end{cfa}
    501 \todo{Decide on a final set of keywords and use them everywhere.}
     509% The new keywords are currently ``experimental" and not used in this work.
    502510It works much the same way as the termination raise, except the
    503511type must satisfy the \snake{is_resumption_exception} that uses the
     
    544552and run, its try block (the guarded statements) and every try statement
    545553searched before it are still on the stack. There presence can lead to
    546 the recursive resumption problem.
    547 \todo{Is there a citation for the recursive resumption problem?}
     554the recursive resumption problem.\cite{Buhr00a}
     555% Other possible citation is MacLaren77, but the form is different.
    548556
    549557The recursive resumption problem is any situation where a resumption handler
  • doc/theses/andrew_beach_MMath/future.tex

    r24ebddac r761e146  
    2121capability, programmers will want to use it. Once fixed, this capability should
    2222result in little or no change in the exception system but simplify usage.
     23\item
     24The @copy@ function in the exception virtual table is an adapter to address
     25some limitations in the \CFA copy constructor. If the copy constructor is
     26improved it can be used directly without the adapter.
    2327\item
    2428Termination handlers cannot use local control-flow transfers, \eg by @break@,
     
    5761type is a child of another. This check precisely captures many of the
    5862current ad-hoc correctness requirements.
     63
     64Other features of the virtual system could also remove some of the
     65special cases around exception virtual tables, such as the generation
     66of the @msg@ function, could be removed.
    5967
    6068The full virtual system might also include other improvement like associated
  • doc/theses/andrew_beach_MMath/implement.tex

    r24ebddac r761e146  
    9999
    100100Type information is constructed as follows:
    101 \begin{enumerate}
     101\begin{enumerate}[nosep]
    102102\item
    103103Use the type's name to generate a name for the type information structure,
     
    123123including different instances of the same polymorphic type.
    124124\end{enumerate}
    125 \todo{The list is making me realize, some of this isn't ordered.}
    126125
    127126Writing that code manually, with helper macros for the early name mangling,
     
    176175below.
    177176
    178 The layout always comes in three parts.
    179 \todo{Add labels to the virtual table layout figure.}
     177The layout always comes in three parts (see \autoref{f:VirtualTableLayout}).
    180178The first section is just the type id at the head of the table. It is always
    181179there to ensure that it can be found even when the accessing code does not
     
    190188
    191189\begin{figure}
     190\begin{center}
    192191\input{vtable-layout}
     192\end{center}
    193193\caption{Virtual Table Layout}
    194194\label{f:VirtualTableLayout}
    195 \todo*{Improve the Virtual Table Layout diagram.}
    196195\end{figure}
    197196
     
    674673\newsavebox{\stackBox}
    675674\begin{lrbox}{\codeBox}
    676 \begin{lstlisting}[language=CFA,{moredelim=**[is][\color{red}]{@}{@}}]
     675\begin{cfa}
    677676unsigned num_exceptions = 0;
    678677void throws() {
     
    693692    throws();
    694693}
    695 \end{lstlisting}
     694\end{cfa}
    696695\end{lrbox}
    697696
    698697\begin{lrbox}{\stackBox}
    699698\begin{lstlisting}
    700 | try-finally
    701 | try-catch (Example)
     699| finally block (Example)
     700| try block
    702701throws()
    703 | try-finally
    704 | try-catch (Example)
     702| finally block (Example)
     703| try block
    705704throws()
    706 | try-finally
    707 | try-catch (Example)
     705| finally block (Example)
     706| try block
    708707throws()
    709708main()
     
    718717\label{f:MultipleExceptions}
    719718\end{figure}
    720 \todo*{Work on multiple exceptions code sample.}
    721719
    722720All exceptions are stored in nodes, which are then linked together in lists
     
    797795\autoref{f:TerminationTransformation} shows the pattern used to transform
    798796a \CFA try statement with catch clauses into the appropriate C functions.
    799 \todo{Explain the Termination Transformation figure.}
    800797
    801798\begin{figure}
     
    855852\caption{Termination Transformation}
    856853\label{f:TerminationTransformation}
    857 \todo*{Improve (compress?) Termination Transformations.}
    858854\end{figure}
    859855
     
    894890
    895891\autoref{f:ResumptionTransformation} shows the pattern used to transform
    896 a \CFA try statement with catch clauses into the appropriate C functions.
    897 \todo{Explain the Resumption Transformation figure.}
     892a \CFA try statement with catchResume clauses into the appropriate
     893C functions.
    898894
    899895\begin{figure}
     
    936932\caption{Resumption Transformation}
    937933\label{f:ResumptionTransformation}
    938 \todo*{Improve (compress?) Resumption Transformations.}
    939934\end{figure}
    940935
     
    964959\caption{Resumption Marking}
    965960\label{f:ResumptionMarking}
    966 \todo*{Label Resumption Marking to aid clarity.}
    967961\end{figure}
    968962
  • doc/theses/andrew_beach_MMath/performance.tex

    r24ebddac r761e146  
    7474three results are discarded and the remaining five values are averaged.
    7575The test are run with the latest (still pre-release) \CFA compiler,
    76 using gcc-10 as a backend.
    77 g++-10 is used for \Cpp.
     76using gcc-10 10.3.0 as a backend.
     77g++-10 10.3.0 is used for \Cpp.
    7878Java tests are complied and run with version 11.0.11.
    79 Python used version 3.8.
     79Python used version 3.8.10.
    8080The machines used to run the tests are:
    81 \todo{Get patch versions for python, gcc and g++.}
    8281\begin{itemize}[nosep]
    8382\item ARM 2280 Kunpeng 920 48-core 2$\times$socket
     
    312311For example, there are a few cases where Python out-performs
    313312\CFA, \Cpp and Java.
    314 \todo{Make sure there are still cases where Python wins.}
     313% To be exact, the Match All and Match None cases.
    315314The most likely explanation is that, since exceptions
    316315are rarely considered to be the common case, the more optimized languages
     
    351350finally clauses seem to avoid the spike that run-time destructors have.
    352351Possibly some optimization removes the cost of changing contexts.
    353 \todo{OK, I think the finally clause may have been optimized out.}
    354352
    355353\item[Other Traversal]
     
    362360but they could avoid the spike by not having the same kind of overhead for
    363361switching to the check's context.
    364 \todo{Could revisit Other Traversal, after Finally Traversal.}
    365362
    366363\item[Cross Handler]
  • doc/theses/andrew_beach_MMath/resumption-marking.fig

    r24ebddac r761e146  
    32322 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
    3333        1 1 1.00 60.00 120.00
    34          2205 1620 1845 1620
    35 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
    36         1 1 1.00 60.00 120.00
    37          3735 2340 3375 2340
    38 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
    39         1 1 1.00 60.00 120.00
    40          5445 945 5085 945
    41 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
    42         1 1 1.00 60.00 120.00
    43          7065 1620 6705 1620
    44 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
    45         1 1 1.00 60.00 120.00
    4634         1665 1755 1665 2205
    47352 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     
    6048        1 1 1.00 60.00 120.00
    6149         6525 2475 6525 2925
    62 4 1 0 50 -1 0 12 0.0000 0 135 945 1665 3375 Initial State\001
    63 4 1 0 50 -1 0 12 0.0000 0 135 1215 3195 3375 Found Handler\001
    64 4 1 0 50 -1 0 12 0.0000 0 180 1605 6570 3375 Handling Complete\001
    65 4 0 0 50 -1 0 12 0.0000 0 135 390 3825 2385 head\001
    66 4 0 0 50 -1 0 12 0.0000 0 135 390 5535 990 head\001
    67 4 0 0 50 -1 0 12 0.0000 0 135 390 7155 1665 head\001
    68 4 2 0 50 -1 0 12 0.0000 0 135 690 1485 2385 handlers\001
    69 4 1 0 50 -1 0 12 0.0000 0 135 855 4905 3375 Handler in\001
    70 4 1 0 50 -1 0 12 0.0000 0 180 795 4905 3600 Try block\001
    71 4 0 0 50 -1 0 12 0.0000 0 135 390 2295 1665 head\001
     502 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     51        1 1 1.00 60.00 120.00
     52         1260 1620 1485 1620
     532 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     54        1 1 1.00 60.00 120.00
     55         1980 1440 1755 1440
     562 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     57        1 1 1.00 60.00 120.00
     58         2790 2340 3015 2340
     592 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     60        1 1 1.00 60.00 120.00
     61         3600 1620 3375 1620
     622 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     63        1 1 1.00 60.00 120.00
     64         4500 945 4725 945
     652 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     66        1 1 1.00 60.00 120.00
     67         5265 765 5040 765
     682 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     69        1 1 1.00 60.00 120.00
     70         6120 1620 6345 1620
     712 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
     72        1 1 1.00 60.00 120.00
     73         6840 1440 6615 1440
     744 1 0 50 -1 0 12 0.0000 0 135 1170 1665 3375 Initial State\001
     754 1 0 50 -1 0 12 0.0000 0 135 1170 3195 3375 Found Handler\001
     764 1 0 50 -1 0 12 0.0000 0 165 1530 6570 3375 Handling Complete\001
     774 2 0 50 -1 0 12 0.0000 0 135 720 1485 2385 handlers\001
     784 1 0 50 -1 0 12 0.0000 0 135 900 4905 3375 Handler in\001
     794 1 0 50 -1 0 12 0.0000 0 165 810 4905 3600 Try block\001
     804 0 0 50 -1 0 12 0.0000 0 135 360 855 1665 head\001
     814 0 0 50 -1 0 12 0.0000 4 120 810 2025 1485 execution\001
     824 0 0 50 -1 0 12 0.0000 0 135 360 2385 2385 head\001
     834 0 0 50 -1 0 12 0.0000 4 120 810 3645 1665 execution\001
     844 0 0 50 -1 0 12 0.0000 0 135 360 4095 990 head\001
     854 0 0 50 -1 0 12 0.0000 4 120 810 5310 810 execution\001
     864 0 0 50 -1 0 12 0.0000 0 135 360 5715 1665 head\001
     874 0 0 50 -1 0 12 0.0000 4 120 810 6885 1485 execution\001
  • doc/theses/andrew_beach_MMath/uw-ethesis-frontpgs.tex

    r24ebddac r761e146  
    129129\begin{center}\textbf{Abstract}\end{center}
    130130
    131 This is the abstract.
     131The \CFA (Cforall) programming language is an evolutionary refinement of
     132the C programming language, adding modern programming features without
     133changing the programming paradigms of C.
     134One of these modern programming features is more powerful error handling
     135through the addition of an exception handling mechanism (EHM).
     136
     137This thesis covers the design and implementation of the \CFA EHM,
     138along with a review of the other required \CFA features.
     139The EHM includes common features of termination exception handling and
     140similar support for resumption exception handling.
     141The design of both has been adapted to utilize other tools \CFA provides,
     142as well as fit with the assertion based interfaces of the language.
     143
     144The EHM has been implemented into the \CFA compiler and run-time environment.
     145Although it has not yet been optimized, performance testing has shown it has
     146comparable performance to other EHM's,
     147which is sufficient for use in current \CFA programs.
    132148
    133149\cleardoublepage
     
    138154\begin{center}\textbf{Acknowledgements}\end{center}
    139155
    140 I would like to thank all the little people who made this thesis possible.
     156I would like to thank all the people who made this thesis possible.
     157(I'm waiting until who is involved is finalized.)
     158
    141159\cleardoublepage
    142160
  • doc/theses/andrew_beach_MMath/vtable-layout.fig

    r24ebddac r761e146  
    88-2
    991200 2
    10 2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 1
    11          1620 1665
    12102 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
    1311         3510 1890 3645 1755
     
    16142 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
    1715         3645 1305 3645 1755
     162 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
     17         2115 1935 2250 1935
     182 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
     19         2250 1170 2115 1170 2115 2475 2250 2475
     202 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
     21         2250 1350 2115 1350
    18224 0 0 50 -1 0 12 0.0000 4 165 630 2295 1305 type_id\001
    19234 0 0 50 -1 0 12 0.0000 4 165 1170 2295 1500 parent_field0\001
Note: See TracChangeset for help on using the changeset viewer.