| 1 | #include "common.h"
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #ifdef _AMD64_
 | 
|---|
| 4 | #include "../BasicCompiler64/opcode.h"
 | 
|---|
| 5 | #else
 | 
|---|
| 6 | #include "../BasicCompiler32/opcode.h"
 | 
|---|
| 7 | #endif
 | 
|---|
| 8 | 
 | 
|---|
| 9 | CDBClass *pobj_DBClass;
 | 
|---|
| 10 | 
 | 
|---|
| 11 | CClass *pobj_CompilingClass;
 | 
|---|
| 12 | CClass *pobj_StringClass;
 | 
|---|
| 13 | 
 | 
|---|
| 14 | int AddDataTable(char *buffer,int length);
 | 
|---|
| 15 | 
 | 
|---|
| 16 | 
 | 
|---|
| 17 | 
 | 
|---|
| 18 | CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, char *buffer, int NowLine ){
 | 
|---|
| 19 |     extern int cp;
 | 
|---|
| 20 | 
 | 
|---|
| 21 |     //構文を解析
 | 
|---|
| 22 |     char VarName[VN_SIZE];
 | 
|---|
| 23 |     char init_buf[VN_SIZE];
 | 
|---|
| 24 |     char constract_parameter[VN_SIZE];
 | 
|---|
| 25 |     if(!GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter))
 | 
|---|
| 26 |         return;
 | 
|---|
| 27 | 
 | 
|---|
| 28 |     //重複チェック
 | 
|---|
| 29 |     if(pobj_c->DupliCheckAll(VarName)){
 | 
|---|
| 30 |         SetError(15,VarName,cp);
 | 
|---|
| 31 |         return;
 | 
|---|
| 32 |     }
 | 
|---|
| 33 | 
 | 
|---|
| 34 |     if(TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 35 |         if(TypeInfo.u.pobj_Class->IsHoldAbstractFunction()){
 | 
|---|
| 36 |             //抽象クラスだったとき
 | 
|---|
| 37 |             SetError(125,TypeInfo.u.pobj_Class->name,cp);
 | 
|---|
| 38 |         }
 | 
|---|
| 39 |     }
 | 
|---|
| 40 | 
 | 
|---|
| 41 |     //メンバ名
 | 
|---|
| 42 |     name=(char *)HeapAlloc(hHeap,0,lstrlen(VarName)+1);
 | 
|---|
| 43 |     lstrcpy(name,VarName);
 | 
|---|
| 44 | 
 | 
|---|
| 45 |     //アクセス権
 | 
|---|
| 46 |     dwAccess=access;
 | 
|---|
| 47 | 
 | 
|---|
| 48 |     //定数扱いかどうか
 | 
|---|
| 49 |     this->isConst = isConst;
 | 
|---|
| 50 | 
 | 
|---|
| 51 |     //初期データ
 | 
|---|
| 52 |     InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1);
 | 
|---|
| 53 |     lstrcpy(InitBuf,init_buf);
 | 
|---|
| 54 | 
 | 
|---|
| 55 |     //コンストラクタ用のパラメータ
 | 
|---|
| 56 |     ConstractParameter=(char *)HeapAlloc(hHeap,0,lstrlen(constract_parameter)+1);
 | 
|---|
| 57 |     lstrcpy(ConstractParameter,constract_parameter);
 | 
|---|
| 58 | 
 | 
|---|
| 59 |     //ソースコードの位置
 | 
|---|
| 60 |     source_code_address=NowLine;
 | 
|---|
| 61 | }
 | 
|---|
| 62 | CMember::CMember(CMember *pobj){
 | 
|---|
| 63 |     //コピーコンストラクタ
 | 
|---|
| 64 |     memset(this,0,sizeof(CMember));
 | 
|---|
| 65 | 
 | 
|---|
| 66 |     //name
 | 
|---|
| 67 |     name=(char *)HeapAlloc(hHeap,0,lstrlen(pobj->name)+1);
 | 
|---|
| 68 |     lstrcpy(name,pobj->name);
 | 
|---|
| 69 | 
 | 
|---|
| 70 |     //定数扱いかどうか
 | 
|---|
| 71 |     isConst = pobj->isConst;
 | 
|---|
| 72 | 
 | 
|---|
| 73 |     //SubScripts
 | 
|---|
| 74 |     memcpy(SubScripts,pobj->SubScripts,MAX_ARRAYDIM*sizeof(int));
 | 
|---|
| 75 | 
 | 
|---|
| 76 |     //TypeInfo
 | 
|---|
| 77 |     TypeInfo=pobj->TypeInfo;
 | 
|---|
| 78 | 
 | 
|---|
| 79 |     //ソースコードの位置
 | 
|---|
| 80 |     source_code_address=pobj->source_code_address;
 | 
|---|
| 81 | }
 | 
|---|
| 82 | CMember::CMember(){
 | 
|---|
| 83 |     memset(this,0,sizeof(CMember));
 | 
|---|
| 84 | }
 | 
|---|
| 85 | CMember::~CMember(){
 | 
|---|
| 86 |     HeapDefaultFree(name);
 | 
|---|
| 87 |     if(InitBuf) HeapDefaultFree(InitBuf);
 | 
|---|
| 88 |     if(ConstractParameter) HeapDefaultFree(ConstractParameter);
 | 
|---|
| 89 | }
 | 
|---|
| 90 | 
 | 
|---|
| 91 | bool CMember::IsConst(){
 | 
|---|
| 92 |     return isConst;
 | 
|---|
| 93 | }
 | 
|---|
| 94 | 
 | 
|---|
| 95 | void CMember::InitStaticMember(void){
 | 
|---|
| 96 |     //静的メンバをグローバル領域に作成
 | 
|---|
| 97 | 
 | 
|---|
| 98 |     //イテレータをリセット
 | 
|---|
| 99 |     extern CDBClass *pobj_DBClass;
 | 
|---|
| 100 |     pobj_DBClass->Iterator_Reset();
 | 
|---|
| 101 | 
 | 
|---|
| 102 |     int back_cp=cp;
 | 
|---|
| 103 | 
 | 
|---|
| 104 |     while(pobj_DBClass->Iterator_HasNext()){
 | 
|---|
| 105 |         CClass *pobj_c;
 | 
|---|
| 106 |         pobj_c=pobj_DBClass->Iterator_GetNext();
 | 
|---|
| 107 | 
 | 
|---|
| 108 |         int i;
 | 
|---|
| 109 |         char temporary[VN_SIZE];
 | 
|---|
| 110 |         for(i=0;i<pobj_c->iStaticMemberNum;i++){
 | 
|---|
| 111 |             sprintf(temporary,"%s.%s",pobj_c->name,pobj_c->ppobj_StaticMember[i]->name);
 | 
|---|
| 112 |             AddGlobalVariable(
 | 
|---|
| 113 |                 temporary,
 | 
|---|
| 114 |                 pobj_c->ppobj_StaticMember[i]->SubScripts,
 | 
|---|
| 115 |                 &pobj_c->ppobj_StaticMember[i]->TypeInfo,
 | 
|---|
| 116 |                 GetTypeSize(pobj_c->ppobj_StaticMember[i]->TypeInfo.type,pobj_c->ppobj_StaticMember[i]->TypeInfo.u.lpIndex),
 | 
|---|
| 117 |                 pobj_c->ppobj_StaticMember[i]->InitBuf,
 | 
|---|
| 118 |                 pobj_c->ppobj_StaticMember[i]->ConstractParameter,
 | 
|---|
| 119 |                 0);
 | 
|---|
| 120 | 
 | 
|---|
| 121 |             if(pobj_c->ppobj_StaticMember[i]->TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 122 |                 //エラー用
 | 
|---|
| 123 |                 cp=pobj_c->ppobj_StaticMember[i]->source_code_address;
 | 
|---|
| 124 | 
 | 
|---|
| 125 |                 CallConstractor(temporary,
 | 
|---|
| 126 |                     pobj_c->ppobj_StaticMember[i]->SubScripts,
 | 
|---|
| 127 |                     pobj_c->ppobj_StaticMember[i]->TypeInfo,
 | 
|---|
| 128 |                     pobj_c->ppobj_StaticMember[i]->ConstractParameter);
 | 
|---|
| 129 |             }
 | 
|---|
| 130 | 
 | 
|---|
| 131 |             //ネイティブコードバッファの再確保
 | 
|---|
| 132 |             extern int obp_AllocSize;
 | 
|---|
| 133 |             if(obp_AllocSize<obp+8192){
 | 
|---|
| 134 |                 obp_AllocSize+=8192;
 | 
|---|
| 135 |                 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea
 | 
|---|
| 136 |             }
 | 
|---|
| 137 |         }
 | 
|---|
| 138 |     }
 | 
|---|
| 139 | 
 | 
|---|
| 140 |     cp=back_cp;
 | 
|---|
| 141 | }
 | 
|---|
| 142 | 
 | 
|---|
| 143 | 
 | 
|---|
| 144 | 
 | 
|---|
| 145 | CMethod::CMethod(CMethod *pobj){
 | 
|---|
| 146 |     //コピーコンストラクタ
 | 
|---|
| 147 |     memset(this,0,sizeof(CMethod));
 | 
|---|
| 148 | 
 | 
|---|
| 149 |     psi=pobj->psi;
 | 
|---|
| 150 | 
 | 
|---|
| 151 |     bAbstract=pobj->bAbstract;
 | 
|---|
| 152 | 
 | 
|---|
| 153 |     bVirtual=pobj->bVirtual;
 | 
|---|
| 154 | }
 | 
|---|
| 155 | CMethod::CMethod(){
 | 
|---|
| 156 |     memset(this,0,sizeof(CMethod));
 | 
|---|
| 157 | }
 | 
|---|
| 158 | CMethod::~CMethod(){
 | 
|---|
| 159 | }
 | 
|---|
| 160 | 
 | 
|---|
| 161 | 
 | 
|---|
| 162 | 
 | 
|---|
| 163 | 
 | 
