Ignore:
Timestamp:
Mar 15, 2008, 3:33:36 PM (16 years ago)
Author:
dai_9181
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/CParameter.cpp

    r331 r436  
    6565                int reg = REG_RAX;
    6666                Type calcType;
    67                 NumOpe( &reg, Parms[i2], dummyType, calcType );
     67                bool isNeedHeapFreeStructure;
     68                NumOpe( &reg, Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure );
    6869
    6970                if( !calcType.IsStruct() ){
     
    8687                    i2);
    8788
    88                 if( result ){
     89                if( result )
     90                {
    8991                    useTempParameters[i2] = true;
     92                    isNeedFreeStructures[i2] = isNeedHeapFreeStructure;
    9093                    useTempObject = true;
    9194
     
    109112                // 構造体の一時メモリ
    110113
    111                 //メモリを解放する
    112 
    113                 pobj_sf->pop( REG_RCX );
    114 
    115                 //call free
    116                 extern const UserProc *pSub_free;
    117                 compiler.codeGenerator.op_call(pSub_free);
    118             }
    119             else{
     114                if( isNeedFreeStructures[i2] )
     115                {
     116                    //メモリを解放する
     117
     118                    pobj_sf->pop( REG_RCX );
     119
     120                    //call free
     121                    extern const UserProc *pSub_free;
     122                    compiler.codeGenerator.op_call(pSub_free);
     123                }
     124                else
     125                {
     126                    pobj_sf->pop();
     127                }
     128            }
     129            else
     130            {
    120131                pobj_sf->pop();
    121132                pobj_sf->pop();
     
    148159
    149160        Type calcType;
    150         BOOL bUseHeap;
     161        bool isNeedHeapFreeStructure;
    151162        int temp_reg=REG_RAX;
    152163        NumOpe( &temp_reg,
     
    154165            baseType,
    155166            calcType,
    156             &bUseHeap );
     167            &isNeedHeapFreeStructure );
    157168
    158169
     
    169180            baseType,
    170181            calcType,
    171             &RelativeVar,bUseHeap);
     182            &RelativeVar,isNeedHeapFreeStructure);
    172183
    173184
     
    282293            temp_reg=reg;
    283294
    284             BOOL bCalcUseHeap;
    285295            Type calcType;
    286             if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){
     296            bool isNeedHeapFreeStructure;
     297            if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure ) ){
    287298                break;
    288299            }
     
    294305                    !dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
    295306                        //キャスト演算子のオーバーロードに対応する
    296                         CallCastOperatorProc( reg, calcType, bCalcUseHeap,dummyType );
     307                        CallCastOperatorProc( reg, calcType, isNeedHeapFreeStructure,dummyType );
    297308                }
    298309            }
Note: See TracChangeset for help on using the changeset viewer.