Changeset 6a0b043 for src


Ignore:
Timestamp:
Nov 21, 2023, 11:34:47 AM (8 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
4883712
Parents:
0da9475
Message:

Did some investigation of WithStmt?. It may not be possible to convert it to a Stmt without changing how SymbolTable? handles the with clauses.

Location:
src/AST
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Decl.hpp

    r0da9475 r6a0b043  
    361361
    362362/// With statement `with (...) ...`
     363/// This is a statement lexically, but a Decl is needed for the SymbolTable.
    363364class WithStmt final : public Decl {
    364365public:
  • src/AST/SymbolTable.cpp

    r0da9475 r6a0b043  
    7676                        ret = new MemberExpr{loc, id, referenceToRvalueConversion( base, cost )};
    7777                        ret->env = subs;
    78                 }
    79                 else {
     78                } else {
    8079                        ret = new MemberExpr{ loc, id, referenceToRvalueConversion( baseExpr, cost ) };
    8180                }
    82         }
    83         else {
     81        } else {
    8482                ret = new VariableExpr{ loc, id };
    8583        }
     
    193191                        }
    194192                }
    195         }
    196         else {
     193        } else {
    197194                ++*num_lookup_with_key;
    198195                ++*stats().map_lookups;
     
    294291}
    295292
    296 bool SymbolTable::addedDeclConflicts( 
     293bool SymbolTable::addedDeclConflicts(
    297294                const AggregateDecl * existing, const AggregateDecl * added ) const {
    298295        if ( ! existing->body ) {
     
    480477                        if (dynamic_cast<const PointerType *>(base)) return Mangle::Encoding::pointer;
    481478                        return Mangle::mangle( base, Mangle::Type | Mangle::NoGenericParams );
    482                 }
    483                 else
    484                         return Mangle::mangle( base ); 
     479                } else {
     480                        return Mangle::mangle( base );
     481                }
    485482        }
    486483
     
    556553                if ( ! alreadyUserDefinedFunc ) for ( const auto& entry : deleted ) {
    557554                        ++*stats().map_mutations;
    558                         mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } );
     555                        mangleTable = mangleTable->set( entry.first, entry.second.withDeleter( function ) );
    559556                }
    560557        } else if ( dataIsUserDefinedFunc ) {
     
    586583                for ( const auto& entry : deleted ) {
    587584                        ++*stats().map_mutations;
    588                         mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } );
     585                        mangleTable = mangleTable->set( entry.first, entry.second.withDeleter( function ) );
    589586                }
    590587        } else if ( function->linkage != Linkage::Intrinsic ) {
     
    690687        if (kind == NUMBER_OF_KINDS) { // not a special decl
    691688                addIdToTable(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
    692         }
    693         else {
     689        } else {
    694690                std::string key;
    695691                if (auto func = dynamic_cast<const FunctionDecl *>(decl)) {
    696692                        key = getOtypeKey(func->type);
    697                 }
    698                 else if (auto obj = dynamic_cast<const ObjectDecl *>(decl)) {
     693                } else if (auto obj = dynamic_cast<const ObjectDecl *>(decl)) {
    699694                        key = getOtypeKey(obj->type.strict_as<PointerType>()->base.strict_as<FunctionType>());
    700                 }
    701                 else {
     695                } else {
    702696                        assertf(false, "special decl with non-function type");
    703697                }
     
    755749                        if ( existing != mangleTable->end()
    756750                                        && existing->second.scope == scope
    757                                         && existing->second.id ) {
    758                                 if ( addedIdConflicts( existing->second, decl, handleConflicts, deleter ) ) {
    759                                         if ( handleConflicts.mode == OnConflict::Delete ) {
    760                                                 // set delete expression for conflicting identifier
    761                                                 lazyInitScope();
    762                                                 *stats().map_mutations += 2;
    763                                                 table = table->set(
    764                                                         lookupKey,
    765                                                         mangleTable->set(
    766                                                                 mangleName,
    767                                                                 IdData{ existing->second, handleConflicts.deleter } ) );
    768                                         }
    769                                         return;
     751                                        && existing->second.id
     752                                        && addedIdConflicts( existing->second, decl, handleConflicts, deleter ) ) {
     753                                if ( handleConflicts.mode == OnConflict::Delete ) {
     754                                        // set delete expression for conflicting identifier
     755                                        lazyInitScope();
     756                                        *stats().map_mutations += 2;
     757                                        table = table->set(
     758                                                lookupKey,
     759                                                mangleTable->set(
     760                                                        mangleName,
     761                                                        existing->second.withDeleter( handleConflicts.deleter ) ) );
    770762                                }
     763                                return;
    771764                        }
    772765                }
  • src/AST/SymbolTable.hpp

    r0da9475 r6a0b043  
    4848                : id( i ), baseExpr( base ), deleter( del ), scope( s ) {}
    4949
    50                 /// Modify an existing node with a new deleter
    51                 IdData( const IdData & o, const Decl * del )
    52                 : id( o.id ), baseExpr( o.baseExpr ), deleter( del ), scope( o.scope ) {}
     50                /// Create a new IdData, updating the deleter value.
     51                IdData withDeleter( const Decl * decl ) const {
     52                        return IdData( id, baseExpr, decl, scope );
     53                }
    5354
    5455                /// Constructs an expression referring to this identifier.
Note: See TracChangeset for help on using the changeset viewer.