|---|
| 164 | CClass::CClass(char *name){
 | 
|---|
| 165 |     memset(this,0,sizeof(CClass));
 | 
|---|
| 166 | 
 | 
|---|
| 167 |     vtbl_offset=-1;
 | 
|---|
| 168 | 
 | 
|---|
| 169 |     this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
 | 
|---|
| 170 |     lstrcpy(this->name,name);
 | 
|---|
| 171 | 
 | 
|---|
| 172 |     isCompilingConstructor = 0;
 | 
|---|
| 173 | }
 | 
|---|
| 174 | CClass::~CClass(){
 | 
|---|
| 175 |     int i;
 | 
|---|
| 176 | 
 | 
|---|
| 177 |     //クラス名
 | 
|---|
| 178 |     HeapDefaultFree(name);
 | 
|---|
| 179 | 
 | 
|---|
| 180 |     if(ppobj_Member){
 | 
|---|
| 181 |         //メンバ
 | 
|---|
| 182 |         for(i=0;i<iMemberNum;i++){
 | 
|---|
| 183 |             delete ppobj_Member[i];
 | 
|---|
| 184 |         }
 | 
|---|
| 185 |         HeapDefaultFree(ppobj_Member);
 | 
|---|
| 186 |         ppobj_Member=0;
 | 
|---|
| 187 |     }
 | 
|---|
| 188 | 
 | 
|---|
| 189 |     if(ppobj_Method){
 | 
|---|
| 190 |         //メソッド
 | 
|---|
| 191 |         for(i=0;i<iMethodNum;i++){
 | 
|---|
| 192 |             delete ppobj_Method[i];
 | 
|---|
| 193 |         }
 | 
|---|
| 194 |         HeapDefaultFree(ppobj_Method);
 | 
|---|
| 195 |         ppobj_Method=0;
 | 
|---|
| 196 |     }
 | 
|---|
| 197 | 
 | 
|---|
| 198 |     if(ppobj_StaticMember){
 | 
|---|
| 199 |         //静的メンバ
 | 
|---|
| 200 |         for(i=0;i<iStaticMemberNum;i++){
 | 
|---|
| 201 |             delete ppobj_StaticMember[i];
 | 
|---|
| 202 |         }
 | 
|---|
| 203 |         HeapDefaultFree(ppobj_StaticMember);
 | 
|---|
| 204 |         ppobj_StaticMember=0;
 | 
|---|
| 205 |     }
 | 
|---|
| 206 | 
 | 
|---|
| 207 |     if(ppobj_StaticMethod){
 | 
|---|
| 208 |         //静的メソッド
 | 
|---|
| 209 |         for(i=0;i<iStaticMethodNum;i++){
 | 
|---|
| 210 |             delete ppobj_StaticMethod[i];
 | 
|---|
| 211 |         }
 | 
|---|
| 212 |         HeapDefaultFree(ppobj_StaticMethod);
 | 
|---|
| 213 |         ppobj_StaticMethod=0;
 | 
|---|
| 214 |     }
 | 
|---|
| 215 | }
 | 
|---|
| 216 | void CClass::AddMember( DWORD dwAccess, bool isConst, char *buffer ){
 | 
|---|
| 217 |     ppobj_Member = (CMember **)HeapReAlloc( hHeap, 0, ppobj_Member, ( iMemberNum + 1 ) * sizeof(CMember *) );
 | 
|---|
| 218 |     ppobj_Member[iMemberNum] = new CMember( this, dwAccess, isConst, buffer );
 | 
|---|
| 219 |     iMemberNum++;
 | 
|---|
| 220 | }
 | 
|---|
| 221 | void CClass::AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine ){
 | 
|---|
| 222 |     ppobj_StaticMember=(CMember **)HeapReAlloc(hHeap,0,ppobj_StaticMember,(iStaticMemberNum+1)*sizeof(CMember *));
 | 
|---|
| 223 |     ppobj_StaticMember[iStaticMemberNum]=new CMember( this, dwAccess, isConst, buffer, NowLine );
 | 
|---|
| 224 |     iStaticMemberNum++;
 | 
|---|
| 225 | }
 | 
|---|
| 226 | void CClass::AddMethod(SUBINFO *psi,DWORD dwAccess,BOOL bAbstract,BOOL bVirtual){
 | 
|---|
| 227 |     ppobj_Method=(CMethod **)HeapReAlloc(hHeap,0,ppobj_Method,(iMethodNum+1)*sizeof(CMethod *));
 | 
|---|
| 228 |     ppobj_Method[iMethodNum]=new CMethod();
 | 
|---|
| 229 |     ppobj_Method[iMethodNum]->psi=psi;
 | 
|---|
| 230 |     ppobj_Method[iMethodNum]->dwAccess=dwAccess;
 | 
|---|
| 231 |     ppobj_Method[iMethodNum]->bAbstract=bAbstract;
 | 
|---|
| 232 |     ppobj_Method[iMethodNum]->bVirtual=bVirtual;
 | 
|---|
| 233 |     ppobj_Method[iMethodNum]->pobj_InheritsClass=0;
 | 
|---|
| 234 | 
 | 
|---|
| 235 |     iMethodNum++;
 | 
|---|
| 236 | }
 | 
|---|
| 237 | void CClass::AddStaticMethod(SUBINFO *psi,DWORD dwAccess){
 | 
|---|
| 238 |     ppobj_StaticMethod=(CMethod **)HeapReAlloc(hHeap,0,ppobj_StaticMethod,(iStaticMethodNum+1)*sizeof(CMethod *));
 | 
|---|
| 239 |     ppobj_StaticMethod[iStaticMethodNum]=new CMethod();
 | 
|---|
| 240 |     ppobj_StaticMethod[iStaticMethodNum]->psi=psi;
 | 
|---|
| 241 |     ppobj_StaticMethod[iStaticMethodNum]->dwAccess=dwAccess;
 | 
|---|
| 242 |     ppobj_StaticMethod[iStaticMethodNum]->bAbstract=0;
 | 
|---|
| 243 |     ppobj_StaticMethod[iStaticMethodNum]->bVirtual=0;
 | 
|---|
| 244 |     ppobj_StaticMethod[iStaticMethodNum]->pobj_InheritsClass=0;
 | 
|---|
| 245 | 
 | 
|---|
| 246 |     iStaticMethodNum++;
 | 
|---|
| 247 | }
 | 
|---|
| 248 | BOOL CClass::DupliCheckAll(char *name){
 | 
|---|
| 249 |     //重複チェック
 | 
|---|
| 250 | 
 | 
|---|
| 251 |     int i;
 | 
|---|
| 252 | 
 | 
|---|
| 253 |     //メンバ
 | 
|---|
| 254 |     if(DupliCheckMember(name)) return 1;
 | 
|---|
| 255 | 
 | 
|---|
| 256 |     //メソッド
 | 
|---|
| 257 |     for(i=0;i<iMethodNum;i++){
 | 
|---|
| 258 |         if(lstrcmp(name,ppobj_Method[i]->psi->name)==0){
 | 
|---|
| 259 |             return 1;
 | 
|---|
| 260 |         }
 | 
|---|
| 261 |     }
 | 
|---|
| 262 | 
 | 
|---|
| 263 |     return 0;
 | 
|---|
| 264 | }
 | 
|---|
| 265 | BOOL CClass::DupliCheckMember(char *name){
 | 
|---|
| 266 |     //重複チェック
 | 
|---|
| 267 | 
 | 
|---|
| 268 |     int i;
 | 
|---|
| 269 | 
 | 
|---|
| 270 |     //メンバ
 | 
|---|
| 271 |     for(i=0;i<iMemberNum;i++){
 | 
|---|
| 272 |         if(lstrcmp(name,ppobj_Member[i]->name)==0){
 | 
|---|
| 273 |             return 1;
 | 
|---|
| 274 |         }
 | 
|---|
| 275 |     }
 | 
|---|
| 276 | 
 | 
|---|
| 277 |     //静的メンバ
 | 
|---|
| 278 |     for(i=0;i<iStaticMemberNum;i++){
 | 
|---|
| 279 |         if(lstrcmp(name,ppobj_StaticMember[i]->name)==0){
 | 
|---|
| 280 |             return 1;
 | 
|---|
| 281 |         }
 | 
|---|
| 282 |     }
 | 
|---|
| 283 | 
 | 
|---|
| 284 |     return 0;
 | 
|---|
| 285 | }
 | 
|---|
| 286 | 
 | 
|---|
| 287 | LONG_PTR CClass::AddVtblDataTable(SUBINFO **ppsi,int length){
 | 
|---|
| 288 |     return AddDataTable((char *)ppsi,length);
 | 
|---|
| 289 | }
 | 
|---|
| 290 | LONG_PTR CClass::GetVtblGlobalOffset(void){
 | 
|---|
| 291 |     if(vtbl_offset!=-1) return vtbl_offset;
 | 
|---|
| 292 | 
 | 
|---|
| 293 |     SUBINFO **ppsi;
 | 
|---|
| 294 |     ppsi=(SUBINFO **)HeapAlloc(hHeap,0,vtbl_num*sizeof(SUBINFO *));
 | 
|---|
| 295 | 
 | 
|---|
| 296 |     //関数テーブルに値をセット
 | 
|---|
| 297 |     int i,i2,i3=0;
 | 
|---|
| 298 |     for(i=0;i < iMethodNum;i++){
 | 
|---|
| 299 |         if(ppobj_Method[i]->bVirtual){
 | 
|---|
| 300 |             for(i2=iMethodNum-1; i2>=i; i2--){
 | 
|---|
| 301 |                 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){
 | 
|---|
| 302 |                     pobj_CompilingClass->ppobj_Method[i2]->psi->bUse=1;
 | 
|---|
| 303 | 
 | 
|---|
| 304 |                     if(ppobj_Method[i2]->bAbstract){
 | 
|---|
| 305 |                         extern int cp;
 | 
|---|
| 306 |                         SetError(300,NULL,cp);
 | 
|---|
| 307 | 
 | 
|---|
| 308 |                         ppsi[i3]=0;
 | 
|---|
| 309 |                     }
 | 
|---|
| 310 |                     else ppsi[i3]=pobj_CompilingClass->ppobj_Method[i2]->psi;
 | 
|---|
| 311 |                     i3++;
 | 
|---|
| 312 | 
 | 
|---|
| 313 |                     break;
 | 
|---|
| 314 |                 }
 | 
|---|
| 315 |             }
 | 
|---|
| 316 |         }
 | 
|---|
| 317 |     }
 | 
