source: src/Parser/TypedefTable.cc @ de62360d

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since de62360d was de62360d, checked in by Peter A. Buhr <pabuhr@…>, 9 years ago

fix computed goto, fixed -std=, implicit typedefs for enum and aggregates, add _Noreturn _Thread_local

  • Property mode set to 100644
File size: 4.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// TypedefTable.cc --
8//
9// Author           : Rodolfo G. Esteves
10// Created On       : Sat May 16 15:20:13 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sun Jun 21 11:46:15 2015
13// Update Count     : 7
14//
15
16#include <map>
17#include <list>
18#include "TypedefTable.h"
19#include <cassert>
20using namespace std;
21
22#if 0
23#include <iostream>
24#define debugPrint(x ) cerr << x
25#else
26#define debugPrint( x )
27#endif
28
29TypedefTable::TypedefTable() : currentScope( 0 ) {}
30
31bool TypedefTable::isKind( const string &identifier, kind_t kind ) const {
32        tableType::const_iterator id_pos = table.find( identifier );
33        if ( id_pos == table.end() ) {
34                return true;
35        } else {
36                return (*((*id_pos ).second.begin())).kind == kind;
37        } // if
38}
39
40bool TypedefTable::isIdentifier( const string &identifier ) const {
41        return isKind( identifier, ID );
42}
43
44bool TypedefTable::isTypedef( const string &identifier ) const {
45        return isKind( identifier, TD );
46}
47
48bool TypedefTable::isTypegen( const string &identifier ) const {
49        return isKind( identifier, TG );
50}
51
52void TypedefTable::addToScope( const std::string &identifier, kind_t kind, int scope ) {
53        if ( currentContext != "" && scope == contextScope ) {
54                DeferredEntry entry = { identifier, kind };
55                contexts[currentContext].push_back( entry );
56        } else {
57                debugPrint( "Adding " << identifier << " as type " << kind << " scope " << scope << " from scope " << currentScope << endl );
58                Entry newEntry = { scope, kind };
59                tableType::iterator curPos = table.find( identifier );
60                if ( curPos == table.end()) {
61                        list<Entry> newList;
62                        newList.push_front( newEntry );
63                        table[identifier] = newList;
64                } else {
65                        list<Entry>::iterator listPos = (*curPos ).second.begin();
66                        while ( listPos != (*curPos ).second.end() && listPos->scope > scope ) {
67                                listPos++;
68                        } // while
69                        (*curPos ).second.insert( listPos, newEntry );
70                } // if
71        } // if
72}
73
74void TypedefTable::addToCurrentScope( const std::string &identifier, kind_t kind ) {
75        addToScope( identifier, kind, currentScope );
76}
77
78void TypedefTable::addToCurrentScope( kind_t kind ) {
79        addToCurrentScope( nextIdentifiers.top(), kind );
80}
81
82void TypedefTable::addToEnclosingScope( const std::string &identifier, kind_t kind ) {
83        assert( currentScope >= 1 );
84        addToScope( identifier, kind, currentScope - 1 );
85}
86
87void TypedefTable::addToEnclosingScope( kind_t kind ) {
88        addToEnclosingScope( nextIdentifiers.top(), kind );
89}
90
91void TypedefTable::addToEnclosingScope2( const std::string &identifier, kind_t kind ) {
92        assert( currentScope >= 2 );
93        addToScope( identifier, kind, currentScope - 2 );
94}
95
96void TypedefTable::addToEnclosingScope2( kind_t kind ) {
97        addToEnclosingScope2( nextIdentifiers.top(), kind );
98}
99
100void TypedefTable::setNextIdentifier( const std::string &identifier ) {
101        nextIdentifiers.top() = identifier;
102}
103
104void TypedefTable::openContext( const std::string &contextName ) {
105        map< string, deferListType >::iterator i = contexts.find( contextName );
106        if ( i != contexts.end() ) {
107                deferListType &entries = i->second;
108                for ( deferListType::iterator i = entries.begin(); i != entries.end(); i++) {
109                        addToEnclosingScope( i->identifier, i->kind );
110                } // for
111        } // if
112}
113
114void TypedefTable::enterScope() {
115        currentScope += 1;
116        deferListStack.push( deferListType() );
117        nextIdentifiers.push( "" );
118        debugPrint( "Entering scope " << currentScope << ", nextIdentifiers size is " << nextIdentifiers.size() << endl );
119}
120
121void TypedefTable::leaveScope() {
122        debugPrint( "Leaving scope " << currentScope << endl );
123        for ( tableType::iterator i = table.begin(); i != table.end(); ) {
124                list<Entry> &declList = (*i ).second;
125                while ( ! declList.empty() && declList.front().scope == currentScope ) {
126                        declList.pop_front();
127                }
128                if ( declList.empty() ) {                       // standard idom for erasing during traversal
129                        table.erase( i++ );
130                } else ++i;
131        } // for
132        currentScope -= 1;
133        for ( deferListType::iterator i = deferListStack.top().begin(); i != deferListStack.top().end(); i++) {
134                addToCurrentScope( i->identifier, i->kind );
135        } // for
136        deferListStack.pop();
137        debugPrint( "nextIdentifiers size is " << nextIdentifiers.size() << " top is " << nextIdentifiers.top() << endl );
138        nextIdentifiers.pop();
139}
140
141void TypedefTable::enterContext( const std::string &contextName ) {
142        currentContext = contextName;
143        contextScope = currentScope;
144}
145
146void TypedefTable::leaveContext() {
147        currentContext = "";
148}
149
150void TypedefTable::print( void ) const {
151        for ( tableType::const_iterator i = table.begin(); i != table.end(); i++) {
152                debugPrint( (*i ).first << ": " );
153                list<Entry> declList = (*i ).second;
154                for ( list<Entry>::const_iterator j = declList.begin(); j != declList.end(); j++ ) {
155                        debugPrint( "(" << (*j ).scope << " " << (*j).kind << ") " );
156                }
157                debugPrint( endl );
158        } // for
159}
160
161// Local Variables: //
162// tab-width: 4 //
163// mode: c++ //
164// compile-command: "make install" //
165// End: //
Note: See TracBrowser for help on using the repository browser.