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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.