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

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

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

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