Changeset 18 in dev
- Timestamp:
- Dec 24, 2006, 4:46:12 AM (18 years ago)
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_CallProc.cpp
r11 r18 222 222 223 223 BOOL bStatic=0; 224 CClass *pobj_c; 224 CClass *pobj_c = NULL; 225 CMethod *pMethod = NULL; 225 226 if(psi->pobj_ParentClass){ 226 227 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う … … 254 255 255 256 256 DWORD dwAccess; 257 for(i=0;i<pobj_c->iMethodNum;i++){ 258 if(psi==pobj_c->ppobj_Method[i]->psi) break; 259 } 260 if(i==pobj_c->iMethodNum){ 261 for(i=0;i<pobj_c->iStaticMethodNum;i++){ 262 if(psi==pobj_c->ppobj_StaticMethod[i]->psi) break; 263 } 264 dwAccess=pobj_c->ppobj_StaticMethod[i]->dwAccess; 265 266 bStatic=1; 267 } 268 else dwAccess=pobj_c->ppobj_Method[i]->dwAccess; 257 ///////////////////////////////// 258 // メソッド情報を取得 259 ///////////////////////////////// 260 pMethod = pobj_c->GetMethodInfo( psi ); 261 if( !pMethod ){ 262 //動的メソッドが取得できなかったときは静的メソッドを当たる 263 pMethod = pobj_c->GetStaticMethodInfo( psi ); 264 if( !pMethod ){ 265 SetError(300,NULL,cp); 266 return -1; 267 } 268 } 269 269 270 270 … … 272 272 // アクセスエラーチェック 273 273 ////////////////////////////// 274 DWORD dwAccess = pMethod->dwAccess; 274 275 275 276 if(ObjectName[0]){ … … 380 381 if(ObjectName[0]){ 381 382 if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember; 382 383 RELATIVE_VAR RelativeVar; 384 if(!GetVarOffsetReadOnly(ObjectName,&i2,&RelativeVar,0)) return -1; 385 SetVarPtrToEax(&RelativeVar); 386 387 //参照タイプが整合しているかをチェック 388 if(i2!=RefType) SetError(104,ObjectName,cp); 389 390 if(i2==DEF_PTR_OBJECT){ 391 //mov eax,dword ptr[eax] 383 else{ 384 RELATIVE_VAR RelativeVar; 385 if( pMethod->isConst ){ 386 //Constアクセスが可能なメソッドの場合 387 if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return -1; 388 } 389 else{ 390 //Constアクセスが不可能なメソッドの場合 391 if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return -1; 392 } 393 394 SetVarPtrToEax(&RelativeVar); 395 396 //参照タイプが整合しているかをチェック 397 if(i2!=RefType) SetError(104,ObjectName,cp); 398 399 if(i2==DEF_PTR_OBJECT){ 400 //mov eax,dword ptr[eax] 401 OpBuffer[obp++]=(char)0x8B; 402 OpBuffer[obp++]=(char)0x00; 403 } 404 405 //mov ecx,eax 392 406 OpBuffer[obp++]=(char)0x8B; 393 OpBuffer[obp++]=(char)0x00; 394 } 395 396 //mov ecx,eax 397 OpBuffer[obp++]=(char)0x8B; 398 OpBuffer[obp++]=(char)0xC8; 407 OpBuffer[obp++]=(char)0xC8; 408 } 399 409 } 400 410 else{ -
BasicCompiler32/Compile_ProcOp.cpp
r17 r18 335 335 //コンパイル中の関数が属するクラス 336 336 pobj_CompilingClass=psi->pobj_ParentClass; 337 338 //コンパイルスタートをクラス管理クラスに追加 339 pobj_DBClass->StartCompile( psi ); 337 340 338 341 //コンパイル中の関数 … … 569 572 } 570 573 } 574 else if(psi->name[0]=='~'){ 575 //デストラクタをコンパイルしたとき 576 577 //デストラクタのコンパイル開始を通知 578 pobj_CompilingClass->NotifyStartDestructorCompile(); 579 } 571 580 } 572 581 … … 584 593 if( pobj_CompilingClass->IsCompilingConstructor() ){ 585 594 // コンストラクタをコンパイルしていたとき 595 586 596 // コンストラクタのコンパイルが完了したことを通知 587 588 597 pobj_CompilingClass->NotifyFinishConstructorCompile(); 589 598 } 590 591 if(psi->name[0]=='~'){ 599 else if(psi->name[0]=='~'){ 592 600 //////////////////////////////////// 593 601 //デストラクタをコンパイルしたとき 594 602 //////////////////////////////////// 603 604 // デストラクタのコンパイルが完了したことを通知 605 pobj_CompilingClass->NotifyFinishDestructorCompile(); 595 606 596 607 if(pobj_CompilingClass->pobj_InheritsClass){ -
BasicCompiler32/Compile_Var.cpp
r17 r18 445 445 } 446 446 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember; 447 } 448 449 //Const修飾子のメソッド内でメンバ書き込みアクセスが発生したとき 450 //(コンストラクタ、デストラクタ内を除く) 451 CMethod *pMethod = pobj_DBClass->GetNowCompilingMethodInfo(); 452 if( isWriteAccess && 453 pMethod->isConst && 454 pobj_CompilingClass->IsCompilingConstructor() == false && 455 pobj_CompilingClass->IsCompilingDestructor() == false 456 ){ 457 SetError(131, NULL, cp ); 447 458 } 448 459 … … 567 578 ok: 568 579 569 if( bConst && isWriteAccess){580 if( bConst && isWriteAccess ){ 570 581 //Const定義の変数に書き込みアクセスをしようとした場合 571 SetError(61,VarName,cp); 582 if( *pType == DEF_OBJECT ){ 583 //オブジェクト定数 584 SetError(130, VarName, cp ); 585 } 586 else{ 587 //一般のConst変数 588 SetError(61,VarName,cp); 589 } 572 590 } 573 591 -
BasicCompiler64/Compile_CallProc.cpp
r11 r18 233 233 234 234 BOOL bStatic=0; 235 CClass *pobj_c; 235 CClass *pobj_c = NULL; 236 CMethod *pMethod = NULL; 236 237 if(psi->pobj_ParentClass){ 237 238 //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う … … 264 265 } 265 266 266 DWORD dwAccess; 267 for(i=0;i<pobj_c->iMethodNum;i++){268 if(psi==pobj_c->ppobj_Method[i]->psi) break;269 }270 if(i==pobj_c->iMethodNum){271 for(i=0;i<pobj_c->iStaticMethodNum;i++){272 if(psi==pobj_c->ppobj_StaticMethod[i]->psi) break;273 }274 dwAccess=pobj_c->ppobj_StaticMethod[i]->dwAccess;275 276 bStatic=1;277 }278 else dwAccess=pobj_c->ppobj_Method[i]->dwAccess;267 268 ///////////////////////////////// 269 // メソッド情報を取得 270 ///////////////////////////////// 271 pMethod = pobj_c->GetMethodInfo( psi ); 272 if( !pMethod ){ 273 //動的メソッドが取得できなかったときは静的メソッドを当たる 274 pMethod = pobj_c->GetStaticMethodInfo( psi ); 275 if( !pMethod ){ 276 SetError(300,NULL,cp); 277 return -1; 278 } 279 } 279 280 280 281 … … 282 283 // アクセスエラーチェック 283 284 ////////////////////////////// 285 DWORD dwAccess = pMethod->dwAccess; 284 286 285 287 if(ObjectName[0]){ … … 408 410 else{ 409 411 RELATIVE_VAR RelativeVar; 410 if(!GetVarOffsetReadOnly(ObjectName,&i2,&RelativeVar,0)) return -1; 412 if( pMethod->isConst ){ 413 //Constアクセスが可能なメソッドの場合 414 if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return -1; 415 } 416 else{ 417 //Constアクセスが不可能なメソッドの場合 418 if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return -1; 419 } 420 411 421 SetVarPtrToReg(REG_RCX,&RelativeVar); 412 422 -
BasicCompiler64/Compile_ProcOp.cpp
r17 r18 374 374 //コンパイル中の関数が属するクラス 375 375 pobj_CompilingClass=psi->pobj_ParentClass; 376 377 //コンパイルスタートをクラス管理クラスに追加 378 pobj_DBClass->StartCompile( psi ); 376 379 377 380 //コンパイル中の関数 … … 614 617 } 615 618 } 619 if(psi->name[0]=='~'){ 620 //デストラクタをコンパイルしたとき 621 622 //デストラクタのコンパイル開始を通知 623 pobj_CompilingClass->NotifyStartDestructorCompile(); 624 } 616 625 } 617 626 … … 633 642 if( pobj_CompilingClass->IsCompilingConstructor() ){ 634 643 // コンストラクタをコンパイルしていたとき 644 635 645 // コンストラクタのコンパイルが完了したことを通知 636 637 646 pobj_CompilingClass->NotifyFinishConstructorCompile(); 638 647 } … … 642 651 //デストラクタをコンパイルしたとき 643 652 //////////////////////////////////// 653 654 // デストラクタのコンパイルが完了したことを通知 655 pobj_CompilingClass->NotifyFinishDestructorCompile(); 644 656 645 657 if(pobj_CompilingClass->pobj_InheritsClass){ -
BasicCompiler64/Compile_Var.cpp
r17 r18 471 471 } 472 472 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember; 473 } 474 475 //Const修飾子のメソッド内でメンバ書き込みアクセスが発生したとき 476 //(コンストラクタ、デストラクタ内を除く) 477 CMethod *pMethod = pobj_DBClass->GetNowCompilingMethodInfo(); 478 if( isWriteAccess && 479 pMethod->isConst && 480 pobj_CompilingClass->IsCompilingConstructor() == false && 481 pobj_CompilingClass->IsCompilingDestructor() == false 482 ){ 483 SetError(131, NULL, cp ); 473 484 } 474 485 … … 590 601 ok: 591 602 592 if( bConst && isWriteAccess){603 if( bConst && isWriteAccess ){ 593 604 //Const定義の変数に書き込みアクセスをしようとした場合 594 SetError(61,VarName,cp); 605 if( *pType == DEF_OBJECT ){ 606 //オブジェクト定数 607 SetError(130, VarName, cp ); 608 } 609 else{ 610 //一般のConst変数 611 SetError(61,VarName,cp); 612 } 595 613 } 596 614 -
BasicCompiler_Common/Class.cpp
r17 r18 11 11 CClass *pobj_CompilingClass; 12 12 CClass *pobj_StringClass; 13 14 CMember *pCompilingMethod; 13 15 14 16 int AddDataTable(char *buffer,int length); … … 170 172 lstrcpy(this->name,name); 171 173 172 isCompilingConstructor = 0; 174 isCompilingConstructor = false; 175 isCompilingDestructor = false; 173 176 } 174 177 CClass::~CClass(){ … … 224 227 iStaticMemberNum++; 225 228 } 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; 229 void CClass::AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ){ 230 ppobj_Method = (CMethod **)HeapReAlloc( hHeap, 0, ppobj_Method, (iMethodNum + 1) * sizeof(CMethod *) ); 231 ppobj_Method[iMethodNum] = new CMethod(); 232 ppobj_Method[iMethodNum]->psi = psi; 233 ppobj_Method[iMethodNum]->dwAccess = dwAccess; 234 ppobj_Method[iMethodNum]->isConst = isConst; 235 ppobj_Method[iMethodNum]->bAbstract = bAbstract; 236 ppobj_Method[iMethodNum]->bVirtual = bVirtual; 237 ppobj_Method[iMethodNum]->pobj_InheritsClass = 0; 234 238 235 239 iMethodNum++; … … 284 288 return 0; 285 289 } 290 CMethod *CClass::GetMethodInfo( SUBINFO *psi ){ 291 int i; 292 for( i=0; i<iMethodNum; i++ ){ 293 if( psi == ppobj_Method[i]->psi ) break; 294 } 295 if( i == iMethodNum ){ 296 return NULL; 297 } 298 return ppobj_Method[i]; 299 } 300 CMethod *CClass::GetStaticMethodInfo( SUBINFO *psi ){ 301 int i; 302 for( i=0; i<iStaticMethodNum; i++ ){ 303 if( psi == ppobj_StaticMethod[i]->psi ) break; 304 } 305 if( i == iMethodNum ){ 306 return NULL; 307 } 308 return ppobj_StaticMethod[i]; 309 } 286 310 287 311 LONG_PTR CClass::AddVtblDataTable(SUBINFO **ppsi,int length){ … … 409 433 } 410 434 435 //デストラクタのコンパイルを開始 436 void CClass::NotifyStartDestructorCompile(){ 437 isCompilingDestructor = true; 438 } 439 440 //デストラクタのコンパイルを終了 441 void CClass::NotifyFinishDestructorCompile(){ 442 isCompilingDestructor = false; 443 } 444 445 //デストラクタをコンパイル中かどうかを判別 446 bool CClass::IsCompilingDestructor(){ 447 return isCompilingDestructor; 448 } 449 411 450 412 451 int CDBClass::hash(char *name){ … … 559 598 560 599 561 void CDBClass::AddMemberSub(CClass *pobj_c,DWORD dwAccess,BOOL bStatic,BOOL bAbstract,BOOL bVirtual,BOOL bOverride,char *buffer,int NowLine){ 600 void CDBClass::AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract, 601 BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine){ 562 602 int i,i2; 563 603 char temporary[VN_SIZE]; … … 580 620 581 621 //////////////////////////////////////////////////////////// 582 // コンストラクタ、デストラクタの アクセシビリティをチェック622 // コンストラクタ、デストラクタの場合の処理 583 623 //////////////////////////////////////////////////////////// 584 624 BOOL fConstructor=0,bDestructor=0; 585 625 586 626 if(lstrcmp(temporary,pobj_c->name)==0){ 627 //コンストラクタの場合 628 629 //標準コンストラクタ(引数なし) 587 630 if(psi->ParmNum==1) fConstructor=1; 631 632 //コピーコンストラクタ 588 633 if(psi->ParmNum==2){ 589 634 if(psi->pParmInfo[1].type==DEF_OBJECT&& 590 635 psi->pParmInfo[1].u.pobj_c==pobj_c) fConstructor=2; 591 636 } 637 638 //強制的にConst修飾子をつける 639 isConst = true; 592 640 } 593 641 else if(temporary[0]=='~'){ … … 599 647 } 600 648 if(fConstructor||bDestructor){ 649 // コンストラクタ、デストラクタのアクセシビリティをチェック 601 650 if(dwAccess!=ACCESS_PUBLIC){ 602 651 SetError(116,NULL,NowLine); 603 652 dwAccess=ACCESS_PUBLIC; 604 653 } 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; 654 655 //強制的にConst修飾子をつける 656 isConst = true; 657 } 658 659 if( fConstructor == 1 ) 660 pobj_c->ConstructorMemberSubIndex = pobj_c->iMethodNum; 661 else if( fConstructor == 2 ) 662 pobj_c->CopyConstructorMemberSubIndex = pobj_c->iMethodNum; 663 else if( bDestructor ) 664 pobj_c->DestructorMemberSubIndex = pobj_c->iMethodNum; 611 665 612 666 … … 678 732 } 679 733 else{ 680 pobj_c->AddMethod(psi, dwAccess,bAbstract,bVirtual);734 pobj_c->AddMethod(psi, dwAccess, isConst, bAbstract, bVirtual); 681 735 } 682 736 } … … 890 944 891 945 //メンバ関数を追加 892 AddMemberSub(pobj_c,ACCESS_PUBLIC,0,1,1,0,temporary,sub_address); 946 AddMethod(pobj_c, 947 ACCESS_PUBLIC, //Publicアクセス権 948 0, //Static指定なし 949 false, //Constではない 950 1, //Abstract 951 1, //Virtual 952 0, 953 temporary, 954 sub_address 955 ); 893 956 } 894 957 } … … 990 1053 } 991 1054 992 //メンバ 変数をコピー1055 //メンバをコピー 993 1056 pobj_c->ppobj_Member=(CMember **)HeapReAlloc( 994 1057 hHeap, … … 1006 1069 } 1007 1070 1008 //メ ンバ関数をコピー1071 //メソッドをコピー 1009 1072 pobj_c->ppobj_Method=(CMethod **)HeapReAlloc( 1010 1073 hHeap, … … 1042 1105 InheritsError: 1043 1106 1044 //メンバ 変数、関数を取得1107 //メンバとメソッドを取得 1045 1108 while(1){ 1046 1109 i++; … … 1180 1243 //メソッドを追加 1181 1244 cp=i; //エラー用 1182 AddMemberSub(pobj_c,dwAccess,bStatic,bAbstract,bVirtual,bOverride,temporary,sub_address); 1245 AddMethod(pobj_c, 1246 dwAccess, 1247 bStatic, 1248 isConst, 1249 bAbstract, 1250 bVirtual, 1251 bOverride, 1252 temporary, 1253 sub_address); 1183 1254 1184 1255 if(bAbstract) continue; … … 1223 1294 } 1224 1295 1296 void CDBClass::StartCompile( SUBINFO *psi ){ 1297 pCompilingClass = psi->pobj_ParentClass; 1298 if( pCompilingClass ){ 1299 pCompilingMethod = pCompilingClass->GetMethodInfo( psi ); 1300 if( !pCompilingMethod ){ 1301 pCompilingMethod = pCompilingClass->GetStaticMethodInfo( psi ); 1302 if( !pCompilingMethod ){ 1303 SetError(300,NULL,cp); 1304 } 1305 } 1306 } 1307 else{ 1308 pCompilingMethod = NULL; 1309 } 1310 } 1311 CClass *CDBClass::GetNowCompilingClass(){ 1312 return pCompilingClass; 1313 } 1314 CMethod *CDBClass::GetNowCompilingMethodInfo(){ 1315 return pCompilingMethod; 1316 } 1317 1225 1318 1226 1319 -
BasicCompiler_Common/Class.h
r17 r18 49 49 BOOL bAbstract; 50 50 BOOL bVirtual; 51 bool isConst; 51 52 52 53 CClass *pobj_InheritsClass; … … 96 97 void AddMember( DWORD dwAccess, bool idConst, char *buffer ); 97 98 void AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine ); 98 void AddMethod( SUBINFO *psi,DWORD dwAccess,BOOL bAbstract,BOOL bVirtual);99 void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual ); 99 100 void AddStaticMethod(SUBINFO *psi,DWORD dwAccess); 100 101 101 102 BOOL DupliCheckAll(char *name); 102 103 BOOL DupliCheckMember(char *name); 104 105 CMethod *GetMethodInfo( SUBINFO *psi ); 106 CMethod *GetStaticMethodInfo( SUBINFO *psi ); 103 107 104 108 … … 124 128 void NotifyFinishConstructorCompile(); 125 129 bool IsCompilingConstructor(); 130 131 //デストラクタをコンパイルしているかどうかのチェックフラグ 132 private: 133 bool isCompilingDestructor; 134 public: 135 void NotifyStartDestructorCompile(); 136 void NotifyFinishDestructorCompile(); 137 bool IsCompilingDestructor(); 126 138 127 139 … … 147 159 148 160 private: 149 void AddMemberSub(CClass *pobj_c,DWORD dwAccess,BOOL bStatic,BOOL bAbstract,BOOL bVirtual,BOOL bOverride,char *buffer,int NowLine); 161 void AddMethod(CClass *pobj_c, DWORD dwAccess, BOOL bStatic, bool isConst, BOOL bAbstract, 162 BOOL bVirtual, BOOL bOverride, char *buffer, int NowLine); 150 163 BOOL MemberVar_LoopRefCheck(CClass *pobj_c); 151 164 public: … … 155 168 156 169 157 //イテレータ 170 ///////////////////////////// 171 // 現在コンパイル中の情報 172 ///////////////////////////// 173 private: 174 CClass *pCompilingClass; 175 CMethod *pCompilingMethod; 176 public: 177 //コンパイル開始の通知を受け取るメソッド 178 void StartCompile( SUBINFO *psi ); 179 180 //現在コンパイル中のメソッド情報を取得 181 CClass *GetNowCompilingClass(); 182 CMethod *GetNowCompilingMethodInfo(); 183 184 185 ///////////////////// 186 // イテレータ 187 ///////////////////// 158 188 private: 159 189 CClass **ppobj_IteClass; -
BasicCompiler_Common/Intermediate_Step2.cpp
r16 r18 33 33 return pci; 34 34 } 35 36 // マクロ定数を追加するための関数 35 37 void AddConstData(char *Command){ 36 38 extern HANDLE hHeap; … … 44 46 return; 45 47 } 46 if(Command[i]=='=' ){48 if(Command[i]=='=' || Command[i] == 1 && Command[i+1] == ESC_AS ){ 47 49 //定数定義は新しいクラスモジュール(CDBConst)へ移行 50 // ※この関数はマクロ定数のみを扱う 48 51 return; 49 52 } -
BasicCompiler_Common/error.cpp
r17 r18 142 142 if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",KeyWord); 143 143 if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。"); 144 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込 めません。",KeyWord);144 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",KeyWord); 145 145 146 146 … … 174 174 if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。"); 175 175 if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",KeyWord); 176 if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord); 177 if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。"); 176 178 177 179 //Enum関連
Note:
See TracChangeset
for help on using the changeset viewer.