Changeset 735 in dev for trunk/ab5.0


Ignore:
Timestamp:
Aug 25, 2008, 5:26:44 PM (16 years ago)
Author:
イグトランス (egtra)
Message:

改行コード変換などを高速化

Location:
trunk/ab5.0/abdev
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step1.cpp

    r465 r735  
    77void ChangeReturnCode(char *buffer)
    88{
    9     int i;
    10 
    119    bool isMustChange = false;
    12     for( i=0; ; i++ ){
     10    for( int i=0; ; i++ ){
    1311        if( buffer[i] == '\0' ){
    1412            break;
     
    5351#endif
    5452
    55     //改行コードのCRLFをLFに変換
    56     for(int i=0,i2=0;;i++,i2++){
    57         if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
    58         buffer[i2]=buffer[i];
    59         if(buffer[i]=='\0') break;
    60     }
     53    ChangeReturnCodeImpl(buffer);
    6154}
    6255void DeleteComment(char *buffer){   //注釈「'」の取り除き
    6356    int i,i2,i3,IsStr;
    64     char *temporary;
    65     temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
     57    char *temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,lstrlen(buffer)+1);
    6658    for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
    6759        if(buffer[i]=='\"') IsStr^=1;
    6860        if(buffer[i]=='\n'||buffer[i]=='\0'){
    69             i2--;
    70             while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
    71             i2++;
     61            if(i2 > 0){
     62                i2--;
     63                while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
     64                i2++;
     65            }
    7266
    7367            if(i3){
     
    10599    }
    106100    lstrcpy(buffer,temporary);
    107     GlobalFree(temporary);
     101    HeapDefaultFree(temporary);
    108102}
    109103void CheckParenthesis(char *buffer){
     
    237231    return 1;
    238232}
     233
     234inline int FindLineEnd(char const *basbuf, int i2){
     235    for(;;i2++){
     236        if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
     237    }
     238    return i2;
     239}
     240
    239241void DirectiveCheck(void){
    240242    extern char *basbuf;
     
    273275                compiler.staticLibraryFilePaths.push_back( temporary );
    274276
    275                 for(;;i2++){
    276                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    277                 }
     277                i2 = FindLineEnd(basbuf, i2);
    278278                SlideString(basbuf+i2,i-i2);
    279279            }
     
    284284                compiler.SetCoreMark( true );
    285285
    286                 for(;;i2++){
    287                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    288                 }
     286                i2 = FindLineEnd(basbuf, i2);
    289287                SlideString(basbuf+i2,i-i2);
    290288            }
     
    292290                //#noprompt
    293291                //旧機能なので、無視
    294                 for(;;i2++){
    295                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    296                 }
     292                i2 = FindLineEnd(basbuf, i2);
    297293                SlideString(basbuf+i2,i-i2);
    298294            }
     
    300296                //#strict
    301297                //旧機能なので、無視
    302                 for(;;i2++){
    303                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    304                 }
     298                i2 = FindLineEnd(basbuf, i2);
    305299                SlideString(basbuf+i2,i-i2);
    306300            }
     
    308302                //#struct code
    309303                //旧機能なので、無視
    310                 for(;;i2++){
    311                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    312                 }
     304                i2 = FindLineEnd(basbuf, i2);
    313305                SlideString(basbuf+i2,i-i2);
    314306            }
     
    332324                lstrcpy(ResourceFileName,temporary);
    333325
    334                 for(;;i2++){
    335                     if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
    336                 }
     326                i2 = FindLineEnd(basbuf, i2);
    337327                SlideString(basbuf+i2,i-i2);
    338328            }
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp

    r720 r735  
    346346        tempType.PtrLevelDown();
    347347
    348         return (std::string)"*" + TypeToString( tempType );
     348        return '*' + TypeToString( tempType );
    349349    }
    350350    else if( type.IsObject() || type.IsStruct() )
     
    370370                    if( actualGenericTypesName.size() )
    371371                    {
    372                         actualGenericTypesName += ",";
     372                        actualGenericTypesName += ',';
    373373                    }
    374374                    actualGenericTypesName += typeParameter.ToString();
    375375                }
    376376
    377                 result += "<" + actualGenericTypesName + ">";
     377                result += '<' + actualGenericTypesName + '>';
    378378            }
    379379
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp

    r708 r735  
    142142        if( dg.GetNamespaceScopes().size() )
    143143        {
    144             std::string namespaceScopesCommandStr = "";
    145             std::string endNamespaceScopesCommandStr = "";
     144            std::string namespaceScopesCommandStr;
     145            std::string endNamespaceScopesCommandStr;
    146146            BOOST_FOREACH( const std::string &namespaceStr, dg.GetNamespaceScopes() )
    147147            {
    148148                if( namespaceScopesCommandStr.size() )
    149149                {
    150                     namespaceScopesCommandStr += ":";
    151                     endNamespaceScopesCommandStr += ":";
     150                    namespaceScopesCommandStr += ':';
     151                    endNamespaceScopesCommandStr += ':';
    152152                }
    153153                namespaceScopesCommandStr += "Namespace " + namespaceStr;
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Source.h

    r700 r735  
    11#pragma once
     2
     3int ChangeReturnCodeImpl(char *buffer);
    24
    35class IncludedFilesRelation
     
    9698    bool ReadFile( const std::string &filePath );
    9799
    98     static void Text::SlideString(char *buffer, int slide){
     100    static void SlideString(char *buffer, int slide){
    99101        memmove(buffer+slide, buffer, strlen(buffer)+1);
    100102    }
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp

    r728 r735  
    11#include "stdafx.h"
    2 
     2#include <algorithm>
     3#include <boost/checked_delete.hpp>
    34
    45CClass::CClass( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces )
     
    7475CClass::~CClass()
    7576{
     77    using std::for_each;
     78    using boost::checked_deleter;
    7679    // 動的メンバ
    77     BOOST_FOREACH( Member *member, dynamicMembers )
    78     {
    79         delete member;
    80     }
    81 
     80    for_each( dynamicMembers.begin(), dynamicMembers.end(), checked_deleter<Member>() );
    8281    // 静的メンバ
    83     BOOST_FOREACH( Member *member, staticMembers )
    84     {
    85         delete member;
    86     }
    87 
     82    for_each( staticMembers.begin(), staticMembers.end(), checked_deleter<Member>() );
    8883    // インターフェイス
    89     BOOST_FOREACH( ::Interface *pInterface, interfaces )
    90     {
    91         delete pInterface;
    92     }
    93 
     84    for_each( interfaces.begin(), interfaces.end(), checked_deleter<::Interface>() );
    9485    // テンプレート展開済みのクラス
    95     BOOST_FOREACH( ExpandedTemplateClass *pExpandedTemplateClass, expandedTemplateClasses )
    96     {
    97         delete pExpandedTemplateClass;
    98     }
     86    for_each( expandedTemplateClasses.begin(), expandedTemplateClasses.end(), checked_deleter<ExpandedTemplateClass>() );
    9987}
    10088
     
    233221{
    234222    //メソッドをコピー
    235     BOOST_FOREACH( const CMethod *pBaseMethod, inheritsClass.GetDynamicMethods() ){
     223    const Methods& inheritsClassMethods = inheritsClass.GetDynamicMethods();
     224    GetDynamicMethods().reserve( inheritsClassMethods.size() );
     225    BOOST_FOREACH( const CMethod *pBaseMethod, inheritsClassMethods ){
    236226        CMethod *pMethod = new DynamicMethod( *pBaseMethod );
    237227
     
    264254
    265255    // インターフェイスを引き継ぐ
    266     BOOST_FOREACH( ::Interface *pInterface, inheritsClass.GetInterfaces() )
     256    const Interfaces& inheritsClassInterfaces = inheritsClass.GetInterfaces();
     257    interfaces.reserve( inheritsClassInterfaces.size() );
     258    BOOST_FOREACH( const ::Interface *pInterface, inheritsClassInterfaces )
    267259    {
    268260        interfaces.push_back( new ::Interface( *pInterface ) );
     
    307299    //メソッド
    308300    BOOST_FOREACH( const CMethod *pMethod, GetDynamicMethods() ){
    309         if( lstrcmp( name, pMethod->GetUserProc().GetName().c_str() ) == 0 ){
     301        if(  name == pMethod->GetUserProc().GetName() ){
    310302            return 1;
    311303        }
     
    328320
    329321    // 動的メンバ
    330     BOOST_FOREACH( Member *pMember, dynamicMembers )
     322    BOOST_FOREACH( const Member *pMember, dynamicMembers )
    331323    {
    332324        if( GetName() == pMember->GetName() )
     
    438430        if( this->HasSuperClass() )
    439431        {
     432            const CClass& super = this->GetSuperClass();
    440433            // 基底クラスのサイズを追加
    441             resultSize += this->GetSuperClass().GetSize();
     434            resultSize += super.GetSize();
    442435
    443436            // 基底クラスのアラインメントを取得
    444             alignment = this->GetSuperClass().GetAlignment();
     437            alignment = super.GetAlignment();
    445438        }
    446439        else
     
    455448    BOOST_FOREACH( Member *pMember, dynamicMembers )
    456449    {
     450        const Type& memberType = pMember->GetType();
    457451        // メンバサイズ
    458         int tempMemberSize = pMember->GetType().GetSize();
     452        int tempMemberSize = memberType.GetSize();
    459453
    460454        // 一時アラインメントを算出
    461455        int tempAlignment = tempMemberSize;
    462         if( pMember->GetType().IsStruct() )
     456        if( memberType.IsStruct() )
    463457        {
    464458            // メンバが構造体の場合は、メンバのアラインメントを取得
    465             tempAlignment = pMember->GetType().GetClass().GetAlignment();
     459            tempAlignment = memberType.GetClass().GetAlignment();
    466460        }
    467461
     
    484478            if( tempMemberSize == 0 )
    485479            {
    486                 if( !pMember->GetType().IsStruct() )
     480                if( !memberType.IsStruct() )
    487481                {
    488482                    throw;
     
    847841        if( result.size() )
    848842        {
    849             result += ",";
    850         }
    851 
    852         result += "\"" + pMember->GetName() + "\"";
     843            result += ',';
     844        }
     845
     846        result += '\"' + pMember->GetName() + '\"';
    853847    }
    854848
     
    863857        if( result.size() )
    864858        {
    865             result += ",";
     859            result += ',';
    866860        }
    867861
     
    869863
    870864        char temporary[255];
    871         itoa( offset, temporary, 16 );
     865        _itoa( offset, temporary, 16 );
    872866
    873867        result += (std::string)"&H" + temporary;
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp

    r706 r735  
    66
    77class CDefine{
    8     std::vector<std::string> names;
     8    stdext::hash_set<std::string> names;
    99public:
    10     void Free();
     10//  void Free();
    1111    void Init( bool isDebug, bool isDll, bool isUnicode, int majorVer );
    1212
    13     BOOL add(char const *name);
    14     BOOL undef(char const *name);
    15     BOOL check(char const *name);
     13    bool add(char const *name);
     14    bool undef(char const *name);
     15    bool check(char const *name);
    1616    void preprocessor_ifdef(char *buffer,bool isNot);
    1717    void DirectiveIfdef(char *buffer);
     
    8484    add(temporary);
    8585}
    86 BOOL CDefine::add(char const *name)
     86bool CDefine::add(char const *name)
    8787{
    88     //重複チェック
    89     if(check(name)) return 0;
    90 
    91     //追加
    92     names.push_back( name );
    93 
    94     return 1;
    95 }
    96 BOOL CDefine::undef(char const *name){
    97     std::vector<std::string>::iterator i = names.begin();
    98     BOOST_FOREACH( const std::string &temp, names ){
    99         if( temp == name ){
    100             names.erase( i );
    101             return 1;
    102         }
    103         i++;
    104     }
    105 
    106     return 0;
    107 }
    108 BOOL CDefine::check(char const *name){
    109 
    110     //重複チェック
    111     BOOST_FOREACH( const std::string &temp, names ){
    112         if( temp == name ){
    113             return 1;
    114         }
    115     }
    116     return 0;
     88    return names.insert(name).second;
     89}
     90bool CDefine::undef(char const *name){
     91    return names.erase(name) > 0;
     92}
     93bool CDefine::check(char const *name){
     94    return names.find(name) != names.end();
    11795}
    11896
     
    167145
    168146    //#ifdefの行を消去
    169     Text::SlideString(buffer+i,-i);
    170     i=0;
     147    memset(buffer,' ',static_cast<size_t>(i));
    171148
    172149    BOOL bElse=0;
     
    304281                    temporary[i3]=buffer[i2];
    305282                }
    306 
    307283                add(temporary);
    308 
    309                 i2-=i;
    310 
    311284                //ディレクティブを消去
    312                 Text::SlideString(buffer+i+i2,-i2);
     285                memset(buffer+i,' ',static_cast<size_t>(i2-i));
     286                i=i2;
    313287            }
    314288            if(memicmp(buffer+i,"#undef",6)==0){
    315                 i2=i+7;
     289                i2=i+6;
    316290                while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
    317291
     
    323297                    temporary[i3]=buffer[i2];
    324298                }
    325 
    326299                undef(temporary);
    327 
    328                 i2-=i;
    329 
    330300                //ディレクティブを消去
    331                 Text::SlideString(buffer+i+i2,-i2);
     301                memset(buffer+i,' ',static_cast<size_t>(i2-i));
     302                i=i2;
    332303            }
    333304            else if(memicmp(buffer+i,"#ifdef",6)==0){
     
    367338
    368339    return true;
     340}
     341
     342//改行コードのCRLFをLFに変換
     343int ChangeReturnCodeImpl(char *buffer)
     344{
     345    int i;
     346    for(i=0;buffer[i]!='\0';i++){
     347        if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
     348            buffer[i]=' ';
     349        }
     350    }
     351    return i;
    369352}
    370353
     
    418401#endif
    419402
    420     //改行コードのCRLFをLFに変換
    421     for(i=0,i2=0;;i++,i2++){
    422         if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
    423         buffer[i2]=buffer[i];
    424         if(buffer[i]=='\0') break;
    425     }
     403    ChangeReturnCodeImpl(buffer);
    426404
    427405    length = i;
     
    471449        if(buffer[i]=='\0') break;
    472450    }
    473     strcpy(buffer,temporary);
     451    std::swap(buffer,temporary);
    474452    free(temporary);
    475453}
     
    683661    //カッコ'('直下の改行
    684662    while(buffer[0]=='\n'){
    685         Text::SlideString(buffer+1,-1);
     663        buffer[0]=' ';
    686664        (*pRnum)++;
    687665    }
Note: See TracChangeset for help on using the changeset viewer.