Changeset 248 in dev for trunk/abdev/BasicCompiler_Common/src
- Timestamp:
- Jul 29, 2007, 12:33:04 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common/src
- Files:
-
- 3 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp
r247 r248 33 33 bool isSuccessful = false; 34 34 35 CodeGenerator::PertialSchedules::iterator it = pertialSchedules.begin();35 PertialSchedules::iterator it = pertialSchedules.begin(); 36 36 while( it != pertialSchedules.end() ) 37 37 { … … 84 84 } 85 85 } 86 const CodeGenerator::PertialSchedule *CodeGenerator::__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )86 const PertialSchedule *CodeGenerator::__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset ) 87 87 { 88 88 long beginCodePos = pNativeCode->GetSize(); … … 158 158 return pPertialSchedule; 159 159 } 160 const CodeGenerator::PertialSchedule *CodeGenerator::op_jle( long offset, int op_size, bool isPertialSchedule )160 const PertialSchedule *CodeGenerator::op_jle( long offset, int op_size, bool isPertialSchedule ) 161 161 { 162 162 return __jmp_op_format( (char)0x0E, offset, op_size, isPertialSchedule ); 163 163 } 164 const CodeGenerator::PertialSchedule *CodeGenerator::op_jbe( long offset, int op_size, bool isPertialSchedule )164 const PertialSchedule *CodeGenerator::op_jbe( long offset, int op_size, bool isPertialSchedule ) 165 165 { 166 166 return __jmp_op_format( (char)0x06, offset, op_size, isPertialSchedule ); 167 167 } 168 const CodeGenerator::PertialSchedule *CodeGenerator::op_jge( long offset, int op_size, bool isPertialSchedule )168 const PertialSchedule *CodeGenerator::op_jge( long offset, int op_size, bool isPertialSchedule ) 169 169 { 170 170 return __jmp_op_format( (char)0x0D, offset, op_size, isPertialSchedule ); 171 171 } 172 const CodeGenerator::PertialSchedule *CodeGenerator::op_jae( long offset, int op_size, bool isPertialSchedule )172 const PertialSchedule *CodeGenerator::op_jae( long offset, int op_size, bool isPertialSchedule ) 173 173 { 174 174 return __jmp_op_format( (char)0x03, offset, op_size, isPertialSchedule ); 175 175 } 176 const CodeGenerator::PertialSchedule *CodeGenerator::op_jl( long offset, int op_size, bool isPertialSchedule )176 const PertialSchedule *CodeGenerator::op_jl( long offset, int op_size, bool isPertialSchedule ) 177 177 { 178 178 return __jmp_op_format( (char)0x0C, offset, op_size, isPertialSchedule ); 179 179 } 180 const CodeGenerator::PertialSchedule *CodeGenerator::op_jb( long offset, int op_size, bool isPertialSchedule )180 const PertialSchedule *CodeGenerator::op_jb( long offset, int op_size, bool isPertialSchedule ) 181 181 { 182 182 return __jmp_op_format( (char)0x02, offset, op_size, isPertialSchedule ); 183 183 } 184 const CodeGenerator::PertialSchedule *CodeGenerator::op_jg( long offset, int op_size, bool isPertialSchedule )184 const PertialSchedule *CodeGenerator::op_jg( long offset, int op_size, bool isPertialSchedule ) 185 185 { 186 186 return __jmp_op_format( (char)0x0F, offset, op_size, isPertialSchedule ); 187 187 } 188 const CodeGenerator::PertialSchedule *CodeGenerator::op_ja( long offset, int op_size, bool isPertialSchedule )188 const PertialSchedule *CodeGenerator::op_ja( long offset, int op_size, bool isPertialSchedule ) 189 189 { 190 190 return __jmp_op_format( (char)0x07, offset, op_size, isPertialSchedule ); 191 191 } 192 const CodeGenerator::PertialSchedule *CodeGenerator::op_jne( long offset, int op_size, bool isPertialSchedule )192 const PertialSchedule *CodeGenerator::op_jne( long offset, int op_size, bool isPertialSchedule ) 193 193 { 194 194 return __jmp_op_format( (char)0x05, offset, op_size, isPertialSchedule ); 195 195 } 196 const CodeGenerator::PertialSchedule *CodeGenerator::op_je( long offset, int op_size, bool isPertialSchedule )196 const PertialSchedule *CodeGenerator::op_je( long offset, int op_size, bool isPertialSchedule ) 197 197 { 198 198 return __jmp_op_format( (char)0x04, offset, op_size, isPertialSchedule ); 199 199 } 200 const CodeGenerator::PertialSchedule *CodeGenerator::op_jmp( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )200 const PertialSchedule *CodeGenerator::op_jmp( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset ) 201 201 { 202 202 return __jmp_op_format( (char)0xEB, offset, op_size, isPertialSchedule, isSelfOpcodeOffset ); -
trunk/abdev/BasicCompiler_Common/src/LexicalScope.cpp
r245 r248 1 1 #include "stdafx.h" 2 2 3 #include <LexicalScop ingImpl.h>3 #include <LexicalScope.h> 4 4 #include <Compiler.h> 5 5 … … 13 13 14 14 15 void ScopeImpl::Break(){15 void LexicalScope::Break(){ 16 16 //未解放のローカルオブジェクトを解放する 17 GetLexicalScopes().CallDestructorsOfReturn( level );17 compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn( level ); 18 18 19 19 //jmp ...(Next addr) 20 OpBuffer[obp++]=(char)0xE9; 21 22 pBreakSchedule=(DWORD *)realloc( pBreakSchedule, ( nBreakSchedule + 1 ) * sizeof(DWORD) ); 23 pBreakSchedule[nBreakSchedule]=obp; 24 nBreakSchedule++; 25 26 obp+=sizeof(long); 20 breakPertialSchedules.push_back( 21 compiler.codeGenerator.op_jmp( 0, sizeof(long), true ) 22 ); 27 23 } 28 void ScopeImpl::RunScheduleOfBreak(){ 29 for(int i=0;i<nBreakSchedule;i++){ 30 *((long *)(OpBuffer+pBreakSchedule[i]))=obp-(pBreakSchedule[i]+sizeof(long)); 24 void LexicalScope::RunScheduleOfBreak(){ 25 BOOST_FOREACH( const PertialSchedule *pBreakPertialSchedule, breakPertialSchedules ) 26 { 27 compiler.codeGenerator.opfix_JmpPertialSchedule( pBreakPertialSchedule ); 31 28 } 32 29 } 33 30 34 void LexicalScopesImpl::End(){ 31 32 33 LexicalScope *LexicalScopes::SearchScope( LexicalScope::SCOPE_TYPE TypeOfStatement ){ 34 for( int i = level; i>=0; i-- ){ 35 if( ppScopes[i]->GetTypeOfStatement() == TypeOfStatement ){ 36 return ppScopes[i]; 37 } 38 } 39 return NULL; 40 } 41 42 void LexicalScopes::Init(int addr){ 43 // TODO: エラーチェック 44 45 level = -1; 46 Start( addr, LexicalScope::SCOPE_TYPE_BASE ); 47 } 48 void LexicalScopes::Start( int addr, LexicalScope::SCOPE_TYPE TypeOfStatement ){ 49 level++; 50 ppScopes = (LexicalScope **)realloc( ppScopes, ( level + 1 ) * sizeof( LexicalScope * ) ); 51 ppScopes[level] = new LexicalScope( level, addr, TypeOfStatement ); 52 } 53 54 int LexicalScopes::GetNowLevel(){ 55 return level; 56 } 57 void LexicalScopes::SetNowLevel( int level ){ 58 this->level = level; 59 } 60 int LexicalScopes::GetStartAddress(){ 61 return ppScopes[level]->GetStartAddress(); 62 } 63 64 void LexicalScopes::End(){ 35 65 if( level <= 0 ){ 36 66 SetError(); … … 65 95 66 96 // スコープ終了時のデストラクタ呼び出し 67 void LexicalScopes Impl::CallDestructorsOfScopeEnd(){97 void LexicalScopes::CallDestructorsOfScopeEnd(){ 68 98 69 99 Variables &vars = UserProc::IsGlobalAreaCompiling() ? … … 134 164 135 165 // Returnステートメントで発行されるデストラクタを生成 136 void LexicalScopes Impl::CallDestructorsOfReturn( int BaseLevel ){166 void LexicalScopes::CallDestructorsOfReturn( int BaseLevel ){ 137 167 //現在のスコープレベルを退避 138 168 int backupScopeLevel = GetNowLevel(); … … 147 177 SetNowLevel( backupScopeLevel ); 148 178 } 149 150 LexicalScopesImpl &GetLexicalScopes()151 {152 static LexicalScopesImpl *pTemp = NULL;153 if( !pTemp )154 {155 pTemp = (LexicalScopesImpl *)Smoothie::Temp::pLexicalScopes;156 }157 return *pTemp;158 } -
trunk/abdev/BasicCompiler_Common/src/SmoothieImpl.cpp
r206 r248 6 6 #include <Class.h> 7 7 #include <Procedure.h> 8 #include <LexicalScopingImpl.h> 9 10 CLexicalScopes *Smoothie::Temp::pLexicalScopes = new LexicalScopesImpl(); 8 #include <LexicalScope.h> -
trunk/abdev/BasicCompiler_Common/src/Variable.cpp
r206 r248 35 35 Variable &var = *(*this)[i]; 36 36 if( var.bLiving //現在のスコープで有効なもの 37 && var.GetScopeLevel() == Smoothie::Temp::pLexicalScopes->GetNowLevel() //現在のスコープと同一レベル 38 ){ 39 if( var.IsEqualSymbol( symbol ) ){ 40 return true; 41 } 37 && var.GetScopeLevel() == compiler.codeGenerator.lexicalScopes.GetNowLevel() //現在のスコープと同一レベル 38 ) 39 { 40 if( var.IsEqualSymbol( symbol ) ){ 41 return true; 42 } 42 43 } 43 44 } … … 51 52 Variable &var = *(*this)[i]; 52 53 if( var.bLiving //現在のスコープで有効なもの 53 && var.GetScopeLevel() <= Smoothie::Temp::pLexicalScopes->GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮)54 && var.GetScopeLevel() <= compiler.codeGenerator.lexicalScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 54 55 ){ 55 56 if( var.IsEqualSymbol( symbol ) ){
Note:
See TracChangeset
for help on using the changeset viewer.