Changeset 94 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Apr 14, 2007, 8:36:04 PM (17 years ago)
Author:
dai_9181
Message:

New[]を禁止した。
一部の動的型情報が生成されないバグを修正。
As演算子によるダウンキャストを許可(プログラム的なチェックはまだ走っていない)

Location:
BasicCompiler_Common
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r92 r94  
    742742    if( IsEquals( pClass ) ) return true;
    743743    return IsSubClass( pClass );
     744}
     745
     746// 自身と等しいまたは派生クラス、基底クラスかどうかを確認
     747bool CClass::IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const
     748{
     749    if( IsEquals( &objClass ) ) return true;
     750    if( IsSubClass( &objClass ) ) return true;
     751    if( objClass.IsSubClass( this ) ) return true;
     752    return false;
    744753}
    745754
     
    15421551        if( !objClass.IsUsing() ){
    15431552            // 未使用のクラスは無視する
     1553            if( (string)objClass.name == "CTest"){
     1554                int test=0;
     1555            }
    15441556            continue;
    15451557        }
    15461558
     1559        char referenceOffsetsBuffer[1024] = "";
     1560        int numOfReference = 0;
     1561        for( int i=0; i<objClass.iMemberNum; i++ ){
     1562            CMember &member = *objClass.ppobj_Member[i];
     1563
     1564            if( member.IsObject() || member.IsPointer() ){
     1565                if( referenceOffsetsBuffer[0] ){
     1566                    lstrcat( referenceOffsetsBuffer, "," );
     1567                }
     1568
     1569                sprintf( referenceOffsetsBuffer + lstrlen( referenceOffsetsBuffer ),
     1570                    "%d",
     1571                    objClass.GetMemberOffset( member.name ) );
     1572
     1573                numOfReference++;
     1574            }
     1575        }
     1576
    15471577        sprintf( temporary
    1548             , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\"))"
     1578            , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\",[%s],%d))"
    15491579            , 1
    15501580            , ESC_NEW
    1551             , ""                // 名前空間 (TODO: 実装)
    1552             , objClass.name     // クラス名
     1581            , ""                        // 名前空間 (TODO: 実装)
     1582            , objClass.name             // クラス名
     1583            , referenceOffsetsBuffer    // 参照メンバオフセット配列
     1584            , numOfReference            // 参照メンバの個数
    15531585            );
    15541586
  • BasicCompiler_Common/Class.h

    r91 r94  
    157157
    158158    // メンバのオフセットを取得
    159     int GetMemberOffset( const char *memberName, int *pMemberNum ) const;
     159    int GetMemberOffset( const char *memberName, int *pMemberNum = NULL ) const;
    160160
    161161private:
     
    199199    //自身と等しいまたは派生クラスかどうかを確認
    200200    bool IsEqualsOrSubClass( const CClass *pClass ) const;
     201
     202    // 自身と等しいまたは派生クラス、基底クラスかどうかを確認
     203    bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
    201204
    202205
  • BasicCompiler_Common/NumOpe_GetType.cpp

    r79 r94  
    309309    }
    310310
     311    if( expression[0] == '[' ){
     312        if( !baseType.IsPointer() ){
     313            SetError(1,NULL,cp);
     314            return false;
     315        }
     316
     317        resultType = baseType;
     318        return true;
     319    }
     320
    311321
    312322    /////////////////////////////////
     
    353363                    || isNothing_stack[sp-2] ){
    354364                        // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
     365                }
     366                else if( idCalc == CALC_AS
     367                    && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
     368                    && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
     369                    )){
     370                        // ダウンキャストを許可する
    355371                }
    356372                else{
  • BasicCompiler_Common/Subroutine.cpp

    r88 r94  
    792792    Smoothie::Meta::procPointers.clear();
    793793}
     794
     795
     796
     797bool IsNeedProcCompile(){
     798    for(int i2=0;i2<MAX_HASH;i2++){
     799        extern UserProc **ppSubHash;
     800        UserProc *pUserProc=ppSubHash[i2];
     801        while(pUserProc){
     802            if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
     803                return true;
     804            }
     805
     806            pUserProc=pUserProc->pNextData;
     807        }
     808    }
     809    return false;
     810}
  • BasicCompiler_Common/common.h

    r93 r94  
    445445int AddProcPtrInfo( const string &typeExpression, int nowLine );
    446446void DeleteProcPtrInfo(void);
     447bool IsNeedProcCompile();
    447448
    448449//OldStatement.cpp
Note: See TracChangeset for help on using the changeset viewer.