Changeset 248 in dev for trunk/abdev
- Timestamp:
- Jul 29, 2007, 12:33:04 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 12 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/BasicCompiler.vcproj
r237 r248 1281 1281 </File> 1282 1282 <File 1283 RelativePath="..\BasicCompiler_Common\src\LexicalScop ingImpl.cpp"1283 RelativePath="..\BasicCompiler_Common\src\LexicalScope.cpp" 1284 1284 > 1285 1285 </File> … … 1419 1419 </File> 1420 1420 <File 1421 RelativePath="..\BasicCompiler_Common\include\LexicalScop ingImpl.h"1421 RelativePath="..\BasicCompiler_Common\include\LexicalScope.h" 1422 1422 > 1423 1423 </File> -
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r247 r248 6 6 #include <Program.h> 7 7 #include <Compiler.h> 8 #include <LexicalScop ingImpl.h>8 #include <LexicalScope.h> 9 9 #include <Class.h> 10 10 #include <Variable.h> … … 97 97 UserProc::CompileStartForGlobalArea(); 98 98 99 GetLexicalScopes().CallDestructorsOfScopeEnd();99 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 100 100 101 101 UserProc::CompileStartForUserProc( pBackUserProc ); … … 349 349 350 350 //レキシカルスコープ情報 351 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );352 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );351 pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() ); 352 pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() ); 353 353 pVar->bLiving=TRUE; 354 354 … … 615 615 616 616 //ローカルオブジェクトの解放処理 617 GetLexicalScopes().CallDestructorsOfScopeEnd();617 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 618 618 619 619 //プロシージャ抜け出しスケジュール(Exit Sub/Function) -
trunk/abdev/BasicCompiler32/Compile_Statement.cpp
r247 r248 3 3 #include <jenga/include/smoothie/LexicalAnalysis.h> 4 4 5 #include <LexicalScop ingImpl.h>5 #include <LexicalScope.h> 6 6 #include <Compiler.h> 7 7 … … 140 140 } 141 141 142 const CodeGenerator::PertialSchedule *pIfPertialSchedule = NULL;142 const PertialSchedule *pIfPertialSchedule = NULL; 143 143 if( !NumOpe(Parameter,Type(),tempType) ){ 144 144 //NumOpe内でエラー … … 207 207 208 208 //jne 209 const CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );209 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 210 210 211 211 //cmp ebx,0 … … 213 213 214 214 //jne 215 const CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );215 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 216 216 217 217 //jmp (endif、または else までジャンプ) … … 240 240 241 241 //レキシカルスコープをレベルアップ 242 GetLexicalScopes().Start( obp,SCOPE_TYPE_IF );242 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_IF ); 243 243 244 244 i2=CompileBuffer(ESC_ENDIF,0); 245 245 246 246 //レキシカルスコープをレベルダウン 247 GetLexicalScopes().End();247 compiler.codeGenerator.lexicalScopes.End(); 248 248 249 249 … … 252 252 if(i2==ESC_ELSE){ 253 253 //jmp (endifまで) 254 const CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );254 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 255 255 256 256 compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule ); … … 262 262 263 263 //レキシカルスコープをレベルアップ 264 GetLexicalScopes().Start( obp,SCOPE_TYPE_IF );264 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_IF ); 265 265 266 266 CompileBuffer(ESC_ENDIF,0); 267 267 268 268 //レキシカルスコープをレベルダウン 269 GetLexicalScopes().End();269 compiler.codeGenerator.lexicalScopes.End(); 270 270 271 271 … … 340 340 if(!Parameter[0]) SetError(10,"While",cp); 341 341 342 const CodeGenerator::PertialSchedule *pWhilePertialSchedule = NULL;342 const PertialSchedule *pWhilePertialSchedule = NULL; 343 343 Type tempType; 344 344 if( !NumOpe(Parameter,Type(),tempType) ){ … … 408 408 409 409 //jne 410 const CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );410 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 411 411 412 412 //cmp ebx,0 … … 414 414 415 415 //jne 416 const CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );416 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 417 417 418 418 //jmp (Wendまでジャンプ) … … 436 436 437 437 //レキシカルスコープをレベルアップ 438 GetLexicalScopes().Start( obp,SCOPE_TYPE_WHILE );438 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_WHILE ); 439 439 440 440 //While内をコンパイル 441 441 CompileBuffer(0,COM_WEND); 442 442 443 GetLexicalScopes().CallDestructorsOfScopeEnd();443 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 444 444 445 445 //jmp ... … … 447 447 448 448 //レキシカルスコープをレベルダウン 449 GetLexicalScopes().End();449 compiler.codeGenerator.lexicalScopes.End(); 450 450 451 451 if( pWhilePertialSchedule ) … … 486 486 487 487 //jmp ... 488 const CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );488 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 489 489 490 490 //Continueアドレスのバックアップとセット … … 528 528 529 529 //jmp [カウンタ減少の場合の判定を飛び越す] 530 const CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );530 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 531 531 532 532 //jeジャンプ先のオフセット値 … … 552 552 553 553 //レキシカルスコープをレベルアップ 554 GetLexicalScopes().Start( obp,SCOPE_TYPE_FOR );554 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_FOR ); 555 555 556 556 //For内をコンパイル 557 557 CompileBuffer(0,COM_NEXT); 558 558 559 GetLexicalScopes().CallDestructorsOfScopeEnd();559 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 560 560 561 561 if(szNextVariable[0]){ … … 569 569 570 570 //レキシカルスコープをレベルダウン 571 GetLexicalScopes().End();571 compiler.codeGenerator.lexicalScopes.End(); 572 572 573 573 //jeジャンプ先のオフセット値 … … 588 588 589 589 //レキシカルスコープをレベルアップ 590 GetLexicalScopes().Start( obp,SCOPE_TYPE_DO );590 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_DO ); 591 591 592 592 //Do内をコンパイル 593 593 CompileBuffer(0,COM_LOOP); 594 594 595 GetLexicalScopes().CallDestructorsOfScopeEnd();596 597 const CodeGenerator::PertialSchedule *pDoPertialSchedule = NULL;595 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 596 597 const PertialSchedule *pDoPertialSchedule = NULL; 598 598 599 599 extern char *basbuf; … … 702 702 703 703 //jne 704 const CodeGenerator::PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );704 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 705 705 706 706 //cmp ebx,0 … … 708 708 709 709 //jne 710 const CodeGenerator::PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );710 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 711 711 712 712 if(basbuf[i3]=='0'){ … … 723 723 724 724 //jmp 2(ループを続ける) 725 const CodeGenerator::PertialSchedule *pTempPertialSchedule3 = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );725 const PertialSchedule *pTempPertialSchedule3 = compiler.codeGenerator.op_jmp( 0, sizeof(char), true ); 726 726 727 727 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 ); … … 767 767 768 768 //jmp ... 769 const CodeGenerator::PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );769 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true ); 770 770 771 771 //レキシカルスコープをレベルダウン 772 GetLexicalScopes().End();772 compiler.codeGenerator.lexicalScopes.End(); 773 773 774 774 //jmpジャンプ先のオフセット値 … … 792 792 793 793 //未解放のローカルオブジェクトのデストラクタを呼び出す 794 GetLexicalScopes().CallDestructorsOfReturn();794 compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn(); 795 795 796 796 //jmp ...(End Sub/Function) … … 1049 1049 1050 1050 //レキシカルスコープをレベルアップ 1051 GetLexicalScopes().Start( obp,SCOPE_TYPE_SELECT );1051 compiler.codeGenerator.lexicalScopes.Start( obp, LexicalScope::SCOPE_TYPE_SELECT ); 1052 1052 1053 1053 //Select Case内をコンパイル … … 1066 1066 1067 1067 //レキシカルスコープをレベルダウン 1068 GetLexicalScopes().End();1068 compiler.codeGenerator.lexicalScopes.End(); 1069 1069 1070 1070 pCaseSchedule=temp_pCaseSchedule; -
trunk/abdev/BasicCompiler32/Compile_Var.cpp
r241 r248 4 4 #include <jenga/include/smoothie/LexicalAnalysis.h> 5 5 6 #include <LexicalScop ingImpl.h>6 #include <LexicalScope.h> 7 7 #include <CodeGenerator.h> 8 8 #include <Compiler.h> … … 1055 1055 1056 1056 //レキシカルスコープ 1057 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );1058 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );1057 pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() ); 1058 pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() ); 1059 1059 pVar->bLiving=TRUE; 1060 1060 … … 1090 1090 1091 1091 //レキシカルスコープ 1092 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );1093 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );1092 pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() ); 1093 pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() ); 1094 1094 pVar->bLiving=TRUE; 1095 1095 -
trunk/abdev/BasicCompiler32/MakePeHdr.cpp
r246 r248 5 5 #include <jenga/include/smoothie/Smoothie.h> 6 6 7 #include <LexicalScop ingImpl.h>7 #include <LexicalScope.h> 8 8 #include <Class.h> 9 9 #include <Compiler.h> … … 387 387 388 388 //レキシカルスコープ情報を初期化 389 GetLexicalScopes().Init(obp);389 compiler.codeGenerator.lexicalScopes.Init(obp); 390 390 391 391 -
trunk/abdev/BasicCompiler32/NumOpe_Relation.cpp
r245 r248 142 142 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 143 143 144 const CodeGenerator::PertialSchedule *pFalsePertialSchedule1;144 const PertialSchedule *pFalsePertialSchedule1; 145 145 if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ 146 146 //符号なし演算 … … 156 156 } 157 157 158 const CodeGenerator::PertialSchedule *pTruePertialSchedule;158 const PertialSchedule *pTruePertialSchedule; 159 159 if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ 160 160 //符号なし演算 … … 174 174 175 175 //ja FalseSchedule2(偽へジャンプ) 176 const CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );176 const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 177 177 178 178 //TrueScheduleのジャンプ先の設定 … … 351 351 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 352 352 353 const CodeGenerator::PertialSchedule *pFalsePertialSchedule1;353 const PertialSchedule *pFalsePertialSchedule1; 354 354 if(IsSignedType(AnswerType)){ 355 355 //符号あり演算 … … 365 365 } 366 366 367 const CodeGenerator::PertialSchedule *pTruePertialSchedule;367 const PertialSchedule *pTruePertialSchedule; 368 368 if(IsSignedType(AnswerType)){ 369 369 //符号あり演算 … … 383 383 384 384 //jb FalseSchedule2(偽へジャンプ) 385 const CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );385 const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 386 386 387 387 //TrueScheduleのジャンプ先の設定 … … 563 563 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 564 564 565 const CodeGenerator::PertialSchedule *pTruePertialSchedule1;565 const PertialSchedule *pTruePertialSchedule1; 566 566 if(IsSignedType(AnswerType)){ 567 567 //符号あり演算 … … 577 577 } 578 578 579 const CodeGenerator::PertialSchedule *pFalsePertialSchedule;579 const PertialSchedule *pFalsePertialSchedule; 580 580 if(IsSignedType(AnswerType)){ 581 581 //符号あり演算 … … 595 595 596 596 //jb TrueSchedule2(真へジャンプ) 597 const CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );597 const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true ); 598 598 599 599 //FalseScheduleのジャンプ先の設定 … … 771 771 compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX ); 772 772 773 const CodeGenerator::PertialSchedule *pTruePertialSchedule1;773 const PertialSchedule *pTruePertialSchedule1; 774 774 if(IsSignedType(AnswerType)){ 775 775 //符号有り … … 785 785 } 786 786 787 const CodeGenerator::PertialSchedule *pFalsePertialSchedule;787 const PertialSchedule *pFalsePertialSchedule; 788 788 if(IsSignedType(AnswerType)){ 789 789 //符号有り … … 803 803 804 804 //ja TrueSchedule2(真へジャンプ) 805 const CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );805 const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true ); 806 806 807 807 //FalseScheduleのジャンプ先の設定 … … 975 975 976 976 //jne TrueSchedule1(真へジャンプ) 977 const CodeGenerator::PertialSchedule *pTruePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );977 const PertialSchedule *pTruePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 978 978 979 979 //cmp edx,ecx … … 981 981 982 982 //jne TrueSchedule2(真へジャンプ) 983 const CodeGenerator::PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );983 const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 984 984 985 985 //xor eax,eax(eaxを0にする) … … 1141 1141 1142 1142 //jne FalseSchedule1(偽へジャンプ) 1143 const CodeGenerator::PertialSchedule *pFalsePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );1143 const PertialSchedule *pFalsePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1144 1144 1145 1145 //cmp edx,ecx … … 1147 1147 1148 1148 //jne FalseSchedule2(偽へジャンプ) 1149 const CodeGenerator::PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );1149 const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true ); 1150 1150 1151 1151 //mov eax,1 -
trunk/abdev/BasicCompiler_Common/Compile.cpp
r247 r248 5 5 #include <jenga/include/smoothie/SmoothieException.h> 6 6 7 #include <LexicalScop ingImpl.h>7 #include <LexicalScope.h> 8 8 #include <CodeGenerator.h> 9 9 #include <Compiler.h> … … 173 173 case ESC_EXITWHILE: 174 174 { 175 CScope *pScope = GetLexicalScopes().SearchScope(SCOPE_TYPE_WHILE );175 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_WHILE ); 176 176 if( !pScope ){ 177 177 SetError(12,"Exit While",cp); … … 183 183 case ESC_EXITFOR: 184 184 { 185 CScope *pScope = GetLexicalScopes().SearchScope(SCOPE_TYPE_FOR );185 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_FOR ); 186 186 if( !pScope ){ 187 187 SetError(12,"Exit For",cp); … … 193 193 case ESC_EXITDO: 194 194 { 195 CScope *pScope = GetLexicalScopes().SearchScope(SCOPE_TYPE_DO );195 LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_DO ); 196 196 if( !pScope ){ 197 197 SetError(12,"Exit Do",cp); -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r232 r248 5 5 6 6 #include <Compiler.h> 7 #include <LexicalScop ingImpl.h>7 #include <LexicalScope.h> 8 8 #include <Variable.h> 9 9 #include <NamespaceSupporter.h> … … 989 989 990 990 //レキシカルスコープ 991 pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );992 pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );991 pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() ); 992 pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() ); 993 993 pVar->bLiving=TRUE; 994 994 -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r247 r248 2 2 3 3 #include <NativeCode.h> 4 #include <LexicalScope.h> 4 5 5 6 #ifdef _AMD64_ … … 8 9 #include "../../BasicCompiler32/MachineFixed.h" 9 10 #endif 10 11 11 12 12 void ReallocNativeCodeBuffer(); … … 51 51 }; 52 52 53 // コード生成時の部分的なスケジューリング 54 class PertialSchedule 55 { 56 int codePos; // バッファ位置 57 int typeSize; // 対象サイズ(一般的には8bit/32bit) 58 59 int _obpOld; // 未完成 60 public: 61 PertialSchedule( int codePos, int typeSize ) 62 : codePos( codePos ) 63 , typeSize( typeSize ) 64 { 65 extern int obp; 66 _obpOld = obp; 67 } 68 ~PertialSchedule() 69 { 70 } 71 72 int GetCodePos() const 73 { 74 return codePos; 75 } 76 int GetTypeSize() const 77 { 78 return typeSize; 79 } 80 int GetObpOld() const 81 { 82 return _obpOld; 83 } 84 }; 85 typedef std::vector<const PertialSchedule *> PertialSchedules; 86 87 class LexicalScope 88 { 89 public: 90 enum SCOPE_TYPE{ 91 //ベース 92 SCOPE_TYPE_BASE, 93 94 //分岐 95 SCOPE_TYPE_IF, 96 97 //ループ 98 SCOPE_TYPE_DO, 99 SCOPE_TYPE_FOR, 100 SCOPE_TYPE_WHILE, 101 102 //ケース分け 103 SCOPE_TYPE_SELECT, 104 }; 105 106 private: 107 int level; 108 int StartAddress; 109 SCOPE_TYPE TypeOfStatement; 110 111 PertialSchedules breakPertialSchedules; 112 113 public: 114 LexicalScope( int level, int addr, SCOPE_TYPE TypeOfStatement ) 115 : level( level ) 116 , StartAddress( addr ) 117 , TypeOfStatement( TypeOfStatement ) 118 { 119 } 120 ~LexicalScope() 121 { 122 } 123 124 int GetStartAddress() 125 { 126 return StartAddress; 127 } 128 SCOPE_TYPE GetTypeOfStatement() 129 { 130 return TypeOfStatement; 131 } 132 133 void Break(); 134 void RunScheduleOfBreak(); 135 }; 136 137 class LexicalScopes 138 { 139 LexicalScope **ppScopes; 140 int level; 141 142 public: 143 144 LexicalScopes(){ 145 ppScopes = (LexicalScope **)malloc( 1 ); 146 level=0; 147 } 148 ~LexicalScopes(){ 149 free( ppScopes ); 150 } 151 152 //初期化(関数コンパイルの開始時に呼び出される) 153 void Init(int addr); 154 155 // スコープを開始 156 void Start( int addr, LexicalScope::SCOPE_TYPE TypeOfStatement ); 157 158 // スコープを検索 159 LexicalScope *SearchScope( LexicalScope::SCOPE_TYPE TypeOfStatement ); 160 161 int GetNowLevel(void); 162 void SetNowLevel( int level ); 163 int GetStartAddress(void); 164 165 void End(); 166 167 //スコープ終了時のデストラクタ呼び出し 168 void CallDestructorsOfScopeEnd(); 169 170 //Returnステートメント用のデストラクタ呼び出し 171 void CallDestructorsOfReturn( int BaseLevel = 0 ); 172 }; 173 53 174 class CodeGenerator 54 175 { 55 176 NativeCode *pNativeCode; 56 177 57 public:58 59 // コード生成時の部分的なスケジューリング60 class PertialSchedule61 {62 int codePos; // バッファ位置63 int typeSize; // 対象サイズ(一般的には8bit/32bit)64 65 int _obpOld; // 未完成66 public:67 PertialSchedule( int codePos, int typeSize )68 : codePos( codePos )69 , typeSize( typeSize )70 {71 extern int obp;72 _obpOld = obp;73 }74 ~PertialSchedule()75 {76 }77 78 int GetCodePos() const79 {80 return codePos;81 }82 int GetTypeSize() const83 {84 return typeSize;85 }86 int GetObpOld() const87 {88 return _obpOld;89 }90 };91 92 178 private: 93 179 // 部分スケジュールの管理 94 typedef std::vector<const PertialSchedule *> PertialSchedules;95 180 PertialSchedules pertialSchedules; 96 181 … … 107 192 // Gotoスケジュールの管理 108 193 std::vector<GotoLabelSchedule> gotoLabelSchedules; 194 195 // レキシカルスコープの管理 196 LexicalScopes lexicalScopes; 109 197 110 198 CodeGenerator() -
trunk/abdev/BasicCompiler_Common/include/LexicalScope.h
r245 r248 2 2 3 3 #include <jenga/include/smoothie/Smoothie.h> 4 #include <jenga/include/smoothie/LexicalScoping.h>5 4 6 class ScopeImpl : public CScope 7 { 8 public: 9 ScopeImpl( int level, int addr, SCOPE_TYPE TypeOfStatement ) 10 : CScope( level, addr, TypeOfStatement ) 11 { 12 } 13 ~ScopeImpl(); 5 #include <CodeGenerator.h> 14 6 15 virtual void Break();16 virtual void RunScheduleOfBreak();17 };18 19 class LexicalScopesImpl : public CLexicalScopes20 {21 virtual CScope *CreateScope( int level, int addr, SCOPE_TYPE TypeOfStatement )22 {23 return new ScopeImpl( level, addr, TypeOfStatement );24 }25 26 public:27 28 virtual void End();29 30 //スコープ終了時のデストラクタ呼び出し31 virtual void CallDestructorsOfScopeEnd();32 33 //Returnステートメント用のデストラクタ呼び出し34 virtual void CallDestructorsOfReturn( int BaseLevel = 0 );35 };36 37 LexicalScopesImpl &GetLexicalScopes(); -
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.