Changeset 206 in dev for trunk/abdev/BasicCompiler_Common/src/LexicalScopingImpl.cpp
- Timestamp:
- Jul 12, 2007, 2:58:26 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/LexicalScopingImpl.cpp
r184 r206 1 #include "stdafx.h" 2 1 3 #include <LexicalScopingImpl.h> 4 #include <Compiler.h> 2 5 3 6 #include "../common.h" … … 29 32 } 30 33 34 void LexicalScopesImpl::End(){ 35 if( level <= 0 ){ 36 SetError(); 37 return; 38 } 39 40 //デストラクタを呼ぶ 41 CallDestructorsOfScopeEnd(); 42 43 Variables &vars = UserProc::IsGlobalAreaCompiling() ? 44 compiler.GetMeta().GetGlobalVars() : 45 UserProc::CompilingUserProc().GetLocalVars(); 46 47 //使用済みローカル変数の生存チェックを外す 48 BOOST_FOREACH( Variable *pVar, vars ){ 49 if(pVar->bLiving&&pVar->GetScopeLevel()==level){ 50 pVar->bLiving=0; 51 extern int obp; 52 pVar->SetScopeEndAddress( obp ); 53 } 54 } 55 56 57 //スコープ抜け出しスケジュール 58 ppScopes[level]->RunScheduleOfBreak(); 59 60 61 //スコープレベルを下げる 62 delete ppScopes[level]; 63 level--; 64 } 65 31 66 // スコープ終了時のデストラクタ呼び出し 32 67 void LexicalScopesImpl::CallDestructorsOfScopeEnd(){ 33 68 34 Variables &vars = UserProc::IsGlobalAreaCompiling() ?35 globalVars:36 UserProc::CompilingUserProc(). localVars;69 Variables &vars = UserProc::IsGlobalAreaCompiling() ? 70 compiler.GetMeta().GetGlobalVars() : 71 UserProc::CompilingUserProc().GetLocalVars(); 37 72 38 73 … … 52 87 //同一レベルのレキシカルスコープのみを検知 53 88 if(!pVar->bLiving) continue; 54 if( pVar-> ScopeLevel!= GetNowLevel() ) continue;89 if( pVar->GetScopeLevel() != GetNowLevel() ) continue; 55 90 56 if( pVar-> IsStruct() && pVar->IsParameter() ){91 if( pVar->GetType().IsStruct() && pVar->IsParameter() ){ 57 92 //構造体パラメータを持つとき 58 93 … … 64 99 //mov rcx,qword ptr[rsp+offset] 65 100 op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP, 66 -pVar-> offset,101 -pVar->GetOffsetAddress(), 67 102 MOD_BASE_DISP32); 68 103 obp-=sizeof(long); … … 73 108 74 109 //mov ecx,dword ptr[ebp+offset] 75 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar-> offset,MOD_BASE_DISP32);110 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->GetOffsetAddress(),MOD_BASE_DISP32); 76 111 obp-=sizeof(long); 77 112 AddLocalVarAddrSchedule(); … … 83 118 84 119 //call free 85 extern UserProc *pSub_free;120 extern const UserProc *pSub_free; 86 121 op_call(pSub_free); 87 122 … … 96 131 if(indexSystemGC!=-1){ 97 132 //_System_GCオブジェクトのデストラクタの呼び出し処理 98 const CMethod *method = vars[indexSystemGC]->Get Class().GetDestructorMethod();133 const CMethod *method = vars[indexSystemGC]->GetType().GetClass().GetDestructorMethod(); 99 134 if( method ){ 100 Opcode_CallProc("", method->pUserProc,0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT);135 Opcode_CallProc("",&method->GetUserProc(),0,vars[indexSystemGC]->GetName().c_str(),DEF_OBJECT); 101 136 } 102 137 }
Note:
See TracChangeset
for help on using the changeset viewer.