Changeset 246 in dev for trunk/abdev/BasicCompiler_Common
- Timestamp:
- Jul 28, 2007, 1:30:22 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/Compile.cpp
r241 r246 32 32 DWORD *pExitSubSchedule; 33 33 int ExitSubScheduleNum; 34 35 //Goto未知ラベル スケジュール36 GOTOLABELSCHEDULE *pGotoLabelSchedule;37 int GotoLabelScheduleNum;38 34 39 35 //グローバル変数初期バッファ … … 123 119 void ChangeOpcode(char *Command){ 124 120 extern HANDLE hHeap; 125 int i,i2;126 121 127 122 if(Command[0]=='\0') … … 141 136 142 137 //書き込みスケジュール 143 for(i=0;i<GotoLabelScheduleNum;i++){ 144 if(lstrcmp(pGotoLabelSchedule[i].pName,Command+1)==0){ 145 *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long)); 146 147 HeapDefaultFree(pGotoLabelSchedule[i].pName); 148 138 std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin(); 139 while( it != compiler.codeGenerator.gotoLabelSchedules.end() ) 140 { 141 if( it->GetName() == Command+1 ) 142 { 143 *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long)); 144 149 145 //詰める 150 GotoLabelScheduleNum--; 151 for(i2=i;i2<GotoLabelScheduleNum;i2++){ 152 pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName; 153 pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line; 154 pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos; 155 } 156 i--; 157 continue; 146 it = compiler.codeGenerator.gotoLabelSchedules.erase( it ); 147 } 148 else 149 { 150 it++; 158 151 } 159 152 } … … 552 545 553 546 //書き込みスケジュール 554 for(i=0;i<GotoLabelScheduleNum;i++){ 555 if(pGotoLabelSchedule[i].pName==0&& 556 pGotoLabelSchedule[i].line==i3){ 557 *((long *)(OpBuffer+pGotoLabelSchedule[i].pos))=obp-(pGotoLabelSchedule[i].pos+sizeof(long)); 558 547 std::vector<GotoLabelSchedule>::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin(); 548 while( it != compiler.codeGenerator.gotoLabelSchedules.end() ) 549 { 550 if( it->GetName().size() == 0 && it->GetLineNum() == i3 ) 551 { 552 *((long *)( OpBuffer + it->GetNativeCodePos() ))=obp-(it->GetNativeCodePos()+sizeof(long)); 553 559 554 //詰める 560 GotoLabelScheduleNum--; 561 for(i2=i;i2<GotoLabelScheduleNum;i2++){ 562 pGotoLabelSchedule[i2].pName=pGotoLabelSchedule[i2+1].pName; 563 pGotoLabelSchedule[i2].line=pGotoLabelSchedule[i2+1].line; 564 pGotoLabelSchedule[i2].pos=pGotoLabelSchedule[i2+1].pos; 565 } 566 i--; 555 it = compiler.codeGenerator.gotoLabelSchedules.erase( it ); 556 } 557 else 558 { 559 it++; 567 560 } 568 561 } -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r245 r246 12 12 void ReallocNativeCodeBuffer(); 13 13 14 //Goto未知ラベル 15 class GotoLabelSchedule 16 { 17 std::string name; 18 int line; 19 int nativeCodePos; 20 int sourceCodePos; 21 public: 22 GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos ) 23 : name( name ) 24 , line( -1 ) 25 , nativeCodePos( nativeCodePos ) 26 , sourceCodePos( sourceCodePos ) 27 { 28 } 29 GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos ) 30 : line( line ) 31 , nativeCodePos( nativeCodePos ) 32 , sourceCodePos( sourceCodePos ) 33 { 34 } 35 const std::string &GetName() const 36 { 37 return name; 38 } 39 int GetLineNum() const 40 { 41 return line; 42 } 43 int GetNativeCodePos() const 44 { 45 return nativeCodePos; 46 } 47 int GetSourceCodePos() const 48 { 49 return sourceCodePos; 50 } 51 }; 52 14 53 class CodeGenerator 15 54 { … … 61 100 62 101 public: 102 103 // Gotoスケジュールの管理 104 std::vector<GotoLabelSchedule> gotoLabelSchedules; 63 105 64 106 CodeGenerator() … … 141 183 const PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false ); 142 184 void op_jmp_continue(); 185 void op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule ); 143 186 144 187 -
trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp
r245 r246 202 202 op_jmp( GetContinueCodePosOld()-obp, sizeof(long), false, true ); 203 203 } 204 void CodeGenerator::op_jmp_goto_schedule( const GotoLabelSchedule &gotoLabelSchedule ) 205 { 206 // オペコード 207 pNativeCode->Put( (char)0xE9 ); 208 209 gotoLabelSchedules.push_back( gotoLabelSchedule ); 210 211 pNativeCode->Put( (long)0 ); 212 }
Note:
See TracChangeset
for help on using the changeset viewer.