|---|
| 318 | 
 | 
|---|
| 319 |     vtbl_offset=AddDataTable((char *)ppsi,vtbl_num*sizeof(LONG_PTR));
 | 
|---|
| 320 | 
 | 
|---|
| 321 |     for(i=0;i<vtbl_num;i++){
 | 
|---|
| 322 |         pobj_Reloc->AddSchedule_DataSection(vtbl_offset+i*sizeof(LONG_PTR));
 | 
|---|
| 323 |     }
 | 
|---|
| 324 | 
 | 
|---|
| 325 |     HeapDefaultFree(ppsi);
 | 
|---|
| 326 | 
 | 
|---|
| 327 |     return vtbl_offset;
 | 
|---|
| 328 | }
 | 
|---|
| 329 | void CClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
 | 
|---|
| 330 |     if(vtbl_offset==-1) return;
 | 
|---|
| 331 | 
 | 
|---|
| 332 |     extern char *DataTable;
 | 
|---|
| 333 |     LONG_PTR *pVtbl;
 | 
|---|
| 334 |     pVtbl=(LONG_PTR *)(DataTable+vtbl_offset);
 | 
|---|
| 335 | 
 | 
|---|
| 336 |     int i;
 | 
|---|
| 337 |     for(i=0;i<vtbl_num;i++){
 | 
|---|
| 338 |         SUBINFO *psi;
 | 
|---|
| 339 |         psi=(SUBINFO *)pVtbl[i];
 | 
|---|
| 340 |         if(!psi) continue;
 | 
|---|
| 341 |         pVtbl[i]=psi->CompileAddress+ImageBase+MemPos_CodeSection;
 | 
|---|
| 342 |     }
 | 
|---|
| 343 | }
 | 
|---|
| 344 | BOOL CClass::IsHoldAbstractFunction(void){
 | 
|---|
| 345 |     //未実装の仮想関数を持つ場合は1を返す
 | 
|---|
| 346 | 
 | 
|---|
| 347 |     int i,i2,i3=0;
 | 
|---|
| 348 |     for(i=0;i < iMethodNum;i++){
 | 
|---|
| 349 |         if(ppobj_Method[i]->bVirtual){
 | 
|---|
| 350 |             for(i2=iMethodNum-1; i2>=i; i2--){
 | 
|---|
| 351 |                 if(lstrcmp(ppobj_Method[i]->psi->name,ppobj_Method[i2]->psi->name)==0){
 | 
|---|
| 352 | 
 | 
|---|
| 353 |                     if(ppobj_Method[i2]->bAbstract){
 | 
|---|
| 354 |                         return 1;
 | 
|---|
| 355 |                     }
 | 
|---|
| 356 | 
 | 
|---|
| 357 |                     break;
 | 
|---|
| 358 |                 }
 | 
|---|
| 359 |             }
 | 
|---|
| 360 |         }
 | 
|---|
| 361 |     }
 | 
|---|
| 362 | 
 | 
|---|
| 363 |     //コンポジションの関係にあるメンバも検査する
 | 
|---|
| 364 |     for(i=0;i < iMemberNum;i++){
 | 
|---|
| 365 |         if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 366 |             if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsHoldAbstractFunction())
 | 
|---|
| 367 |                 return 1;
 | 
|---|
| 368 |         }
 | 
|---|
| 369 |     }
 | 
|---|
| 370 | 
 | 
|---|
| 371 |     return 0;
 | 
|---|
| 372 | }
 | 
|---|
| 373 | 
 | 
|---|
| 374 | 
 | 
|---|
| 375 | SUBINFO **CClass::GetOperatorSubInfo(BYTE idCalc,int &num){
 | 
|---|
| 376 |     //格納のための構造体配列を用意
 | 
|---|
| 377 |     SUBINFO **ppArray_si;
 | 
|---|
| 378 |     ppArray_si=(SUBINFO **)HeapAlloc(hHeap,0,sizeof(SUBINFO *)*1024);
 | 
|---|
| 379 |     num=0;
 | 
|---|
| 380 | 
 | 
|---|
| 381 |     int i;
 | 
|---|
| 382 |     for(i=0;i<iMethodNum;i++){
 | 
|---|
| 383 |         char *temp;
 | 
|---|
| 384 |         temp=ppobj_Method[i]->psi->name;
 | 
|---|
| 385 |         if(temp[0]==1&&temp[1]==ESC_OPERATOR){
 | 
|---|
| 386 |             if((BYTE)temp[2]==idCalc){
 | 
|---|
| 387 |                 ppArray_si[num]=ppobj_Method[i]->psi;
 | 
|---|
| 388 |                 num++;
 | 
|---|
| 389 |             }
 | 
|---|
| 390 |         }
 | 
|---|
| 391 |     }
 | 
|---|
| 392 | 
 | 
|---|
| 393 |     return ppArray_si;
 | 
|---|
| 394 | }
 | 
|---|
| 395 | 
 | 
|---|
| 396 | // コンストラクタのコンパイルを開始
 | 
|---|
| 397 | void CClass::NotifyStartConstructorCompile(){
 | 
|---|
| 398 |     isCompilingConstructor = true;
 | 
|---|
| 399 | }
 | 
|---|
| 400 | 
 | 
|---|
| 401 | //コンストラクタのコンパイルを終了
 | 
|---|
| 402 | void CClass::NotifyFinishConstructorCompile(){
 | 
|---|
| 403 |     isCompilingConstructor = false;
 | 
|---|
| 404 | }
 | 
|---|
| 405 | 
 | 
|---|
| 406 | //コンストラクタをコンパイル中かどうかを判別
 | 
|---|
| 407 | bool CClass::IsCompilingConstructor(){
 | 
|---|
| 408 |     return isCompilingConstructor;
 | 
|---|
| 409 | }
 | 
|---|
| 410 | 
 | 
|---|
| 411 | 
 | 
|---|
| 412 | int CDBClass::hash(char *name){
 | 
|---|
| 413 |     int key;
 | 
|---|
| 414 | 
 | 
|---|
| 415 |     for(key=0;*name!='\0';name++){
 | 
|---|
| 416 |         key=((key<<8)+ *name )%MAX_CLASS_HASH;
 | 
|---|
| 417 |     }
 | 
|---|
| 418 | 
 | 
|---|
| 419 |     return key;
 | 
|---|
| 420 | }
 | 
|---|
| 421 | 
 | 
|---|
| 422 | void CDBClass::DestroyClass(CClass *pobj_c){
 | 
|---|
| 423 |     if(pobj_c->pobj_NextClass){
 | 
|---|
| 424 |         DestroyClass(pobj_c->pobj_NextClass);
 | 
|---|
| 425 |     }
 | 
|---|
| 426 | 
 | 
|---|
| 427 |     delete pobj_c;
 | 
|---|
| 428 | }
 | 
|---|
| 429 | 
 | 
|---|
| 430 | CDBClass::CDBClass(){
 | 
|---|
| 431 |     memset(this,0,sizeof(CDBClass));
 | 
|---|
| 432 | }
 | 
|---|
| 433 | CDBClass::~CDBClass(){
 | 
|---|
| 434 |     int i;
 | 
|---|
| 435 |     for(i=0;i<MAX_CLASS_HASH;i++){
 | 
|---|
| 436 |         if(pobj_ClassHash[i]) DestroyClass(pobj_ClassHash[i]);
 | 
|---|
| 437 |     }
 | 
|---|
| 438 | 
 | 
|---|
| 439 |     if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass);
 | 
|---|
| 440 | }
 | 
|---|
| 441 | 
 | 
|---|
| 442 | void CDBClass::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
 | 
|---|
| 443 |     int i;
 | 
|---|
| 444 |     for(i=0;i<MAX_CLASS_HASH;i++){
 | 
|---|
| 445 |         if(pobj_ClassHash[i]){
 | 
|---|
| 446 |             CClass *pobj_c;
 | 
|---|
| 447 |             pobj_c=pobj_ClassHash[i];
 | 
|---|
| 448 |             while(1){
 | 
|---|
| 449 |                 pobj_c->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
 | 
|---|
| 450 | 
 | 
|---|
| 451 |                 if(pobj_c->pobj_NextClass==0) break;
 | 
|---|
| 452 |                 pobj_c=pobj_c->pobj_NextClass;
 | 
|---|
| 453 |             }
 | 
|---|
| 454 |         }
 | 
|---|
| 455 |     }
 | 
|---|
| 456 | }
 | 
|---|
| 457 | 
 | 
|---|
| 458 | CClass *CDBClass::check(char *name){
 | 
|---|
| 459 |     int key;
 | 
|---|
| 460 |     key=hash(name);
 | 
|---|
| 461 | 
 | 
|---|
| 462 |     if(pobj_ClassHash[key]){
 | 
|---|
| 463 |         CClass *pobj_c;
 | 
|---|
| 464 |         pobj_c=pobj_ClassHash[key];
 | 
|---|
| 465 |         while(1){
 | 
|---|
| 466 |             if(lstrcmp(name,pobj_c->name)==0){
 | 
|---|
| 467 |                 //重複した場合
 | 
|---|
| 468 |                 return pobj_c;
 | 
|---|
| 469 |             }
 | 
|---|
| 470 | 
 | 
|---|
| 471 |             if(pobj_c->pobj_NextClass==0) break;
 | 
|---|
| 472 |             pobj_c=pobj_c->pobj_NextClass;
 | 
|---|
| 473 |         }
 | 
|---|
| 474 |     }
 | 
|---|
| 475 |     return 0;
 | 
|---|
| 476 | }
 | 
|---|
| 477 | 
 | 
