Changeset 206 in dev for trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
- Timestamp:
- Jul 12, 2007, 2:58:26 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r204 r206 1 #include "stdafx.h" 2 1 3 #include <jenga/include/smoothie/Smoothie.h> 2 4 #include <jenga/include/smoothie/LexicalAnalysis.h> … … 5 7 #include <Compiler.h> 6 8 #include <LexicalScopingImpl.h> 7 #include <Class Impl.h>8 #include <Variable Impl.h>9 #include <Class.h> 10 #include <Variable.h> 9 11 #include <NamespaceSupporter.h> 10 12 … … 36 38 } 37 39 38 UserProc *pBackUserProc;40 const UserProc *pBackUserProc; 39 41 pBackUserProc = &UserProc::CompilingUserProc(); 40 42 UserProc::CompileStartForGlobalArea(); … … 54 56 55 57 //_System_StartupProgramの呼び出し 56 extern UserProc *pSub_System_StartupProgram;58 extern const UserProc *pSub_System_StartupProgram; 57 59 op_call(pSub_System_StartupProgram); 58 60 … … 71 73 //静的ローカルオブジェクトのコンストラクタ呼び出し 72 74 73 BOOST_FOREACH( Variable *pVar, globalVars){75 BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){ 74 76 if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){ 75 77 //コンストラクタ呼び出し 76 if( pVar-> IsObject() ){78 if( pVar->GetType().IsObject() ){ 77 79 78 80 //エラー用 … … 81 83 CallConstructor( 82 84 pVar->GetName().c_str(), 83 pVar->GetSub ScriptsPtr(),84 *pVar,85 pVar-> paramStrForConstructor.c_str());85 pVar->GetSubscripts(), 86 pVar->GetType(), 87 pVar->GetParamStrForConstructor().c_str()); 86 88 } 87 89 } … … 93 95 else if( userProc.GetName() == "_System_Call_Destructor_of_GlobalObject" ){ 94 96 95 UserProc *pBackUserProc;97 const UserProc *pBackUserProc; 96 98 pBackUserProc = &UserProc::CompilingUserProc(); 97 99 UserProc::CompileStartForGlobalArea(); … … 222 224 } 223 225 } 224 void AutoGeneration( UserProc &userProc){226 void AutoGeneration( const UserProc &userProc){ 225 227 if( userProc.GetName() == "InitializeUserTypes" 226 228 && userProc.HasParentClass() … … 240 242 } 241 243 242 void _compile_proc( UserProc *pUserProc){244 void _compile_proc(const UserProc *pUserProc){ 243 245 extern char *basbuf; 244 246 extern HANDLE hHeap; 245 extern GlobalProc **ppSubHash;246 247 extern BOOL bDebugCompile; 247 248 int i3,i4,LocalVarSchedule,EspOffsetSchedule,BaseOffset; … … 250 251 if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return; 251 252 252 if( pUserProc-> localVars.size() ){253 if( pUserProc->GetLocalVars().size() ){ 253 254 SetError(); 254 255 return; 255 256 } 257 258 trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" ); 256 259 257 260 pUserProc->CompleteCompile(); … … 270 273 else bDebugSupportProc=0; 271 274 272 pUserProc-> beginOpAddress=obp;275 pUserProc->SetBeginOpAddress( obp ); 273 276 274 277 //コンパイル中の関数が属するクラス 275 Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();278 compiler.pCompilingClass=pUserProc->GetParentClassPtr(); 276 279 277 280 //コンパイルスタートをクラス管理クラスに追加 … … 297 300 SystemProc(*pUserProc); 298 301 299 pUserProc-> endOpAddress=obp;302 pUserProc->SetEndOpAddress( obp ); 300 303 return; 301 304 } … … 321 324 Parameter ¶m = *pUserProc->RealParams()[i3]; 322 325 323 Variable *pVar = new Variable Impl( param.GetVarName(), param, false, param.IsRef());326 Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" ); 324 327 325 328 if( param.IsArray() ){ 326 pVar->SetArray( param.GetSub ScriptsPtr() );329 pVar->SetArray( param.GetSubscripts() ); 327 330 } 328 331 … … 342 345 } 343 346 AllLocalVarSize+=varSize; 344 pVar-> offset=AllLocalVarSize;347 pVar->SetOffsetAddress( AllLocalVarSize ); 345 348 346 349 //レキシカルスコープ情報 347 pVar->S copeLevel=GetLexicalScopes().GetNowLevel();348 pVar->S copeStartAddress=GetLexicalScopes().GetStartAddress();350 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() ); 351 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() ); 349 352 pVar->bLiving=TRUE; 350 353 351 pUserProc-> localVars.push_back( pVar );354 pUserProc->GetLocalVars().push_back( pVar ); 352 355 } 353 356 … … 456 459 457 460 //call _DebugSys_StartProc 458 extern UserProc *pSub_DebugSys_StartProc;461 extern const UserProc *pSub_DebugSys_StartProc; 459 462 op_call(pSub_DebugSys_StartProc); 460 463 } 461 464 462 if( Smoothie::Temp::pCompilingClass){463 if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){465 if(compiler.pCompilingClass){ 466 if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){ 464 467 //////////////////////////////////// 465 468 // コンストラクタをコンパイルするとき … … 467 470 468 471 //コンストラクタのコンパイル開始を通知 469 Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();472 compiler.pCompilingClass->NotifyStartConstructorCompile(); 470 473 471 474 //基底クラスかどうかの識別 472 475 //(継承元がインターフェイスの場合も基底クラスと見なす) 473 476 BOOL bThisIsSuperClass; 474 if( ! Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;475 else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){477 if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1; 478 else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){ 476 479 //インターフェイスを継承したときはコンストラクタを持たない 477 480 bThisIsSuperClass=1; … … 492 495 temporary[i4]=basbuf[i3]; 493 496 } 494 if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){497 if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){ 495 498 //基底クラスのコンストラクタを呼び出す 496 499 cp=i3; … … 509 512 Type dummyType; 510 513 CallProc( PROC_DEFAULT 511 , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc512 , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()514 , &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc() 515 , compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str() 513 516 , temporary 514 517 , dummyType ); … … 517 520 //基底クラスのコンストラクタを暗黙的に呼び出す 518 521 Opcode_CallProc("", 519 Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,522 &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(), 520 523 0, 521 524 "", … … 525 528 526 529 //仮想関数テーブルを初期化 527 if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()528 && ! Smoothie::Temp::pCompilingClass->IsAbstract() ){530 if( compiler.pCompilingClass->IsExistVirtualFunctions() 531 && !compiler.pCompilingClass->IsAbstract() ){ 529 532 //関数テーブルに値をセット 530 int offset = (int) Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();533 int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset(); 531 534 532 535 //mov eax,offset … … 548 551 549 552 //デストラクタのコンパイル開始を通知 550 Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();553 compiler.pCompilingClass->NotifyStartDestructorCompile(); 551 554 } 552 555 } … … 574 577 ////////////////////////////////////////// 575 578 576 if( Smoothie::Temp::pCompilingClass ){577 578 if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){579 if( compiler.pCompilingClass ){ 580 581 if( compiler.pCompilingClass->IsCompilingConstructor() ){ 579 582 // コンストラクタをコンパイルしていたとき 580 583 581 584 // コンストラクタのコンパイルが完了したことを通知 582 Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();585 compiler.pCompilingClass->NotifyFinishConstructorCompile(); 583 586 } 584 587 else if( pUserProc->IsDestructor() ){ … … 588 591 589 592 // デストラクタのコンパイルが完了したことを通知 590 Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();591 592 if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){593 compiler.pCompilingClass->NotifyFinishDestructorCompile(); 594 595 if( compiler.pCompilingClass->HasSuperClass() ){ 593 596 /* サブクラスのデストラクタをコンパイルしているときは、 594 597 基底クラスのデストラクタを呼び出す */ 595 598 596 const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();599 const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod(); 597 600 if( method ){ 598 601 Opcode_CallProc("", 599 method->pUserProc,602 &method->GetUserProc(), 600 603 0, 601 604 "", … … 649 652 650 653 //call _DebugSys_EndProc 651 extern UserProc *pSub_DebugSys_EndProc;654 extern const UserProc *pSub_DebugSys_EndProc; 652 655 op_call(pSub_DebugSys_EndProc); 653 656 } … … 742 745 } 743 746 HeapDefaultFree(pLocalVarAddrSchedule); 744 BOOST_FOREACH( Variable *pVar, pUserProc-> localVars){747 BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){ 745 748 //後にデバッグで利用する 746 pVar-> offset = AllLocalVarSize - pVar->offset;749 pVar->SetOffsetAddress( AllLocalVarSize - pVar->GetOffsetAddress() ); 747 750 } 748 751 … … 771 774 772 775 //call _esp_error 773 extern UserProc *pSub_esp_error;776 extern const UserProc *pSub_esp_error; 774 777 op_call( pSub_esp_error ); 775 778 … … 799 802 800 803 801 pUserProc-> endOpAddress=obp;804 pUserProc->SetEndOpAddress( obp ); 802 805 803 806 … … 811 814 } 812 815 813 void CompileBufferInProcedure( UserProc &userProc ){816 void CompileBufferInProcedure( const UserProc &userProc ){ 814 817 if( userProc.IsUsing() == false || userProc.IsCompiled() ) return; 815 818 … … 827 830 } 828 831 void CompileLocal(){ 829 extern GlobalProc **ppSubHash;830 int i2;831 832 832 extern BOOL bDll; 833 833 if(bDll){ 834 834 //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする 835 UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");835 const UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables"); 836 836 if(pUserProc){ 837 837 CompileBufferInProcedure( *pUserProc ); … … 841 841 842 842 //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル 843 extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;843 extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes; 844 844 pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile(); 845 845 846 846 //_System_InitStaticLocalVariablesは一番最後にコンパイル 847 847 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない 848 extern UserProc *pSub_System_InitStaticLocalVariables;848 extern const UserProc *pSub_System_InitStaticLocalVariables; 849 849 pSub_System_InitStaticLocalVariables->CompleteCompile(); 850 850 851 851 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 852 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;852 extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject; 853 853 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 854 854 855 855 repeat: 856 GlobalProc *pGlobalProc; 857 for(i2=0;i2<MAX_HASH;i2++){ 858 pGlobalProc=ppSubHash[i2]; 859 while(pGlobalProc){ 860 CompileBufferInProcedure( *pGlobalProc ); 861 pGlobalProc=pGlobalProc->pNextData; 862 } 856 compiler.GetMeta().GetUserProcs().Iterator_Reset(); 857 while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() ) 858 { 859 UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext(); 860 CompileBufferInProcedure( *pUserProc ); 863 861 } 864 862 … … 874 872 if( IsNeedProcCompile() ){ 875 873 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 876 for(i2=0;i2<MAX_HASH;i2++){ 877 pGlobalProc=ppSubHash[i2];878 while(pGlobalProc){879 CompileBufferInProcedure( *pGlobalProc );880 pGlobalProc=pGlobalProc->pNextData;881 }874 875 compiler.GetMeta().GetUserProcs().Iterator_Reset(); 876 while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() ) 877 { 878 UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext(); 879 CompileBufferInProcedure( *pUserProc ); 882 880 } 883 881 }
Note:
See TracChangeset
for help on using the changeset viewer.