Changeset 435 in dev for trunk/abdev/BasicCompiler_Common
- Timestamp:
- Mar 15, 2008, 1:20:13 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/Compile.cpp
r424 r435 457 457 case COM_LET: 458 458 OpcodeCalc(Command+2); 459 459 460 break; 460 461 default: 461 462 OpcodeOthers(Command); 463 464 // コード生成過程で発生した構造体の一時メモリを破棄する 465 compiler.codeGenerator.op_FreeTempStructure(); 466 462 467 break; 463 468 } -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r370 r435 198 198 std::vector<long> continueCodePositions; 199 199 200 // コンパイル中のステップにおいて、構造体の一時オブジェクトの解放が必要かどうか 201 bool isNeedFreeTempStructureInCurrentStep; 202 200 203 public: 201 204 … … 215 218 CodeGenerator() 216 219 : pNativeCode( 0 ) 220 , isNeedFreeTempStructureInCurrentStep( false ) 217 221 { 218 222 } … … 294 298 void op_jmp_exitsub(); 295 299 void op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos ); 300 void op_AddNeedFreeTempStructure( int reg ); 301 void op_FreeTempStructure(); 296 302 297 303 -
trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp
r357 r435 304 304 pNativeCode->Put( (long)0 ); 305 305 } 306 307 void CodeGenerator::op_AddNeedFreeTempStructure( int reg ) 308 { 309 #ifdef _AMD64_ 310 ////////////////////////////////////////////////////// 311 ///// レジスタ資源のバックアップ 312 { BACKUP_REGISTER_RESOURCE 313 ////////////////////////////////////////////////////// 314 315 //mov rcx,reg 316 compiler.codeGenerator.op_mov_RR( REG_RCX, reg ); 317 318 //call _System_AddNeedFreeTempStructure 319 extern const UserProc *pSub_System_AddNeedFreeTempStructure; 320 compiler.codeGenerator.op_call( pSub_System_AddNeedFreeTempStructure ); 321 322 ///////////////////////////////////////////// 323 ////// レジスタ資源を復元 324 RESTORE_REGISTER_RESOURCE 325 }//////////////////////////////////////////// 326 #else 327 328 //push useReg(引き続き利用するため、退避しておく) 329 compiler.codeGenerator.op_push( reg ); 330 331 //push useReg 332 compiler.codeGenerator.op_push( reg ); 333 334 //call _System_AddNeedFreeTempStructure 335 extern const UserProc *pSub_System_AddNeedFreeTempStructure; 336 compiler.codeGenerator.op_call( pSub_System_AddNeedFreeTempStructure ); 337 338 //pop useReg(復元する) 339 compiler.codeGenerator.op_pop( reg ); 340 #endif 341 342 isNeedFreeTempStructureInCurrentStep = true; 343 } 344 void CodeGenerator::op_FreeTempStructure() 345 { 346 if( !isNeedFreeTempStructureInCurrentStep ) 347 { 348 // 解放の必要はない 349 return; 350 } 351 352 // call _System_FreeTempStructure 353 extern const UserProc *pSub_System_FreeTempStructure; 354 op_call( pSub_System_FreeTempStructure ); 355 356 isNeedFreeTempStructureInCurrentStep = false; 357 }
Note:
See TracChangeset
for help on using the changeset viewer.