|---|
| 478 | CClass *CDBClass::AddClass(char *name,int NowLine){
 | 
|---|
| 479 |     //////////////////////////////////////////////////////////////////////////
 | 
|---|
| 480 |     // クラスを追加
 | 
|---|
| 481 |     // ※名前のみを登録。その他の情報はSetClassメソッドで!
 | 
|---|
| 482 |     //////////////////////////////////////////////////////////////////////////
 | 
|---|
| 483 | 
 | 
|---|
| 484 |     CClass *pobj_c;
 | 
|---|
| 485 |     pobj_c=new CClass(name);
 | 
|---|
| 486 | 
 | 
|---|
| 487 |     if(lstrcmp(name,"String")==0){
 | 
|---|
| 488 |         //Stringクラス
 | 
|---|
| 489 |         pobj_StringClass=pobj_c;
 | 
|---|
| 490 |     }
 | 
|---|
| 491 | 
 | 
|---|
| 492 | 
 | 
|---|
| 493 |     /////////////////////////////////
 | 
|---|
| 494 |     // ハッシュデータに追加
 | 
|---|
| 495 |     /////////////////////////////////
 | 
|---|
| 496 | 
 | 
|---|
| 497 |     int key;
 | 
|---|
| 498 |     key=hash(name);
 | 
|---|
| 499 | 
 | 
|---|
| 500 |     if(pobj_ClassHash[key]){
 | 
|---|
| 501 |         CClass *pobj_c2;
 | 
|---|
| 502 |         pobj_c2=pobj_ClassHash[key];
 | 
|---|
| 503 |         while(1){
 | 
|---|
| 504 |             if(lstrcmp(name,pobj_c2->name)==0){
 | 
|---|
| 505 |                 //重複した場合
 | 
|---|
| 506 |                 SetError(15,name,NowLine);
 | 
|---|
| 507 |                 return 0;
 | 
|---|
| 508 |             }
 | 
|---|
| 509 | 
 | 
|---|
| 510 |             if(pobj_c2->pobj_NextClass==0) break;
 | 
|---|
| 511 |             pobj_c2=pobj_c2->pobj_NextClass;
 | 
|---|
| 512 |         }
 | 
|---|
| 513 |         pobj_c2->pobj_NextClass=pobj_c;
 | 
|---|
| 514 |     }
 | 
|---|
| 515 |     else{
 | 
|---|
| 516 |         pobj_ClassHash[key]=pobj_c;
 | 
|---|
| 517 |     }
 | 
|---|
| 518 | 
 | 
|---|
| 519 |     return pobj_c;  
 | 
|---|
| 520 | }
 | 
|---|
| 521 | 
 | 
|---|
| 522 | void CDBClass::InitNames(void){
 | 
|---|
| 523 |     extern char *basbuf;
 | 
|---|
| 524 |     int i;
 | 
|---|
| 525 | 
 | 
|---|
| 526 |     for(i=0;;i++){
 | 
|---|
| 527 |         if(basbuf[i]=='\0') break;
 | 
|---|
| 528 | 
 | 
|---|
| 529 |         if(basbuf[i]==1&&(
 | 
|---|
| 530 |             basbuf[i+1]==ESC_CLASS||
 | 
|---|
| 531 |             basbuf[i+1]==ESC_TYPE||
 | 
|---|
| 532 |             basbuf[i+1]==ESC_INTERFACE
 | 
|---|
| 533 |             )){
 | 
|---|
| 534 |                 int NowLine;
 | 
|---|
| 535 |                 NowLine=i;
 | 
|---|
| 536 | 
 | 
|---|
| 537 |                 i+=2;
 | 
|---|
| 538 |                 //アラインメント修飾子
 | 
|---|
| 539 |                 if(_memicmp(basbuf+i,"Align(",6)==0){
 | 
|---|
| 540 |                     i+=6;
 | 
|---|
| 541 |                     i=JumpStringInPare(basbuf,i)+1;
 | 
|---|
| 542 |                 }
 | 
|---|
| 543 | 
 | 
|---|
| 544 |                 int i2;
 | 
|---|
| 545 |                 char temporary[VN_SIZE];
 | 
|---|
| 546 |                 for(i2=0;;i++,i2++){
 | 
|---|
| 547 |                     if(!IsVariableChar(basbuf[i])){
 | 
|---|
| 548 |                         temporary[i2]=0;
 | 
|---|
| 549 |                         break;
 | 
|---|
| 550 |                     }
 | 
|---|
| 551 |                     temporary[i2]=basbuf[i];
 | 
|---|
| 552 |                 }
 | 
|---|
| 553 | 
 | 
|---|
| 554 |                 //クラスを追加
 | 
|---|
| 555 |                 pobj_DBClass->AddClass(temporary,NowLine);
 | 
|---|
| 556 |         }
 | 
|---|
| 557 |     }
 | 
|---|
| 558 | }
 | 
|---|
| 559 | 
 | 
|---|
| 560 | 
 | 
|---|
| 561 | void CDBClass::AddMemberSub(CClass *pobj_c,DWORD dwAccess,BOOL bStatic,BOOL bAbstract,BOOL bVirtual,BOOL bOverride,char *buffer,int NowLine){
 | 
|---|
| 562 |     int i,i2;
 | 
|---|
| 563 |     char temporary[VN_SIZE];
 | 
|---|
| 564 | 
 | 
|---|
| 565 |     i=2;
 | 
|---|
| 566 |     for(i2=0;;i++,i2++){
 | 
|---|
| 567 |         if(buffer[i]=='('||buffer[i]=='\0'){
 | 
|---|
| 568 |             temporary[i2]=0;
 | 
|---|
| 569 |             break;
 | 
|---|
| 570 |         }
 | 
|---|
| 571 |         temporary[i2]=buffer[i];
 | 
|---|
| 572 |     }
 | 
|---|
| 573 | 
 | 
|---|
| 574 | 
 | 
|---|
| 575 |     //関数ハッシュへ登録
 | 
|---|
| 576 |     SUBINFO *psi;
 | 
|---|
| 577 |     psi=AddSubData(buffer,NowLine,bVirtual,pobj_c,bStatic);
 | 
|---|
| 578 |     if(!psi) return;
 | 
|---|
| 579 | 
 | 
|---|
| 580 | 
 | 
|---|
| 581 |     ////////////////////////////////////////////////////////////
 | 
|---|
| 582 |     // コンストラクタ、デストラクタのアクセシビリティをチェック
 | 
|---|
| 583 |     ////////////////////////////////////////////////////////////
 | 
|---|
| 584 |     BOOL fConstructor=0,bDestructor=0;
 | 
|---|
| 585 | 
 | 
|---|
| 586 |     if(lstrcmp(temporary,pobj_c->name)==0){
 | 
|---|
| 587 |         if(psi->ParmNum==1) fConstructor=1;
 | 
|---|
| 588 |         if(psi->ParmNum==2){
 | 
|---|
| 589 |             if(psi->pParmInfo[1].type==DEF_OBJECT&&
 | 
|---|
| 590 |                 psi->pParmInfo[1].u.pobj_c==pobj_c) fConstructor=2;
 | 
|---|
| 591 |         }
 | 
|---|
| 592 |     }
 | 
|---|
| 593 |     else if(temporary[0]=='~'){
 | 
|---|
| 594 |         //デストラクタの場合はその名前が正しいかチェックを行う
 | 
|---|
| 595 |         if(lstrcmp(temporary+1,pobj_c->name)!=0)
 | 
|---|
| 596 |             SetError(117,NULL,NowLine);
 | 
|---|
| 597 |         else
 | 
|---|
| 598 |             bDestructor=1;
 | 
|---|
| 599 |     }
 | 
|---|
| 600 |     if(fConstructor||bDestructor){
 | 
|---|
| 601 |         if(dwAccess!=ACCESS_PUBLIC){
 | 
|---|
| 602 |             SetError(116,NULL,NowLine);
 | 
|---|
| 603 |             dwAccess=ACCESS_PUBLIC;
 | 
|---|
| 604 |         }
 | 
|---|
| 605 |     }
 | 
|---|
| 606 | 
 | 
|---|
| 607 | 
 | 
|---|
| 608 |     if(fConstructor==1) pobj_c->ConstructorMemberSubIndex=pobj_c->iMethodNum;
 | 
|---|
| 609 |     else if(fConstructor==2) pobj_c->CopyConstructorMemberSubIndex=pobj_c->iMethodNum;
 | 
|---|
| 610 |     else if(bDestructor) pobj_c->DestructorMemberSubIndex=pobj_c->iMethodNum;
 | 
|---|
| 611 | 
 | 
|---|
| 612 | 
 | 
|---|
| 613 | 
 | 
|---|
| 614 |     //////////////////
 | 
|---|
| 615 |     // 重複チェック
 | 
|---|
| 616 |     //////////////////
 | 
|---|
| 617 | 
 | 
|---|
| 618 |     if(pobj_c->DupliCheckMember(temporary)){
 | 
|---|
| 619 |         SetError(15,temporary,NowLine);
 | 
|---|
| 620 |         return;
 | 
|---|
| 621 |     }
 | 
|---|
| 622 | 
 | 
|---|
| 623 |     //メンバ関数
 | 
|---|
| 624 |     for(i=0;i<pobj_c->iMethodNum;i++){
 | 
|---|
| 625 |         //スーパークラスと重複する場合はオーバーライドを行う
 | 
|---|
| 626 |         if(pobj_c->ppobj_Method[i]->pobj_InheritsClass) continue;
 | 
|---|
| 627 | 
 | 
|---|
| 628 |         if(lstrcmp(temporary,pobj_c->ppobj_Method[i]->psi->name)==0){
 | 
|---|
| 629 |             if(CompareParameter(
 | 
|---|
| 630 |                 pobj_c->ppobj_Method[i]->psi->pParmInfo,pobj_c->ppobj_Method[i]->psi->ParmNum,
 | 
|---|
| 631 |                 psi->pParmInfo,psi->ParmNum
 | 
|---|
| 632 |                 )==0){
 | 
|---|
| 633 |                 //関数名、パラメータ属性が合致したとき
 | 
|---|
| 634 |                 SetError(15,psi->name,NowLine);
 | 
|---|
| 635 |                 return;
 | 
|---|
| 636 |             }
 | 
|---|
| 637 |         }
 | 
|---|
| 638 |     }
 | 
|---|
| 639 | 
 | 
|---|
| 640 |     //仮想関数の場合
 | 
|---|
| 641 |     if(bAbstract) psi->bCompile=1;
 | 
|---|
| 642 | 
 | 
|---|
| 643 | 
 | 
|---|
| 644 |     for(i=0;i<pobj_c->iMethodNum;i++){
 | 
|---|
| 645 |         if(lstrcmp(temporary,pobj_c->ppobj_Method[i]->psi->name)==0){
 | 
|---|
| 646 |             if(CompareParameter(
 | 
|---|
| 647 |                 pobj_c->ppobj_Method[i]->psi->pParmInfo,pobj_c->ppobj_Method[i]->psi->ParmNum,
 | 
|---|
| 648 |                 psi->pParmInfo,psi->ParmNum
 | 
|---|
| 649 |                 )==0){
 | 
|---|
| 650 | 
 | 
|---|
| 651 |                 if(pobj_c->ppobj_Method[i]->psi->bVirtual){
 | 
|---|
| 652 |                     //メンバ関数を上書き
 | 
|---|
| 653 |                     pobj_c->ppobj_Method[i]->psi=psi;
 | 
|---|
| 654 |                     pobj_c->ppobj_Method[i]->bAbstract=0;
 | 
|---|
| 655 | 
 | 
|---|
| 656 |                     if(!bOverride){
 | 
|---|
| 657 |                         SetError(127,NULL,NowLine);
 | 
|---|
| 658 |                     }
 | 
|---|
| 659 |                     if(pobj_c->ppobj_Method[i]->dwAccess!=dwAccess){
 | 
|---|
| 660 |                         SetError(128,NULL,NowLine);
 | 
|---|
| 661 |                     }
 | 
|---|
| 662 |                     return;
 | 
|---|
| 663 |                 }
 | 
|---|
| 664 |             }
 | 
|---|
| 665 |         }
 | 
|---|
| 666 |     }
 | 
|---|
| 667 | 
 | 
|---|
| 668 |     if(psi->bVirtual){
 | 
|---|
| 669 |         pobj_c->vtbl_num++;
 | 
|---|
| 670 |     }
 | 
|---|
| 671 | 
 | 
|---|
| 672 |     if(bOverride){
 | 
|---|
| 673 |         SetError(12,"Override",NowLine);
 | 
|---|
| 674 |     }
 | 
|---|
| 675 | 
 | 
|---|
| 676 |     if(bStatic){
 | 
|---|
| 677 |         pobj_c->AddStaticMethod(psi,dwAccess);
 | 
|---|
| 678 |     }
 | 
|---|
| 679 |     else{
 | 
|---|
| 680 |         pobj_c->AddMethod(psi,dwAccess,bAbstract,bVirtual);
 | 
|---|
| 681 |     }
 | 
|---|
| 682 | }
 | 
