Ignore:
Timestamp:
Apr 20, 2022, 3:00:11 PM (2 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, ast-experimental, master, pthread-emulation, qualifiedEnum
Children:
4c530a5
Parents:
2686bc7
Message:

Added ast::WaitForClause? and changed ast::WaitForStmt? to use it. This simplified a lot of the internal code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/Resolver.cc

    r2686bc7 rf6e6a55  
    1010// Created On       : Sun May 17 12:17:01 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Mar 18 10:41:00 2022
    13 // Update Count     : 247
     12// Last Modified On : Wed Apr 20 10:41:00 2022
     13// Update Count     : 248
    1414//
    1515
     
    17381738                // Resolve all clauses first
    17391739                for ( unsigned i = 0; i < stmt->clauses.size(); ++i ) {
    1740                         const ast::WaitForStmt::Clause & clause = stmt->clauses[i];
     1740                        const ast::WaitForClause & clause = *stmt->clauses[i];
    17411741
    17421742                        ast::TypeEnvironment env;
     
    17441744
    17451745                        // Find all candidates for a function in canonical form
    1746                         funcFinder.find( clause.target.func, ResolvMode::withAdjustment() );
     1746                        funcFinder.find( clause.target_func, ResolvMode::withAdjustment() );
    17471747
    17481748                        if ( funcFinder.candidates.empty() ) {
    17491749                                stringstream ss;
    17501750                                ss << "Use of undeclared indentifier '";
    1751                                 ss << clause.target.func.strict_as< ast::NameExpr >()->name;
     1751                                ss << clause.target_func.strict_as< ast::NameExpr >()->name;
    17521752                                ss << "' in call to waitfor";
    17531753                                SemanticError( stmt->location, ss.str() );
    17541754                        }
    17551755
    1756                         if ( clause.target.args.empty() ) {
     1756                        if ( clause.target_args.empty() ) {
    17571757                                SemanticError( stmt->location,
    17581758                                        "Waitfor clause must have at least one mutex parameter");
     
    17611761                        // Find all alternatives for all arguments in canonical form
    17621762                        std::vector< CandidateFinder > argFinders =
    1763                                 funcFinder.findSubExprs( clause.target.args );
     1763                                funcFinder.findSubExprs( clause.target_args );
    17641764
    17651765                        // List all combinations of arguments
     
    19341934
    19351935                        // build new clause
    1936                         ast::WaitForStmt::Clause clause2;
    1937 
    1938                         clause2.target.func = funcCandidates.front()->expr;
    1939 
    1940                         clause2.target.args.reserve( clause.target.args.size() );
     1936                        auto clause2 = new ast::WaitForClause( clause.location );
     1937
     1938                        clause2->target_func = funcCandidates.front()->expr;
     1939
     1940                        clause2->target_args.reserve( clause.target_args.size() );
    19411941                        const ast::StructDecl * decl_monitor = symtab.lookupStruct( "monitor$" );
    19421942                        for ( auto arg : argsCandidates.front() ) {
     
    19551955                                );
    19561956
    1957                                 clause2.target.args.emplace_back( findSingleExpression( init, context ) );
     1957                                clause2->target_args.emplace_back( findSingleExpression( init, context ) );
    19581958                        }
    19591959
    19601960                        // Resolve the conditions as if it were an IfStmt, statements normally
    1961                         clause2.cond = findSingleExpression( clause.cond, context );
    1962                         clause2.stmt = clause.stmt->accept( *visitor );
     1961                        clause2->cond = findSingleExpression( clause.cond, context );
     1962                        clause2->stmt = clause.stmt->accept( *visitor );
    19631963
    19641964                        // set results into stmt
    19651965                        auto n = mutate( stmt );
    1966                         n->clauses[i] = std::move( clause2 );
     1966                        n->clauses[i] = clause2;
    19671967                        stmt = n;
    19681968                }
    19691969
    1970                 if ( stmt->timeout.stmt ) {
     1970                if ( stmt->timeout_stmt ) {
    19711971                        // resolve the timeout as a size_t, the conditions like IfStmt, and stmts normally
    1972                         ast::WaitForStmt::Timeout timeout2;
    1973 
    19741972                        ast::ptr< ast::Type > target =
    19751973                                new ast::BasicType{ ast::BasicType::LongLongUnsignedInt };
    1976                         timeout2.time = findSingleExpression( stmt->timeout.time, target, context );
    1977                         timeout2.cond = findSingleExpression( stmt->timeout.cond, context );
    1978                         timeout2.stmt = stmt->timeout.stmt->accept( *visitor );
     1974                        auto timeout_time = findSingleExpression( stmt->timeout_time, target, context );
     1975                        auto timeout_cond = findSingleExpression( stmt->timeout_cond, context );
     1976                        auto timeout_stmt = stmt->timeout_stmt->accept( *visitor );
    19791977
    19801978                        // set results into stmt
    19811979                        auto n = mutate( stmt );
    1982                         n->timeout = std::move( timeout2 );
     1980                        n->timeout_time = std::move( timeout_time );
     1981                        n->timeout_cond = std::move( timeout_cond );
     1982                        n->timeout_stmt = std::move( timeout_stmt );
    19831983                        stmt = n;
    19841984                }
    19851985
    1986                 if ( stmt->orElse.stmt ) {
     1986                if ( stmt->else_stmt ) {
    19871987                        // resolve the condition like IfStmt, stmts normally
    1988                         ast::WaitForStmt::OrElse orElse2;
    1989 
    1990                         orElse2.cond = findSingleExpression( stmt->orElse.cond, context );
    1991                         orElse2.stmt = stmt->orElse.stmt->accept( *visitor );
     1988                        auto else_cond = findSingleExpression( stmt->else_cond, context );
     1989                        auto else_stmt = stmt->else_stmt->accept( *visitor );
    19921990
    19931991                        // set results into stmt
    19941992                        auto n = mutate( stmt );
    1995                         n->orElse = std::move( orElse2 );
     1993                        n->else_cond = std::move( else_cond );
     1994                        n->else_stmt = std::move( else_stmt );
    19961995                        stmt = n;
    19971996                }
Note: See TracChangeset for help on using the changeset viewer.