Changes in / [85521c7:d0a045c7]
- Files:
-
- 1 added
- 1 deleted
- 33 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/LaTeXmacros/common.tex
r85521c7 rd0a045c7 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Wed Jan 31 23:10:28 201814 %% Update Count : 3 6413 %% Last Modified On : Mon Aug 28 20:18:42 2017 14 %% Update Count : 355 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 165 165 {\ETC\xspace}% 166 166 }% 167 \newcommand{\ETAL}{\abbrevFont{et }\hspace{2pt}\abbrevFont{al}}168 \newcommand *{\etal}{%169 \@ifnextchar{.}{\ protect\ETAL}%170 {\abbrevFont{\ protect\ETAL}.\xspace}%167 \newcommand{\ETAL}{\abbrevFont{et\:al}} 168 \newcommand{\etal}{% 169 \@ifnextchar{.}{\ETAL}% 170 {\abbrevFont{\ETAL}.\xspace}% 171 171 }% 172 172 \newcommand{\VIZ}{\abbrevFont{viz}} 173 \newcommand *{\viz}{%173 \newcommand{\viz}{% 174 174 \@ifnextchar{.}{\VIZ}% 175 175 {\abbrevFont{\VIZ}.\xspace}% -
doc/bibliography/pl.bib
r85521c7 rd0a045c7 1034 1034 } 1035 1035 1036 @manual{cforall -refrat,1036 @manual{cforall, 1037 1037 keywords = {polymorphism}, 1038 1038 contributer = {gjditchfield@plg}, -
doc/papers/OOPSLA17/Makefile
r85521c7 rd0a045c7 9 9 10 10 MAKEFLAGS = --no-print-directory --silent # 11 VPATH = ${ Build} ${Figures} evaluation11 VPATH = ${Figures} evaluation 12 12 13 13 ## Define the text source files. … … 36 36 # Directives # 37 37 38 .PHONY : all clean # not file names39 40 38 all : ${DOCUMENT} 41 39 … … 51 49 dvips ${Build}/$< -o $@ 52 50 53 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ../../bibliography/pl.bib51 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ../../bibliography/pl.bib 54 52 # Must have *.aux file containing citations for bibtex 55 53 if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi -
doc/papers/concurrency/Makefile
r85521c7 rd0a045c7 9 9 10 10 MAKEFLAGS = --no-print-directory --silent # 11 VPATH = ${ Build} ${Figures}11 VPATH = ${Figures} 12 12 13 13 ## Define the text source files. … … 58 58 dvips ${Build}/$< -o $@ 59 59 60 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \60 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 61 61 ${Macros}/common.tex ${Macros}/indexstyle annex/local.bib ../../bibliography/pl.bib 62 62 # Must have *.aux file containing citations for bibtex -
doc/papers/general/Makefile
r85521c7 rd0a045c7 9 9 10 10 MAKEFLAGS = --no-print-directory --silent # 11 VPATH = ${ Build} ${Figures} evaluation11 VPATH = ${Figures} evaluation 12 12 13 13 ## Define the text source files. … … 51 51 dvips ${Build}/$< -o $@ 52 52 53 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \53 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 54 54 ${Macros}/common.tex ${Macros}/indexstyle ../../bibliography/pl.bib 55 55 # Must have *.aux file containing citations for bibtex -
doc/refrat/Makefile
r85521c7 rd0a045c7 9 9 10 10 MAKEFLAGS = --no-print-directory --silent # 11 VPATH = ${ Build} ${Figures}11 VPATH = ${Figures} 12 12 13 13 ## Define the text source files. … … 52 52 dvips ${Build}/$< -o $@ 53 53 54 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \54 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 55 55 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 56 56 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. -
doc/theses/aaron_moss/comp_II/.gitignore
r85521c7 rd0a045c7 1 1 # generated by latex 2 build/* 2 *.aux 3 *.bbl 4 *.blg 5 *.brf 6 *.dvi 7 *.idx 8 *.ilg 9 *.ind 10 *.log 11 *.out 3 12 *.pdf 4 13 *.ps 14 *.toc -
doc/theses/aaron_moss/comp_II/Makefile
r85521c7 rd0a045c7 1 ## Define the configuration variables.1 ## Define the appropriate configuration variables. 2 2 3 Build = build 4 Figures = figures 5 Macros = ../../../LaTeXmacros 6 TeXLIB = .:${Macros}:${Build}:../../../bibliography: 7 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=${Build} 3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/: 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error 8 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex 9 10 MAKEFLAGS = --no-print-directory --silent #11 VPATH = ${Build} ${Figures}12 6 13 7 ## Define the text source files. … … 35 29 # Directives # 36 30 37 .PHONY : all clean # not file names38 39 31 all : ${DOCUMENT} 40 32 41 33 clean : 42 @rm -frv ${DOCUMENT} ${basename ${DOCUMENT}}.ps ${Build} 34 rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf \ 35 ${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT} 43 36 44 37 # File Dependencies # … … 48 41 49 42 ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi 50 dvips $ {Build}/$< -o $@43 dvips $< -o $@ 51 44 52 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 53 ${Macros}/common.tex ${Macros}/indexstyle ../../../bibliography/pl.bib 45 ${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 46 ../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib 47 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. 48 if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi 54 49 # Must have *.aux file containing citations for bibtex 55 50 if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi 56 -${BibTeX} ${ Build}/${basename $@}57 # Some citations reference others so run again to resolve these citations51 -${BibTeX} ${basename $@} 52 # Some citations reference others so run steps again to resolve these citations 58 53 ${LaTeX} ${basename $@}.tex 59 -${BibTeX} ${Build}/${basename $@} 60 # Run again to finish citations 54 -${BibTeX} ${basename $@} 55 # Make index from *.aux entries and input index at end of document 56 makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx 61 57 ${LaTeX} ${basename $@}.tex 58 # Run again to get index title into table of contents 59 ${LaTeX} ${basename $@}.tex 60 61 predefined : 62 sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf 62 63 63 64 ## Define the default recipes. 64 65 65 ${Build}:66 mkdir -p ${Build}67 68 66 %.tex : %.fig 69 fig2dev -L eepic $< > $ {Build}/$@67 fig2dev -L eepic $< > $@ 70 68 71 69 %.ps : %.fig 72 fig2dev -L ps $< > $ {Build}/$@70 fig2dev -L ps $< > $@ 73 71 74 72 %.pstex : %.fig 75 fig2dev -L pstex $< > $ {Build}/$@76 fig2dev -L pstex_t -p $ {Build}/$@ $< > ${Build}/$@_t73 fig2dev -L pstex $< > $@ 74 fig2dev -L pstex_t -p $@ $< > $@_t 77 75 78 76 # Local Variables: # -
doc/theses/aaron_moss/comp_II/comp_II.tex
r85521c7 rd0a045c7 1 % inline code ©...© (copyright symbol) emacs: C-q M-) 2 % red highlighting ®...® (registered trademark symbol) emacs: C-q M-. 3 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_ 4 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-" 5 % LaTex escape §...§ (section symbol) emacs: C-q M-' 6 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 7 % math escape $...$ (dollar symbol) 8 1 9 \documentclass[twoside,11pt]{article} 2 10 … … 19 27 \usepackage{mathptmx} % better math font with "times" 20 28 \usepackage[usenames]{color} 29 \usepackage[pagewise]{lineno} 30 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 21 31 \input{common} % bespoke macros used in the document 22 32 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} … … 24 34 \renewcommand{\UrlFont}{\small\sf} 25 35 26 \usepackage[pagewise]{lineno}27 \renewcommand{\linenumberfont}{\scriptsize\sffamily}28 29 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore30 % removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR31 % AFTER HYPERREF.32 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}33 34 36 \setlength{\topmargin}{-0.45in} % move running title into header 35 37 \setlength{\headsep}{0.25in} 36 37 \CFAStyle % use default CFA format-style38 39 % inline code ©...© (copyright symbol) emacs: C-q M-)40 % red highlighting ®...® (registered trademark symbol) emacs: C-q M-.41 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_42 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-"43 % LaTex escape §...§ (section symbol) emacs: C-q M-'44 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^45 % math escape $...$ (dollar symbol)46 38 47 39 \usepackage{caption} … … 630 622 \addcontentsline{toc}{section}{\refname} 631 623 \bibliographystyle{plain} 632 \bibliography{ pl}624 \bibliography{cfa} 633 625 634 626 %\addcontentsline{toc}{section}{\indexname} % add index name to table of contents -
doc/theses/rob_schluntz/.gitignore
r85521c7 rd0a045c7 1 1 # generated by latex 2 build/* 2 *.aux 3 *.bbl 4 *.blg 5 *.brf 6 *.dvi 7 *.idx 8 *.ilg 9 *.ind 10 *.log 11 *.out 3 12 *.pdf 4 13 *.ps 5 14 *.toc 15 *.lof 16 *.lot 17 *.synctex.gz -
doc/theses/rob_schluntz/Makefile
r85521c7 rd0a045c7 1 Build = build 2 Macros = ../../LaTeXmacros 3 TeXLIB = .:${Macros}:${Build}:../../bibliography: 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && pdflatex -halt-on-error -output-directory=${Build} 1 TeXLIB = .:../LaTeXmacros:../bibliography/: 2 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && pdflatex -halt-on-error 5 3 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex 6 7 VPATH = ${Build}8 4 9 5 all : thesis.pdf 10 6 11 thesis.pdf : Makefile ${Build} ${Macros}/common.tex cfa-format.tex thesis.tex intro.tex ctordtor.tex tuples.tex variadic.tex conclusions.tex7 thesis.pdf : Makefile ../LaTeXmacros/common.tex cfa-format.tex thesis.tex intro.tex ctordtor.tex tuples.tex variadic.tex conclusions.tex 12 8 ${LaTeX} thesis 13 ${BibTeX} ${Build}/thesis9 ${BibTeX} thesis 14 10 ${LaTeX} thesis 15 11 ${LaTeX} thesis 16 cp -p ${Build}/thesis.pdf .17 12 pdf2ps thesis.pdf thesis.ps 18 13 19 ${Build}:20 mkdir -p ${Build}21 22 14 clean : 23 @rm -frv ${Build}15 rm -f *.aux *.bbl *.blg *.lof *.log *.lot *.out *.toc 24 16 25 17 spotless : clean -
doc/theses/rob_schluntz/intro.tex
r85521c7 rd0a045c7 290 290 \end{cfacode} 291 291 Every if- and iteration-statement in C compares the condition with @0@, and every increment and decrement operator is semantically equivalent to adding or subtracting the value @1@ and storing the result. 292 Due to these rewrite rules, the values @0@ and @1@ have the types \zero and \one in \CFA, which allow for overloading various operations that connect to @0@ and @1@ \footnote{In the original design of \CFA, @0@ and @1@ were overloadable names \cite[p.~7]{cforall -refrat}.}.292 Due to these rewrite rules, the values @0@ and @1@ have the types \zero and \one in \CFA, which allow for overloading various operations that connect to @0@ and @1@ \footnote{In the original design of \CFA, @0@ and @1@ were overloadable names \cite[p.~7]{cforall}.}. 293 293 The types \zero and \one have special built-in implicit conversions to the various integral types, and a conversion to pointer types for @0@, which allows standard C code involving @0@ and @1@ to work as normal. 294 294 \begin{cfacode} -
doc/theses/rob_schluntz/thesis.tex
r85521c7 rd0a045c7 288 288 \addcontentsline{toc}{chapter}{\textbf{References}} 289 289 290 \bibliography{ pl,thesis}290 \bibliography{cfa,thesis} 291 291 % Tip 5: You can create multiple .bib files to organize your references. 292 292 % Just list them all in the \bibliogaphy command, separated by commas (no spaces). -
doc/theses/thierry_delisle/Makefile
r85521c7 rd0a045c7 1 ## Define the configuration variables.1 ## Define the appropriate configuration variables. 2 2 3 Build = build 4 Figures = figures 5 Macros = ../../LaTeXmacros 6 TeXLIB = .:style:text:annex:${Macros}:${Build}:../../bibliography: 7 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=${Build} 3 TeXLIB = .:./style:./text:./annex:./build:../../LaTeXmacros:../../LaTeXmacros/listings:../../LaTeXmacros/enumitem:~/bibliographies:/usr/local/bibliographies: 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error -output-directory=build -interaction=nonstopmode 8 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex -terse 9 10 MAKEFLAGS = --no-print-directory --silent #11 VPATH = ${Build} ${Figures}12 6 13 7 ## Define the text source files. … … 30 24 } 31 25 32 FIGURES = ${add suffix .tex, \33 monitor \34 ext_monitor \35 int_monitor \36 dependency \37 } 26 FIGURES = ${addprefix build/, ${addsuffix .tex, \ 27 monitor \ 28 ext_monitor \ 29 int_monitor \ 30 dependency \ 31 }} 38 32 39 PICTURES = ${add suffix .pstex, \40 system \41 monitor_structs \42 } 33 PICTURES = ${addprefix build/, ${addsuffix .pstex, \ 34 system \ 35 monitor_structs \ 36 }} 43 37 44 38 PROGRAMS = ${addsuffix .tex, \ … … 54 48 # Directives # 55 49 56 .PHONY : all clean # not file names57 58 50 all : ${DOCUMENT} 59 51 60 52 clean : 61 @rm -frv ${DOCUMENT} ${basename ${DOCUMENT}}.ps ${Build} 53 @rm -fv ${DOCUMENT} \ 54 build/*.acn \ 55 build/*.acr \ 56 build/*.alg \ 57 build/*.aux \ 58 build/*.bbl \ 59 build/*.blg \ 60 build/*.brf \ 61 build/*.cf \ 62 build/*.dvi \ 63 build/*.glg \ 64 build/*.glo \ 65 build/*.gls \ 66 build/*.ist \ 67 build/*.idx \ 68 build/*.ilg \ 69 build/*.ind \ 70 build/*.log \ 71 build/*.out \ 72 build/*.ps \ 73 build/*.pstex \ 74 build/*.pstex_t \ 75 build/*.tex \ 76 build/*.toc \ 77 build/*.lof \ 78 build/*.lol \ 79 build/*.lot \ 80 figures/*.tex \ 81 *.png \ 82 62 83 63 84 # File Dependencies # 64 85 65 ${DOCUMENT} : ${basename ${DOCUMENT}}.ps86 ${DOCUMENT} : build/${basename ${DOCUMENT}}.ps 66 87 ps2pdf $< 67 88 68 ${basename ${DOCUMENT}}.ps :${basename ${DOCUMENT}}.dvi69 dvips $ {Build}/$< -o $@89 build/${basename ${DOCUMENT}}.ps : build/${basename ${DOCUMENT}}.dvi 90 dvips $< -o $@ 70 91 71 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 72 ${Macros}/common.tex ${Macros}/indexstyle annex/local.bib ../../bibliography/pl.bib 73 # Must have *.aux file containing citations for bibtex 74 if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi 75 -${BibTeX} ${Build}/${basename $@} 76 # Some citations reference others so run again to resolve these citations 77 ${LaTeX} ${basename $@}.tex 78 -${BibTeX} ${Build}/${basename $@} 79 # Make index from *.aux entries and input index at end of document 80 makeglossaries -q -s ${Build}/${basename $@}.ist ${Build}/${basename $@} 81 -version.sh 82 # Run again to finish citations 83 ${LaTeX} ${basename $@}.tex 92 build/${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex ../../LaTeXmacros/common.tex ../../LaTeXmacros/indexstyle annex/local.bib 93 94 @ if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. 95 @ echo "Citation lookup" # Must have *.aux file containing citations for bibtex 96 @ if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename ${notdir $@}}.tex ; fi 97 @ echo "Citation Pass 1" 98 @ -${BibTeX} ${basename $@} # Some citations reference others so run steps again to resolve these citations 99 @ echo "Citation Pass 2" 100 @ ${LaTeX} ${basename ${notdir $@}}.tex 101 @ -${BibTeX} ${basename $@} 102 @ echo "Glossary" 103 @ makeglossaries -q -s ${basename $@}.ist ${basename $@} # Make index from *.aux entries and input index at end of document 104 @ echo ".dvi generation" 105 @ -build/bump_ver.sh 106 @ ${LaTeX} ${basename ${notdir $@}}.tex # Run again to get index title into table of contents 107 108 109 predefined : 110 sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf 84 111 85 112 ## Define the default recipes. 86 113 87 ${Build}: 88 mkdir -p ${Build}114 build/%.tex : figures/%.fig 115 fig2dev -L eepic $< > $@ 89 116 90 %.tex :%.fig91 fig2dev -L eepic $< > ${Build}/$@117 build/%.ps : figures/%.fig 118 fig2dev -L ps $< > $@ 92 119 93 %.ps : %.fig 94 fig2dev -L ps $< > ${Build}/$@ 95 96 %.pstex : %.fig 97 fig2dev -L pstex $< > ${Build}/$@ 98 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t 120 build/%.pstex : figures/%.fig 121 fig2dev -L pstex $< > $@ 122 fig2dev -L pstex_t -p $@ $< > $@_t 99 123 100 124 #----------------------------------------------------------------------------------- … … 121 145 "\end{document}" > $@ 122 146 147 148 123 149 # Local Variables: # 124 150 # compile-command: "make" # -
doc/theses/thierry_delisle/version
r85521c7 rd0a045c7 1 0.11.40 91 0.11.403 -
doc/user/Makefile
r85521c7 rd0a045c7 9 9 10 10 MAKEFLAGS = --no-print-directory --silent # 11 VPATH = ${ Build} ${Figures}11 VPATH = ${Figures} 12 12 13 13 ## Define the text source files. … … 56 56 dvips ${Build}/$< -o $@ 57 57 58 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \58 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 59 59 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 60 60 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. -
doc/user/user.tex
r85521c7 rd0a045c7 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Wed Jan 31 22:29:25201814 %% Update Count : 314 713 %% Last Modified On : Wed Jan 31 07:59:24 2018 14 %% Update Count : 3146 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 -
src/Common/PassVisitor.h
r85521c7 rd0a045c7 291 291 bool_ref * get_visit_children_ptr() { return visit_children_impl(pass, 0); } 292 292 293 void indexerScopeEnter () 294 void indexerScopeLeave () 295 void indexerAddId ( DeclarationWithType * node) { indexer_impl_addId ( pass, 0, node ); }296 void indexerAddType ( NamedTypeDecl * node) { indexer_impl_addType ( pass, 0, node ); }297 void indexerAddStruct ( const std::string & id) { indexer_impl_addStruct ( pass, 0, id ); }298 void indexerAddStruct ( StructDecl * node) { indexer_impl_addStruct ( pass, 0, node ); }299 void indexerAddStructFwd( StructDecl * node) { indexer_impl_addStructFwd( pass, 0, node ); }300 void indexerAddEnum ( EnumDecl * node) { indexer_impl_addEnum ( pass, 0, node ); }301 void indexerAddUnion ( const std::string & id) { indexer_impl_addUnion ( pass, 0, id ); }302 void indexerAddUnion ( UnionDecl * node) { indexer_impl_addUnion ( pass, 0, node ); }303 void indexerAddUnionFwd ( UnionDecl * node) { indexer_impl_addUnionFwd ( pass, 0, node ); }304 void indexerAddTrait ( TraitDecl * node) { indexer_impl_addTrait ( pass, 0, node ); }305 void indexerAddWith ( std::list< Expression * > & exprs ) { indexer_impl_addWith ( pass, 0, exprs); }293 void indexerScopeEnter () { indexer_impl_enterScope ( pass, 0 ); } 294 void indexerScopeLeave () { indexer_impl_leaveScope ( pass, 0 ); } 295 void indexerAddId ( DeclarationWithType * node ) { indexer_impl_addId ( pass, 0, node ); } 296 void indexerAddType ( NamedTypeDecl * node ) { indexer_impl_addType ( pass, 0, node ); } 297 void indexerAddStruct ( const std::string & id ) { indexer_impl_addStruct ( pass, 0, id ); } 298 void indexerAddStruct ( StructDecl * node ) { indexer_impl_addStruct ( pass, 0, node ); } 299 void indexerAddStructFwd( StructDecl * node ) { indexer_impl_addStructFwd( pass, 0, node ); } 300 void indexerAddEnum ( EnumDecl * node ) { indexer_impl_addEnum ( pass, 0, node ); } 301 void indexerAddUnion ( const std::string & id ) { indexer_impl_addUnion ( pass, 0, id ); } 302 void indexerAddUnion ( UnionDecl * node ) { indexer_impl_addUnion ( pass, 0, node ); } 303 void indexerAddUnionFwd ( UnionDecl * node ) { indexer_impl_addUnionFwd ( pass, 0, node ); } 304 void indexerAddTrait ( TraitDecl * node ) { indexer_impl_addTrait ( pass, 0, node ); } 305 void indexerAddWith ( WithStmt * node ) { indexer_impl_addWith ( pass, 0, node ); } 306 306 307 307 -
src/Common/PassVisitor.impl.h
r85521c7 rd0a045c7 365 365 maybeAccept_impl ( node->attributes , *this ); 366 366 367 indexerAddId( node ); 367 if ( node->name != "" ) { 368 indexerAddId( node ); 369 } 368 370 369 371 VISIT_END( node ); … … 379 381 maybeMutate_impl ( node->attributes , *this ); 380 382 381 indexerAddId( node ); 383 if ( node->name != "" ) { 384 indexerAddId( node ); 385 } 382 386 383 387 MUTATE_END( DeclarationWithType, node ); … … 390 394 VISIT_START( node ); 391 395 392 indexerAddId( node ); 393 394 maybeAccept_impl( node->withExprs, *this ); 395 { 396 // with clause introduces a level of scope (for the with expression members). 397 // with clause exprs are added to the indexer before parameters so that parameters 398 // shadow with exprs and not the other way around. 399 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 400 indexerAddWith( node->withExprs ); 401 { 402 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 403 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 404 static ObjectDecl func( 405 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 406 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 407 nullptr 408 ); 409 indexerAddId( &func ); 410 maybeAccept_impl( node->type, *this ); 411 maybeAccept_impl( node->statements, *this ); 412 maybeAccept_impl( node->attributes, *this ); 413 } 396 if ( node->name != "" ) { 397 indexerAddId( node ); 398 } 399 400 { 401 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 402 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 403 static ObjectDecl func( 404 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 405 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 406 nullptr 407 ); 408 indexerAddId( &func ); 409 maybeAccept_impl( node->type, *this ); 410 maybeAccept_impl( node->statements, *this ); 411 maybeAccept_impl( node->attributes, *this ); 414 412 } 415 413 … … 421 419 MUTATE_START( node ); 422 420 423 indexerAddId( node ); 424 425 { 426 // with clause introduces a level of scope (for the with expression members). 427 // with clause exprs are added to the indexer before parameters so that parameters 428 // shadow with exprs and not the other way around. 429 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 430 indexerAddWith( node->withExprs ); 431 { 432 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 433 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 434 static ObjectDecl func( 435 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 436 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 437 nullptr 438 ); 439 indexerAddId( &func ); 440 maybeMutate_impl( node->type, *this ); 441 maybeMutate_impl( node->statements, *this ); 442 maybeMutate_impl( node->attributes, *this ); 443 } 421 if ( node->name != "" ) { 422 indexerAddId( node ); 423 } 424 425 { 426 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 427 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 428 static ObjectDecl func( 429 "__func__", noStorageClasses, LinkageSpec::C, nullptr, 430 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ), 431 nullptr 432 ); 433 indexerAddId( &func ); 434 maybeMutate_impl( node->type, *this ); 435 maybeMutate_impl( node->statements, *this ); 436 maybeMutate_impl( node->attributes, *this ); 444 437 } 445 438 … … 737 730 template< typename pass_type > 738 731 void PassVisitor< pass_type >::visit( AsmStmt * node ) { 739 VISIT_START( node ) 740 741 maybeAccept_impl( node->instruction, *this ); 742 maybeAccept_impl( node->output, *this ); 743 maybeAccept_impl( node->input, *this ); 744 maybeAccept_impl( node->clobber, *this ); 745 746 VISIT_END( node ); 732 VISIT_BODY( node ); 747 733 } 748 734 749 735 template< typename pass_type > 750 736 Statement * PassVisitor< pass_type >::mutate( AsmStmt * node ) { 751 MUTATE_START( node ); 752 753 maybeMutate_impl( node->instruction, *this ); 754 maybeMutate_impl( node->output, *this ); 755 maybeMutate_impl( node->input, *this ); 756 maybeMutate_impl( node->clobber, *this ); 757 758 MUTATE_END( Statement, node ); 737 MUTATE_BODY( Statement, node ); 759 738 } 760 739 … … 889 868 template< typename pass_type > 890 869 void PassVisitor< pass_type >::visit( BranchStmt * node ) { 891 VISIT_START( node ); 892 VISIT_END( node ); 870 VISIT_BODY( node ); 893 871 } 894 872 895 873 template< typename pass_type > 896 874 Statement * PassVisitor< pass_type >::mutate( BranchStmt * node ) { 897 MUTATE_START( node ); 875 MUTATE_BODY( Statement, node ); 876 } 877 878 //-------------------------------------------------------------------------- 879 // ReturnStmt 880 template< typename pass_type > 881 void PassVisitor< pass_type >::visit( ReturnStmt * node ) { 882 VISIT_START( node ); 883 884 visitExpression( node->expr ); 885 886 VISIT_END( node ); 887 } 888 889 template< typename pass_type > 890 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) { 891 MUTATE_START( node ); 892 893 node->expr = mutateExpression( node->expr ); 894 898 895 MUTATE_END( Statement, node ); 899 896 } 900 897 901 898 //-------------------------------------------------------------------------- 902 // ReturnStmt903 template< typename pass_type >904 void PassVisitor< pass_type >::visit( ReturnStmt * node ) {905 VISIT_START( node );906 907 visitExpression( node->expr );908 909 VISIT_END( node );910 }911 912 template< typename pass_type >913 Statement * PassVisitor< pass_type >::mutate( ReturnStmt * node ) {914 MUTATE_START( node );915 916 node->expr = mutateExpression( node->expr );917 918 MUTATE_END( Statement, node );919 }920 921 //--------------------------------------------------------------------------922 899 // ThrowStmt 923 900 924 901 template< typename pass_type > 925 902 void PassVisitor< pass_type >::visit( ThrowStmt * node ) { 926 VISIT_START( node ); 927 928 maybeAccept_impl( node->expr, *this ); 929 maybeAccept_impl( node->target, *this ); 930 931 VISIT_END( node ); 903 VISIT_BODY( node ); 932 904 } 933 905 934 906 template< typename pass_type > 935 907 Statement * PassVisitor< pass_type >::mutate( ThrowStmt * node ) { 936 MUTATE_START( node ); 937 938 maybeMutate_impl( node->expr, *this ); 939 maybeMutate_impl( node->target, *this ); 940 941 MUTATE_END( Statement, node ); 908 MUTATE_BODY( Statement, node ); 942 909 } 943 910 … … 1029 996 // catch statements introduce a level of scope (for the caught exception) 1030 997 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1031 indexerAddWith( node ->exprs);998 indexerAddWith( node ); 1032 999 maybeAccept_impl( node->stmt, *this ); 1033 1000 } … … 1042 1009 // catch statements introduce a level of scope (for the caught exception) 1043 1010 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 1044 indexerAddWith( node ->exprs);1011 indexerAddWith( node ); 1045 1012 maybeMutate_impl( node->stmt, *this ); 1046 1013 } -
src/Common/PassVisitor.proto.h
r85521c7 rd0a045c7 202 202 static inline void indexer_impl_##func ( pass_type &, long, type ) { } \ 203 203 204 INDEXER_FUNC( addId , DeclarationWithType * 205 INDEXER_FUNC( addType , NamedTypeDecl * 206 INDEXER_FUNC( addStruct , StructDecl * 207 INDEXER_FUNC( addEnum , EnumDecl * 208 INDEXER_FUNC( addUnion , UnionDecl * 209 INDEXER_FUNC( addTrait , TraitDecl * 210 INDEXER_FUNC( addWith , std::list< Expression * > &);204 INDEXER_FUNC( addId , DeclarationWithType * ); 205 INDEXER_FUNC( addType , NamedTypeDecl * ); 206 INDEXER_FUNC( addStruct , StructDecl * ); 207 INDEXER_FUNC( addEnum , EnumDecl * ); 208 INDEXER_FUNC( addUnion , UnionDecl * ); 209 INDEXER_FUNC( addTrait , TraitDecl * ); 210 INDEXER_FUNC( addWith , WithStmt * ); 211 211 212 212 -
src/Parser/DeclarationNode.cc
r85521c7 rd0a045c7 723 723 } 724 724 725 DeclarationNode * DeclarationNode::addFunctionBody( StatementNode * body, ExpressionNode * withExprs) {725 DeclarationNode * DeclarationNode::addFunctionBody( StatementNode * body, StatementNode * with ) { 726 726 assert( type ); 727 727 assert( type->kind == TypeData::Function ); 728 728 assert( ! type->function.body ); 729 if ( with ) { 730 // convert 731 // void f(S s) with (s) { x = 0; } 732 // to 733 // void f(S s) { with(s) { x = 0; } } 734 WithStmt * withStmt = strict_dynamic_cast< WithStmt * >( with->build() ); 735 withStmt->stmt = body->build(); 736 delete body; 737 delete with; 738 body = new StatementNode( new CompoundStmt( { withStmt } ) ); 739 } 729 740 type->function.body = body; 730 type->function.withExprs = withExprs;731 741 return this; 732 742 } -
src/Parser/ParseNode.h
r85521c7 rd0a045c7 262 262 DeclarationNode * addBitfield( ExpressionNode * size ); 263 263 DeclarationNode * addVarArgs(); 264 DeclarationNode * addFunctionBody( StatementNode * body, ExpressionNode * with = nullptr );264 DeclarationNode * addFunctionBody( StatementNode * body, StatementNode * with = nullptr ); 265 265 DeclarationNode * addOldDeclList( DeclarationNode * list ); 266 266 DeclarationNode * setBase( TypeData * newType ); -
src/Parser/TypeData.cc
r85521c7 rd0a045c7 55 55 function.body = nullptr; 56 56 function.newStyle = false; 57 function.withExprs = nullptr;58 57 break; 59 58 // Enum is an Aggregate, so both structures are initialized together. … … 123 122 delete function.oldDeclList; 124 123 delete function.body; 125 delete function.withExprs;126 124 // delete function; 127 125 break; … … 196 194 newtype->function.body = maybeClone( function.body ); 197 195 newtype->function.newStyle = function.newStyle; 198 newtype->function.withExprs = maybeClone( function.withExprs );199 196 break; 200 197 case Aggregate: … … 864 861 CompoundStmt * body = dynamic_cast< CompoundStmt * >( stmt ); 865 862 decl = new FunctionDecl( name, scs, linkage, buildFunction( td ), body, attributes, funcSpec ); 866 buildList( td->function.withExprs, decl->withExprs );867 863 return decl->set_asmName( asmName ); 868 864 } else if ( td->kind == TypeData::Aggregate ) { -
src/Parser/TypeData.h
r85521c7 rd0a045c7 65 65 StatementNode * body; 66 66 bool newStyle; 67 ExpressionNode * withExprs; // expressions from function's with_clause68 67 }; 69 68 -
src/Parser/parser.yy
r85521c7 rd0a045c7 259 259 %type<sn> iteration_statement jump_statement 260 260 %type<sn> expression_statement asm_statement 261 %type<sn> with_statement 262 %type<en> with_clause_opt 261 %type<sn> with_statement with_clause_opt 263 262 %type<sn> exception_statement handler_clause finally_clause 264 263 %type<catch_kind> handler_key … … 2418 2417 { $$ = nullptr; } 2419 2418 | WITH '(' tuple_expression_list ')' 2420 { $$ = $3; }2419 { $$ = new StatementNode( build_with( $3, nullptr ) ); } 2421 2420 ; 2422 2421 -
src/ResolvExpr/AlternativeFinder.cc
r85521c7 rd0a045c7 1563 1563 // find alternatives for condition 1564 1564 AlternativeFinder firstFinder( indexer, env ); 1565 firstFinder.findWithAdjustment( conditionalExpr-> arg1);1565 firstFinder.findWithAdjustment( conditionalExpr->get_arg1() ); 1566 1566 if ( firstFinder.alternatives.empty() ) return; 1567 1567 // find alternatives for true expression 1568 1568 AlternativeFinder secondFinder( indexer, env ); 1569 secondFinder.findWithAdjustment( conditionalExpr-> arg2);1569 secondFinder.findWithAdjustment( conditionalExpr->get_arg2() ); 1570 1570 if ( secondFinder.alternatives.empty() ) return; 1571 1571 // find alterantives for false expression 1572 1572 AlternativeFinder thirdFinder( indexer, env ); 1573 thirdFinder.findWithAdjustment( conditionalExpr-> arg3);1573 thirdFinder.findWithAdjustment( conditionalExpr->get_arg3() ); 1574 1574 if ( thirdFinder.alternatives.empty() ) return; 1575 for ( const Alternative & first : firstFinder.alternatives) {1576 for ( const Alternative & second : secondFinder.alternatives) {1577 for ( const Alternative & third : thirdFinder.alternatives) {1575 for ( AltList::const_iterator first = firstFinder.alternatives.begin(); first != firstFinder.alternatives.end(); ++first ) { 1576 for ( AltList::const_iterator second = secondFinder.alternatives.begin(); second != secondFinder.alternatives.end(); ++second ) { 1577 for ( AltList::const_iterator third = thirdFinder.alternatives.begin(); third != thirdFinder.alternatives.end(); ++third ) { 1578 1578 TypeEnvironment compositeEnv; 1579 compositeEnv.simpleCombine( first .env );1580 compositeEnv.simpleCombine( second .env );1581 compositeEnv.simpleCombine( third .env );1579 compositeEnv.simpleCombine( first->env ); 1580 compositeEnv.simpleCombine( second->env ); 1581 compositeEnv.simpleCombine( third->env ); 1582 1582 1583 1583 // unify true and false types, then infer parameters to produce new alternatives 1584 1584 OpenVarSet openVars; 1585 1585 AssertionSet needAssertions, haveAssertions; 1586 Alternative newAlt( 0, compositeEnv, first .cost + second.cost + third.cost );1586 Alternative newAlt( 0, compositeEnv, first->cost + second->cost + third->cost ); 1587 1587 Type* commonType = nullptr; 1588 if ( unify( second .expr->result, third.expr->result, newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {1589 ConditionalExpr *newExpr = new ConditionalExpr( first .expr->clone(), second.expr->clone(), third.expr->clone() );1590 newExpr-> result = commonType ? commonType : second.expr->result->clone();1588 if ( unify( second->expr->get_result(), third->expr->get_result(), newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) { 1589 ConditionalExpr *newExpr = new ConditionalExpr( first->expr->clone(), second->expr->clone(), third->expr->clone() ); 1590 newExpr->set_result( commonType ? commonType : second->expr->get_result()->clone() ); 1591 1591 // convert both options to the conditional result type 1592 1592 newAlt.cost += computeExpressionConversionCost( newExpr->arg2, newExpr->result, indexer, newAlt.env ); -
src/ResolvExpr/Resolver.cc
r85521c7 rd0a045c7 82 82 void previsit( ConstructorInit *ctorInit ); 83 83 private: 84 84 typedef std::list< Initializer * >::iterator InitIterator; 85 85 86 86 template< typename PtrType > 87 87 void handlePtrType( PtrType * type ); 88 88 89 void resolveWithExprs( std::list< Expression * > & withExprs, std::list< Statement * > & newStmts ); 90 void fallbackInit( ConstructorInit * ctorInit ); 89 void resolveAggrInit( ReferenceToType *, InitIterator &, InitIterator & ); 90 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator &, TypeSubstitution sub ); 91 void fallbackInit( ConstructorInit * ctorInit ); 91 92 92 93 Type * functionReturn = nullptr; … … 268 269 std::cerr << std::endl; 269 270 #endif 270 Type *new_type = resolveTypeof( functionDecl-> type, indexer );271 Type *new_type = resolveTypeof( functionDecl->get_type(), indexer ); 271 272 functionDecl->set_type( new_type ); 272 273 GuardValue( functionReturn ); 273 functionReturn = ResolvExpr::extractResultType( functionDecl->type ); 274 275 { 276 // resolve with-exprs with parameters in scope and add any newly generated declarations to the 277 // front of the function body. 278 auto guard = makeFuncGuard( [this]() { indexer.enterScope(); }, [this](){ indexer.leaveScope(); } ); 279 indexer.addFunctionType( functionDecl->type ); 280 std::list< Statement * > newStmts; 281 resolveWithExprs( functionDecl->withExprs, newStmts ); 282 functionDecl->statements->kids.splice( functionDecl->statements->kids.begin(), newStmts ); 283 } 274 functionReturn = ResolvExpr::extractResultType( functionDecl->get_functionType() ); 284 275 } 285 276 … … 288 279 // xxx - it might be necessary to somehow keep the information from this environment, but I can't currently 289 280 // see how it's useful. 290 for ( Declaration * d : functionDecl-> type->parameters) {281 for ( Declaration * d : functionDecl->get_functionType()->get_parameters() ) { 291 282 if ( ObjectDecl * obj = dynamic_cast< ObjectDecl * >( d ) ) { 292 if ( SingleInit * init = dynamic_cast< SingleInit * >( obj-> init) ) {293 delete init-> value->env;294 init-> value->env = nullptr;283 if ( SingleInit * init = dynamic_cast< SingleInit * >( obj->get_init() ) ) { 284 delete init->get_value()->get_env(); 285 init->get_value()->set_env( nullptr ); 295 286 } 296 287 } … … 593 584 } 594 585 595 void Resolver::resolveWithExprs( std::list< Expression * > & withExprs, std::list< Statement * > & newStmts ) { 596 for ( Expression *& expr : withExprs ) { 586 587 void Resolver::previsit( WithStmt * withStmt ) { 588 for ( Expression *& expr : withStmt->exprs ) { 597 589 // only struct- and union-typed expressions are viable candidates 598 590 findKindExpression( expr, indexer, "with statement", isStructOrUnion ); … … 603 595 ObjectDecl * tmp = ObjectDecl::newObject( tmpNamer.newName(), expr->result->clone(), new SingleInit( expr ) ); 604 596 expr = new VariableExpr( tmp ); 605 newStmts.push_back( new DeclStmt( tmp ) );597 stmtsToAddBefore.push_back( new DeclStmt( tmp ) ); 606 598 if ( InitTweak::isConstructable( tmp->type ) ) { 607 599 // generate ctor/dtor and resolve them … … 611 603 } 612 604 } 613 }614 615 void Resolver::previsit( WithStmt * withStmt ) {616 resolveWithExprs( withStmt->exprs, stmtsToAddBefore );617 605 } 618 606 … … 728 716 PassVisitor<Resolver> resolver( indexer ); 729 717 stmtExpr->accept( resolver ); 730 stmtExpr->computeResult();731 718 } 732 719 -
src/SymTab/Indexer.cc
r85521c7 rd0a045c7 409 409 410 410 void Indexer::addId( DeclarationWithType *decl, Expression * baseExpr ) { 411 if ( decl->name == "" ) return;412 411 debugPrint( "Adding Id " << decl->name << std::endl ); 413 412 makeWritable(); … … 589 588 } 590 589 591 void Indexer::addWith( std::list< Expression * > & withExprs) {592 for ( Expression * expr : withExprs ) {590 void Indexer::addWith( WithStmt * stmt ) { 591 for ( Expression * expr : stmt->exprs ) { 593 592 if ( expr->result ) { 594 593 AggregateDecl * aggr = expr->result->stripReferences()->getAggr(); -
src/SymTab/Indexer.h
r85521c7 rd0a045c7 84 84 85 85 /// adds all of the IDs from WithStmt exprs 86 void addWith( std::list< Expression * > & withExprs);86 void addWith( WithStmt * ); 87 87 88 88 /// adds all of the members of the Aggregate (addWith helper) -
src/SynTree/Declaration.h
r85521c7 rd0a045c7 151 151 FunctionType *type; 152 152 CompoundStmt *statements; 153 std::list< Expression * > withExprs;154 153 155 154 FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, -
src/SynTree/Expression.cc
r85521c7 rd0a045c7 597 597 598 598 StmtExpr::StmtExpr( CompoundStmt *statements ) : statements( statements ) { 599 computeResult(); 599 assert( statements ); 600 std::list< Statement * > & body = statements->get_kids(); 601 if ( ! body.empty() ) { 602 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) { 603 result = maybeClone( exprStmt->expr->result ); 604 } 605 } 606 // ensure that StmtExpr has a result type 607 if ( ! result ) { 608 result = new VoidType( Type::Qualifiers() ); 609 } 600 610 } 601 611 StmtExpr::StmtExpr( const StmtExpr &other ) : Expression( other ), statements( other.statements->clone() ) { … … 607 617 deleteAll( dtors ); 608 618 deleteAll( returnDecls ); 609 }610 void StmtExpr::computeResult() {611 assert( statements );612 std::list< Statement * > & body = statements->kids;613 delete result;614 result = nullptr;615 if ( ! returnDecls.empty() ) {616 // prioritize return decl for result type, since if a return decl exists, then617 // the StmtExpr is currently in an intermediate state where the body will always618 // give a void result type.619 result = returnDecls.front()->get_type()->clone();620 } else if ( ! body.empty() ) {621 if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( body.back() ) ) {622 result = maybeClone( exprStmt->expr->result );623 }624 }625 // ensure that StmtExpr has a result type626 if ( ! result ) {627 result = new VoidType( Type::Qualifiers() );628 }629 619 } 630 620 void StmtExpr::print( std::ostream &os, Indenter indent ) const { -
src/SynTree/Expression.h
r85521c7 rd0a045c7 728 728 StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; } 729 729 730 // call to set the result type of this StmtExpr based on its body731 void computeResult();732 733 730 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; } 734 731 std::list< Expression * > & get_dtors() { return dtors; } -
src/SynTree/FunctionDecl.cc
r85521c7 rd0a045c7 51 51 VarExprReplacer::replace( this, declMap ); 52 52 } 53 cloneAll( other.withExprs, withExprs );54 53 } 55 54 … … 57 56 delete type; 58 57 delete statements; 59 deleteAll( withExprs );60 58 } 61 59
Note: See TracChangeset
for help on using the changeset viewer.