source: dev/BasicCompiler_Common/Object.cpp@ 34

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

スコープ処理を統一した。関数の途中でReturnしても、スコープにあるローカルオブジェクトを正確に破棄できるようにした。

File size: 4.3 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
9extern HANDLE hHeap;
10
11int GetAlignment(CClass *pobj_c){
12 int i;
13 int alignment,member_size;
14
15 if(pobj_c->vtbl_num) alignment=PTR_SIZE;
16 else alignment=0;
17
18 for(i=0;i<pobj_c->iMemberNum;i++){
19 if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
20 //メンバクラスのアラインメントを取得
21 member_size=GetAlignment(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
22 }
23 else{
24 //メンバサイズを取得
25 member_size=GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
26 }
27
28 //アラインメントをセット
29 if(alignment<member_size) alignment=member_size;
30 }
31
32 if(alignment==0) return 0;
33
34 if(pobj_c->iAlign) alignment=pobj_c->iAlign;
35
36 return alignment;
37}
38int GetSizeOfClassMember(CClass *pobj_c,char *pMemberName,int *pMemberNum){
39 int i,i2,offset;
40
41 //仮想関数が存在する場合は関数リストへのポインタのサイズを追加
42 if(pobj_c->vtbl_num) offset=PTR_SIZE;
43 else offset=0;
44
45 int alignment;
46 if(pobj_c->iAlign) alignment=pobj_c->iAlign;
47 else alignment=1;
48
49 int iMaxAlign=0;
50 for(i=0;i<pobj_c->iMemberNum;i++){
51 //メンバ変数の型サイズを取得
52 i2=GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
53 if(i2==-1) return -1;
54
55 //アラインメントを算出
56 int member_size;
57 if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
58 //メンバクラスのアラインメントを取得
59 member_size=GetAlignment(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
60 }
61 else{
62 //メンバサイズを取得
63 member_size=i2;
64 }
65 if(iMaxAlign<member_size) iMaxAlign=member_size;
66
67 //アラインメントを考慮
68 if(pobj_c->iAlign&&pobj_c->iAlign<member_size){
69 if(offset%alignment) offset+=alignment-(offset%alignment);
70 }
71 else{
72 if(alignment<member_size) alignment=member_size;
73
74 if(member_size==0){
75 //メンバを持たないクラス
76 //※何もしない(オフセットの計算をしない)
77 }
78 else{
79 if(offset%member_size) offset+=member_size-(offset%member_size);
80 }
81 }
82
83 if(pMemberName){
84 //メンバ指定がある場合は、オフセットを返す
85 if(lstrcmp(pobj_c->ppobj_Member[i]->name,pMemberName)==0){
86 if(pMemberNum) *pMemberNum=i;
87 return offset;
88 }
89 }
90
91 //配列を考慮したメンバサイズを取得
92 member_size=i2 * JumpSubScripts(pobj_c->ppobj_Member[i]->SubScripts);
93
94 //メンバサイズを加算
95 offset+= member_size;
96 }
97
98 if(iMaxAlign<alignment) alignment=iMaxAlign;
99
100 //アラインメントを考慮
101 if(alignment){
102 if(offset%alignment) offset+=alignment-(offset%alignment);
103 }
104
105 if(pMemberNum) *pMemberNum=i;
106 return offset;
107}
108int GetSizeOfClass(CClass *pobj_c){
109 return GetSizeOfClassMember(pobj_c,0,0);
110}
111
112
113void CallConstractor(char *ObjectName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter){
114 if(TypeInfo.type!=DEF_OBJECT) return;
115
116 /////////////////////////////////////
117 // クラスオブジェクトの場合
118 // ※コンストラクタの呼び出し
119 /////////////////////////////////////
120 CClass *pobj_c;
121 pobj_c=(CClass *)TypeInfo.u.lpIndex;
122
123 SUBINFO *psi;
124 psi=GetMethodHash(ObjectName,pobj_c->name,Parameter);
125 if(!psi){
126 if(Parameter[0]) SetError(113,pobj_c->name,cp);
127 return;
128 }
129
130
131 char temporary[VN_SIZE];
132
133 if(SubScripts[0]!=-1){
134 int ss[MAX_ARRAYDIM];
135 memset(ss,0,MAX_ARRAYDIM*sizeof(int));
136 while(1){
137 int i3;
138 for(i3=0;;i3++){
139 if(SubScripts[i3]==-1) break;
140
141 if(ss[i3]>SubScripts[i3]){
142 ss[i3]=0;
143 ss[i3+1]++;
144 }
145 else break;
146 }
147 if(SubScripts[i3]==-1) break;
148 sprintf(temporary,"%s[%d",ObjectName,ss[0]);
149 for(i3=1;;i3++){
150 if(SubScripts[i3]==-1) break;
151
152 sprintf(temporary+lstrlen(temporary),",%d",ss[i3]);
153 }
154 lstrcat(temporary,"]");
155
156 LONG_PTR lp;
157 sprintf(temporary+lstrlen(temporary),".%s",pobj_c->name);
158 CallProc(PROC_DEFAULT,
159 psi,
160 temporary,
161 Parameter,
162 &lp);
163
164 ss[0]++;
165
166
167 //ネイティブコードバッファの再確保
168 extern int obp_AllocSize;
169 if(obp_AllocSize<obp+8192){
170 obp_AllocSize+=8192;
171 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
172 }
173 }
174 }
175 else{
176 LONG_PTR lp;
177 sprintf(temporary,"%s.%s",ObjectName,pobj_c->name);
178 CallProc(PROC_DEFAULT,
179 psi,
180 temporary,
181 Parameter,
182 &lp);
183 }
184}
Note: See TracBrowser for help on using the repository browser.