|---|
| 683 | 
 | 
|---|
| 684 | BOOL CDBClass::MemberVar_LoopRefCheck(CClass *pobj_c){
 | 
|---|
| 685 |     int i,i2,bRet=1;
 | 
|---|
| 686 |     for(i=0;i<pobj_c->iMemberNum;i++){
 | 
|---|
| 687 |         if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 688 |             //循環参照でないかをチェック
 | 
|---|
| 689 |             if(pobj_LoopRefCheck->check(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name)){
 | 
|---|
| 690 |                 extern int cp;
 | 
|---|
| 691 |                 SetError(123,pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name,cp);
 | 
|---|
| 692 |                 return 0;
 | 
|---|
| 693 |             }
 | 
|---|
| 694 | 
 | 
|---|
| 695 |             pobj_LoopRefCheck->add(pobj_c->name);
 | 
|---|
| 696 | 
 | 
|---|
| 697 |             i2=MemberVar_LoopRefCheck(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
 | 
|---|
| 698 |             if(bRet==1) bRet=i2;
 | 
|---|
| 699 | 
 | 
|---|
| 700 |             pobj_LoopRefCheck->del(pobj_c->name);
 | 
|---|
| 701 |         }
 | 
|---|
| 702 |     }
 | 
|---|
| 703 | 
 | 
|---|
| 704 |     return bRet;
 | 
|---|
| 705 | }
 | 
|---|
| 706 | 
 | 
