LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc - sym_container.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 54
Code covered: 90.7 % Executed lines: 49

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/sym_container.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program is distributed in the hope that it will be useful,
      12                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 : // GNU General Public License for more details.
      15                 : //
      16                 : // You should have received a copy of the GNU General Public License
      17                 : // along with this program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //==============================================================================
      21                 : 
      22                 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
      23                 : 
      24                 : #include "src/cpp/prod/tool/Assert.h"
      25                 : 
      26                 : #include "src/cpp/dev/idlc/symbol.h"
      27                 : #include "src/cpp/dev/idlc/sym_container.h"
      28                 : #include "src/cpp/dev/idlc/context.h"
      29                 : #include "src/cpp/dev/idlc/yyutils.h"
      30                 : 
      31            3797 : SymbolContainer::SymbolContainer(Context *parent)
      32            3797 :  : _parent(parent), _subContexts(), _localSymbols()
      33                 : {}
      34                 : 
      35            3797 : SymbolContainer::~SymbolContainer()
      36                 : {
      37                 :    // Do NOT delete _parent !
      38            3797 :    _subContexts.clearAndDestroy() ;
      39            3797 :    _localSymbols.clearAndDestroy() ;
      40               0 : }
      41                 : 
      42           12845 : void SymbolContainer::addLocalSymbol(Symbol *s)
      43                 : {
      44                 :    Symbol *duplicate = NULL ;
      45           12845 :    const String& name = s->GetName() ;
      46                 : 
      47           12845 :    SymbolListIt it(_localSymbols) ;
      48          285611 :    while (it.GetNext())
      49                 :    {
      50                 :       duplicate = it.GetItem() ;
      51          259922 :       if (name == duplicate->GetName())
      52                 :       {
      53               1 :          String error = "Symbol " ;
      54               1 :          error += name ;
      55               1 :          error += " is already defined in this scope." ;
      56               1 :          IDLCompileError(error) ;
      57               0 :          return ;
      58                 :       }
      59                 :    }
      60                 : 
      61                 :    _localSymbols.addTail(s) ;
      62                 : }
      63                 : 
      64             474 : void SymbolContainer::relocateLocalTail(Symbol *s)
      65                 : {
      66                 :    ASSERT(s != NULL) ;
      67                 :    _localSymbols.removeObject(s) ;
      68                 :    _localSymbols.addTail(s) ;
      69                 : }
      70                 : 
      71            3734 : void SymbolContainer::addLocalContext(Context *c)
      72                 : {
      73                 :    _subContexts.addTail(c) ;
      74                 : }
      75                 : 
      76           36228 : Context* SymbolContainer::GetParent(void) const
      77                 : {
      78                 :    return _parent ;
      79                 : }
      80                 : 
      81             953 : const SymbolList& SymbolContainer::GetLocalSymbols(void) const
      82                 : {
      83                 :    return _localSymbols ;
      84                 : }
      85                 : 
      86               0 : const ContextList& SymbolContainer::GetLocalContexts(void) const
      87                 : {
      88                 :    return _subContexts ;
      89                 : }
      90                 : 
      91           17169 : Symbol *SymbolContainer::findLocalSymbol(const String& name)
      92                 : {
      93                 :    Symbol *result = NULL ;
      94                 :    Symbol *tmp = NULL ;
      95                 : 
      96                 :    SymbolListIt it(_localSymbols) ;
      97          446584 :    while (it.GetNext())
      98                 :    {
      99                 :       tmp = it.GetItem() ;
     100          422087 :       if (name == tmp->GetName())
     101                 :       {
     102                 :          result = tmp ;
     103                 :          break ;
     104                 :       }
     105                 :    }
     106                 : 
     107                 :    return result ;
     108                 : }
     109                 : 
     110             944 : Context *SymbolContainer::findLocalContext(const String& name)
     111                 : {
     112                 :    Context *result = NULL ;
     113                 :    Context *tmp = NULL ;
     114                 : 
     115                 :    ContextListIt it(_subContexts) ;
     116           11218 :    while (it.GetNext())
     117                 :    {
     118                 :       tmp = it.GetItem() ;
     119           10274 :       if (name == tmp->GetName())
     120                 :       {
     121                 :          result = tmp ;
     122                 :          break ;
     123                 :       }
     124                 :    }
     125                 : 
     126                 :    return result ;
     127                 : }
     128                 : 
     129             490 : Symbol* SymbolContainer::find(const Scope& scope)
     130                 : {
     131             490 :    const StringList& names = scope.GetNameList() ;
     132                 :    int nbNames = names.size() ;
     133                 :    String *name = NULL ;
     134                 :    Symbol *result = NULL ;
     135                 :    SymbolContainer *current = this ;
     136                 :    SymbolContainer *context = NULL ;
     137                 : 
     138                 :    int nbContexts = nbNames ;
     139                 : 
     140                 :    StringListIt it(names) ;
     141            1958 :    while (it.GetNext())
     142                 :    {
     143                 :       name = it.GetItem() ;
     144             978 :       nbContexts -- ;
     145                 : 
     146             978 :       if (nbContexts > 0)
     147                 :       {
     148             488 :          context = current->findLocalContext(*name) ;
     149             488 :          if (context == NULL)
     150                 :          {
     151                 :             return NULL ;
     152                 :          }
     153                 :          else
     154                 :          {
     155                 :             current = context ;
     156                 :          }
     157                 :       }
     158                 :       else
     159                 :       {
     160                 :          ASSERT(nbContexts == 0) ;
     161             490 :          result = current->findLocalSymbol(*name) ;
     162                 :       }
     163                 :    }
     164                 : 
     165                 :    return result ;
     166                 : }
     167                 : 
     168              69 : void SymbolContainer::print(std::ostream& str, const String& tab) const
     169                 : {
     170              69 :    String tab2(80) ;
     171                 : 
     172              69 :    tab2 = tab ;
     173              69 :    tab2 += "   " ;
     174                 :    Symbol *symbol = NULL ;
     175                 :    Context *context = NULL ;
     176                 : 
     177              69 :    if (_localSymbols.size() != 0)
     178                 :    {
     179              61 :       str << tab << "Local symbols (" << std::endl ;
     180                 :       SymbolListIt its(_localSymbols) ;
     181             630 :       while (its.GetNext())
     182                 :       {
     183                 :          symbol = its.GetItem() ;
     184             569 :          str << tab2 ;
     185             569 :          symbol->print(str) ;
     186                 :          str << std::endl ;
     187                 :       }
     188              61 :       str << tab << ")" << std::endl ;
     189                 :    }
     190                 : 
     191              69 :    if (_subContexts.size() != 0)
     192                 :    {
     193              29 :       str << tab << "Local contexts (" << std::endl ;
     194                 :       ContextListIt itc(_subContexts) ;
     195              83 :       while (itc.GetNext())
     196                 :       {
     197                 :          context = itc.GetItem() ;
     198              54 :          context->print(str, tab2) ;
     199                 :       }
     200              29 :       str << tab << ")" << std::endl ;
     201               0 :    }
     202              63 : }
     203              63 : 

Generated by: LTP GCOV extension version 1.4