#include "../BasicCompiler_Common/common.h" #ifdef _AMD64_ #include "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/opcode.h" #endif void Diagnose(){ char temporary[8192]; { /////////////////////////////////////////////////////////////////// // グローバル / ローカル コード領域のサイズを調べる /////////////////////////////////////////////////////////////////// extern int obp; extern int GlobalOpBufferSize; sprintf(temporary, "%d", GlobalOpBufferSize/1024 ); Smoothie::Logger::Put( (string)"グローバル領域のコードサイズ: " + temporary + "KB" ); sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 ); Smoothie::Logger::Put( (string)"ローカル領域のコードサイズ: " + temporary + "KB" ); sprintf(temporary, "%d", obp/1024 ); Smoothie::Logger::Put( (string)"コードサイズ総量: " + temporary + "KB" ); } { /////////////////////////////////////////////////////////////////// // グローバル関数、クラスメソッドのサイズを調べる /////////////////////////////////////////////////////////////////// int codeSizeOfGlobalProc = 0; int codeSizeOfClassMethod = 0; for(int i2=0;i2IsCompiled() ){ if( pUserProc->HasParentClass() ){ codeSizeOfClassMethod += pUserProc->GetCodeSize(); } else{ codeSizeOfGlobalProc += pUserProc->GetCodeSize(); } } pUserProc=pUserProc->pNextData; } } sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 ); Smoothie::Logger::Put( (string)"グローバル関数のコードサイズ総量: " + temporary + "KB" ); sprintf(temporary, "%d", codeSizeOfClassMethod/1024 ); Smoothie::Logger::Put( (string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" ); } { /////////////////////////////////////////////////////////////////// // Enumに必要なのコードサイズを調べる /////////////////////////////////////////////////////////////////// int codeSizeOfEnum = 0; // イテレータをリセット extern CDBClass *pobj_DBClass; pobj_DBClass->Iterator_Reset(); while( pobj_DBClass->Iterator_HasNext() ){ int codeSizeOfClass = 0; CClass &objClass = *pobj_DBClass->Iterator_GetNext(); if( !objClass.IsEnum() ){ // 列挙型以外は無視 continue; } // 動的メソッド foreach( const CMethod &method, objClass.GetMethods() ){ if( method.pUserProc->IsCompiled() ){ codeSizeOfClass += method.pUserProc->GetCodeSize(); } } // 静的メソッド foreach( const CMethod &method, objClass.GetStaticMethods() ){ codeSizeOfClass += method.pUserProc->GetCodeSize(); } codeSizeOfEnum += codeSizeOfClass; } sprintf(temporary, "%d", codeSizeOfEnum/1024 ); Smoothie::Logger::Put( (string)"Enumのコードサイズ総量: " + temporary + "KB" ); } Smoothie::Logger::Put( "\n\n" ); { /////////////////////////////////////////////////////////////////// // クラスのサイズを調べる /////////////////////////////////////////////////////////////////// // イテレータをリセット extern CDBClass *pobj_DBClass; pobj_DBClass->Iterator_Reset(); while( pobj_DBClass->Iterator_HasNext() ){ int codeSizeOfClass = 0; CClass &objClass = *pobj_DBClass->Iterator_GetNext(); // 動的メソッド foreach( const CMethod &method, objClass.GetMethods() ){ if( method.pUserProc->IsCompiled() ){ codeSizeOfClass += method.pUserProc->GetCodeSize(); } } // 静的メソッド foreach( const CMethod &method, objClass.GetStaticMethods() ){ codeSizeOfClass += method.pUserProc->GetCodeSize(); } if( codeSizeOfClass ){ temporary[0]=0; lstrcat( temporary, "------------------------------------------------------------------\n" ); sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.name ); sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass ); lstrcat( temporary, "------------------------------------------------------------------\n" ); lstrcat( temporary, "\n" ); Smoothie::Logger::Put( temporary ); } } } }