|---|
| 707 | void CDBClass::GetClass_recur(char *lpszInheritsClass){
 | 
|---|
| 708 |     extern char *basbuf;
 | 
|---|
| 709 |     int i,i2,i3,sub_address,top_pos;
 | 
|---|
| 710 |     DWORD dwClassType;
 | 
|---|
| 711 |     DWORD dwAccess;
 | 
|---|
| 712 |     char temporary[8192];
 | 
|---|
| 713 | 
 | 
|---|
| 714 |     for(i=0;;i++){
 | 
|---|
| 715 |         if(basbuf[i]=='\0') break;
 | 
|---|
| 716 | 
 | 
|---|
| 717 |         CClass *pobj_c;
 | 
|---|
| 718 | 
 | 
|---|
| 719 |         if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){
 | 
|---|
| 720 |             //////////////////////////
 | 
|---|
| 721 |             // インターフェイス
 | 
|---|
| 722 |             //////////////////////////
 | 
|---|
| 723 | 
 | 
|---|
| 724 |             top_pos=i;
 | 
|---|
| 725 | 
 | 
|---|
| 726 |             i+=2;
 | 
|---|
| 727 | 
 | 
|---|
| 728 |             //インターフェイス名を取得
 | 
|---|
| 729 |             GetIdentifierToken( temporary, basbuf, i );
 | 
|---|
| 730 | 
 | 
|---|
| 731 |             pobj_c=pobj_DBClass->check(temporary);
 | 
|---|
| 732 |             if(!pobj_c) continue;
 | 
|---|
| 733 | 
 | 
|---|
| 734 |             if(lpszInheritsClass){
 | 
|---|
| 735 |                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
 | 
|---|
| 736 |                     //継承先先読み用
 | 
|---|
| 737 |                     continue;
 | 
|---|
| 738 |                 }
 | 
|---|
| 739 |             }
 | 
|---|
| 740 | 
 | 
|---|
| 741 |             if(pobj_c->ppobj_Member){
 | 
|---|
| 742 |                 //既に先読みされているとき
 | 
|---|
| 743 |                 continue;
 | 
|---|
| 744 |             }
 | 
|---|
| 745 | 
 | 
|---|
| 746 |             //メンバ用メモリを初期化
 | 
|---|
| 747 |             pobj_c->ppobj_Member=(CMember **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 748 |             pobj_c->iMemberNum=0;
 | 
|---|
| 749 |             pobj_c->ppobj_StaticMember=(CMember **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 750 |             pobj_c->iStaticMemberNum=0;
 | 
|---|
| 751 |             pobj_c->ppobj_Method=(CMethod **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 752 |             pobj_c->iMethodNum=0;
 | 
|---|
| 753 |             pobj_c->ppobj_StaticMethod=(CMethod **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 754 |             pobj_c->iStaticMethodNum=0;
 | 
|---|
| 755 | 
 | 
|---|
| 756 |             pobj_c->ConstructorMemberSubIndex=-1;
 | 
|---|
| 757 |             pobj_c->CopyConstructorMemberSubIndex=-1;
 | 
|---|
| 758 |             pobj_c->DestructorMemberSubIndex=-1;
 | 
|---|
| 759 | 
 | 
|---|
| 760 |             if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
 | 
|---|
| 761 |                 //継承を行う場合
 | 
|---|
| 762 |                 for(i+=3,i2=0;;i++,i2++){
 | 
|---|
| 763 |                     if(IsCommandDelimitation(basbuf[i])){
 | 
|---|
| 764 |                         temporary[i2]=0;
 | 
|---|
| 765 |                         break;
 | 
|---|
| 766 |                     }
 | 
|---|
| 767 |                     temporary[i2]=basbuf[i];
 | 
|---|
| 768 |                 }
 | 
|---|
| 769 | 
 | 
|---|
| 770 |                 if(lstrcmpi(temporary,pobj_c->name)==0){
 | 
|---|
| 771 |                     SetError(105,temporary,i);
 | 
|---|
| 772 |                     goto Interface_InheritsError;
 | 
|---|
| 773 |                 }
 | 
|---|
| 774 | 
 | 
|---|
| 775 |                 //継承元クラスを取得
 | 
|---|
| 776 |                 pobj_c->pobj_InheritsClass=check(temporary);
 | 
|---|
| 777 |                 if(!pobj_c->pobj_InheritsClass){
 | 
|---|
| 778 |                     SetError(106,temporary,i);
 | 
|---|
| 779 |                     goto Interface_InheritsError;
 | 
|---|
| 780 |                 }
 | 
|---|
| 781 | 
 | 
|---|
| 782 |                 //ループ継承でないかをチェック
 | 
|---|
| 783 |                 if(pobj_LoopRefCheck->check(temporary)){
 | 
|---|
| 784 |                     SetError(123,temporary,i);
 | 
|---|
| 785 |                     goto Interface_InheritsError;
 | 
|---|
| 786 |                 }
 | 
|---|
| 787 | 
 | 
|---|
| 788 |                 if(pobj_c->pobj_InheritsClass->ppobj_Member==0){
 | 
|---|
| 789 |                     //継承先が読み取られていないとき
 | 
|---|
| 790 |                     pobj_LoopRefCheck->add(pobj_c->name);
 | 
|---|
| 791 |                     GetClass_recur(temporary);
 | 
|---|
| 792 |                     pobj_LoopRefCheck->del(pobj_c->name);
 | 
|---|
| 793 |                 }
 | 
|---|
| 794 | 
 | 
|---|
| 795 |                 //メンバ変数をコピー
 | 
|---|
| 796 |                 pobj_c->ppobj_Member=(CMember **)HeapReAlloc(
 | 
|---|
| 797 |                     hHeap,
 | 
|---|
| 798 |                     0,
 | 
|---|
| 799 |                     pobj_c->ppobj_Member,
 | 
|---|
| 800 |                     pobj_c->pobj_InheritsClass->iMemberNum*sizeof(CMember *));
 | 
|---|
| 801 |                 pobj_c->iMemberNum=pobj_c->pobj_InheritsClass->iMemberNum;
 | 
|---|
| 802 |                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMemberNum;i3++){
 | 
|---|
| 803 |                     pobj_c->ppobj_Member[i3]=new CMember(pobj_c->pobj_InheritsClass->ppobj_Member[i3]);
 | 
|---|
| 804 | 
 | 
|---|
| 805 |                     //dwAccess
 | 
|---|
| 806 |                     if(pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
 | 
|---|
| 807 |                         pobj_c->ppobj_Member[i3]->dwAccess=ACCESS_NON;
 | 
|---|
| 808 |                     else pobj_c->ppobj_Member[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess;
 | 
|---|
| 809 |                 }
 | 
|---|
| 810 | 
 | 
|---|
| 811 |                 //メンバ関数をコピー
 | 
|---|
| 812 |                 pobj_c->ppobj_Method=(CMethod **)HeapReAlloc(
 | 
|---|
| 813 |                     hHeap,
 | 
|---|
| 814 |                     0,
 | 
|---|
| 815 |                     pobj_c->ppobj_Method,
 | 
|---|
| 816 |                     pobj_c->pobj_InheritsClass->iMethodNum*sizeof(CMethod *));
 | 
|---|
| 817 |                 pobj_c->iMethodNum=pobj_c->pobj_InheritsClass->iMethodNum;
 | 
|---|
| 818 |                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMethodNum;i3++){
 | 
|---|
| 819 |                     pobj_c->ppobj_Method[i3]=new CMethod(pobj_c->pobj_InheritsClass->ppobj_Method[i3]);
 | 
|---|
| 820 | 
 | 
|---|
| 821 |                     //dwAccess
 | 
|---|
| 822 |                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess==ACCESS_PRIVATE)
 | 
|---|
| 823 |                         pobj_c->ppobj_Method[i3]->dwAccess=ACCESS_NON;
 | 
|---|
| 824 |                     else pobj_c->ppobj_Method[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess;
 | 
|---|
| 825 | 
 | 
|---|
| 826 |                     //pobj_Inherits
 | 
|---|
| 827 |                     // ※継承元のClassIndexをセット(入れ子継承を考慮する)
 | 
|---|
| 828 |                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass==0)
 | 
|---|
| 829 |                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=pobj_c->pobj_InheritsClass;
 | 
|---|
| 830 |                     else
 | 
|---|
| 831 |                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=
 | 
|---|
| 832 |                             pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass;
 | 
|---|
| 833 |                 }
 | 
|---|
| 834 | 
 | 
|---|
| 835 |                 //仮想関数の数
 | 
|---|
| 836 |                 pobj_c->vtbl_num=pobj_c->pobj_InheritsClass->vtbl_num;
 | 
|---|
| 837 |             }
 | 
|---|
| 838 |             else{
 | 
|---|
| 839 |                 //継承無し
 | 
|---|
| 840 |                 pobj_c->pobj_InheritsClass=0;
 | 
|---|
| 841 | 
 | 
|---|
| 842 |                 //仮想関数の数を初期化
 | 
|---|
| 843 |                 pobj_c->vtbl_num=0;
 | 
|---|
| 844 |             }
 | 
|---|
| 845 | Interface_InheritsError:
 | 
|---|
| 846 | 
 | 
|---|
| 847 |             //メンバ変数、関数を取得
 | 
|---|
| 848 |             while(1){
 | 
|---|
| 849 |                 i++;
 | 
|---|
| 850 | 
 | 
|---|
| 851 |                 //エラー
 | 
|---|
| 852 |                 if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE||basbuf[i+1]==ESC_INTERFACE)){
 | 
|---|
| 853 |                     SetError(22,"Interface",i);
 | 
|---|
| 854 |                     i--;
 | 
|---|
| 855 |                     break;
 | 
|---|
| 856 |                 }
 | 
|---|
| 857 | 
 | 
|---|
| 858 |                 if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
 | 
|---|
| 859 |                     SetError(111,NULL,i);
 | 
|---|
| 860 |                     break;
 | 
|---|
| 861 |                 }
 | 
|---|
| 862 | 
 | 
|---|
| 863 |                 sub_address=i;
 | 
|---|
| 864 | 
 | 
|---|
| 865 |                 for(i2=0;;i++,i2++){
 | 
|---|
| 866 |                     if(IsCommandDelimitation(basbuf[i])){
 | 
|---|
| 867 |                         temporary[i2]=0;
 | 
|---|
| 868 |                         break;
 | 
|---|
| 869 |                     }
 | 
|---|
| 870 |                     temporary[i2]=basbuf[i];
 | 
|---|
| 871 |                 }
 | 
|---|
| 872 |                 if(temporary[0]=='\0'){
 | 
|---|
| 873 |                     if(basbuf[i]=='\0'){
 | 
|---|
| 874 |                         i--;
 | 
|---|
| 875 |                         SetError(22,"Interface",top_pos);
 | 
|---|
| 876 |                         break;
 | 
|---|
| 877 |                     }
 | 
|---|
| 878 |                     continue;
 | 
|---|
| 879 |                 }
 | 
|---|
| 880 | 
 | 
|---|
| 881 |                 //End Interface記述の場合
 | 
|---|
| 882 |                 if(temporary[0]==1&&temporary[1]==ESC_ENDINTERFACE) break;
 | 
|---|
| 883 | 
 | 
|---|
| 884 |                 if(!(temporary[0]==1&&(
 | 
|---|
| 885 |                     temporary[1]==ESC_SUB||temporary[1]==ESC_FUNCTION
 | 
|---|
| 886 |                     ))){
 | 
|---|
| 887 |                     SetError(1,NULL,i);
 | 
|---|
| 888 |                     break;
 | 
|---|
| 889 |                 }
 | 
|---|
| 890 | 
 | 
|---|
| 891 |                 //メンバ関数を追加
 | 
|---|
| 892 |                 AddMemberSub(pobj_c,ACCESS_PUBLIC,0,1,1,0,temporary,sub_address);
 | 
|---|
| 893 |             }
 | 
|---|
| 894 |         }
 | 
|---|
| 895 | 
 | 
|---|
| 896 |         if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
 | 
|---|
| 897 |             //////////////////////////
 | 
|---|
| 898 |             // クラス
 | 
|---|
| 899 |             //////////////////////////
 | 
|---|
| 900 | 
 | 
|---|
| 901 |             top_pos=i;
 | 
|---|
| 902 | 
 | 
|---|
| 903 |             dwClassType=basbuf[i+1];
 | 
|---|
| 904 | 
 | 
|---|
| 905 |             i+=2;
 | 
|---|
| 906 | 
 | 
|---|
| 907 |             //アラインメント修飾子
 | 
|---|
| 908 |             int iAlign=0;
 | 
