Changeset 27 in dev
- Timestamp:
- Jan 7, 2007, 6:51:20 AM (18 years ago)
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_CallProc.cpp
r26 r27 240 240 if(ObjectName[0]){ 241 241 if(lstrcmpi(ObjectName,"Super")==0){ 242 //クラスメンバ関数内から スーパークラスの呼び出し242 //クラスメンバ関数内から基底クラスの呼び出し 243 243 pobj_c=pobj_CompilingClass; 244 244 } … … 270 270 // メソッド情報を取得 271 271 ///////////////////////////////// 272 pMethod = pobj_c->GetMethodInfo( psi ); 273 if( !pMethod ){ 272 pMethod = NULL; 273 if( ! bStatic ) pMethod = pobj_c->GetMethodInfo( psi ); 274 if( ! pMethod ){ 274 275 //動的メソッドが取得できなかったときは静的メソッドを当たる 275 276 pMethod = pobj_c->GetStaticMethodInfo( psi ); -
BasicCompiler32/Compile_ProcOp.cpp
r18 r27 449 449 pobj_CompilingClass->NotifyStartConstructorCompile(); 450 450 451 // スーパークラスかどうかの識別452 //(継承元がインターフェイスの場合も スーパークラスと見なす)451 //基底クラスかどうかの識別 452 //(継承元がインターフェイスの場合も基底クラスと見なす) 453 453 BOOL bThisIsSuperClass; 454 454 if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1; … … 461 461 if(!bThisIsSuperClass){ 462 462 /* サブクラスコンストラクタをコンパイルしているときは、 463 スーパークラスのコンストラクタを呼び出す */463 基底クラスのコンストラクタを呼び出す */ 464 464 465 465 i3=cp+1; … … 474 474 if(lstrcmp(temporary, 475 475 pobj_CompilingClass->pobj_InheritsClass->name)==0){ 476 // スーパークラスのコンストラクタを呼び出す476 //基底クラスのコンストラクタを呼び出す 477 477 cp=i3; 478 478 for(i4=0;;cp++,i4++){ … … 497 497 } 498 498 else{ 499 // スーパークラスのコンストラクタを暗黙的に呼び出す499 //基底クラスのコンストラクタを暗黙的に呼び出す 500 500 i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex; 501 501 Opcode_CallProc("", … … 607 607 if(pobj_CompilingClass->pobj_InheritsClass){ 608 608 /* サブクラスのデストラクタをコンパイルしているときは、 609 スーパークラスのデストラクタを呼び出す */609 基底クラスのデストラクタを呼び出す */ 610 610 611 611 i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex; -
BasicCompiler32/Compile_Var.cpp
r20 r27 498 498 499 499 500 ////////////////////501 // グローバル変数502 ////////////////////503 504 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ505 if(GlobalVar[i].bLiving){506 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;507 }508 }509 if(i>=0){510 goto GlobalOk;511 }512 513 514 500 ////////////////////////// 515 501 // クラスの静的メンバ … … 518 504 if(member[0]){ 519 505 lstrcpy(temporary,member); 520 GetVarFormatString(temporary,array,lpPtrOffset,member,&i); 506 char tempMember[VN_SIZE]; 507 char tempArray[VN_SIZE]; 508 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 521 509 522 510 char temp2[VN_SIZE]; … … 527 515 528 516 if(i!=MaxGlobalVarNum){ 517 lstrcpy(member,tempMember); 518 lstrcpy(array,tempArray); 529 519 goto GlobalOk; 530 520 } … … 543 533 } 544 534 } 535 536 537 //////////////////// 538 // グローバル変数 539 //////////////////// 540 541 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 542 if(GlobalVar[i].bLiving){ 543 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 544 } 545 } 546 if(i>=0){ 547 goto GlobalOk; 548 } 549 545 550 546 551 if(isErrorEnabled) SetError(3,variable,cp); -
BasicCompiler64/Compile_CallProc.cpp
r26 r27 245 245 if(ObjectName[0]){ 246 246 if(lstrcmpi(ObjectName,"Super")==0){ 247 //クラスメンバ関数内から スーパークラスの呼び出し247 //クラスメンバ関数内から基底クラスの呼び出し 248 248 pobj_c=pobj_CompilingClass; 249 249 } … … 275 275 // メソッド情報を取得 276 276 ///////////////////////////////// 277 pMethod = pobj_c->GetMethodInfo( psi ); 278 if( !pMethod ){ 277 pMethod = NULL; 278 if( ! bStatic ) pMethod = pobj_c->GetMethodInfo( psi ); 279 if( ! pMethod ){ 279 280 //動的メソッドが取得できなかったときは静的メソッドを当たる 280 281 pMethod = pobj_c->GetStaticMethodInfo( psi ); -
BasicCompiler64/Compile_ProcOp.cpp
r19 r27 504 504 pobj_CompilingClass->NotifyStartConstructorCompile(); 505 505 506 // スーパークラスかどうかの識別507 //(継承元がインターフェイスの場合も スーパークラスと見なす)506 //基底クラスかどうかの識別 507 //(継承元がインターフェイスの場合も基底クラスと見なす) 508 508 BOOL bThisIsSuperClass; 509 509 if(pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1; … … 516 516 if(!bThisIsSuperClass){ 517 517 /* サブクラスコンストラクタをコンパイルしているときは、 518 スーパークラスのコンストラクタを呼び出す */518 基底クラスのコンストラクタを呼び出す */ 519 519 520 520 i3=cp+1; … … 529 529 if(lstrcmp(temporary, 530 530 pobj_CompilingClass->pobj_InheritsClass->name)==0){ 531 // スーパークラスのコンストラクタを呼び出す531 //基底クラスのコンストラクタを呼び出す 532 532 cp=i3; 533 533 for(i4=0;;cp++,i4++){ … … 552 552 } 553 553 else{ 554 // スーパークラスのコンストラクタを暗黙的に呼び出す554 //基底クラスのコンストラクタを暗黙的に呼び出す 555 555 i3=pobj_CompilingClass->pobj_InheritsClass->ConstructorMemberSubIndex; 556 556 Opcode_CallProc("", … … 656 656 if(pobj_CompilingClass->pobj_InheritsClass){ 657 657 /* サブクラスのデストラクタをコンパイルしているときは、 658 スーパークラスのデストラクタを呼び出す */658 基底クラスのデストラクタを呼び出す */ 659 659 660 660 i3=pobj_CompilingClass->pobj_InheritsClass->DestructorMemberSubIndex; -
BasicCompiler64/Compile_Set_Var.cpp
r3 r27 77 77 78 78 79 79 //TODO: 継承・派生関係にある場合は許容する 80 80 if(CalcType==DEF_OBJECT&&lpVarIndex==lpCalcIndex){ 81 81 //双方のオブジェクト型が完全に一致したとき -
BasicCompiler64/Compile_Var.cpp
r20 r27 520 520 } 521 521 522 /////////////////////523 // グローバル変数524 /////////////////////525 526 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ527 if(GlobalVar[i].bLiving){528 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;529 }530 }531 if(i>=0){532 goto GlobalOk;533 }534 535 522 536 523 ////////////////////////// … … 540 527 if(member[0]){ 541 528 lstrcpy(temporary,member); 542 GetVarFormatString(temporary,array,lpPtrOffset,member,&i); 529 530 char tempMember[VN_SIZE]; 531 char tempArray[VN_SIZE]; 532 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 543 533 544 534 char temp2[VN_SIZE]; … … 549 539 550 540 if(i!=MaxGlobalVarNum){ 541 lstrcpy(member,tempMember); 542 lstrcpy(array,tempArray); 551 543 goto GlobalOk; 552 544 } … … 564 556 goto GlobalOk; 565 557 } 558 } 559 560 561 ///////////////////// 562 // グローバル変数 563 ///////////////////// 564 565 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 566 if(GlobalVar[i].bLiving){ 567 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 568 } 569 } 570 if(i>=0){ 571 goto GlobalOk; 566 572 } 567 573 -
BasicCompiler_Common/Class.cpp
r18 r27 308 308 return ppobj_StaticMethod[i]; 309 309 } 310 bool CClass::IsExistMethod( char *name ){ 311 for( int i=0; i<iMethodNum; i++ ){ 312 if( lstrcmp( ppobj_Method[i]->psi->name, name ) == 0 ) return true; 313 } 314 return false; 315 } 316 bool CClass::IsExistStaticMethod( char *name ){ 317 for( int i=0; i<iStaticMethodNum; i++ ){ 318 if( lstrcmp( ppobj_StaticMethod[i]->psi->name, name ) == 0 ) return true; 319 } 320 return false; 321 } 322 310 323 311 324 LONG_PTR CClass::AddVtblDataTable(SUBINFO **ppsi,int length){ … … 677 690 //メンバ関数 678 691 for(i=0;i<pobj_c->iMethodNum;i++){ 679 // スーパークラスと重複する場合はオーバーライドを行う692 //基底クラスと重複する場合はオーバーライドを行う 680 693 if(pobj_c->ppobj_Method[i]->pobj_InheritsClass) continue; 681 694 -
BasicCompiler_Common/Class.h
r18 r27 105 105 CMethod *GetMethodInfo( SUBINFO *psi ); 106 106 CMethod *GetStaticMethodInfo( SUBINFO *psi ); 107 bool IsExistMethod( char *name ); 108 bool IsExistStaticMethod( char *name ); 107 109 108 110 -
BasicCompiler_Common/Intermediate_Step2.cpp
r18 r27 453 453 lstrcmpi(com,"PRINT")==0|| 454 454 lstrcmpi(com,"RANDOMIZE")==0|| 455 lstrcmpi(com,"WRITE")==0||455 //lstrcmpi(com,"WRITE")==0|| TODO: Trace.Writeとの重複が未完成 456 456 lstrcmpi(com,"MSGBOX")==0|| 457 457 lstrcmpi(com,"WINDOW")==0|| -
BasicCompiler_Common/Variable.cpp
r20 r27 724 724 725 725 726 ////////////////////727 // グローバル変数728 ////////////////////729 730 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ731 if(GlobalVar[i].bLiving){732 if(lstrcmp(VarName,GlobalVar[i].name)==0) break;733 }734 }735 736 if(i>=0){737 goto GlobalOk;738 }739 740 741 726 ////////////////////////// 742 727 // クラスの静的メンバ … … 745 730 if(member[0]){ 746 731 lstrcpy(temporary,member); 747 GetVarFormatString(temporary,array,lpPtrOffset,member,&i); 732 char tempMember[VN_SIZE]; 733 char tempArray[VN_SIZE]; 734 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,&i); 748 735 749 736 char temp2[VN_SIZE]; … … 754 741 755 742 if(i!=MaxGlobalVarNum){ 743 lstrcpy(member,tempMember); 744 lstrcpy(array,tempArray); 756 745 goto GlobalOk; 757 746 } … … 769 758 goto GlobalOk; 770 759 } 760 } 761 762 763 //////////////////// 764 // グローバル変数 765 //////////////////// 766 767 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 768 if(GlobalVar[i].bLiving){ 769 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 770 } 771 } 772 773 if(i>=0){ 774 goto GlobalOk; 771 775 } 772 776 … … 1019 1023 } 1020 1024 1021 //関数 名1025 //関数(またはメソッド)名 1022 1026 lstrcat(FullName,pCompilingSubInfo->name); 1023 1027 lstrcat(FullName,"%"); … … 1029 1033 lstrcat(FullName,"%"); 1030 1034 1035 //変数名 1031 1036 lstrcat(FullName,VarName); 1032 1037 -
BasicCompiler_Common/error.cpp
r20 r27 162 162 if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません"); 163 163 if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません"); 164 if(num==118) lstrcpy(msg,"参照する スーパークラスが存在しません");165 if(num==119) sprintf(msg,"\"%s\" メンバは スーパークラスで定義されていません",KeyWord);164 if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません"); 165 if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",KeyWord); 166 166 if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です"); 167 167 if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません"); -
BasicCompiler_Common/hash.cpp
r5 r27 121 121 //オブジェクトのメンバ関数の場合 122 122 123 bool isStatic = false; 124 CClass *pobj_c; 123 125 if(lstrcmpi(ObjName,"Super")==0){ 124 //スーパークラス参照の場合 125 126 if(pobj_CompilingClass==0){ 127 SetError(118,NULL,cp); 128 goto finish; 129 } 130 131 //クラス内のメンバ関数をコンパイルしているとき 132 //※オーバーライドされた関数をサーチする 133 for(i=0;i<pobj_CompilingClass->iMethodNum;i++){ 134 if(pobj_CompilingClass->ppobj_Method[i]->pobj_InheritsClass==0) continue; 135 136 if(lstrcmp(NestMember,pobj_CompilingClass->ppobj_Method[i]->psi->name)==0){ 137 ppArray_si[num]=pobj_CompilingClass->ppobj_Method[i]->psi; 138 num++; 139 } 140 } 141 142 if(num==0) SetError(119,NestMember,cp); 143 144 goto finish; 145 } 146 147 148 149 ////////////////////////////////////////////// 150 // 静的メソッド(クラス名が指定される場合) 151 ////////////////////////////////////////////// 152 153 CClass *pobj_c; 154 pobj_c=pobj_DBClass->check(ObjName); 155 if(pobj_c){ 156 for(i=0;i<pobj_c->iStaticMethodNum;i++){ 157 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){ 158 ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi; 159 num++; 160 } 161 } 162 163 goto finish; 164 } 165 166 167 i=GetVarType(ObjName,(LONG_PTR *)&pobj_c,1); 168 if(i==-1) goto finish; //エラーの場合 169 if(!(NATURAL_TYPE(i)==DEF_OBJECT)) goto finish; 126 //クラスメンバ関数内から基底クラスの呼び出し 127 pobj_c=pobj_CompilingClass; 128 } 129 else{ 130 pobj_c=pobj_DBClass->check(ObjName); 131 if( ! pobj_c ){ 132 //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し 133 int type = GetVarType(ObjName,(LONG_PTR *)&pobj_c,0); 134 if(!(NATURAL_TYPE(type)==DEF_OBJECT)) goto finish; 135 } 136 } 137 138 // 静的メソッドから取得 139 for(i=0;i<pobj_c->iStaticMethodNum;i++){ 140 if(lstrcmp(NestMember,pobj_c->ppobj_StaticMethod[i]->psi->name)==0){ 141 ppArray_si[num]=pobj_c->ppobj_StaticMethod[i]->psi; 142 num++; 143 } 144 } 145 146 //動的メソッドから取得 170 147 171 148 //※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う … … 176 153 } 177 154 } 178 goto finish;179 155 } 180 156 … … 221 197 } 222 198 } 223 224 if(num) goto finish; 225 } 199 } 200 201 if(num) goto finish; 202 226 203 227 204 //ハッシュ値を取得
Note:
See TracChangeset
for help on using the changeset viewer.