Changeset c298079


Ignore:
Timestamp:
Oct 16, 2023, 1:16:42 PM (9 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
6bd9f9e
Parents:
bab2917 (diff), 61e5d99 (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

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • doc/uC++toCFA/uC++toCFA.tex

    rbab2917 rc298079  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sun Sep 17 09:10:12 2023
    14 %% Update Count     : 5883
     13%% Last Modified On : Sun Oct 15 23:09:58 2023
     14%% Update Count     : 5926
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    119119
    120120\title{\vspace*{-0.5in}
    121 \CC/\uC to \CFA Cheat Sheet}
     121\uC to \CFA Cheat Sheet}
    122122%\author{Peter A. Buhr}
    123123\date{}
     
    195195\end{cfa}
    196196\noindent
    197 In subsequent code examples, the left example is \CC/\uC and the right example is \CFA.
     197In subsequent code examples, the left example is \uC and the right example is \CFA.
     198
     199
     200\section{Stream I/O}
     201
     202\CFA output streams automatically separate values and insert a newline at the end of the print.
     203
     204\begin{cquote}
     205\begin{tabular}{l|l}
     206\begin{uC++}
     207#include <@iostream@>
     208using namespace std;
     209int i;   double d;   char c;
     210cin >> i >> d >> c;
     211cout << i << ' ' << d << ' ' << c | endl;
     212\end{uC++}
     213&
     214\begin{cfa}
     215#include <@fstream.hfa@>
     216
     217int i;   double d;   char c;
     218sin | i | d | c;
     219sout | i | d | c
     220\end{cfa}
     221\end{tabular}
     222\end{cquote}
    198223
    199224
     
    203228\begin{tabular}{l|l}
    204229\begin{uC++}
    205 for ( ;; ) { ... } / while ( true ) { ... }
    206 for ( int i = 0; i < 10; i += 1 ) { ... }
    207 for ( int i = 5; i < 15; i += 2 ) { ... }
     230for ( @;;@ ) { ... }  /  while ( @true@ ) { ... }
     231for ( int i = 0; i < @10@; i += 1 ) { ... }
     232for ( int i = @5@; i < @15@; i += @2@ ) { ... }
     233for ( int i = -1; i <@=@ 10; i += 3 ) { ... }
     234for ( int i = 10; i > 0; i @-@= 1 ) { ... }
     235\end{uC++}
     236&
     237\begin{cfa}
     238for () { ... }  /  while () { ... }
     239for ( @10@ ) { ... }  /  for ( i; @10@ ) { ... }
     240for ( i; @5@ ~ @15@ ~ @2@ ) { ... }
     241for ( i; -1 ~@=@ 10 ~ 3 ) { ... }
     242for ( i; 0 @-@~ 10 ) { ... }
     243\end{cfa}
     244\\
     245\hline
     246\begin{uC++}
    208247int i = 0
    209248for ( i = 0; i < 10; i += 1 ) { ... }
    210 if ( i == 10 ) { ... }
    211 \end{uC++}
    212 &
    213 \begin{cfa}
    214 for () { ... } / while () { ... }
    215 for ( 10 ) { ... } / for ( i; 10 ) { ... }
    216 for ( i; 5~15~2 ) { ... }
     249@if ( i == 10 )@ { ... }
     250\end{uC++}
     251&
     252\begin{cfa}
    217253
    218254for ( i; 10 ) { ... }
    219 else { ... } // i == 10
    220 \end{cfa}
    221 \end{tabular}
    222 \end{cquote}
    223 
    224 
    225 \section{Exceptions}
     255@else@ { ... } // i == 10
     256\end{cfa}
     257\\
     258\hline
     259\begin{uC++}
     260L1: for ( ;; ) {
     261        L2: for ( ;; ) {
     262                ... @break L1@; ... @break L2@; ...
     263        }
     264}
     265\end{uC++}
     266&
     267\begin{cfa}
     268L1: for () {
     269        L2: for () {
     270                ... @break L1@; ... @break L2@; ...
     271        }
     272}
     273\end{cfa}
     274\end{tabular}
     275\end{cquote}
     276
     277
     278\section{Exception}
    226279
    227280Currently, \CFA uses macros @ExceptionDecl@ and @ExceptionInst@ to declare and instantiate an exception.
     
    230283\begin{uC++}
    231284
    232 struct E {              // local or global scope
     285@_Exception@ E {        // local or global scope
    233286        ... // exception fields
    234287};
    235288try {
    236289        ...
    237         if ( ... ) _Resume E( /* initialization */ );
    238         if ( ... ) _Throw E( /* initialization */ );
    239         ...
    240 } _CatchResume( E & ) { // should be reference
     290        if ( ... ) @_Resume@ E( /* initialization */ );
     291        if ( ... ) @_Throw@ E( /* initialization */ );
     292                ...
     293} @_CatchResume@( E & ) { // should be reference
    241294        ...
    242295} catch( E & ) {
     
    252305try {
    253306        ...
    254         if ( ... ) throwResume @ExceptionInst@( E, /* intialization */ );
    255         if ( ... ) throw @ExceptionInst@( E, /* intialization */ );
     307        if ( ... ) @throwResume@ @ExceptionInst@( E, /* intialization */ );
     308        if ( ... ) @throw@ @ExceptionInst@( E, /* intialization */ );
    256309        ...
    257 } catchResume( E * ) { // must be pointer
     310} @catchResume@( E * ) { // must be pointer
    258311        ...
    259312} catch( E * ) {
     
    265318
    266319
    267 \section{Stream I/O}
    268 
    269 \CFA output streams automatically separate values and insert a newline at the end of the print.
     320\section{Non-local Exception}
     321
     322\begin{cquote}
     323\begin{tabular}{l|ll}
     324\begin{uC++}
     325
     326
     327void main() {
     328        try {
     329                _Enable {
     330                        ... suspend(); ...
     331                }
     332        } @_CatchResume@( E & ) { // reference
     333                ...
     334        } catch( E & ) {
     335                ...
     336        }
     337}
     338\end{uC++}
     339&
     340\begin{cfa}
     341#define resumePoll( coroutine ) resume( coroutine ); checked_poll()
     342#define suspendPoll suspend; checked_poll()
     343void main() {
     344        try {
     345                enable_ehm();
     346                ... suspendPoll ...
     347                disable_ehm();
     348        } @catchResume@( E * ) { // pointer
     349                ...
     350        } catch( E & ) {
     351                ...
     352        }
     353}
     354\end{cfa}
     355\end{tabular}
     356\end{cquote}
     357
     358
     359\section{Constructor / Destructor}
    270360
    271361\begin{cquote}
    272362\begin{tabular}{l|l}
    273363\begin{uC++}
    274 #include <@iostream@>
    275 using namespace std;
    276 int i;   double d;   char c;
    277 cin >> i >> d >> c;
    278 cout << i << ' ' << d << ' ' << c | endl;
    279 \end{uC++}
    280 &
    281 \begin{cfa}
    282 #include <@fstream.hfa@>
    283 
    284 int i;   double d;   char c;
    285 sin | i | d | c;
    286 sout | i | d | c
     364struct S {
     365        ... // fields
     366        @S@(...) { ... }
     367        @~S@(...) { ... }
     368};
     369\end{uC++}
     370&
     371\begin{cfa}
     372struct S {
     373        ... // fields
     374};
     375@?{}@( @S & s,@ ...) { ... }
     376@^?{}@( @S & s@ ) { ... }
    287377\end{cfa}
    288378\end{tabular}
     
    332422
    333423
    334 \section{Constructor / Destructor}
    335 
    336 \begin{cquote}
    337 \begin{tabular}{l|l}
    338 \begin{uC++}
    339 struct S {
    340         ... // fields
    341         @S@(...) { ... }
    342         @~S@(...) { ... }
    343 };
    344 \end{uC++}
    345 &
    346 \begin{cfa}
    347 struct S {
    348         ... // fields
    349 };
    350 @?{}@( @S & s,@ ...) { ... }
    351 @^?{}@( @S & s@ ) { ... }
    352 \end{cfa}
    353 \end{tabular}
    354 \end{cquote}
    355 
    356 
    357424\section{\texorpdfstring{Structures (object-oriented \protect\vs routine style)}{Structures (object-oriented vs. routine style)}}
    358425
  • src/GenPoly/BoxNew.cpp

    rbab2917 rc298079  
    386386        // return value.
    387387
    388         /// Pass the extra type parameters from polymorphic generic arguments or
    389         /// return types into a function application.
    390         ast::vector<ast::Expr>::iterator passArgTypeVars(
    391                 ast::ApplicationExpr * expr, ast::Type const * parmType,
    392                 ast::Type const * argBaseType, ast::vector<ast::Expr>::iterator arg,
    393                 const TypeVarMap & exprTyVars, std::set<std::string> & seenTypes );
    394         /// Passes extra type parameters into a polymorphic function application.
     388        /// Passes extra layout arguments for sized polymorphic type parameters.
    395389        ast::vector<ast::Expr>::iterator passTypeVars(
    396390                ast::ApplicationExpr * expr,
    397                 ast::Type const * polyRetType,
    398                 ast::FunctionType const * funcType,
    399                 const TypeVarMap & exprTyVars );
     391                ast::FunctionType const * funcType );
    400392        /// Wraps a function application with a new temporary for the
    401393        /// out-parameter return value.
     
    700692        // the concrete type's parameters, not the formal type's).
    701693        ast::vector<ast::Expr>::iterator argIt =
    702                 passTypeVars( mutExpr, concRetType, function, exprTypeVars );
     694                passTypeVars( mutExpr, function );
    703695        addInferredParams( mutExpr, argIt, function, exprTypeVars );
    704696
     
    812804}
    813805
    814 // arg is an in/out parameter that matches the return value.
    815 ast::vector<ast::Expr>::iterator CallAdapter::passArgTypeVars(
    816                 ast::ApplicationExpr * expr, ast::Type const * paramType,
    817                 ast::Type const * argBaseType, ast::vector<ast::Expr>::iterator arg,
    818                 const TypeVarMap & exprTypeVars, std::set<std::string> & seenTypes ) {
    819         ast::Type const * polyType = isPolyType( paramType, exprTypeVars );
    820         if ( !polyType || dynamic_cast<ast::TypeInstType const *>( polyType ) ) {
    821                 return arg;
    822         }
    823 
    824         std::string typeName = Mangle::mangleType( polyType );
    825         if ( seenTypes.count( typeName ) ) return arg;
    826 
    827         arg = expr->args.insert( arg,
    828                 new ast::SizeofExpr( expr->location, ast::deepCopy( argBaseType ) )
    829         );
    830         arg++;
    831         arg = expr->args.insert( arg,
    832                 new ast::AlignofExpr( expr->location, ast::deepCopy( argBaseType ) )
    833         );
    834         arg++;
    835         if ( dynamic_cast<ast::StructInstType const *>( polyType ) ) {
    836                 auto argBaseStructType =
    837                                 dynamic_cast<ast::StructInstType const *>( argBaseType );
    838                 if ( nullptr == argBaseStructType ) {
    839                         SemanticError( expr,
    840                                 "Cannot pass non-structure type for generic struct: " );
    841                 }
    842 
    843                 // Zero-length arrays are forbidden by C, so don't pass
    844                 // offset for empty structure.
    845                 if ( !argBaseStructType->base->members.empty() ) {
    846                         arg = expr->args.insert( arg,
    847                                 new ast::OffsetPackExpr(
    848                                         expr->location,
    849                                         ast::deepCopy( argBaseStructType ) )
    850                         );
    851                         arg++;
    852                 }
    853         }
    854 
    855         seenTypes.insert( typeName );
    856         return arg;
    857 }
    858 
    859806ast::vector<ast::Expr>::iterator CallAdapter::passTypeVars(
    860807                ast::ApplicationExpr * expr,
    861                 ast::Type const * polyRetType,
    862                 ast::FunctionType const * function,
    863                 const TypeVarMap & exprTypeVars ) {
     808                ast::FunctionType const * function ) {
    864809        assert( typeSubs );
    865810        ast::vector<ast::Expr>::iterator arg = expr->args.begin();
     
    880825                        new ast::AlignofExpr( expr->location, ast::deepCopy( concrete ) ) );
    881826                arg++;
    882         }
    883 
    884         // Add size/align for generic types to parameter list.
    885         if ( !expr->func->result ) return arg;
    886         ast::FunctionType const * funcType = getFunctionType( expr->func->result );
    887         assert( funcType );
    888 
    889         // This iterator points at first original argument.
    890         ast::vector<ast::Expr>::const_iterator funcArg;
    891         // Names for generic types we've seen.
    892         std::set<std::string> seenTypes;
    893 
    894         // A polymorphic return type may need to be added to the argument list.
    895         if ( polyRetType ) {
    896                 assert( typeSubs );
    897                 auto concRetType = replaceWithConcrete( polyRetType, *typeSubs );
    898                 // TODO: This write-back may not be correct.
    899                 arg = passArgTypeVars( expr, polyRetType, concRetType,
    900                                 arg, exprTypeVars, seenTypes );
    901                 // Skip the return parameter in the argument list.
    902                 funcArg = arg + 1;
    903         } else {
    904                 funcArg = arg;
    905         }
    906 
    907         // TODO:
    908         // I believe this is (starts as) the number of original arguments to the
    909         // function with the args before funcArg all being inserted.
    910         ptrdiff_t argsToPass = std::distance( funcArg, expr->args.cend() );
    911 
    912         // Add type information args for presently unseen types in parameter list.
    913         ast::vector<ast::Type>::const_iterator funcParam = funcType->params.begin();
    914         // assert( funcType->params.size() == argsToPass );
    915         for ( ; funcParam != funcType->params.end() && 0 < argsToPass
    916                         ; ++funcParam, --argsToPass ) {
    917                 assert( 0 < argsToPass );
    918                 assert( argsToPass <= (ptrdiff_t)expr->args.size() );
    919                 ptrdiff_t index = expr->args.size() - argsToPass;
    920                 ast::Type const * argType = expr->args[index]->result;
    921                 if ( nullptr == argType ) continue;
    922                 arg = passArgTypeVars( expr, *funcParam, argType,
    923                                 arg, exprTypeVars, seenTypes );
    924827        }
    925828        return arg;
     
    15231426}
    15241427
    1525 ast::ObjectDecl * makePtr(
    1526                 CodeLocation const & location, std::string const & name ) {
    1527         return new ast::ObjectDecl( location, name,
    1528                 new ast::PointerType( makeSizeAlignType() ),
    1529                 nullptr, ast::Storage::Classes(), ast::Linkage::C, nullptr );
    1530 }
    1531 
    15321428ast::FunctionDecl const * DeclAdapter::previsit( ast::FunctionDecl const * decl ) {
    15331429        TypeVarMap localTypeVars = { ast::TypeData() };
     
    15841480        mutDecl->assertions.clear();
    15851481
    1586         // Add size/align for generic parameter types to parameter list.
    1587         std::set<std::string> seenTypes;
    1588         ast::vector<ast::DeclWithType> otypeParams;
    1589         for ( ast::ptr<ast::DeclWithType> & funcParam : mutDecl->params ) {
    1590                 ast::Type const * polyType = isPolyType( funcParam->get_type(), localTypeVars );
    1591                 if ( !polyType || dynamic_cast<ast::TypeInstType const *>( polyType ) ) {
    1592                         continue;
    1593                 }
    1594                 std::string typeName = Mangle::mangleType( polyType );
    1595                 if ( seenTypes.count( typeName ) ) continue;
    1596                 seenTypes.insert( typeName );
    1597 
    1598                 auto sizeParam = makeObj( funcParam->location, sizeofName( typeName ) );
    1599                 otypeParams.emplace_back( sizeParam );
    1600 
    1601                 auto alignParam = makeObj( funcParam->location, alignofName( typeName ) );
    1602                 otypeParams.emplace_back( alignParam );
    1603 
    1604                 // Zero-length arrays are illegal in C, so empty structs have no
    1605                 // offset array.
    1606                 if ( auto * polyStruct =
    1607                                 dynamic_cast<ast::StructInstType const *>( polyType ) ;
    1608                                 polyStruct && !polyStruct->base->members.empty() ) {
    1609                         auto offsetParam = makePtr( funcParam->location, offsetofName( typeName ) );
    1610                         otypeParams.emplace_back( offsetParam );
    1611                 }
    1612         }
    1613 
    16141482        // Prepend each argument group. From last group to first. addAdapters
    16151483        // does do the same, it just does it itself and see all other parameters.
    16161484        spliceBegin( mutDecl->params, inferredParams );
    1617         spliceBegin( mutDecl->params, otypeParams );
    16181485        spliceBegin( mutDecl->params, layoutParams );
    16191486        addAdapters( mutDecl, localTypeVars );
     
    18151682        beginGenericScope();
    18161683        beginTypeScope( decl->type );
    1817 
    1818         // TODO: Going though dec->params does not work for some reason.
    1819         for ( ast::ptr<ast::Type> const & funcParam : decl->type->params ) {
    1820                 // Condition here duplicates that in `DeclAdapter::previsit( FunctionDecl const * )`
    1821                 ast::Type const * polyType = isPolyType( funcParam, scopeTypeVars );
    1822                 if ( polyType && !dynamic_cast<ast::TypeInstType const *>( polyType ) ) {
    1823                         knownLayouts.insert( Mangle::mangleType( polyType ) );
    1824                 }
    1825         }
    18261684}
    18271685
     
    18981756        // don't mark them as known in this scope.
    18991757        expect_func_type = false;
    1900 
    1901         // Make sure that any type information passed into the function is
    1902         // accounted for.
    1903         for ( ast::ptr<ast::Type> const & funcParam : type->params ) {
    1904                 // Condition here duplicates that in `DeclAdapter::previsit( FunctionDecl const * )`
    1905                 ast::Type const * polyType = isPolyType( funcParam, scopeTypeVars );
    1906                 if ( polyType && !dynamic_cast<ast::TypeInstType const *>( polyType ) ) {
    1907                         knownLayouts.insert( Mangle::mangleType( polyType ) );
    1908                 }
    1909         }
    19101758}
    19111759
Note: See TracChangeset for help on using the changeset viewer.