|---|
| 909 |             if(_memicmp(basbuf+i,"Align(",6)==0){
 | 
|---|
| 910 |                 i+=6;
 | 
|---|
| 911 |                 i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
 | 
|---|
| 912 |                 iAlign=atoi(temporary);
 | 
|---|
| 913 | 
 | 
|---|
| 914 |                 if(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
 | 
|---|
| 915 |                     SetError(51,NULL,i);
 | 
|---|
| 916 |             }
 | 
|---|
| 917 | 
 | 
|---|
| 918 | 
 | 
|---|
| 919 |             //クラス名を取得
 | 
|---|
| 920 |             GetIdentifierToken( temporary, basbuf, i );
 | 
|---|
| 921 | 
 | 
|---|
| 922 |             pobj_c=pobj_DBClass->check(temporary);
 | 
|---|
| 923 |             if(!pobj_c) continue;
 | 
|---|
| 924 | 
 | 
|---|
| 925 |             if(lpszInheritsClass){
 | 
|---|
| 926 |                 if(lstrcmp(lpszInheritsClass,pobj_c->name)!=0){
 | 
|---|
| 927 |                     //継承先先読み用
 | 
|---|
| 928 |                     continue;
 | 
|---|
| 929 |                 }
 | 
|---|
| 930 |             }
 | 
|---|
| 931 | 
 | 
|---|
| 932 |             if(pobj_c->ppobj_Member){
 | 
|---|
| 933 |                 //既に先読みされているとき
 | 
|---|
| 934 |                 continue;
 | 
|---|
| 935 |             }
 | 
|---|
| 936 | 
 | 
|---|
| 937 |             pobj_c->iAlign=iAlign;
 | 
|---|
| 938 | 
 | 
|---|
| 939 |             //メンバ用メモリを初期化
 | 
|---|
| 940 |             pobj_c->ppobj_Member=(CMember **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 941 |             pobj_c->iMemberNum=0;
 | 
|---|
| 942 |             pobj_c->ppobj_StaticMember=(CMember **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 943 |             pobj_c->iStaticMemberNum=0;
 | 
|---|
| 944 |             pobj_c->ppobj_Method=(CMethod **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 945 |             pobj_c->iMethodNum=0;
 | 
|---|
| 946 |             pobj_c->ppobj_StaticMethod=(CMethod **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 947 |             pobj_c->iStaticMethodNum=0;
 | 
|---|
| 948 | 
 | 
|---|
| 949 |             pobj_c->ConstructorMemberSubIndex=-1;
 | 
|---|
| 950 |             pobj_c->CopyConstructorMemberSubIndex=-1;
 | 
|---|
| 951 |             pobj_c->DestructorMemberSubIndex=-1;
 | 
|---|
| 952 | 
 | 
|---|
| 953 |             //アクセス制限の初期値をセット
 | 
|---|
| 954 |             if(dwClassType==ESC_CLASS) dwAccess=ACCESS_PRIVATE;
 | 
|---|
| 955 |             else dwAccess=ACCESS_PUBLIC;
 | 
|---|
| 956 | 
 | 
|---|
| 957 |             if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
 | 
|---|
| 958 |                 //継承を行う場合
 | 
|---|
| 959 |                 for(i+=3,i2=0;;i++,i2++){
 | 
|---|
| 960 |                     if(IsCommandDelimitation(basbuf[i])){
 | 
|---|
| 961 |                         temporary[i2]=0;
 | 
|---|
| 962 |                         break;
 | 
|---|
| 963 |                     }
 | 
|---|
| 964 |                     temporary[i2]=basbuf[i];
 | 
|---|
| 965 |                 }
 | 
|---|
| 966 | 
 | 
|---|
| 967 |                 if(lstrcmpi(temporary,pobj_c->name)==0){
 | 
|---|
| 968 |                     SetError(105,temporary,i);
 | 
|---|
| 969 |                     goto InheritsError;
 | 
|---|
| 970 |                 }
 | 
|---|
| 971 | 
 | 
|---|
| 972 |                 //継承元クラスを取得
 | 
|---|
| 973 |                 pobj_c->pobj_InheritsClass=check(temporary);
 | 
|---|
| 974 |                 if(!pobj_c->pobj_InheritsClass){
 | 
|---|
| 975 |                     SetError(106,temporary,i);
 | 
|---|
| 976 |                     goto InheritsError;
 | 
|---|
| 977 |                 }
 | 
|---|
| 978 | 
 | 
|---|
| 979 |                 //ループ継承でないかをチェック
 | 
|---|
| 980 |                 if(pobj_LoopRefCheck->check(temporary)){
 | 
|---|
| 981 |                     SetError(123,temporary,i);
 | 
|---|
| 982 |                     goto InheritsError;
 | 
|---|
| 983 |                 }
 | 
|---|
| 984 | 
 | 
|---|
| 985 |                 if(pobj_c->pobj_InheritsClass->ppobj_Member==0){
 | 
|---|
| 986 |                     //継承先が読み取られていないとき
 | 
|---|
| 987 |                     pobj_LoopRefCheck->add(pobj_c->name);
 | 
|---|
| 988 |                     GetClass_recur(temporary);
 | 
|---|
| 989 |                     pobj_LoopRefCheck->del(pobj_c->name);
 | 
|---|
| 990 |                 }
 | 
|---|
| 991 | 
 | 
|---|
| 992 |                 //メンバ変数をコピー
 | 
|---|
| 993 |                 pobj_c->ppobj_Member=(CMember **)HeapReAlloc(
 | 
|---|
| 994 |                     hHeap,
 | 
|---|
| 995 |                     0,
 | 
|---|
| 996 |                     pobj_c->ppobj_Member,
 | 
|---|
| 997 |                     pobj_c->pobj_InheritsClass->iMemberNum*sizeof(CMember *));
 | 
|---|
| 998 |                 pobj_c->iMemberNum=pobj_c->pobj_InheritsClass->iMemberNum;
 | 
|---|
| 999 |                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMemberNum;i3++){
 | 
|---|
| 1000 |                     pobj_c->ppobj_Member[i3]=new CMember(pobj_c->pobj_InheritsClass->ppobj_Member[i3]);
 | 
|---|
| 1001 | 
 | 
|---|
| 1002 |                     //dwAccess
 | 
|---|
| 1003 |                     if(pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
 | 
|---|
| 1004 |                         pobj_c->ppobj_Member[i3]->dwAccess=ACCESS_NON;
 | 
|---|
| 1005 |                     else pobj_c->ppobj_Member[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess;
 | 
|---|
| 1006 |                 }
 | 
|---|
| 1007 | 
 | 
|---|
| 1008 |                 //メンバ関数をコピー
 | 
|---|
| 1009 |                 pobj_c->ppobj_Method=(CMethod **)HeapReAlloc(
 | 
|---|
| 1010 |                     hHeap,
 | 
|---|
| 1011 |                     0,
 | 
|---|
| 1012 |                     pobj_c->ppobj_Method,
 | 
|---|
| 1013 |                     pobj_c->pobj_InheritsClass->iMethodNum*sizeof(CMethod *));
 | 
|---|
| 1014 |                 pobj_c->iMethodNum=pobj_c->pobj_InheritsClass->iMethodNum;
 | 
|---|
| 1015 |                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMethodNum;i3++){
 | 
|---|
| 1016 |                     pobj_c->ppobj_Method[i3]=new CMethod(pobj_c->pobj_InheritsClass->ppobj_Method[i3]);
 | 
|---|
| 1017 | 
 | 
|---|
| 1018 |                     //dwAccess
 | 
|---|
| 1019 |                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess==ACCESS_PRIVATE)
 | 
|---|
| 1020 |                         pobj_c->ppobj_Method[i3]->dwAccess=ACCESS_NON;
 | 
|---|
| 1021 |                     else pobj_c->ppobj_Method[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess;
 | 
|---|
| 1022 | 
 | 
|---|
| 1023 |                     //pobj_Inherits
 | 
|---|
| 1024 |                     // ※継承元のClassIndexをセット(入れ子継承を考慮する)
 | 
|---|
| 1025 |                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass==0)
 | 
|---|
| 1026 |                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=pobj_c->pobj_InheritsClass;
 | 
|---|
| 1027 |                     else
 | 
|---|
| 1028 |                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=
 | 
|---|
| 1029 |                             pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass;
 | 
|---|
| 1030 |                 }
 | 
|---|
| 1031 | 
 | 
|---|
| 1032 |                 //仮想関数の数
 | 
|---|
| 1033 |                 pobj_c->vtbl_num=pobj_c->pobj_InheritsClass->vtbl_num;
 | 
|---|
| 1034 |             }
 | 
|---|
| 1035 |             else{
 | 
|---|
| 1036 |                 //継承無し
 | 
|---|
| 1037 |                 pobj_c->pobj_InheritsClass=0;
 | 
|---|
| 1038 | 
 | 
|---|
| 1039 |                 //仮想関数の数を初期化
 | 
|---|
| 1040 |                 pobj_c->vtbl_num=0;
 | 
|---|
| 1041 |             }
 | 
|---|
| 1042 | InheritsError:
 | 
|---|
| 1043 | 
 | 
|---|
| 1044 |             //メンバ変数、関数を取得
 | 
|---|
| 1045 |             while(1){
 | 
|---|
| 1046 |                 i++;
 | 
|---|
| 1047 | 
 | 
|---|
| 1048 |                 //エラー
 | 
|---|
| 1049 |                 if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
 | 
|---|
| 1050 |                     SetError(22,"Class",i);
 | 
|---|
| 1051 |                     i--;
 | 
|---|
| 1052 |                     break;
 | 
|---|
| 1053 |                 }
 | 
|---|
| 1054 | 
 | 
|---|
| 1055 |                 if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
 | 
|---|
| 1056 |                     SetError(111,NULL,i);
 | 
|---|
| 1057 |                     break;
 | 
|---|
| 1058 |                 }
 | 
|---|
| 1059 | 
 | 
|---|
| 1060 |                 //Static修飾子
 | 
|---|
| 1061 |                 BOOL bStatic;
 | 
|---|
| 1062 |                 if(basbuf[i]==1&&basbuf[i+1]==ESC_STATIC){
 | 
|---|
| 1063 |                     bStatic=1;
 | 
|---|
| 1064 |                     i+=2;
 | 
|---|
| 1065 |                 }
 | 
|---|
| 1066 |                 else bStatic=0;
 | 
|---|
| 1067 | 
 | 
|---|
| 1068 |                 //Const修飾子
 | 
|---|
| 1069 |                 bool isConst = false;
 | 
|---|
| 1070 |                 if( basbuf[i] == 1 && basbuf[i + 1] == ESC_CONST ){
 | 
|---|
| 1071 |                     isConst = true;
 | 
|---|
| 1072 |                     i += 2;
 | 
|---|
| 1073 |                 }
 | 
|---|
| 1074 | 
 | 
|---|
| 1075 |                 if(basbuf[i]==1&&(
 | 
|---|
| 1076 |                     basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE||
 | 
|---|
| 1077 |                     basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION
 | 
|---|
| 1078 |                     )){
 | 
|---|
| 1079 |                     i3=basbuf[i+1];
 | 
|---|
| 1080 |                     sub_address=i;
 | 
|---|
| 1081 |                 }
 | 
|---|
| 1082 |                 else i3=0;
 | 
|---|
| 1083 | 
 | 
|---|
| 1084 |                 BOOL bVirtual=0,bAbstract=0,bOverride=0;
 | 
|---|
| 1085 |                 if(i3==ESC_ABSTRACT){
 | 
|---|
| 1086 |                     bAbstract=1;
 | 
|---|
| 1087 |                     bVirtual=1;
 | 
|---|
| 1088 |                     i+=2;
 | 
|---|
| 1089 | 
 | 
|---|
| 1090 |                     i3=basbuf[i+1];
 | 
|---|
| 1091 |                 }
 | 
|---|
| 1092 |                 else if(i3==ESC_VIRTUAL){
 | 
|---|
| 1093 |                     bAbstract=0;
 | 
|---|
| 1094 |                     bVirtual=1;
 | 
|---|
| 1095 |                     i+=2;
 | 
|---|
| 1096 | 
 | 
|---|
| 1097 |                     i3=basbuf[i+1];
 | 
|---|
| 1098 |                 }
 | 
|---|
| 1099 |                 else if(i3==ESC_OVERRIDE){
 | 
|---|
| 1100 |                     bOverride=1;
 | 
|---|
| 1101 |                     bVirtual=1;
 | 
|---|
| 1102 | 
 | 
|---|
| 1103 |                     i+=2;
 | 
|---|
| 1104 | 
 | 
|---|
| 1105 |                     i3=basbuf[i+1];
 | 
|---|
| 1106 |                 }
 | 
|---|
| 1107 | 
 | 
|---|
| 1108 |                 for(i2=0;;i++,i2++){
 | 
|---|
| 1109 |                     if(IsCommandDelimitation(basbuf[i])){
 | 
|---|
| 1110 |                         temporary[i2]=0;
 | 
|---|
| 1111 |                         break;
 | 
|---|
| 1112 |                     }
 | 
|---|
| 1113 |                     temporary[i2]=basbuf[i];
 | 
|---|
| 1114 |                 }
 | 
|---|
| 1115 |                 if(temporary[0]=='\0'){
 | 
|---|
| 1116 |                     if(basbuf[i]=='\0'){
 | 
|---|
| 1117 | 
 | 
|---|
| 1118 |                         if(dwClassType==ESC_CLASS)
 | 
|---|
| 1119 |                             SetError(22,"Class",top_pos);
 | 
|---|
| 1120 |                         else
 | 
|---|
| 1121 |                             SetError(22,"Type",top_pos);
 | 
|---|
| 1122 | 
 | 
|---|
| 1123 |                         i--;
 | 
|---|
| 1124 |                         break;
 | 
|---|
| 1125 |                     }
 | 
|---|
| 1126 |                     continue;
 | 
|---|
| 1127 |                 }
 | 
|---|
| 1128 | 
 | 
|---|
| 1129 |                 //End Class記述の場合
 | 
|---|
| 1130 |                 if(temporary[0]==1&&temporary[1]==ESC_ENDCLASS&&dwClassType==ESC_CLASS) break;
 | 
|---|
| 1131 |                 if(temporary[0]==1&&temporary[1]==ESC_ENDTYPE&&dwClassType==ESC_TYPE) break;
 | 
|---|
| 1132 | 
 | 
|---|
| 1133 |                 //アクセスを変更
 | 
|---|
| 1134 |                 if(lstrcmpi(temporary,"Private")==0){
 | 
|---|
| 1135 |                     dwAccess=ACCESS_PRIVATE;
 | 
|---|
| 1136 |                     continue;
 | 
|---|
| 1137 |                 }
 | 
|---|
| 1138 |                 if(lstrcmpi(temporary,"Public")==0){
 | 
|---|
| 1139 |                     dwAccess=ACCESS_PUBLIC;
 | 
|---|
| 1140 |                     continue;
 | 
|---|
| 1141 |                 }
 | 
|---|
| 1142 |                 if(lstrcmpi(temporary,"Protected")==0){
 | 
|---|
| 1143 |                     dwAccess=ACCESS_PROTECTED;
 | 
|---|
| 1144 |                     continue;
 | 
|---|
| 1145 |                 }
 | 
|---|
| 1146 | 
 | 
|---|
| 1147 |                 extern int cp;
 | 
|---|
| 1148 |                 if(i3==0){
 | 
|---|
| 1149 |                     if(bStatic){
 | 
|---|
| 1150 |                         //静的メンバを追加
 | 
|---|
| 1151 |                         cp=i;   //エラー用
 | 
|---|
| 1152 |                         pobj_c->AddStaticMember( dwAccess, isConst, temporary, i);
 | 
|---|
| 1153 |                     }
 | 
|---|
| 1154 |                     else{
 | 
|---|
| 1155 |                         //メンバを追加
 | 
|---|
| 1156 |                         cp=i;   //エラー用
 | 
|---|
| 1157 |                         pobj_c->AddMember( dwAccess, isConst, temporary );
 | 
|---|
| 1158 | 
 | 
|---|
| 1159 | 
 | 
|---|
| 1160 |                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 1161 |                             if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->ppobj_Member==0){
 | 
|---|
| 1162 |                                 //参照先が読み取られていないとき
 | 
|---|
| 1163 |                                 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class->name);
 | 
|---|
| 1164 |                             }
 | 
|---|
| 1165 |                         }
 | 
|---|
| 1166 | 
 | 
|---|
| 1167 | 
 | 
|---|
| 1168 |                         if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type==DEF_OBJECT){
 | 
|---|
| 1169 |                             //循環参照のチェック
 | 
|---|
| 1170 |                             pobj_LoopRefCheck->add(pobj_c->name);
 | 
|---|
| 1171 |                             if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.u.pobj_Class)){
 | 
|---|
| 1172 |                                 //エラー回避
 | 
|---|
| 1173 |                                 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->TypeInfo.type=DEF_PTR_VOID;
 | 
|---|
| 1174 |                             }
 | 
