Ignore:
Timestamp:
Sep 7, 2007, 3:15:41 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Subroutine.cpp

    r308 r316  
    447447    return false;
    448448}
     449
     450void CompileBufferInProcedure( const UserProc &userProc ){
     451    if( userProc.IsCompiled() ) return;
     452
     453    _compile_proc( &userProc );
     454
     455/*
     456    // ログを履く
     457    char temporary[8192];
     458    temporary[0]=0;
     459    lstrcat( temporary, "------------------------------------------------------------------\n" );
     460    sprintf( temporary + lstrlen(temporary), "【 %s のコード情報】\n", userProc.GetFullName().c_str() );
     461    sprintf( temporary + lstrlen(temporary), "code size: %d bytes\n", userProc.GetCodeSize() );
     462    lstrcat( temporary, "------------------------------------------------------------------\n" );
     463    lstrcat( temporary, "\n" );
     464    Smoothie::Logger::Put( temporary );*/
     465}
     466void CompileLocal(){
     467    if( compiler.IsDll() )
     468    {
     469        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
     470        const UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     471        if(pUserProc){
     472            CompileBufferInProcedure( *pUserProc );
     473        }
     474        else SetError(300,NULL,cp);
     475    }
     476    else
     477    {
     478        // グローバル領域を一番初めにコンパイルする
     479        extern const UserProc *pSub_System_GlobalArea;
     480        CompileBufferInProcedure( *pSub_System_GlobalArea );
     481    }
     482
     483    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
     484    extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     485    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
     486
     487    //_System_InitStaticLocalVariablesは一番最後にコンパイル
     488    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
     489    extern const UserProc *pSub_System_InitStaticLocalVariables;
     490    pSub_System_InitStaticLocalVariables->CompleteCompile();
     491
     492    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
     493    extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
     494    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
     495
     496repeat:
     497    compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
     498    while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
     499    {
     500        UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
     501        CompileBufferInProcedure( *pUserProc );
     502    }
     503
     504    if( IsNeedProcCompile() ){
     505        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     506        goto repeat;
     507    }
     508
     509    if( !compiler.IsStaticLibrary() )
     510    {
     511        //_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル
     512        pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus();
     513        CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes );
     514
     515        if( IsNeedProcCompile() ){
     516            //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     517
     518            compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
     519            while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
     520            {
     521                UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
     522                CompileBufferInProcedure( *pUserProc );
     523            }
     524        }
     525
     526        //_System_InitStaticLocalVariablesは一番最後にコンパイル
     527        pSub_System_InitStaticLocalVariables->KillCompileStatus();
     528        CompileBufferInProcedure( *pSub_System_InitStaticLocalVariables );
     529
     530        //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
     531        pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus();
     532        CompileBufferInProcedure( *pSub_System_Call_Destructor_of_GlobalObject );
     533    }
     534}
Note: See TracChangeset for help on using the changeset viewer.