Changeset 18 in dev for BasicCompiler32
- Timestamp:
- Dec 24, 2006, 4:46:12 AM (18 years ago)
- Location:
- BasicCompiler32
- Files:
-
- 3 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
Note:
See TracChangeset
for help on using the changeset viewer.