Changeset 206 in dev for trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
- Timestamp:
- Jul 12, 2007, 2:58:26 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/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 <ClassImpl.h> 8 #include <VariableImpl.h> 9 #include <Class.h> 9 10 10 11 #include "../BasicCompiler_Common/common.h" … … 31 32 } 32 33 33 UserProc *pBackUserProc; 34 pBackUserProc = &UserProc::CompilingUserProc(); 34 const UserProc *pBackUserProc = &UserProc::CompilingUserProc(); 35 35 UserProc::CompileStartForGlobalArea(); 36 36 … … 54 54 55 55 //_System_StartupProgramの呼び出し 56 extern UserProc *pSub_System_StartupProgram;56 extern const UserProc *pSub_System_StartupProgram; 57 57 op_call(pSub_System_StartupProgram); 58 58 … … 82 82 StackFrameSchedule=obp-sizeof(long); 83 83 84 BOOST_FOREACH( Variable *pVar, globalVars){84 BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){ 85 85 if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){ 86 86 //コンストラクタ呼び出し 87 if( pVar-> IsObject() ){87 if( pVar->GetType().IsObject() ){ 88 88 89 89 //エラー用 … … 92 92 CallConstructor( 93 93 pVar->GetName().c_str(), 94 pVar->GetSub ScriptsPtr(),95 *pVar,96 pVar-> paramStrForConstructor.c_str());94 pVar->GetSubscripts(), 95 pVar->GetType(), 96 pVar->GetParamStrForConstructor().c_str()); 97 97 } 98 98 } … … 113 113 114 114 115 UserProc *pBackUserProc; 116 pBackUserProc = &UserProc::CompilingUserProc(); 115 const UserProc *pBackUserProc = &UserProc::CompilingUserProc(); 117 116 UserProc::CompileStartForGlobalArea(); 118 117 … … 212 211 } 213 212 } 214 void AutoGeneration( UserProc &userProc){213 void AutoGeneration(const UserProc &userProc){ 215 214 if( userProc.GetName() == "InitializeUserTypes" 216 215 && userProc.HasParentClass() … … 229 228 } 230 229 } 231 void _compile_proc( UserProc *pUserProc){230 void _compile_proc(const UserProc *pUserProc){ 232 231 extern char *basbuf; 233 232 extern HANDLE hHeap; 234 extern GlobalProc **ppSubHash;235 233 extern BOOL bDebugCompile; 236 234 int i3,i4; … … 239 237 if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return; 240 238 241 if( pUserProc-> localVars.size() ){239 if( pUserProc->GetLocalVars().size() ){ 242 240 SetError(); 243 241 return; 244 242 } 243 244 trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" ); 245 245 246 246 pUserProc->CompleteCompile(); … … 259 259 else bDebugSupportProc=0; 260 260 261 pUserProc-> beginOpAddress=obp;261 pUserProc->SetBeginOpAddress( obp ); 262 262 263 263 //コンパイル中の関数が属するクラス 264 Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();264 compiler.pCompilingClass=pUserProc->GetParentClassPtr(); 265 265 266 266 //コンパイルスタートをクラス管理クラスに追加 … … 294 294 pobj_sf=0; 295 295 296 pUserProc-> endOpAddress=obp;296 pUserProc->SetEndOpAddress( obp ); 297 297 return; 298 298 } … … 360 360 Parameter ¶m = *pUserProc->RealParams()[i3]; 361 361 362 Variable *pVar = new Variable Impl( param.GetVarName(), param, false, param.IsRef());362 Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" ); 363 363 364 364 if( param.IsArray() ){ 365 pVar->SetArray( param.GetSub ScriptsPtr() );365 pVar->SetArray( param.GetSubscripts() ); 366 366 } 367 367 … … 381 381 } 382 382 AllLocalVarSize+=varSize; 383 pVar-> offset=AllLocalVarSize;383 pVar->SetOffsetAddress( AllLocalVarSize ); 384 384 385 385 //レキシカルスコープ情報 386 pVar->S copeLevel=GetLexicalScopes().GetNowLevel();387 pVar->S copeStartAddress=GetLexicalScopes().GetStartAddress();386 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() ); 387 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() ); 388 388 pVar->bLiving=TRUE; 389 389 390 pUserProc-> localVars.push_back( pVar );390 pUserProc->GetLocalVars().push_back( pVar ); 391 391 } 392 392 … … 507 507 508 508 //call _DebugSys_StartProc 509 extern UserProc *pSub_DebugSys_StartProc;509 extern const UserProc *pSub_DebugSys_StartProc; 510 510 op_call(pSub_DebugSys_StartProc); 511 511 } 512 512 513 if( Smoothie::Temp::pCompilingClass){514 if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){513 if(compiler.pCompilingClass){ 514 if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){ 515 515 //////////////////////////////////// 516 516 // コンストラクタをコンパイルするとき … … 518 518 519 519 //コンストラクタのコンパイル開始を通知 520 Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();520 compiler.pCompilingClass->NotifyStartConstructorCompile(); 521 521 522 522 //基底クラスかどうかの識別 523 523 //(継承元がインターフェイスの場合も基底クラスと見なす) 524 524 BOOL bThisIsSuperClass; 525 if( ! Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;526 else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){525 if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1; 526 else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){ 527 527 //インターフェイスを継承したときはコンストラクタを持たない 528 528 bThisIsSuperClass=1; … … 543 543 temporary[i4]=basbuf[i3]; 544 544 } 545 if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){545 if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){ 546 546 //基底クラスのコンストラクタを呼び出す 547 547 cp=i3; … … 560 560 Type dummyType; 561 561 CallProc( PROC_DEFAULT 562 , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc563 , Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()562 , &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc() 563 , compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str() 564 564 , temporary 565 565 , dummyType ); … … 568 568 //基底クラスのコンストラクタを暗黙的に呼び出す 569 569 Opcode_CallProc("", 570 Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,570 &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(), 571 571 0, 572 572 "", … … 576 576 577 577 //仮想関数テーブルを初期化 578 if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()579 && ! Smoothie::Temp::pCompilingClass->IsAbstract() ){578 if( compiler.pCompilingClass->IsExistVirtualFunctions() 579 && !compiler.pCompilingClass->IsAbstract() ){ 580 580 //関数テーブルに値をセット 581 int offset = (int) Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();581 int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset(); 582 582 583 583 //mov rax,offset … … 598 598 599 599 //デストラクタのコンパイル開始を通知 600 Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();600 compiler.pCompilingClass->NotifyStartDestructorCompile(); 601 601 } 602 602 } … … 624 624 ////////////////////////////////////////// 625 625 626 if( Smoothie::Temp::pCompilingClass ){627 628 if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){626 if( compiler.pCompilingClass ){ 627 628 if( compiler.pCompilingClass->IsCompilingConstructor() ){ 629 629 // コンストラクタをコンパイルしていたとき 630 630 631 631 // コンストラクタのコンパイルが完了したことを通知 632 Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();632 compiler.pCompilingClass->NotifyFinishConstructorCompile(); 633 633 } 634 634 else if( pUserProc->IsDestructor() ){ … … 638 638 639 639 // デストラクタのコンパイルが完了したことを通知 640 Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();641 642 if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){640 compiler.pCompilingClass->NotifyFinishDestructorCompile(); 641 642 if( compiler.pCompilingClass->HasSuperClass() ){ 643 643 /* サブクラスのデストラクタをコンパイルしているときは、 644 644 基底クラスのデストラクタを呼び出す */ 645 645 646 const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();646 const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod(); 647 647 if( method ){ 648 648 Opcode_CallProc("", 649 method->pUserProc,649 &method->GetUserProc(), 650 650 0, 651 651 "", … … 694 694 if(bDebugCompile&&bDebugSupportProc==0){ 695 695 //call _DebugSys_EndProc 696 extern UserProc *pSub_DebugSys_EndProc;696 extern const UserProc *pSub_DebugSys_EndProc; 697 697 op_call(pSub_DebugSys_EndProc); 698 698 } … … 745 745 } 746 746 HeapDefaultFree(pLocalVarAddrSchedule); 747 BOOST_FOREACH( Variable *pVar, pUserProc-> localVars){747 BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){ 748 748 //後にデバッグで利用する 749 pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset; 749 pVar->SetOffsetAddress( 750 AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->GetOffsetAddress() 751 ); 750 752 } 751 753 … … 785 787 786 788 787 pUserProc-> endOpAddress=obp;789 pUserProc->SetEndOpAddress( obp ); 788 790 789 791 … … 793 795 } 794 796 795 void CompileBufferInProcedure( UserProc &userProc ){797 void CompileBufferInProcedure( const UserProc &userProc ){ 796 798 if( userProc.IsUsing() == false || userProc.IsCompiled() ) return; 797 799 … … 809 811 } 810 812 void CompileLocal(){ 811 extern GlobalProc **ppSubHash;812 int i2;813 814 813 extern BOOL bDll; 815 814 if(bDll){ 816 815 //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする 817 UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");816 const UserProc *pUserProc = GetSubHash("_System_InitDllGlobalVariables"); 818 817 if(pUserProc){ 819 818 CompileBufferInProcedure( *pUserProc ); … … 823 822 824 823 //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル 825 extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;824 extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes; 826 825 pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile(); 827 826 828 827 //_System_InitStaticLocalVariablesは一番最後にコンパイル 829 828 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない 830 extern UserProc *pSub_System_InitStaticLocalVariables;829 extern const UserProc *pSub_System_InitStaticLocalVariables; 831 830 pSub_System_InitStaticLocalVariables->CompleteCompile(); 832 831 833 832 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 834 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;833 extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject; 835 834 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 836 835 837 836 repeat: 838 GlobalProc *pGlobalProc; 839 for(i2=0;i2<MAX_HASH;i2++){ 840 pGlobalProc=ppSubHash[i2]; 841 while(pGlobalProc){ 842 CompileBufferInProcedure( *pGlobalProc ); 843 pGlobalProc=pGlobalProc->pNextData; 844 } 837 compiler.GetMeta().GetUserProcs().Iterator_Reset(); 838 while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() ) 839 { 840 UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext(); 841 CompileBufferInProcedure( *pUserProc ); 845 842 } 846 843 … … 856 853 if( IsNeedProcCompile() ){ 857 854 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 858 for(i2=0;i2<MAX_HASH;i2++){ 859 pGlobalProc=ppSubHash[i2];860 while(pGlobalProc){861 CompileBufferInProcedure( *pGlobalProc );862 pGlobalProc=pGlobalProc->pNextData;863 }855 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 ); 864 861 } 865 862 }
Note:
See TracChangeset
for help on using the changeset viewer.