Changeset 04c77791


Ignore:
Timestamp:
Aug 19, 2018, 12:09:36 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, no_list, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
2987b30
Parents:
0e73845
Message:

Parse forall lists and type variables in demangler

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Demangle.cc

    r0e73845 r04c77791  
    2323#include "SynTree/Declaration.h"
    2424
    25 // #define DEBUG
     25#define DEBUG
    2626#ifdef DEBUG
    2727#define PRINT(x) x
     
    365365                                                PRINT( std::cerr << "basic type: " << k << std::endl; )
    366366                                                return new BasicType(tq, (BasicType::Kind)k);
     367                                        });
     368                                }
     369                                // type variable types
     370                                for (size_t k = 0; k < TypeDecl::NUMBER_OF_KINDS; ++k) {
     371                                        parsers.emplace_back(Encoding::typeVariables[k], [k, this](Type::Qualifiers tq) -> TypeInstType * {
     372                                                PRINT( std::cerr << "type variable type: " << k << std::endl; )
     373                                                std::string name;
     374                                                if (! extractName(name)) return nullptr;
     375                                                return new TypeInstType(tq, name, (TypeDecl::Kind)k != TypeDecl::Ftype);
    367376                                        });
    368377                                }
     
    516525                                if (done()) return nullptr;
    517526
     527                                std::list<TypeDecl *> forall;
     528                                if (isPrefix(Encoding::forall)) {
     529                                        PRINT( std::cerr << "polymorphic with..." << std::endl; )
     530                                        size_t dcount, fcount, vcount, acount;
     531                                        if (! extractNumber(dcount)) return nullptr;
     532                                        PRINT( std::cerr << dcount << " dtypes" << std::endl; )
     533                                        if (! expect('_')) return nullptr;
     534                                        if (! extractNumber(fcount)) return nullptr;
     535                                        PRINT( std::cerr << fcount << " ftypes" << std::endl; )
     536                                        if (! expect('_')) return nullptr;
     537                                        if (! extractNumber(vcount)) return nullptr;
     538                                        PRINT( std::cerr << vcount << " ttypes" << std::endl; )
     539                                        if (! expect('_')) return nullptr;
     540                                        if (! extractNumber(acount)) return nullptr;
     541                                        PRINT( std::cerr << acount << " assertions" << std::endl; )
     542                                        if (! expect('_')) return nullptr;
     543                                        // recursively(?) parse `acount` assertions
     544                                        if (! expect('_')) return nullptr;
     545                                }
     546
    518547                                // qualifiers
    519548                                Type::Qualifiers tq;
     
    531560                                });
    532561                                assertf(iter != parsers.end(), "Unhandled type letter: %c at index: %zd", cur(), idx);
    533                                 return iter->second(tq);
     562                                Type * ret = iter->second(tq);
     563                                if (! ret) return nullptr;
     564                                ret->forall = std::move(forall);
     565                                return ret;
    534566                        }
    535567
Note: See TracChangeset for help on using the changeset viewer.