Ignore:
Timestamp:
Aug 9, 2007, 3:18:40 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r266 r270  
    758758}
    759759
    760 
    761 int Classes::GetHashCode(const char *name) const
    762 {
    763     int key;
    764 
    765     for(key=0;*name!='\0';name++){
    766         key=((key<<8)+ *name )%MAX_CLASS_HASH;
    767     }
    768 
    769     return key;
    770 }
    771 
    772760CClass *Classes::Create( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name){
    773761    return new CClass(namespaceScopes, importedNamespaces, name);
     
    789777    /////////////////////////////////
    790778
    791     int key;
    792     key=GetHashCode( pClass->GetName().c_str() );
    793 
    794     if(pobj_ClassHash[key]){
    795         CClass *pobj_c2;
    796         pobj_c2=pobj_ClassHash[key];
    797         while(1){
    798             if( ((const Prototype *)pobj_c2)->IsEqualSymbol( *(const Prototype *)pClass ) ){
    799                 //名前空間及びクラス名が重複した場合
    800                 SmoothieException::Throw(15,pClass->GetName());
    801                 return false;
    802             }
    803 
    804             if(pobj_c2->pobj_NextClass==0) break;
    805             pobj_c2=pobj_c2->pobj_NextClass;
    806         }
    807         pobj_c2->pobj_NextClass=pClass;
    808     }
    809     else{
    810         pobj_ClassHash[key]=pClass;
     779    if( !Put( pClass ) )
     780    {
     781        SetError(15,pClass->GetName(), cp);
     782        return false;
    811783    }
    812784    return true;
     
    961933
    962934void Classes::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
    963     int i;
    964     for(i=0;i<MAX_CLASS_HASH;i++){
    965         if(pobj_ClassHash[i]){
    966             CClass *pobj_c;
    967             pobj_c=pobj_ClassHash[i];
    968             while(1){
    969                 pobj_c->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
    970 
    971                 if(pobj_c->pobj_NextClass==0) break;
    972                 pobj_c=pobj_c->pobj_NextClass;
    973             }
    974         }
     935    Iterator_Reset();
     936    while( Iterator_HasNext() )
     937    {
     938        CClass *pClass = Iterator_GetNext();
     939        pClass->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
    975940    }
    976941}
     
    981946
    982947    //イテレータをリセット
    983     this->Iterator_Reset();
    984948
    985949    extern int cp;
    986950    int back_cp=cp;
    987951
     952    this->Iterator_Reset();
    988953    while(this->Iterator_HasNext()){
    989954        CClass &objClass = *this->Iterator_GetNext();
     
    16341599const CClass *Classes::Find( const NamespaceScopes &namespaceScopes, const string &name ) const
    16351600{
    1636     int key;
    1637     key=GetHashCode(name.c_str());
    1638 
    16391601    if( namespaceScopes.size() == 0 && name == "Object" ){
    16401602        return GetObjectClassPtr();
     
    16441606    }
    16451607
    1646     if(pobj_ClassHash[key]){
    1647         CClass *pobj_c;
    1648         pobj_c=pobj_ClassHash[key];
    1649         while(1){
    1650             if( pobj_c->IsEqualSymbol( namespaceScopes, name ) ){
    1651                 //名前空間とクラス名が一致した
    1652                 return pobj_c;
    1653             }
    1654 
    1655             if(pobj_c->pobj_NextClass==0) break;
    1656             pobj_c=pobj_c->pobj_NextClass;
    1657         }
     1608    const CClass *pClass = GetHashArrayElement( name.c_str() );
     1609    while( pClass )
     1610    {
     1611        if( pClass->IsEqualSymbol( namespaceScopes, name ) ){
     1612            //名前空間とクラス名が一致した
     1613            return pClass;
     1614        }
     1615        pClass = pClass->GetChainNext();
    16581616    }
    16591617
     
    17111669    return pObjectClass;
    17121670}
    1713 
    1714 
    1715 //////////////////////
    1716 // イテレータ
    1717 //////////////////////
    1718 
    1719 void Classes::Iterator_Init() const
    1720 {
    1721     if(ppobj_IteClass) free(ppobj_IteClass);
    1722 
    1723     iIteMaxNum=0;
    1724     iIteNextNum=0;
    1725     ppobj_IteClass=(CClass **)malloc(1);
    1726 
    1727     int i;
    1728     for(i=0;i<MAX_CLASS_HASH;i++){
    1729         if(pobj_ClassHash[i]){
    1730             CClass *pobj_c;
    1731             pobj_c=pobj_ClassHash[i];
    1732             while(1){
    1733                 ppobj_IteClass=(CClass **)realloc(ppobj_IteClass,(iIteMaxNum+1)*sizeof(CClass *));
    1734                 ppobj_IteClass[iIteMaxNum]=pobj_c;
    1735                 iIteMaxNum++;
    1736 
    1737                 if(pobj_c->pobj_NextClass==0) break;
    1738                 pobj_c=pobj_c->pobj_NextClass;
    1739             }
    1740         }
    1741     }
    1742 }
    1743 void Classes::Iterator_Reset() const
    1744 {
    1745     iIteNextNum = 0;
    1746 }
    1747 BOOL Classes::Iterator_HasNext() const
    1748 {
    1749     if(iIteNextNum<iIteMaxNum) return 1;
    1750     return 0;
    1751 }
    1752 CClass *Classes::Iterator_GetNext() const
    1753 {
    1754     CClass *pobj_c = ppobj_IteClass[iIteNextNum];
    1755     iIteNextNum++;
    1756     return pobj_c;
    1757 }
    1758 int Classes::Iterator_GetMaxCount() const
    1759 {
    1760     return iIteMaxNum;
    1761 }
Note: See TracChangeset for help on using the changeset viewer.