source: dev/BasicCompiler_Common/Class.cpp@ 17

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

定数メンバ機能を有効にした。

File size: 30.4 KB
Line 
1#include "common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
9CDBClass *pobj_DBClass;
10
11CClass *pobj_CompilingClass;
12CClass *pobj_StringClass;
13
14int AddDataTable(char *buffer,int length);
15
16
17
18CMember::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}
62CMember::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}
82CMember::CMember(){
83 memset(this,0,sizeof(CMember));
84}
85CMember::~CMember(){
86 HeapDefaultFree(name);
87 if(InitBuf) HeapDefaultFree(InitBuf);
88 if(ConstractParameter) HeapDefaultFree(ConstractParameter);
89}
90
91bool CMember::IsConst(){
92 return isConst;
93}
94
95void 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
145CMethod::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}
155CMethod::CMethod(){
156 memset(this,0,sizeof(CMethod));
157}
158CMethod::~CMethod(){
159}
160
161
162
163
164CClass::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}
174CClass::~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}
216void 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}
221void 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}
226void 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}
237void 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}
248BOOL 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}
265BOOL 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
287LONG_PTR CClass::AddVtblDataTable(SUBINFO **ppsi,int length){
288 return AddDataTable((char *)ppsi,length);
289}
290LONG_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}
329void 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}
344BOOL 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
375SUBINFO **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// コンストラクタのコンパイルを開始
397void CClass::NotifyStartConstructorCompile(){
398 isCompilingConstructor = true;
399}
400
401//コンストラクタのコンパイルを終了
402void CClass::NotifyFinishConstructorCompile(){
403 isCompilingConstructor = false;
404}
405
406//コンストラクタをコンパイル中かどうかを判別
407bool CClass::IsCompilingConstructor(){
408 return isCompilingConstructor;
409}
410
411
412int 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
422void 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
430CDBClass::CDBClass(){
431 memset(this,0,sizeof(CDBClass));
432}
433CDBClass::~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
442void 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
458CClass *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
478CClass *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
522void 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
561void 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
684BOOL 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
707void 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 }
845Interface_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 }
1042InheritsError:
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
1214void 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
1232void 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}
1255BOOL CDBClass::Iterator_HasNext(void){
1256 if(iIteNextNum<iIteMaxNum) return 1;
1257 return 0;
1258}
1259CClass *CDBClass::Iterator_GetNext(void){
1260 CClass *pobj_c;
1261 pobj_c=ppobj_IteClass[iIteNextNum];
1262 iIteNextNum++;
1263 return pobj_c;
1264}
1265int CDBClass::Iterator_GetMaxCount(void){
1266 return iIteMaxNum;
1267}
Note: See TracBrowser for help on using the repository browser.