LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc - sym_tab.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 62
Code covered: 90.3 % Executed lines: 56

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/sym_tab.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 <stdio.h>
      23                 : #include <iostream>
      24                 : 
      25                 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
      26                 : 
      27                 : #include "src/cpp/prod/tool/Assert.h"
      28                 : #include "src/cpp/prod/tool/String.h"
      29                 : 
      30                 : #include "src/cpp/dev/idlc/symbol.h"
      31                 : #include "src/cpp/dev/idlc/scope.h"
      32                 : #include "src/cpp/dev/idlc/sym_tab.h"
      33                 : #include "src/cpp/dev/idlc/context.h"
      34                 : 
      35              63 : SymbolTable::SymbolTable()
      36              63 :  : SymbolContainer(NULL), _current(NULL), _prefix()
      37                 : {
      38               0 : }
      39                 : 
      40              63 : SymbolTable::~SymbolTable()
      41                 : {
      42              63 : }
      43                 : 
      44           12845 : void SymbolTable::addSymbol(Symbol *s)
      45                 : {
      46           12845 :    String fullName ;
      47                 : 
      48                 :    ASSERT(s != NULL) ;
      49                 : 
      50           12845 :    s->SetPrefix(_prefix) ;
      51                 : 
      52           12845 :    if (_current == NULL)
      53                 :    {
      54             114 :       this->addLocalSymbol(s) ;
      55             114 :       fullName = "" ;
      56                 :    }
      57                 :    else
      58                 :    {
      59           12731 :       _current->addLocalSymbol(s) ;
      60           12731 :       fullName = _current->GetFullyQualifiedName() ;
      61           12731 :       fullName += "::" ;
      62                 :    }
      63                 : 
      64           12845 :    fullName += s->GetName() ;
      65           12845 :    s->SetFullyQualifiedName(fullName) ;
      66                 : }
      67                 : 
      68             474 : void SymbolTable::relocateTail(Symbol *s)
      69                 : {
      70                 :    ASSERT(s != NULL) ;
      71                 : 
      72             474 :    if (_current == NULL)
      73                 :    {
      74               1 :       this->relocateLocalTail(s) ;
      75                 :    }
      76                 :    else
      77                 :    {
      78             473 :       _current->relocateLocalTail(s) ;
      79                 :    }
      80                 : }
      81                 : 
      82               0 : Symbol *SymbolTable::findGlobalSymbol(const Scope& scope)
      83                 : {
      84               0 :    return find(scope) ;
      85                 : }
      86                 : 
      87             864 : Symbol *SymbolTable::findLocalSymbol(const String& name)
      88                 : {
      89                 :    Symbol *s = NULL ;
      90                 : 
      91             864 :    if (_current != NULL)
      92                 :    {
      93             861 :       s = _current->findLocalSymbol(name) ;
      94                 :    }
      95                 :    else
      96                 :    {
      97               3 :       s = SymbolContainer::findLocalSymbol(name) ;
      98                 :    }
      99                 : 
     100                 :    return s ;
     101                 : }
     102                 : 
     103            9356 : Symbol *SymbolTable::findLocalSymbol(const Scope& scope)
     104                 : {
     105            9356 :    const String *name = scope.GetFirstName() ;
     106                 : 
     107                 :    ASSERT(name != NULL) ;
     108            9356 :    Context *search = _current ;
     109                 :    Symbol *s = NULL ;
     110                 : 
     111           15815 :    while (search != NULL)
     112                 :    {
     113           14853 :       s = search->findLocalSymbol(*name) ;
     114           14853 :       if (s != NULL)
     115                 :       {
     116            8394 :          if (scope.GetNameCount() == 1)
     117                 :          {
     118                 :             // The symbol is just "identifier",
     119                 :             // and it is defined in a locally visible context.
     120                 : 
     121                 :             return s ;
     122                 :          }
     123                 :          else
     124                 :          {
     125               7 :             return search->find(scope) ;
     126                 :          }
     127                 :       }
     128                 :       else
     129                 :       {
     130            6459 :          search = search->GetParent() ;
     131                 :       }
     132                 :    }
     133                 : 
     134             962 :    s = SymbolContainer::findLocalSymbol(*name) ;
     135             962 :    if (s != NULL)
     136                 :    {
     137             483 :       return find(scope) ;
     138                 :    }
     139                 : 
     140                 :    return NULL ;
     141                 : }
     142                 : 
     143            9356 : Symbol *SymbolTable::findSymbol(const Scope& scope)
     144                 : {
     145                 :    Symbol *result = NULL ;
     146                 : 
     147            9356 :    if (scope.IsGlobal())
     148                 :    {
     149               0 :       result = findGlobalSymbol(scope) ;
     150                 :    }
     151                 :    else
     152                 :    {
     153            9356 :       result = findLocalSymbol(scope) ;
     154                 :    }
     155                 : 
     156                 :    return result ;
     157                 : }
     158                 : 
     159            3734 : void SymbolTable::openContext(const String& name)
     160                 : {
     161                 :    Context *sub = NULL ;
     162                 : 
     163            3734 :    if (_current == NULL)
     164                 :    {
     165             113 :       sub = new Context(name, NULL) ;
     166             113 :       this->addLocalContext(sub) ;
     167                 :    }
     168                 :    else
     169                 :    {
     170            3621 :       sub = new Context(name, _current) ;
     171            3621 :       _current->addLocalContext(sub) ;
     172                 :    }
     173                 : 
     174            3734 :    _current = sub ;
     175                 : }
     176                 : 
     177            3732 : void SymbolTable::closeContext(void)
     178                 : {
     179                 :    ASSERT(_current != NULL) ;
     180                 : 
     181            3732 :    _current = _current->GetParent() ;
     182                 : }
     183                 : 
     184             252 : void SymbolTable::SetPrefix(const String& prefix)
     185                 : {
     186             252 :    _prefix = prefix ;
     187                 : }
     188                 : 
     189               0 : const String& SymbolTable::GetPrefix(void) const
     190                 : {
     191                 :    return _prefix ;
     192                 : }
     193                 : 
     194              15 : void SymbolTable::print(std::ostream& str) const
     195                 : {
     196              15 :    String tab("   ") ;
     197                 : 
     198              15 :    str << "Symbol Table (begin)" << std::endl ;
     199                 : 
     200              15 :    SymbolContainer::print(str, tab) ;
     201                 : 
     202              30 :    str << "Symbol Table (end)" << std::endl ;
     203              78 : }
     204              63 : 

Generated by: LTP GCOV extension version 1.4