Changeset 435 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Mar 15, 2008, 1:20:13 PM (16 years ago)
Author:
dai_9181
Message:

関数の戻り値の構造体など、一時メモリに保持された構造体のメンバに直接アクセスした場合、その一時メモリの解放が正常に行われないバグを修正(まずは32bit版のみ)

Location:
trunk/abdev/BasicCompiler_Common
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Compile.cpp

    r424 r435  
    457457        case COM_LET:
    458458            OpcodeCalc(Command+2);
     459
    459460            break;
    460461        default:
    461462            OpcodeOthers(Command);
     463
     464            // コード生成過程で発生した構造体の一時メモリを破棄する
     465            compiler.codeGenerator.op_FreeTempStructure();
     466
    462467            break;
    463468    }
  • trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h

    r370 r435  
    198198    std::vector<long> continueCodePositions;
    199199
     200    // コンパイル中のステップにおいて、構造体の一時オブジェクトの解放が必要かどうか
     201    bool isNeedFreeTempStructureInCurrentStep;
     202
    200203public:
    201204
     
    215218    CodeGenerator()
    216219        : pNativeCode( 0 )
     220        , isNeedFreeTempStructureInCurrentStep( false )
    217221    {
    218222    }
     
    294298    void op_jmp_exitsub();
    295299    void op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos );
     300    void op_AddNeedFreeTempStructure( int reg );
     301    void op_FreeTempStructure();
    296302
    297303
  • trunk/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp

    r357 r435  
    304304    pNativeCode->Put( (long)0 );
    305305}
     306
     307void 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}
     344void 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.