Changeset 417 in dev


Ignore:
Timestamp:
Mar 7, 2008, 5:32:29 AM (17 years ago)
Author:
dai_9181
Message:

[416]のコミットによって発生した64bit版での不具合を修正。

Location:
trunk/abdev
Files:
5 edited

Legend:

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

    r416 r417  
    205205
    206206    //変数アドレスを取得
     207    RELATIVE_VAR VarRelativeVar;
    207208    if( !TermOpeOnlyVariable( variable, varType, VarRelativeVar, true ) )
    208209    {
     
    213214    //レジスタのブロッキングを解除
    214215    pobj_BlockReg->clear();
    215 
    216     if( !result )
    217     {
    218         return;
    219     }
    220216
    221217    if(varType.GetBasicType()&FLAG_PTR){
  • trunk/abdev/BasicCompiler64/NumOpe.cpp

    r416 r417  
    638638bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly, bool isWriteAccess )
    639639{
     640    bool isInitRegSwitch = false;
     641    if( !pobj_reg )
     642    {
     643        isInitRegSwitch = true;
     644
     645        //作業用レジスタを取得
     646        pobj_reg = new CRegister( REG_RAX );
     647    }
     648
     649    //エラー時の復旧用
     650    CRegister objReg_Backup = *pobj_reg;
     651
     652
    640653    RELATIVE_VAR relativeVar;
    641654    bool isVariable = false;
     
    650663    }
    651664
     665
     666    if( !result )
     667    {
     668        *pobj_reg = objReg_Backup;
     669    }
     670
     671    if( isInitRegSwitch ){
     672        //整合性をチェック(バグ回避)
     673        if( result )
     674        {
     675            pobj_reg->bug_check();
     676        }
     677
     678        //作業レジスタを解放
     679        delete pobj_reg;
     680        pobj_reg = NULL;
     681    }
     682
    652683    return result;
    653684}
    654685bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess )
    655686{
     687    if( pobj_reg )
     688    {
     689        SetError();
     690    }
     691
     692    //作業用レジスタを取得
     693    pobj_reg = new CRegister( REG_NON );
     694
    656695    bool isLiteral, isVariable = false;
    657696    bool result = _TermOpe( term, Type(), resultType, isLiteral, NULL, NULL, false, isVariable, relativeVar, isWriteAccess );
     
    661700        SetError();
    662701    }
     702
     703    //整合性をチェック(バグ回避)
     704    if( result )
     705    {
     706        pobj_reg->bug_check();
     707    }
     708
     709    //作業レジスタを解放
     710    delete pobj_reg;
     711    pobj_reg=0;
    663712
    664713    return result;
     
    13271376            BOOL *pbUseHeap )
    13281377{
    1329     BOOL bInitRegSwitch=0;
    1330     if(!pobj_reg){
    1331         bInitRegSwitch=1;
     1378    bool isInitRegSwitch = false;
     1379    if( !pobj_reg )
     1380    {
     1381        isInitRegSwitch = true;
    13321382
    13331383        //作業用レジスタを取得
    1334         pobj_reg=new CRegister(*pReg);
     1384        pobj_reg = new CRegister( *pReg );
    13351385    }
    13361386
    13371387    //エラー時の復旧用
    1338     CRegister objReg_Backup;
    1339     objReg_Backup=*pobj_reg;
     1388    CRegister objReg_Backup = *pobj_reg;
    13401389
    13411390    *pReg = pobj_reg->GetNextReg();
     
    13471396    if( !result )
    13481397    {
    1349         *pobj_reg=objReg_Backup;
    1350     }
    1351 
    1352     if(bInitRegSwitch){
     1398        *pobj_reg = objReg_Backup;
     1399    }
     1400
     1401    if( isInitRegSwitch ){
    13531402        //整合性をチェック(バグ回避)
    13541403        if( result )
     
    13591408        //作業レジスタを解放
    13601409        delete pobj_reg;
    1361         pobj_reg=0;
     1410        pobj_reg = NULL;
    13621411    }
    13631412
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r412 r417  
    565565    std::string GetStaticDefiningStringAsMemberTypeInfoNames() const;
    566566    std::string GetStaticDefiningStringAsMemberOffsets() const;
     567    void GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset = 0 ) const;
    567568
    568569
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r412 r417  
    12921292            // 未使用のクラスは無視する
    12931293            continue;
    1294         }   
    1295 
    1296         char referenceOffsetsBuffer[1024] = "";
     1294        }
     1295
     1296        std::string referenceOffsetsBuffer;
    12971297        int numOfReference = 0;
    1298         BOOST_FOREACH( CMember *pMember, objClass.GetDynamicMembers() ){
    1299             if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() ){
    1300                 if( referenceOffsetsBuffer[0] ){
    1301                     lstrcat( referenceOffsetsBuffer, "," );
    1302                 }
    1303 
    1304                 sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
    1305                     "%d",
    1306                     objClass.GetMemberOffset( pMember->GetName().c_str() ) );
    1307 
    1308                 numOfReference++;
    1309             }
    1310         }
     1298        objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );
    13111299
    13121300        sprintf( temporary
     
    13171305            , objClass.GetName().c_str()                            // クラス名
    13181306            , objClass.GetFullName().c_str()                        // フルネーム
    1319             , referenceOffsetsBuffer                                // 参照メンバオフセット配列
     1307            , referenceOffsetsBuffer.c_str()                        // 参照メンバオフセット配列
    13201308            , numOfReference                                        // 参照メンバの個数
    13211309            );
     
    15771565    return result;
    15781566}
     1567
     1568void CClass::GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset ) const
     1569{
     1570    const CClass &thisClass = *this;
     1571    BOOST_FOREACH( const CMember *pMember, thisClass.GetDynamicMembers() )
     1572    {
     1573        if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() )
     1574        {
     1575            if( referenceOffsetsBuffer.size() )
     1576            {
     1577                referenceOffsetsBuffer += ",";
     1578            }
     1579
     1580            char temp[255];
     1581            sprintf( temp, "%d", baseOffset + thisClass.GetMemberOffset( pMember->GetName().c_str() ) );
     1582            referenceOffsetsBuffer += temp;
     1583
     1584            numOfReference++;
     1585        }
     1586        if( pMember->GetType().IsStruct() && !pMember->GetType().IsPointer() )
     1587        {
     1588            // 構造体の実体をメンバに持つとき
     1589            int baseOffset = thisClass.GetMemberOffset( pMember->GetName().c_str() );
     1590
     1591            // 構造体メンバでGCによるチェックが必要な参照位置を追加
     1592            pMember->GetType().GetClass().GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference, baseOffset );
     1593        }
     1594    }
     1595}
  • trunk/abdev/BasicCompiler_Common/src/DataTable.cpp

    r409 r417  
    293293    BOOST_FOREACH( const std::string &paramStr, parameters )
    294294    {
     295        if( paramStr.size() == 0 )
     296        {
     297            throw;
     298        }
    295299        if( paramStr[0] == '\"' )
    296300        {
Note: See TracChangeset for help on using the changeset viewer.