source: dev/trunk/abdev/BasicCompiler_Common/Diagnose.cpp@ 167

Last change on this file since 167 was 167, checked in by dai_9181, 17 years ago

BasicSysDirをGetAppDirに置き換えた

File size: 4.2 KB
Line 
1#include <Program.h>
2
3#include "../BasicCompiler_Common/common.h"
4
5#ifdef _AMD64_
6#include "../BasicCompiler64/opcode.h"
7#else
8#include "../BasicCompiler32/opcode.h"
9#endif
10
11
12void Diagnose(){
13 char temporary[8192];
14
15 {
16 ///////////////////////////////////////////////////////////////////
17 // グローバル / ローカル コード領域のサイズを調べる
18 ///////////////////////////////////////////////////////////////////
19
20 extern int obp;
21 extern int GlobalOpBufferSize;
22 sprintf(temporary, "%d", GlobalOpBufferSize/1024 );
23 trace_for_size( (string)"グローバル領域のコードサイズ: " + temporary + "KB" );
24 sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 );
25 trace_for_size( (string)"ローカル領域のコードサイズ: " + temporary + "KB" );
26 sprintf(temporary, "%d", obp/1024 );
27 trace_for_size( (string)"コードサイズ総量: " + temporary + "KB" );
28 }
29
30 {
31 ///////////////////////////////////////////////////////////////////
32 // グローバル関数、クラスメソッドのサイズを調べる
33 ///////////////////////////////////////////////////////////////////
34
35 int codeSizeOfGlobalProc = 0;
36 int codeSizeOfClassMethod = 0;
37 for(int i2=0;i2<MAX_HASH;i2++){
38 extern GlobalProc **ppSubHash;
39 GlobalProc *pUserProc = ppSubHash[i2];
40 while(pUserProc){
41 if( pUserProc->IsCompiled() ){
42 if( pUserProc->HasParentClass() ){
43 codeSizeOfClassMethod += pUserProc->GetCodeSize();
44 }
45 else{
46 codeSizeOfGlobalProc += pUserProc->GetCodeSize();
47 }
48 }
49
50 pUserProc=pUserProc->pNextData;
51 }
52 }
53
54 sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 );
55 trace_for_size( (string)"グローバル関数のコードサイズ総量: " + temporary + "KB" );
56 sprintf(temporary, "%d", codeSizeOfClassMethod/1024 );
57 trace_for_size( (string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" );
58 }
59
60 {
61 ///////////////////////////////////////////////////////////////////
62 // Enumに必要なのコードサイズを調べる
63 ///////////////////////////////////////////////////////////////////
64 int codeSizeOfEnum = 0;
65
66 // イテレータをリセット
67 extern Classes *pobj_DBClass;
68 pobj_DBClass->Iterator_Reset();
69
70 while( pobj_DBClass->Iterator_HasNext() ){
71 int codeSizeOfClass = 0;
72
73 CClass &objClass = *pobj_DBClass->Iterator_GetNext();
74
75 if( !objClass.IsEnum() ){
76 // 列挙型以外は無視
77 continue;
78 }
79
80 // 動的メソッド
81 foreach( const CMethod *pMethod, objClass.GetMethods() ){
82 if( pMethod->pUserProc->IsCompiled() ){
83 codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
84 }
85 }
86
87 // 静的メソッド
88 foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
89 codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
90 }
91
92 codeSizeOfEnum += codeSizeOfClass;
93 }
94
95 sprintf(temporary, "%d", codeSizeOfEnum/1024 );
96 trace_for_size( (string)"Enumのコードサイズ総量: " + temporary + "KB" );
97 }
98
99 trace_for_size( "\n\n" );
100
101 {
102 ///////////////////////////////////////////////////////////////////
103 // クラスのサイズを調べる
104 ///////////////////////////////////////////////////////////////////
105
106 // イテレータをリセット
107 extern Classes *pobj_DBClass;
108 pobj_DBClass->Iterator_Reset();
109
110 while( pobj_DBClass->Iterator_HasNext() ){
111 int codeSizeOfClass = 0;
112
113 CClass &objClass = *pobj_DBClass->Iterator_GetNext();
114
115 // 動的メソッド
116 foreach( const CMethod *pMethod, objClass.GetMethods() ){
117 if( pMethod->pUserProc->IsCompiled() ){
118 codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
119 }
120 }
121
122 // 静的メソッド
123 foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
124 codeSizeOfClass += pMethod->pUserProc->GetCodeSize();
125 }
126
127 if( codeSizeOfClass ){
128 temporary[0]=0;
129 lstrcat( temporary, "------------------------------------------------------------------\n" );
130 sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() );
131 sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass );
132 lstrcat( temporary, "------------------------------------------------------------------\n" );
133 lstrcat( temporary, "\n" );
134 trace_for_size( temporary );
135 }
136 }
137 }
138}
Note: See TracBrowser for help on using the repository browser.