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