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/BasicCompiler64/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>
    910
    1011#include "../BasicCompiler_Common/common.h"
     
    3132        }
    3233
    33         UserProc *pBackUserProc;
    34         pBackUserProc = &UserProc::CompilingUserProc();
     34        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
    3535        UserProc::CompileStartForGlobalArea();
    3636
     
    5454
    5555        //_System_StartupProgramの呼び出し
    56         extern UserProc *pSub_System_StartupProgram;
     56        extern const UserProc *pSub_System_StartupProgram;
    5757        op_call(pSub_System_StartupProgram);
    5858
     
    8282        StackFrameSchedule=obp-sizeof(long);
    8383
    84         BOOST_FOREACH( Variable *pVar, globalVars ){
     84        BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
    8585            if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
    8686                //コンストラクタ呼び出し
    87                 if( pVar->IsObject() ){
     87                if( pVar->GetType().IsObject() ){
    8888
    8989                    //エラー用
     
    9292                    CallConstructor(
    9393                        pVar->GetName().c_str(),
    94                         pVar->GetSubScriptsPtr(),
    95                         *pVar,
    96                         pVar->paramStrForConstructor.c_str());
     94                        pVar->GetSubscripts(),
     95                        pVar->GetType(),
     96                        pVar->GetParamStrForConstructor().c_str());
    9797                }
    9898            }
     
    113113
    114114
    115         UserProc *pBackUserProc;
    116         pBackUserProc = &UserProc::CompilingUserProc();
     115        const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
    117116        UserProc::CompileStartForGlobalArea();
    118117
     
    212211    }
    213212}
    214 void AutoGeneration(UserProc &userProc){
     213void AutoGeneration(const UserProc &userProc){
    215214    if( userProc.GetName() == "InitializeUserTypes"
    216215        && userProc.HasParentClass()
     
    229228    }
    230229}
    231 void _compile_proc(UserProc *pUserProc){
     230void _compile_proc(const UserProc *pUserProc){
    232231    extern char *basbuf;
    233232    extern HANDLE hHeap;
    234     extern GlobalProc **ppSubHash;
    235233    extern BOOL bDebugCompile;
    236234    int i3,i4;
     
    239237    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
    240238
    241     if( pUserProc->localVars.size() ){
     239    if( pUserProc->GetLocalVars().size() ){
    242240        SetError();
    243241        return;
    244242    }
     243
     244    trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" );
    245245
    246246    pUserProc->CompleteCompile();
     
    259259    else bDebugSupportProc=0;
    260260
    261     pUserProc->beginOpAddress=obp;
     261    pUserProc->SetBeginOpAddress( obp );
    262262
    263263    //コンパイル中の関数が属するクラス
    264     Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();
     264    compiler.pCompilingClass=pUserProc->GetParentClassPtr();
    265265
    266266    //コンパイルスタートをクラス管理クラスに追加
     
    294294        pobj_sf=0;
    295295
    296         pUserProc->endOpAddress=obp;
     296        pUserProc->SetEndOpAddress( obp );
    297297        return;
    298298    }
     
    360360        Parameter &param = *pUserProc->RealParams()[i3];
    361361
    362         Variable *pVar = new VariableImpl( param.GetVarName(), param, false, param.IsRef() );
     362        Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" );
    363363
    364364        if( param.IsArray() ){
    365             pVar->SetArray( param.GetSubScriptsPtr() );
     365            pVar->SetArray( param.GetSubscripts() );
    366366        }
    367367
     
    381381        }
    382382        AllLocalVarSize+=varSize;
    383         pVar->offset=AllLocalVarSize;
     383        pVar->SetOffsetAddress( AllLocalVarSize );
    384384
    385385        //レキシカルスコープ情報
    386         pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
    387         pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
     386        pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
     387        pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
    388388        pVar->bLiving=TRUE;
    389389
    390         pUserProc->localVars.push_back( pVar );
     390        pUserProc->GetLocalVars().push_back( pVar );
    391391    }
    392392
     
    507507
    508508        //call _DebugSys_StartProc
    509         extern UserProc *pSub_DebugSys_StartProc;
     509        extern const UserProc *pSub_DebugSys_StartProc;
    510510        op_call(pSub_DebugSys_StartProc);
    511511    }
    512512
    513     if(Smoothie::Temp::pCompilingClass){
    514         if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){
     513    if(compiler.pCompilingClass){
     514        if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){
    515515            ////////////////////////////////////
    516516            // コンストラクタをコンパイルするとき
     
    518518
    519519            //コンストラクタのコンパイル開始を通知
    520             Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();
     520            compiler.pCompilingClass->NotifyStartConstructorCompile();
    521521
    522522            //基底クラスかどうかの識別
    523523            //(継承元がインターフェイスの場合も基底クラスと見なす)
    524524            BOOL bThisIsSuperClass;
    525             if( !Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
    526             else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
     525            if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
     526            else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
    527527                //インターフェイスを継承したときはコンストラクタを持たない
    528528                bThisIsSuperClass=1;
     
    543543                    temporary[i4]=basbuf[i3];
    544544                }
    545                 if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){
     545                if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){
    546546                    //基底クラスのコンストラクタを呼び出す
    547547                    cp=i3;
     
    560560                    Type dummyType;
    561561                    CallProc( PROC_DEFAULT
    562                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc
    563                         , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()
     562                        , &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc()
     563                        , compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
    564564                        , temporary
    565565                        , dummyType );
     
    568568                    //基底クラスのコンストラクタを暗黙的に呼び出す
    569569                    Opcode_CallProc("",
    570                         Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,
     570                        &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(),
    571571                        0,
    572572                        "",
     
    576576
    577577            //仮想関数テーブルを初期化
    578             if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()
    579                 && !Smoothie::Temp::pCompilingClass->IsAbstract() ){
     578            if( compiler.pCompilingClass->IsExistVirtualFunctions()
     579                && !compiler.pCompilingClass->IsAbstract() ){
    580580                    //関数テーブルに値をセット
    581                     int offset = (int)Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();
     581                    int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
    582582
    583583                    //mov rax,offset
     
    598598
    599599            //デストラクタのコンパイル開始を通知
    600             Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();
     600            compiler.pCompilingClass->NotifyStartDestructorCompile();
    601601        }
    602602    }
     
    624624    //////////////////////////////////////////
    625625
    626     if( Smoothie::Temp::pCompilingClass ){
    627 
    628         if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){
     626    if( compiler.pCompilingClass ){
     627
     628        if( compiler.pCompilingClass->IsCompilingConstructor() ){
    629629            // コンストラクタをコンパイルしていたとき
    630630
    631631            // コンストラクタのコンパイルが完了したことを通知
    632             Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();
     632            compiler.pCompilingClass->NotifyFinishConstructorCompile();
    633633        }
    634634        else if( pUserProc->IsDestructor() ){
     
    638638
    639639            // デストラクタのコンパイルが完了したことを通知
    640             Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();
    641 
    642             if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){
     640            compiler.pCompilingClass->NotifyFinishDestructorCompile();
     641
     642            if( compiler.pCompilingClass->HasSuperClass() ){
    643643                /* サブクラスのデストラクタをコンパイルしているときは、
    644644                    基底クラスのデストラクタを呼び出す */
    645645
    646                 const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();
     646                const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod();
    647647                if( method ){
    648648                    Opcode_CallProc("",
    649                         method->pUserProc,
     649                        &method->GetUserProc(),
    650650                        0,
    651651                        "",
     
    694694    if(bDebugCompile&&bDebugSupportProc==0){
    695695        //call _DebugSys_EndProc
    696         extern UserProc *pSub_DebugSys_EndProc;
     696        extern const UserProc *pSub_DebugSys_EndProc;
    697697        op_call(pSub_DebugSys_EndProc);
    698698    }
     
    745745    }
    746746    HeapDefaultFree(pLocalVarAddrSchedule);
    747     BOOST_FOREACH( Variable *pVar, pUserProc->localVars ){
     747    BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
    748748        //後にデバッグで利用する
    749         pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset;
     749        pVar->SetOffsetAddress(
     750            AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->GetOffsetAddress()
     751        );
    750752    }
    751753
     
    785787
    786788
    787     pUserProc->endOpAddress=obp;
     789    pUserProc->SetEndOpAddress( obp );
    788790
    789791
     
    793795}
    794796
    795 void CompileBufferInProcedure( UserProc &userProc ){
     797void CompileBufferInProcedure( const UserProc &userProc ){
    796798    if( userProc.IsUsing() == false || userProc.IsCompiled() ) return;
    797799
     
    809811}
    810812void CompileLocal(){
    811     extern GlobalProc **ppSubHash;
    812     int i2;
    813 
    814813    extern BOOL bDll;
    815814    if(bDll){
    816815        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    817         UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     816        const UserProc *pUserProc = GetSubHash("_System_InitDllGlobalVariables");
    818817        if(pUserProc){
    819818            CompileBufferInProcedure( *pUserProc );
     
    823822
    824823    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
    825     extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     824    extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
    826825    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
    827826
    828827    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    829828    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    830     extern UserProc *pSub_System_InitStaticLocalVariables;
     829    extern const UserProc *pSub_System_InitStaticLocalVariables;
    831830    pSub_System_InitStaticLocalVariables->CompleteCompile();
    832831
    833832    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    834     extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     833    extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
    835834    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    836835
    837836repeat:
    838     GlobalProc *pGlobalProc;
    839     for(i2=0;i2<MAX_HASH;i2++){
    840         pGlobalProc=ppSubHash[i2];
    841         while(pGlobalProc){
    842             CompileBufferInProcedure( *pGlobalProc );
    843             pGlobalProc=pGlobalProc->pNextData;
    844         }
     837    compiler.GetMeta().GetUserProcs().Iterator_Reset();
     838    while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
     839    {
     840        UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
     841        CompileBufferInProcedure( *pUserProc );
    845842    }
    846843
     
    856853    if( IsNeedProcCompile() ){
    857854        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    858         for(i2=0;i2<MAX_HASH;i2++){
    859             pGlobalProc=ppSubHash[i2];
    860             while(pGlobalProc){
    861                 CompileBufferInProcedure( *pGlobalProc );
    862                 pGlobalProc=pGlobalProc->pNextData;
    863             }
     855
     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 );
    864861        }
    865862    }
Note: See TracChangeset for help on using the changeset viewer.