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

Last change on this file since 829 was 829, checked in by イグトランス (egtra), 12 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 5.2 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 foreach(auto pClass, classes)
21 {
22 CClass &objClass = *pClass;
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 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 foreach (auto pClass, classes)
86 {
87 const CClass &objClass = *pClass;
88
89 if( !objClass.IsUsing() ){
90 // 未使用のクラスは無視する
91 continue;
92 }
93
94 std::string referenceOffsetsBuffer;
95 int numOfReference = 0;
96 objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );
97
98 sprintf( temporary
99 , "Add(%c%c_System_TypeForClass[strNamespace=\"%s\",name=\"%s\",fullName=\"%s\",referenceOffsets=[%s],numOfReference=%d])"
100 , 1
101 , ESC_SYSTEM_STATIC_NEW
102 , objClass.GetNamespaceScopes().ToString().c_str() // 名前空間
103 , objClass.GetName().c_str() // クラス名
104 , objClass.GetFullName().c_str() // フルネーム
105 , referenceOffsetsBuffer.c_str() // 参照メンバオフセット配列
106 , numOfReference // 参照メンバの個数
107 );
108
109 // コンパイル
110 ChangeOpcode( temporary );
111
112 objClass.SetTypeInfoDataTableOffset(
113 DataTableGenerator::GetLastMadeConstObjectDataTableOffset()
114 );
115 }
116}
117
118std::string ProcedureGenerator::GetStaticDefiningStringAsMemberTypeInfoNames( const CClass &_class )
119{
120 std::string result;
121
122 foreach( const Member *pMember, _class.GetDynamicMembers() )
123 {
124 if( result.size() )
125 {
126 result += ",";
127 }
128
129 result += "\"" + compiler.TypeToString( pMember->GetType() ) + "\"";
130 }
131
132 return result;
133}
134
135void ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType( const Classes &classes )
136{
137 extern int cp;
138 cp = -1;
139 ////////////////////////////////////////////////////////////////////
140 // 基底クラスを登録
141 ////////////////////////////////////////////////////////////////////
142
143 char temporary[8192];
144 sprintf(temporary, "%c%ctempType=Nothing%c%c_System_TypeForClass"
145 , HIBYTE( COM_DIM )
146 , LOBYTE( COM_DIM )
147 , 1
148 , ESC_AS
149 );
150 ChangeOpcode( temporary );
151
152 foreach (auto pClass, classes)
153 {
154 const CClass &objClass = *pClass;
155
156 if( !objClass.IsUsing() ){
157 // 未使用のクラスは無視する
158 continue;
159 }
160
161 if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){
162 sprintf( temporary
163 , "tempType=Search(\"%s\") As ActiveBasic.Core._System_TypeForClass"
164 , objClass.GetFullName().c_str()
165 );
166
167 // コンパイル
168 MakeMiddleCode( temporary );
169 ChangeOpcode( temporary );
170
171 sprintf( temporary
172 , "tempType.SetClassInfo(%d,_System_GetComVtbl(%s),_System_GetVtblList(%s),_System_GetDefaultConstructor(%s),_System_GetDestructor(%s))"
173 , objClass.GetSize()
174 , objClass.GetFullName().c_str()
175 , objClass.GetFullName().c_str()
176 , objClass.GetFullName().c_str()
177 , objClass.GetFullName().c_str()
178 , objClass.GetName().c_str()
179 );
180
181 // コンパイル
182 ChangeOpcode( temporary );
183
184 if( objClass.HasSuperClass() )
185 {
186 sprintf( temporary
187 , "tempType.SetBaseType(Search(\"%s\"))"
188 , objClass.GetSuperClass().GetFullName().c_str()
189 );
190
191 // コンパイル
192 ChangeOpcode( temporary );
193 }
194
195 if( objClass.GetDynamicMembers().size() )
196 {
197 // メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
198 sprintf(
199 temporary,
200 "tempType.SetMembers([%s],[%s],[%s],%d)",
201 objClass.GetStaticDefiningStringAsMemberNames().c_str(),
202 GetStaticDefiningStringAsMemberTypeInfoNames( objClass ).c_str(),
203 objClass.GetStaticDefiningStringAsMemberOffsets().c_str(),
204 objClass.GetDynamicMembers().size()
205 );
206 ChangeOpcode( temporary );
207 }
208 }
209 }
210}
Note: See TracBrowser for help on using the repository browser.