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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/OperatorProc.cpp

    r424 r435  
    2626}
    2727
    28 int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,BOOL *bUseHeap,int &sp)
     28int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp)
    2929{
    3030    Type leftType( type_stack[sp-2], index_stack[sp-2] );
     
    9595        if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
    9696            //一時オブジェクトはメソッド内で破棄される
    97             bUseHeap[sp-1]=0;
     97            isNeedHeapFreeStructureStack[sp-1] = false;
    9898        }
    9999    }
     
    140140
    141141    //ヒープ解放用に退避
    142     if(bUseHeap[sp-1]){
     142    if(isNeedHeapFreeStructureStack[sp-1]){
    143143        //mov esi,eax
    144144        compiler.codeGenerator.op_mov_RR(REG_ESI,REG_EAX);
    145145    }
    146     if(bUseHeap[sp-2]){
     146    if(isNeedHeapFreeStructureStack[sp-2]){
    147147        //mov edi,ecx
    148148        compiler.codeGenerator.op_mov_RR(REG_EDI,REG_ECX);
     
    198198    }
    199199
    200     if(bUseHeap[sp-1]){
     200    if(isNeedHeapFreeStructureStack[sp-1]){
    201201        FreeTempObject(REG_ESI,(CClass *)index_stack[sp-1]);
    202202    }
    203     if(bUseHeap[sp-2]){
     203    if(isNeedHeapFreeStructureStack[sp-2]){
    204204        FreeTempObject(REG_EDI,(CClass *)index_stack[sp-2]);
    205205    }
     
    209209    index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
    210210
    211     if( pUserProc->ReturnType().IsStruct() ){
     211    if( pUserProc->ReturnType().IsStruct() )
     212    {
    212213        //構造体が戻ったときはヒープ領域にインスタンスが格納されている
    213214        //※後にfreeする必要あり
    214         bUseHeap[sp-1]=1;
    215     }
    216     else bUseHeap[sp-1]=0;
     215        isNeedHeapFreeStructureStack[sp-1] = true;
     216    }
     217    else
     218    {
     219        isNeedHeapFreeStructureStack[sp-1] = false;
     220    }
    217221
    218222    return 1;
     
    222226    int type_stack[10];
    223227    LONG_PTR index_stack[10];
    224     BOOL array_bUseHeap[10];
     228    bool array_bUseHeap[10];
    225229    int sp=2;
    226230
Note: See TracChangeset for help on using the changeset viewer.