source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp@ 565

Last change on this file since 565 was 565, checked in by dai_9181, 16 years ago

・ProcedureGeneratorクラスを追加。
・「InitStaticMember、Compile_System_InitializeUserTypes、Compile_System_InitializeUserTypesForBaseType」これらのメソッドをProcedureGeneratorクラスに移動。

File size: 5.3 KB
Line 
1#include "stdafx.h"
2
3#ifdef _AMD64_
4#include "../../compiler_x64/opcode.h"
5#else
6#include "../../compiler_x86/opcode.h"
7#endif
8
9using namespace ActiveBasic::Compiler;
10
11void ProcedureGenerator::Generate_InitStaticMember( const Classes &classes )
12{
13 //静的メンバをグローバル領域に作成
14
15 //イテレータをリセット
16
17 extern int cp;
18 int back_cp=cp;
19
20 classes.Iterator_Reset();
21 while(classes.Iterator_HasNext()){
22 CClass &objClass = *classes.Iterator_GetNext();
23 if( objClass.isTargetObjectModule == false )
24 {
25 // 静的リンクライブラリの場合は飛ばす(既にインスタンスが定義済みであるため)
26 continue;
27 }
28
29 // 名前空間をセット
30 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = objClass.GetNamespaceScopes();
31
32 DWORD dwFlags = 0;
33 if( objClass.GetName() == "_System_TypeBase" )
34 {
35 // _System_TypeBaseクラスはグローバル、スタティック領域を初期化するためのクラスなのでここでの初期化は除外する
36 dwFlags |= DIMFLAG_NONCALL_CONSTRACTOR;
37 }
38
39 // コンパイル中クラスとしてセット
40 compiler.SetCompilingClass( &objClass );
41
42 const EnumInfo *pEnumInfo = NULL;
43 if( objClass.IsEnum() )
44 {
45 pEnumInfo = compiler.enumInfoCollection.Find( objClass );
46 }
47
48 int i=0;
49 BOOST_FOREACH( Member *member, objClass.GetStaticMembers() )
50 {
51 if( pEnumInfo )
52 {
53 cp = pEnumInfo->GetEnumMember( member->GetName() ).GetSourceIndex();
54 }
55
56 char temporary[VN_SIZE];
57 sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str());
58 dim(
59 temporary,
60 member->GetSubscripts(),
61 member->GetType(),
62 member->GetInitializeExpression().c_str(),
63 member->GetConstructParameter().c_str(),
64 dwFlags);
65
66 i++;
67 }
68
69 compiler.SetCompilingClass( NULL );
70 }
71
72 compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().clear();
73
74 cp=back_cp;
75}
76
77void ProcedureGenerator::Generate_System_InitializeUserTypes( const Classes &classes )
78{
79 char temporary[VN_SIZE];
80
81 ////////////////////////////////////////////////////////////////////
82 // クラス登録
83 ////////////////////////////////////////////////////////////////////
84
85 // イテレータをリセット
86 classes.Iterator_Reset();
87
88 while( classes.Iterator_HasNext() ){
89 const CClass &objClass = *classes.Iterator_GetNext();
90
91 if( !objClass.IsUsing() ){
92 // 未使用のクラスは無視する
93 continue;
94 }
95
96 std::string referenceOffsetsBuffer;
97 int numOfReference = 0;
98 objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );
99
100 sprintf( temporary
101 , "Add(%c%c_System_TypeForClass[strNamespace=\"%s\",name=\"%s\",fullName=\"%s\",referenceOffsets=[%s],numOfReference=%d])"
102 , 1
103 , ESC_SYSTEM_STATIC_NEW
104 , objClass.GetNamespaceScopes().ToString().c_str() // 名前空間
105 , objClass.GetName().c_str() // クラス名
106 , objClass.GetFullName().c_str() // フルネーム
107 , referenceOffsetsBuffer.c_str() // 参照メンバオフセット配列
108 , numOfReference // 参照メンバの個数
109 );
110
111 // コンパイル
112 ChangeOpcode( temporary );
113
114 objClass.SetTypeInfoDataTableOffset(
115 compiler.GetObjectModule().dataTable.GetLastMadeConstObjectDataTableOffset()
116 );
117 }
118}
119
120void ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType( const Classes &classes )
121{
122 extern int cp;
123 cp = -1;
124 ////////////////////////////////////////////////////////////////////
125 // 基底クラスを登録
126 ////////////////////////////////////////////////////////////////////
127
128 char temporary[8192];
129 sprintf(temporary, "%c%ctempType=Nothing%c%c_System_TypeForClass"
130 , HIBYTE( COM_DIM )
131 , LOBYTE( COM_DIM )
132 , 1
133 , ESC_AS
134 );
135 ChangeOpcode( temporary );
136
137 // イテレータをリセット
138 classes.Iterator_Reset();
139
140 while( classes.Iterator_HasNext() ){
141 const CClass &objClass = *classes.Iterator_GetNext();
142
143 if( !objClass.IsUsing() ){
144 // 未使用のクラスは無視する
145 continue;
146 }
147
148 if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){
149 sprintf( temporary
150 , "tempType=Search(\"%s\") As ActiveBasic.Core._System_TypeForClass"
151 , objClass.GetFullName().c_str()
152 );
153
154 // コンパイル
155 MakeMiddleCode( temporary );
156 ChangeOpcode( temporary );
157
158 sprintf( temporary
159 , "tempType.SetClassInfo(%d,_System_GetComVtbl(%s),_System_GetVtblList(%s),_System_GetDefaultConstructor(%s),_System_GetDestructor(%s))"
160 , objClass.GetSize()
161 , objClass.GetFullName().c_str()
162 , objClass.GetFullName().c_str()
163 , objClass.GetFullName().c_str()
164 , objClass.GetFullName().c_str()
165 , objClass.GetName().c_str()
166 );
167
168 // コンパイル
169 ChangeOpcode( temporary );
170
171 if( objClass.HasSuperClass() )
172 {
173 sprintf( temporary
174 , "tempType.SetBaseType(Search(\"%s\"))"
175 , objClass.GetSuperClass().GetFullName().c_str()
176 );
177
178 // コンパイル
179 ChangeOpcode( temporary );
180 }
181
182 if( objClass.GetDynamicMembers().size() )
183 {
184 // メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
185 sprintf(
186 temporary,
187 "tempType.SetMembers([%s],[%s],[%s],%d)",
188 objClass.GetStaticDefiningStringAsMemberNames().c_str(),
189 objClass.GetStaticDefiningStringAsMemberTypeInfoNames().c_str(),
190 objClass.GetStaticDefiningStringAsMemberOffsets().c_str(),
191 objClass.GetDynamicMembers().size()
192 );
193 ChangeOpcode( temporary );
194 }
195 }
196 }
197}
Note: See TracBrowser for help on using the repository browser.