Changeset 6dba8755


Ignore:
Timestamp:
Jul 31, 2020, 11:06:44 AM (16 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
arm-eh, jacob/cs343-translation, master, new-ast, new-ast-unique-expr
Children:
95789be
Parents:
0c760db
Message:

I was given a trick with the indexer that fixes some scoping issues with virtual casts.

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Common/ScopedMap.h

    r0c760db r6dba8755  
    9393
    9494                reference operator* () { return *it; }
    95                 pointer operator-> () { return it.operator->(); }
     95                pointer operator-> () const { return it.operator->(); }
    9696
    9797                iterator& operator++ () {
  • src/Virtual/ExpandCasts.cc

    r0c760db r6dba8755  
    1010// Created On       : Mon Jul 24 13:59:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tue Jul 22 10:04:00 2020
    13 // Update Count     : 3
     12// Last Modified On : Fri Jul 31 10:29:00 2020
     13// Update Count     : 4
    1414//
    1515
     
    1818#include <cassert>                 // for assert, assertf
    1919#include <iterator>                // for back_inserter, inserter
    20 #include <map>                     // for map, _Rb_tree_iterator, map<>::ite...
    2120#include <string>                  // for string, allocator, operator==, ope...
    22 #include <utility>                 // for pair
    2321
    2422#include "Common/PassVisitor.h"    // for PassVisitor
     23#include "Common/ScopedMap.h"      // for ScopedMap
    2524#include "Common/SemanticError.h"  // for SemanticError
    2625#include "SymTab/Mangler.h"        // for mangleType
     
    3736        /// Maps virtual table types the instance for that type.
    3837        class VirtualTableMap final {
    39                 std::unordered_map<std::string, ObjectDecl *> vtable_instances;
     38                ScopedMap<std::string, ObjectDecl *> vtable_instances;
    4039        public:
     40                void enterScope() {
     41                        vtable_instances.beginScope();
     42                }
     43                void leaveScope() {
     44                        vtable_instances.endScope();
     45                }
     46
    4147                ObjectDecl * insert( ObjectDecl * vtableDecl ) {
    4248                        std::string const & mangledName = SymTab::Mangler::mangleType( vtableDecl->type );
     
    9399
    94100        class VirtualCastCore {
    95                 VirtualTableMap vtable_instances;
    96                 FunctionDecl *vcast_decl;
    97                 StructDecl *pvt_decl;
    98 
    99101                Type * pointer_to_pvt(int level_of_indirection) {
    100102                        Type * type = new StructInstType(
     
    108110        public:
    109111                VirtualCastCore() :
    110                         vtable_instances(), vcast_decl( nullptr ), pvt_decl( nullptr )
     112                        indexer(), vcast_decl( nullptr ), pvt_decl( nullptr )
    111113                {}
    112114
     
    116118
    117119                Expression * postmutate( VirtualCastExpr * castExpr );
     120
     121                VirtualTableMap indexer;
     122        private:
     123                FunctionDecl *vcast_decl;
     124                StructDecl *pvt_decl;
    118125        };
    119126
     
    135142        void VirtualCastCore::premutate( ObjectDecl * objectDecl ) {
    136143                if ( is_vtable_inst_name( objectDecl->get_name() ) ) {
    137                         if ( ObjectDecl * existing = vtable_instances.insert( objectDecl ) ) {
     144                        if ( ObjectDecl * existing = indexer.insert( objectDecl ) ) {
    138145                                std::string msg = "Repeated instance of virtual table, original found at: ";
    139146                                msg += existing->location.filename;
     
    222229
    223230                const Type * vtable_type = getVirtualTableType( castExpr );
    224                 ObjectDecl * table = vtable_instances.lookup( vtable_type );
     231                ObjectDecl * table = indexer.lookup( vtable_type );
    225232                if ( nullptr == table ) {
    226233                        SemanticError( castLocation( castExpr ),
Note: See TracChangeset for help on using the changeset viewer.