Ignore:
Timestamp:
Jul 12, 2007, 2:58:26 AM (17 years ago)
Author:
dai_9181
Message:

コード全体のリファクタリングを実施

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp

    r204 r206  
     1#include "stdafx.h"
     2
    13#include <jenga/include/smoothie/Smoothie.h>
    24#include <jenga/include/smoothie/LexicalAnalysis.h>
     
    57#include <Compiler.h>
    68#include <LexicalScopingImpl.h>
    7 #include <ClassImpl.h>
    8 #include <VariableImpl.h>
     9#include <Class.h>
     10#include <Variable.h>
    911#include <NamespaceSupporter.h>
    1012
     
    3638        }
    3739
    38         UserProc *pBackUserProc;
     40        const UserProc *pBackUserProc;
    3941        pBackUserProc = &UserProc::CompilingUserProc();
    4042        UserProc::CompileStartForGlobalArea();
     
    5456
    5557        //_System_StartupProgramの呼び出し
    56         extern UserProc *pSub_System_StartupProgram;
     58        extern const UserProc *pSub_System_StartupProgram;
    5759        op_call(pSub_System_StartupProgram);
    5860
     
    7173        //静的ローカルオブジェクトのコンストラクタ呼び出し
    7274
    73         BOOST_FOREACH( Variable *pVar, globalVars ){
     75        BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
    7476            if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
    7577                //コンストラクタ呼び出し
    76                 if( pVar->IsObject() ){
     78                if( pVar->GetType().IsObject() ){
    7779
    7880                    //エラー用
     
    8183                    CallConstructor(
    8284                        pVar->GetName().c_str(),
    83                         pVar->GetSubScriptsPtr(),
    84                         *pVar,
    85                         pVar->paramStrForConstructor.c_str());
     85                        pVar->GetSubscripts(),
     86                        pVar->GetType(),
     87                        pVar->GetParamStrForConstructor().c_str());
    8688                }
    8789            }
     
    9395    else if( userProc.GetName() == "_System_Call_Destructor_of_GlobalObject" ){
    9496
    95         UserProc *pBackUserProc;
     97        const UserProc *pBackUserProc;
    9698        pBackUserProc = &UserProc::CompilingUserProc();
    9799        UserProc::CompileStartForGlobalArea();
     
    222224    }
    223225}
    224 void AutoGeneration(UserProc &userProc){
     226void AutoGeneration( const UserProc &userProc){
    225227    if( userProc.GetName() == "InitializeUserTypes"
    226228        && userProc.HasParentClass()
     
    240242}
    241243
    242 void _compile_proc(UserProc *pUserProc){
     244void _compile_proc(const UserProc *pUserProc){
    243245    extern char *basbuf;
    244246    extern HANDLE hHeap;
    245     extern GlobalProc **ppSubHash;
    246247    extern BOOL bDebugCompile;
    247248    int i3,i4,LocalVarSchedule,EspOffsetSchedule,BaseOffset;
     
    250251    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
    251252
    252     if( pUserProc->localVars.size() ){
     253    if( pUserProc->GetLocalVars().size() ){
    253254        SetError();
    254255        return;
    255256    }
     257
     258    trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" );
    256259
    257260    pUserProc->CompleteCompile();
     
    270273    else bDebugSupportProc=0;
    271274
    272     pUserProc->beginOpAddress=obp;
     275    pUserProc->SetBeginOpAddress( obp );
    273276
    274277    //コンパイル中の関数が属するクラス
    275     Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();
     278    compiler.pCompilingClass=pUserProc->GetParentClassPtr();
    276279
    277280    //コンパイルスタートをクラス管理クラスに追加
     
    297300        SystemProc(*pUserProc);
    298301
    299         pUserProc->endOpAddress=obp;
     302        pUserProc->SetEndOpAddress( obp );
    300303        return;
    301304    }
     
    321324        Parameter &param = *pUserProc->RealParams()[i3];
    322325
    323         Variable *pVar = new VariableImpl( param.GetVarName(), param, false, param.IsRef() );
     326        Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" );
    324327
    325328        if( param.IsArray() ){
    326             pVar->SetArray( param.GetSubScriptsPtr() );
     329            pVar->SetArray( param.GetSubscripts() );
    327330        }
    328331
     
    342345        }
    343346        AllLocalVarSize+=varSize;
    344         pVar->offset=AllLocalVarSize;
     347        pVar->SetOffsetAddress( AllLocalVarSize );
    345348
    346349        //レキシカルスコープ情報
    347         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    348         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     350        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     351        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    349352        pVar->bLiving=TRUE;
    350353
    351         pUserProc->localVars.push_back( pVar );
     354        pUserProc->GetLocalVars().push_back( pVar );
    352355    }
    353356
     
    456459
    457460        //call _DebugSys_StartProc
    458         extern UserProc *pSub_DebugSys_StartProc;
     461        extern const UserProc *pSub_DebugSys_StartProc;
    459462        op_call(pSub_DebugSys_StartProc);
    460463    }
    461464
    462     if(Smoothie::Temp::pCompilingClass){
    463         if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){
     465    if(compiler.pCompilingClass){
     466        if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){
    464467            ////////////////////////////////////
    465468            // コンストラクタをコンパイルするとき
     
    467470
    468471            //コンストラクタのコンパイル開始を通知
    469             Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();
     472            compiler.pCompilingClass->NotifyStartConstructorCompile();
    470473
    471474            //基底クラスかどうかの識別
    472475            //(継承元がインターフェイスの場合も基底クラスと見なす)
    473476            BOOL bThisIsSuperClass;
    474             if( !Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
    475             else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
     477            if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
     478            else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
    476479                //インターフェイスを継承したときはコンストラクタを持たない
    477480                bThisIsSuperClass=1;
     
    492495                    temporary[i4]=basbuf[i3];
    493496                }
    494                 if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){
     497                if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){
    495498                    //基底クラスのコンストラクタを呼び出す
    496499                    cp=i3;
     
    509512                    Type dummyType;
    510513                    CallProc( PROC_DEFAULT
    511                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc
    512                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()
     514                        , &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc()
     515                        , compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
    513516                        , temporary
    514517                        , dummyType );
     
    517520                    //基底クラスのコンストラクタを暗黙的に呼び出す
    518521                    Opcode_CallProc("",
    519                         Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,
     522                        &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(),
    520523                        0,
    521524                        "",
     
    525528
    526529            //仮想関数テーブルを初期化
    527             if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()
    528                 && !Smoothie::Temp::pCompilingClass->IsAbstract() ){
     530            if( compiler.pCompilingClass->IsExistVirtualFunctions()
     531                && !compiler.pCompilingClass->IsAbstract() ){
    529532                    //関数テーブルに値をセット
    530                     int offset = (int)Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();
     533                    int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
    531534
    532535                    //mov eax,offset
     
    548551
    549552            //デストラクタのコンパイル開始を通知
    550             Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();
     553            compiler.pCompilingClass->NotifyStartDestructorCompile();
    551554        }
    552555    }
     
    574577    //////////////////////////////////////////
    575578
    576     if( Smoothie::Temp::pCompilingClass ){
    577 
    578         if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){
     579    if( compiler.pCompilingClass ){
     580
     581        if( compiler.pCompilingClass->IsCompilingConstructor() ){
    579582            // コンストラクタをコンパイルしていたとき
    580583
    581584            // コンストラクタのコンパイルが完了したことを通知
    582             Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();
     585            compiler.pCompilingClass->NotifyFinishConstructorCompile();
    583586        }
    584587        else if( pUserProc->IsDestructor() ){
     
    588591
    589592            // デストラクタのコンパイルが完了したことを通知
    590             Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();
    591 
    592             if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){
     593            compiler.pCompilingClass->NotifyFinishDestructorCompile();
     594
     595            if( compiler.pCompilingClass->HasSuperClass() ){
    593596                /* サブクラスのデストラクタをコンパイルしているときは、
    594597                    基底クラスのデストラクタを呼び出す */
    595598
    596                 const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();
     599                const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod();
    597600                if( method ){
    598601                    Opcode_CallProc("",
    599                         method->pUserProc,
     602                        &method->GetUserProc(),
    600603                        0,
    601604                        "",
     
    649652
    650653        //call _DebugSys_EndProc
    651         extern UserProc *pSub_DebugSys_EndProc;
     654        extern const UserProc *pSub_DebugSys_EndProc;
    652655        op_call(pSub_DebugSys_EndProc);
    653656    }
     
    742745    }
    743746    HeapDefaultFree(pLocalVarAddrSchedule);
    744     BOOST_FOREACH( Variable *pVar, pUserProc->localVars ){
     747    BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
    745748        //後にデバッグで利用する
    746         pVar->offset = AllLocalVarSize - pVar->offset;
     749        pVar->SetOffsetAddress( AllLocalVarSize - pVar->GetOffsetAddress() );
    747750    }
    748751
     
    771774
    772775        //call _esp_error
    773         extern UserProc *pSub_esp_error;
     776        extern const UserProc *pSub_esp_error;
    774777        op_call( pSub_esp_error );
    775778
     
    799802
    800803
    801     pUserProc->endOpAddress=obp;
     804    pUserProc->SetEndOpAddress( obp );
    802805
    803806
     
    811814}
    812815
    813 void CompileBufferInProcedure( UserProc &userProc ){
     816void CompileBufferInProcedure( const UserProc &userProc ){
    814817    if( userProc.IsUsing() == false || userProc.IsCompiled() ) return;
    815818
     
    827830}
    828831void CompileLocal(){
    829     extern GlobalProc **ppSubHash;
    830     int i2;
    831 
    832832    extern BOOL bDll;
    833833    if(bDll){
    834834        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    835         UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     835        const UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
    836836        if(pUserProc){
    837837            CompileBufferInProcedure( *pUserProc );
     
    841841
    842842    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
    843     extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     843    extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
    844844    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
    845845
    846846    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    847847    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    848     extern UserProc *pSub_System_InitStaticLocalVariables;
     848    extern const UserProc *pSub_System_InitStaticLocalVariables;
    849849    pSub_System_InitStaticLocalVariables->CompleteCompile();
    850850
    851851    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    852     extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     852    extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    853853    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    854854
    855855repeat:
    856     GlobalProc *pGlobalProc;
    857     for(i2=0;i2<MAX_HASH;i2++){
    858         pGlobalProc=ppSubHash[i2];
    859         while(pGlobalProc){
    860             CompileBufferInProcedure( *pGlobalProc );
    861             pGlobalProc=pGlobalProc->pNextData;
    862         }
     856    compiler.GetMeta().GetUserProcs().Iterator_Reset();
     857    while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     858    {
     859        UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     860        CompileBufferInProcedure( *pUserProc );
    863861    }
    864862
     
    874872    if( IsNeedProcCompile() ){
    875873        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    876         for(i2=0;i2<MAX_HASH;i2++){
    877             pGlobalProc=ppSubHash[i2];
    878             while(pGlobalProc){
    879                 CompileBufferInProcedure( *pGlobalProc );
    880                 pGlobalProc=pGlobalProc->pNextData;
    881             }
     874
     875        compiler.GetMeta().GetUserProcs().Iterator_Reset();
     876        while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     877        {
     878            UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     879            CompileBufferInProcedure( *pUserProc );
    882880        }
    883881    }
Note: See TracChangeset for help on using the changeset viewer.