Changeset 94 in dev


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

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

Files:
11 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Object.cpp

    r90 r94  
    1818    jnz_back=obp;
    1919
    20     //push ebx
    21     op_push(REG_EBX);
     20    if(bSomeObjects){
     21        SetError();
     22
     23        //push ebx
     24        op_push(REG_EBX);
     25    }
    2226
    2327    // ※ここでプッシュされた値はコンストラクタのthisポインタとなる
     
    7175    op_pop(REG_EAX);
    7276
    73     //pop ebx
    74     op_pop(REG_EBX);
    75 
    7677    if(bSomeObjects){
     78        //pop ebx
     79        op_pop(REG_EBX);
     80
    7781        //add eax,TypeSize
    7882        OpBuffer[obp++]=(char)0x05;
  • BasicCompiler32/Compile_ProcOp.cpp

    r92 r94  
    873873    }
    874874
     875    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
     876    extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     877    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
     878
    875879    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    876880    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
     
    882886    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    883887
    884 Repeat:
     888repeat:
    885889    for(i2=0;i2<MAX_HASH;i2++){
    886890        pUserProc=ppSubHash[i2];
     
    891895    }
    892896
    893     //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    894     for(i2=0;i2<MAX_HASH;i2++){
    895         pUserProc=ppSubHash[i2];
    896         while(pUserProc){
    897             if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
    898                 goto Repeat;
    899             }
    900 
    901             pUserProc=pUserProc->pNextData;
     897    if( IsNeedProcCompile() ){
     898        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     899        goto repeat;
     900    }
     901
     902    //_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル
     903    pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus();
     904    CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes );
     905
     906    if( IsNeedProcCompile() ){
     907        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     908        for(i2=0;i2<MAX_HASH;i2++){
     909            pUserProc=ppSubHash[i2];
     910            while(pUserProc){
     911                CompileBufferInProcedure( *pUserProc );
     912                pUserProc=pUserProc->pNextData;
     913            }
    902914        }
    903915    }
  • BasicCompiler32/NumOpe.cpp

    r93 r94  
    224224                    || isNothing_stack[sp-2] ){
    225225                        // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
     226                }
     227                else if( idCalc == CALC_AS
     228                    && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
     229                    && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
     230                    )){
     231                        // ダウンキャストを許可する
    226232                }
    227233                else{
  • BasicCompiler64/Compile_Object.cpp

    r90 r94  
    1919
    2020    if(bSomeObjects){
     21        SetError();
    2122        //mov qword ptr[rsp+offset],rbx     ※スタックフレームを利用
    2223        pobj_sf->push(REG_RBX);
  • BasicCompiler64/Compile_ProcOp.cpp

    r91 r94  
    845845    }
    846846
     847    //_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
     848    extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
     849    pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
     850
    847851    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    848852    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
     
    854858    pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
    855859
    856 Repeat:
     860repeat:
    857861    for(i2=0;i2<MAX_HASH;i2++){
    858862        pUserProc=ppSubHash[i2];
     
    863867    }
    864868
    865     //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    866     for(i2=0;i2<MAX_HASH;i2++){
    867         pUserProc=ppSubHash[i2];
    868         while(pUserProc){
    869             if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
    870                 goto Repeat;
    871             }
    872 
    873             pUserProc=pUserProc->pNextData;
     869    if( IsNeedProcCompile() ){
     870        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     871        goto repeat;
     872    }
     873
     874    //_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル
     875    pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus();
     876    CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes );
     877
     878    if( IsNeedProcCompile() ){
     879        //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
     880        for(i2=0;i2<MAX_HASH;i2++){
     881            pUserProc=ppSubHash[i2];
     882            while(pUserProc){
     883                CompileBufferInProcedure( *pUserProc );
     884                pUserProc=pUserProc->pNextData;
     885            }
    874886        }
    875887    }
  • BasicCompiler64/NumOpe.cpp

    r93 r94  
    249249                        // 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
    250250                }
     251                else if( idCalc == CALC_AS
     252                    && type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
     253                    && ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
     254                    )){
     255                        // ダウンキャストを許可する
     256                }
    251257                else{
    252258                    //オーバーロードされたオペレータを呼び出す
  • 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.