|---|
| 1175 |                             pobj_LoopRefCheck->del(pobj_c->name);
 | 
|---|
| 1176 |                         }
 | 
|---|
| 1177 |                     }
 | 
|---|
| 1178 |                 }
 | 
|---|
| 1179 |                 else{
 | 
|---|
| 1180 |                     //メソッドを追加
 | 
|---|
| 1181 |                     cp=i;   //エラー用
 | 
|---|
| 1182 |                     AddMemberSub(pobj_c,dwAccess,bStatic,bAbstract,bVirtual,bOverride,temporary,sub_address);
 | 
|---|
| 1183 | 
 | 
|---|
| 1184 |                     if(bAbstract) continue;
 | 
|---|
| 1185 | 
 | 
|---|
| 1186 |                     for(;;i++){
 | 
|---|
| 1187 |                         if(basbuf[i]=='\0'){
 | 
|---|
| 1188 |                             i--;
 | 
|---|
| 1189 |                             break;
 | 
|---|
| 1190 |                         }
 | 
|---|
| 1191 |                         if(basbuf[i-1]!='*'&&
 | 
|---|
| 1192 |                             basbuf[i]==1&&(
 | 
|---|
| 1193 |                             basbuf[i+1]==ESC_SUB||
 | 
|---|
| 1194 |                             basbuf[i+1]==ESC_FUNCTION||
 | 
|---|
| 1195 |                             basbuf[i+1]==ESC_MACRO||
 | 
|---|
| 1196 |                             basbuf[i+1]==ESC_TYPE||
 | 
|---|
| 1197 |                             basbuf[i+1]==ESC_CLASS||
 | 
|---|
| 1198 |                             basbuf[i+1]==ESC_INTERFACE||
 | 
|---|
| 1199 |                             basbuf[i+1]==ESC_ENUM)){
 | 
|---|
| 1200 |                             GetDefaultNameFromES(i3,temporary);
 | 
|---|
| 1201 |                             SetError(22,temporary,i);
 | 
|---|
| 1202 |                         }
 | 
|---|
| 1203 |                         if(basbuf[i]==1&&basbuf[i+1]==GetEndXXXCommand((char)i3)){
 | 
|---|
| 1204 |                             i+=2;
 | 
|---|
| 1205 |                             break;
 | 
|---|
| 1206 |                         }
 | 
|---|
| 1207 |                     }
 | 
|---|
| 1208 |                 }
 | 
|---|
| 1209 |             }
 | 
|---|
| 1210 |         }
 | 
|---|
| 1211 |     }
 | 
|---|
| 1212 | }
 | 
|---|
| 1213 | 
 | 
|---|
| 1214 | void CDBClass::GetObjectClassInfo(void){
 | 
|---|
| 1215 |     //ループ継承チェック用のクラス
 | 
|---|
| 1216 |     pobj_LoopRefCheck=new CLoopRefCheck();
 | 
|---|
| 1217 | 
 | 
|---|
| 1218 |     //クラスを取得
 | 
|---|
| 1219 |     GetClass_recur(0);
 | 
|---|
| 1220 | 
 | 
|---|
| 1221 |     delete pobj_LoopRefCheck;
 | 
|---|
| 1222 |     pobj_LoopRefCheck=0;
 | 
|---|
| 1223 | }
 | 
|---|
| 1224 | 
 | 
|---|
| 1225 | 
 | 
|---|
| 1226 | 
 | 
|---|
| 1227 | 
 | 
|---|
| 1228 | //////////////////////
 | 
|---|
| 1229 | // イテレータ
 | 
|---|
| 1230 | //////////////////////
 | 
|---|
| 1231 | 
 | 
|---|
| 1232 | void CDBClass::Iterator_Reset(void){
 | 
|---|
| 1233 |     if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass);
 | 
|---|
| 1234 | 
 | 
|---|
| 1235 |     iIteMaxNum=0;
 | 
|---|
| 1236 |     iIteNextNum=0;
 | 
|---|
| 1237 |     ppobj_IteClass=(CClass **)HeapAlloc(hHeap,0,1);
 | 
|---|
| 1238 | 
 | 
|---|
| 1239 |     int i;
 | 
|---|
| 1240 |     for(i=0;i<MAX_CLASS_HASH;i++){
 | 
|---|
| 1241 |         if(pobj_ClassHash[i]){
 | 
|---|
| 1242 |             CClass *pobj_c;
 | 
|---|
| 1243 |             pobj_c=pobj_ClassHash[i];
 | 
|---|
| 1244 |             while(1){
 | 
|---|
| 1245 |                 ppobj_IteClass=(CClass **)HeapReAlloc(hHeap,0,ppobj_IteClass,(iIteMaxNum+1)*sizeof(CClass *));
 | 
|---|
| 1246 |                 ppobj_IteClass[iIteMaxNum]=pobj_c;
 | 
|---|
| 1247 |                 iIteMaxNum++;
 | 
|---|
| 1248 | 
 | 
|---|
| 1249 |                 if(pobj_c->pobj_NextClass==0) break;
 | 
|---|
| 1250 |                 pobj_c=pobj_c->pobj_NextClass;
 | 
|---|
| 1251 |             }
 | 
|---|
| 1252 |         }
 | 
|---|
| 1253 |     }
 | 
|---|
| 1254 | }
 | 
|---|
| 1255 | BOOL CDBClass::Iterator_HasNext(void){
 | 
|---|
| 1256 |     if(iIteNextNum<iIteMaxNum) return 1;
 | 
|---|
| 1257 |     return 0;
 | 
|---|
| 1258 | }
 | 
|---|
| 1259 | CClass *CDBClass::Iterator_GetNext(void){
 | 
|---|
| 1260 |     CClass *pobj_c;
 | 
|---|
| 1261 |     pobj_c=ppobj_IteClass[iIteNextNum];
 | 
|---|
| 1262 |     iIteNextNum++;
 | 
|---|
| 1263 |     return pobj_c;
 | 
|---|
| 1264 | }
 | 
|---|
| 1265 | int CDBClass::Iterator_GetMaxCount(void){
 | 
|---|
| 1266 |     return iIteMaxNum;
 | 
|---|
| 1267 | }
 | 
|---|