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

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

リンカの依存関係解決モジュールを製作中

File size: 5.6 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.IsExternal() )
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 DataTableGenerator::GetLastMadeConstObjectDataTableOffset()
116 );
117 }
118}
119
120std::string ProcedureGenerator::GetStaticDefiningStringAsMemberTypeInfoNames( const CClass &_class )
121{
122 std::string result;
123
124 BOOST_FOREACH( const Member *pMember, _class.GetDynamicMembers() )
125 {
126 if( result.size() )
127 {
128 result += ",";
129 }
130
131 result += "\"" + compiler.TypeToString( pMember->GetType() ) + "\"";
132 }
133
134 return result;
135}
136
137void ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType( const Classes &classes )
138{
139 extern int cp;
140 cp = -1;
141 ////////////////////////////////////////////////////////////////////
142 // 基底クラスを登録
143 ////////////////////////////////////////////////////////////////////
144
145 char temporary[8192];
146 sprintf(temporary, "%c%ctempType=Nothing%c%c_System_TypeForClass"
147 , HIBYTE( COM_DIM )
148 , LOBYTE( COM_DIM )
149 , 1
150 , ESC_AS
151 );
152 ChangeOpcode( temporary );
153
154 // イテレータをリセット
155 classes.Iterator_Reset();
156
157 while( classes.Iterator_HasNext() ){
158 const CClass &objClass = *classes.Iterator_GetNext();
159
160 if( !objClass.IsUsing() ){
161 // 未使用のクラスは無視する
162 continue;
163 }
164
165 if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){
166 sprintf( temporary
167 , "tempType=Search(\"%s\") As ActiveBasic.Core._System_TypeForClass"
168 , objClass.GetFullName().c_str()
169 );
170
171 // コンパイル
172 MakeMiddleCode( temporary );
173 ChangeOpcode( temporary );
174
175 sprintf( temporary
176 , "tempType.SetClassInfo(%d,_System_GetComVtbl(%s),_System_GetVtblList(%s),_System_GetDefaultConstructor(%s),_System_GetDestructor(%s))"
177 , objClass.GetSize()
178 , objClass.GetFullName().c_str()
179 , objClass.GetFullName().c_str()
180 , objClass.GetFullName().c_str()
181 , objClass.GetFullName().c_str()
182 , objClass.GetName().c_str()
183 );
184
185 // コンパイル
186 ChangeOpcode( temporary );
187
188 if( objClass.HasSuperClass() )
189 {
190 sprintf( temporary
191 , "tempType.SetBaseType(Search(\"%s\"))"
192 , objClass.GetSuperClass().GetFullName().c_str()
193 );
194
195 // コンパイル
196 ChangeOpcode( temporary );
197 }
198
199 if( objClass.GetDynamicMembers().size() )
200 {
201 // メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
202 sprintf(
203 temporary,
204 "tempType.SetMembers([%s],[%s],[%s],%d)",
205 objClass.GetStaticDefiningStringAsMemberNames().c_str(),
206 GetStaticDefiningStringAsMemberTypeInfoNames( objClass ).c_str(),
207 objClass.GetStaticDefiningStringAsMemberOffsets().c_str(),
208 objClass.GetDynamicMembers().size()
209 );
210 ChangeOpcode( temporary );
211 }
212 }
213 }
214}
Note: See TracBrowser for help on using the repository browser.