Changeset 183 in dev for trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
- Timestamp:
- Jun 24, 2007, 6:50:40 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r143 r183 1 #include <jenga/include/smoothie/Smoothie.h> 2 #include <jenga/include/smoothie/LexicalAnalysis.h> 3 4 #include <Program.h> 5 #include <LexicalScopingImpl.h> 6 #include <ClassImpl.h> 7 1 8 #include "../BasicCompiler_Common/common.h" 2 9 #include "Opcode.h" … … 48 55 49 56 //クラスに属する静的メンバを定義 50 CMember::InitStaticMember();57 Smoothie::GetMeta().GetClasses().InitStaticMember(); 51 58 52 59 GetGlobalDataForDll(); … … 61 68 //静的ローカルオブジェクトのコンストラクタ呼び出し 62 69 63 foreach( Variable *pVar, globalVars ){70 BOOST_FOREACH( Variable *pVar, globalVars ){ 64 71 if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){ 65 72 //コンストラクタ呼び出し … … 87 94 UserProc::CompileStartForGlobalArea(); 88 95 89 obj_LexScopes.CallDestructorsOfScopeEnd();96 GetLexicalScopes().CallDestructorsOfScopeEnd(); 90 97 91 98 UserProc::CompileStartForUserProc( pBackUserProc ); … … 217 224 && userProc.GetParentClass().GetName() == "_System_TypeBase" ){ 218 225 219 pobj_DBClass->Compile_System_InitializeUserTypes();226 Smoothie::GetMeta().GetClasses().Compile_System_InitializeUserTypes(); 220 227 } 221 228 else if( userProc.GetName() == "RegisterGlobalRoots" … … 263 270 264 271 //コンパイル中の関数が属するクラス 265 pobj_CompilingClass=pUserProc->GetParentClassPtr();272 Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr(); 266 273 267 274 //コンパイルスタートをクラス管理クラスに追加 268 pobj_DBClass->StartCompile( pUserProc );275 Smoothie::GetMeta().GetClasses().StartCompile( pUserProc ); 269 276 270 277 //コンパイル中の関数 … … 272 279 273 280 // コンパイル中の関数が属する名前空間 274 Smoothie:: Lexical::liveingNamespaceScopes = pUserProc->GetNamespaceScopes();281 Smoothie::Temp::liveingNamespaceScopes = pUserProc->GetNamespaceScopes(); 275 282 276 283 // コンパイル中の関数でImportsされている名前空間 … … 335 342 336 343 //レキシカルスコープ情報 337 pVar->ScopeLevel= obj_LexScopes.GetNowLevel();338 pVar->ScopeStartAddress= obj_LexScopes.GetStartAddress();344 pVar->ScopeLevel=GetLexicalScopes().GetNowLevel(); 345 pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress(); 339 346 pVar->bLiving=TRUE; 340 347 … … 450 457 } 451 458 452 if( pobj_CompilingClass){453 if( pUserProc->GetName() == pobj_CompilingClass->GetName() ){459 if(Smoothie::Temp::pCompilingClass){ 460 if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){ 454 461 //////////////////////////////////// 455 462 // コンストラクタをコンパイルするとき … … 457 464 458 465 //コンストラクタのコンパイル開始を通知 459 pobj_CompilingClass->NotifyStartConstructorCompile();466 Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile(); 460 467 461 468 //基底クラスかどうかの識別 462 469 //(継承元がインターフェイスの場合も基底クラスと見なす) 463 470 BOOL bThisIsSuperClass; 464 if( pobj_CompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1;465 else if( pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod() == NULL ){471 if(Smoothie::Temp::pCompilingClass->pobj_InheritsClass==0) bThisIsSuperClass=1; 472 else if( Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetConstructorMethod() == NULL ){ 466 473 //インターフェイスを継承したときはコンストラクタを持たない 467 474 bThisIsSuperClass=1; … … 482 489 temporary[i4]=basbuf[i3]; 483 490 } 484 if( pobj_CompilingClass->pobj_InheritsClass->GetName() == temporary ){491 if( Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetName() == temporary ){ 485 492 //基底クラスのコンストラクタを呼び出す 486 493 cp=i3; … … 499 506 Type dummyType; 500 507 CallProc( PROC_DEFAULT 501 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc502 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc->GetName().c_str()508 , Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc 509 , Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc->GetName().c_str() 503 510 , temporary 504 511 , dummyType ); … … 507 514 //基底クラスのコンストラクタを暗黙的に呼び出す 508 515 Opcode_CallProc("", 509 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc,516 Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 510 517 0, 511 518 "", … … 515 522 516 523 //仮想関数テーブルを初期化 517 if( pobj_CompilingClass->IsExistVirtualFunctions()518 && ! pobj_CompilingClass->IsAbstract() ){524 if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions() 525 && !Smoothie::Temp::pCompilingClass->IsAbstract() ){ 519 526 //関数テーブルに値をセット 520 int offset = (int) pobj_CompilingClass->GetVtblGlobalOffset();527 int offset = (int)Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset(); 521 528 522 529 //mov eax,offset … … 538 545 539 546 //デストラクタのコンパイル開始を通知 540 pobj_CompilingClass->NotifyStartDestructorCompile();547 Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile(); 541 548 } 542 549 } … … 564 571 ////////////////////////////////////////// 565 572 566 if( pobj_CompilingClass ){567 568 if( pobj_CompilingClass->IsCompilingConstructor() ){573 if( Smoothie::Temp::pCompilingClass ){ 574 575 if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){ 569 576 // コンストラクタをコンパイルしていたとき 570 577 571 578 // コンストラクタのコンパイルが完了したことを通知 572 pobj_CompilingClass->NotifyFinishConstructorCompile();579 Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile(); 573 580 } 574 581 else if( pUserProc->IsDestructor() ){ … … 578 585 579 586 // デストラクタのコンパイルが完了したことを通知 580 pobj_CompilingClass->NotifyFinishDestructorCompile();581 582 if( pobj_CompilingClass->pobj_InheritsClass){587 Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile(); 588 589 if(Smoothie::Temp::pCompilingClass->pobj_InheritsClass){ 583 590 /* サブクラスのデストラクタをコンパイルしているときは、 584 591 基底クラスのデストラクタを呼び出す */ 585 592 586 const CMethod *method = pobj_CompilingClass->pobj_InheritsClass->GetDestructorMethod();593 const CMethod *method = Smoothie::Temp::pCompilingClass->pobj_InheritsClass->GetDestructorMethod(); 587 594 if( method ){ 588 595 Opcode_CallProc("", … … 627 634 628 635 //ローカルオブジェクトの解放処理 629 obj_LexScopes.CallDestructorsOfScopeEnd();636 GetLexicalScopes().CallDestructorsOfScopeEnd(); 630 637 631 638 //プロシージャ抜け出しスケジュール(Exit Sub/Function) … … 702 709 obp+=sizeof(long); 703 710 } 704 else if(i3==DEF_INTEGER||i3==DEF_WORD || ( isUnicode&&i3==DEF_CHAR)){711 else if(i3==DEF_INTEGER||i3==DEF_WORD || (Smoothie::IsUnicode()&&i3==DEF_CHAR)){ 705 712 //xor eax,eax(eaxを0に初期化する) 706 713 op_zero_reg(REG_EAX); … … 714 721 obp+=sizeof(long); 715 722 } 716 else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || ( isUnicode==false&&i3==DEF_CHAR)){723 else if(i3==DEF_SBYTE||i3==DEF_BYTE||i3==DEF_BOOLEAN || (Smoothie::IsUnicode()==false&&i3==DEF_CHAR)){ 717 724 //xor eax,eax(eaxを0に初期化する) 718 725 op_zero_reg(REG_EAX); … … 732 739 } 733 740 HeapDefaultFree(pLocalVarAddrSchedule); 734 foreach( Variable *pVar, pUserProc->localVars ){741 BOOST_FOREACH( Variable *pVar, pUserProc->localVars ){ 735 742 //後にデバッグで利用する 736 743 pVar->offset = AllLocalVarSize - pVar->offset;
Note:
See TracChangeset
for help on using the changeset viewer.