Changeset 90 in dev


Ignore:
Timestamp:
Apr 7, 2007, 3:02:29 PM (18 years ago)
Author:
dai_9181
Message:

実行時型情報の生成にほぼ対応した。

Files:
12 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Object.cpp

    r75 r90  
    4848        PROCFLAG_NEW,"",0);
    4949
     50    {
     51        // 動的型情報をセットする
     52        // obj._System_SetType( _System_TypeBase.Search( strNamespace, name ) )
     53        subs.clear();
     54        pobj_c->EnumMethod( "_System_SetType", subs );
     55        if( subs.size() == 1 ){
     56            char temporary[VN_SIZE];
     57            sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->name );
     58
     59            Opcode_CallProc(temporary,
     60                subs[0],
     61                PROCFLAG_NEW,"",0);
     62        }
     63        else{
     64            SetError();
     65        }
     66    }
     67
    5068
    5169
  • BasicCompiler32/Compile_ProcOp.cpp

    r89 r90  
    204204        obp+=31;
    205205    }
    206     else if( userProc.GetName() == "InitializeUserTypes"
     206    else{
     207        SetError();
     208    }
     209}
     210void AutoGeneration(UserProc &userProc){
     211    if( userProc.GetName() == "InitializeUserTypes"
    207212        && userProc.HasParentClass()
    208213        && (string)userProc.GetParentClass().name == "_System_TypeBase" ){
     
    540545    //////////////////////////////////////////
    541546    ////// プロシージャ内をコンパイル ////////
    542     if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0);
     547    if( pUserProc->IsAutoGeneration() ){
     548        AutoGeneration( *pUserProc );
     549    }
    543550    else{
    544         if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0);
    545         else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0);
     551        if(pUserProc->IsMacro()){
     552            CompileBuffer(ESC_ENDMACRO,0);
     553        }
     554        else{
     555            if(pUserProc->IsSub()){
     556                CompileBuffer(ESC_ENDSUB,0);
     557            }
     558            else if(pUserProc->IsFunction()){
     559                CompileBuffer(ESC_ENDFUNCTION,0);
     560            }
     561        }
    546562    }
    547563    //////////////////////////////////////////
  • BasicCompiler32/MakePeHdr.cpp

    r88 r90  
    249249    if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "_System_TypeBase.InitializeUserTypes",1 ) ){
    250250        pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
    251         pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsSystemProc();
     251        pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
    252252    }
    253253
  • BasicCompiler64/Compile_Object.cpp

    r75 r90  
    4848        pUserProc,
    4949        PROCFLAG_NEW,"",0);
     50
     51    {
     52        // 動的型情報をセットする
     53        // obj._System_SetType( _System_TypeBase.Search( strNamespace, name ) )
     54        subs.clear();
     55        pobj_c->EnumMethod( "_System_SetType", subs );
     56        if( subs.size() == 1 ){
     57            char temporary[VN_SIZE];
     58            sprintf( temporary, "_System_TypeBase.Search(\"\",\"%s\"))", pobj_c->name );
     59
     60            Opcode_CallProc(temporary,
     61                subs[0],
     62                PROCFLAG_NEW,"",0);
     63        }
     64        else{
     65            SetError();
     66        }
     67    }
    5068
    5169    if(bSomeObjects){
  • BasicCompiler64/Compile_ProcOp.cpp

    r89 r90  
    195195        obp+=31;
    196196    }
    197     else if( userProc.GetName() == "InitializeUserTypes"
     197    else{
     198        SetError();
     199    }
     200}
     201void AutoGeneration(UserProc &userProc){
     202    if( userProc.GetName() == "InitializeUserTypes"
    198203        && userProc.HasParentClass()
    199204        && (string)userProc.GetParentClass().name == "_System_TypeBase" ){
     
    591596    //////////////////////////////////////////
    592597    ////// プロシージャ内をコンパイル ////////
    593     if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0);
     598    if( pUserProc->IsAutoGeneration() ){
     599        AutoGeneration( *pUserProc );
     600    }
    594601    else{
    595         if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0);
    596         else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0);
     602        if(pUserProc->IsMacro()){
     603            CompileBuffer(ESC_ENDMACRO,0);
     604        }
     605        else{
     606            if(pUserProc->IsSub()){
     607                CompileBuffer(ESC_ENDSUB,0);
     608            }
     609            else if(pUserProc->IsFunction()){
     610                CompileBuffer(ESC_ENDFUNCTION,0);
     611            }
     612        }
    597613    }
    598614    //////////////////////////////////////////
  • BasicCompiler64/MakePeHdr.cpp

    r89 r90  
    230230    if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "_System_TypeBase.InitializeUserTypes",1 ) ){
    231231        pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
    232         pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsSystemProc();
     232        pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
    233233    }
    234234
  • BasicCompiler_Common/Class.cpp

    r89 r90  
    146146
    147147
    148 
    149 CClass::CClass(const char *name){
    150     memset(this,0,sizeof(CClass));
    151 
    152     vtbl_offset=-1;
    153 
     148CClass::CClass(const char *name):
     149    ConstructorMemberSubIndex( 0 ),
     150    DestructorMemberSubIndex( 0 ),
     151    classType( Class ),
     152    pobj_InheritsClass( NULL ),
     153    ppobj_Member( NULL ),
     154    iMemberNum( 0 ),
     155    vtbl_num( 0 ),
     156    iAlign( 0 ),
     157    vtbl_offset( -1 ),
     158    isCompilingConstructor( false ),
     159    isCompilingDestructor( false ),
     160    pobj_NextClass( NULL )
     161{
    154162    this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
    155163    lstrcpy(this->name,name);
    156 
    157     isCompilingConstructor = false;
    158     isCompilingDestructor = false;
    159164}
    160165CClass::~CClass(){
     
    189194}
    190195
     196bool CClass::IsClass() const
     197{
     198    return classType == CClass::Class;
     199}
     200bool CClass::IsInterface() const
     201{
     202    return classType == CClass::Interface;
     203}
     204bool CClass::IsEnum() const
     205{
     206    return classType == CClass::Enum;
     207}
     208bool CClass::IsDelegate() const
     209{
     210    return classType == CClass::Delegate;
     211}
    191212bool CClass::IsStructure() const
    192213{
     
    194215}
    195216
    196 void CClass::Inherits( CClass *pInheritsClass ){
     217bool CClass::Inherits( CClass &inheritsClass, int nowLine ){
     218
     219    //ループ継承でないかをチェック
     220    if(pobj_LoopRefCheck->check(inheritsClass)){
     221        SetError(123,inheritsClass.name,nowLine);
     222        return false;
     223    }
     224
     225    if( inheritsClass.ppobj_Member == 0 ){
     226        //継承先が読み取られていないとき
     227        pobj_LoopRefCheck->add(this->name);
     228        pobj_DBClass->GetClass_recur(inheritsClass.name);
     229        pobj_LoopRefCheck->del(this->name);
     230    }
    197231
    198232    //メンバをコピー
     
    201235        0,
    202236        ppobj_Member,
    203         pInheritsClass->iMemberNum*sizeof(CMember *));
    204     iMemberNum=pInheritsClass->iMemberNum;
    205     for(int i3=0;i3<pInheritsClass->iMemberNum;i3++){
    206         ppobj_Member[i3]=new CMember( *pInheritsClass->ppobj_Member[i3] );
     237        ( iMemberNum + inheritsClass.iMemberNum )*sizeof(CMember *));
     238    for(int i3=0;i3<inheritsClass.iMemberNum;i3++){
     239        ppobj_Member[iMemberNum]=new CMember( *inheritsClass.ppobj_Member[i3] );
    207240
    208241        //dwAccess
    209         if(pInheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
    210             ppobj_Member[i3]->dwAccess=ACCESS_NON;
    211         else ppobj_Member[i3]->dwAccess=pInheritsClass->ppobj_Member[i3]->dwAccess;
     242        if(inheritsClass.ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
     243            ppobj_Member[iMemberNum]->dwAccess=ACCESS_NON;
     244        else ppobj_Member[iMemberNum]->dwAccess=inheritsClass.ppobj_Member[i3]->dwAccess;
     245
     246        iMemberNum++;
    212247    }
    213248
    214249    //メソッドをコピー
    215     foreach( CMethod *baseMethod, pInheritsClass->methods ){
     250    foreach( CMethod *baseMethod, inheritsClass.methods ){
    216251        CMethod *method = new CMethod( baseMethod );
    217252
     
    224259        // ※継承元のClassIndexをセット(入れ子継承を考慮する)
    225260        if(baseMethod->pobj_InheritsClass==0)
    226             method->pobj_InheritsClass=pInheritsClass;
     261            method->pobj_InheritsClass=&inheritsClass;
    227262        else
    228263            method->pobj_InheritsClass=
     
    233268
    234269    //仮想関数の数
    235     vtbl_num=pInheritsClass->vtbl_num;
     270    vtbl_num += inheritsClass.vtbl_num;
    236271
    237272    //継承先のクラスをメンバとして保持する
    238     pobj_InheritsClass = pInheritsClass;
     273    pobj_InheritsClass = &inheritsClass;
     274
     275    return true;
     276}
     277bool CClass::InheritsInterface( CClass &inheritsInterface, int nowLine ){
     278
     279    //ループ継承でないかをチェック
     280    if(pobj_LoopRefCheck->check(inheritsInterface)){
     281        SetError(123,inheritsInterface.name,nowLine);
     282        return false;
     283    }
     284
     285    if( inheritsInterface.ppobj_Member == 0 ){
     286        //継承先が読み取られていないとき
     287        pobj_LoopRefCheck->add(this->name);
     288        pobj_DBClass->GetClass_recur(inheritsInterface.name);
     289        pobj_LoopRefCheck->del(this->name);
     290    }
     291
     292    //メソッドをコピー
     293    foreach( CMethod *baseMethod, inheritsInterface.methods ){
     294        CMethod *method = new CMethod( baseMethod );
     295
     296        //dwAccess
     297        if(baseMethod->dwAccess==ACCESS_PRIVATE)
     298            method->dwAccess=ACCESS_NON;
     299        else method->dwAccess=baseMethod->dwAccess;
     300
     301        //pobj_Inherits
     302        // ※継承元のClassIndexをセット(入れ子継承を考慮する)
     303        if(baseMethod->pobj_InheritsClass==0)
     304            method->pobj_InheritsClass=&inheritsInterface;
     305        else
     306            method->pobj_InheritsClass=
     307                baseMethod->pobj_InheritsClass;
     308
     309        methods.push_back( method );
     310    }
     311
     312    //仮想関数の数
     313    vtbl_num += inheritsInterface.vtbl_num;
     314
     315    /*
     316    TODO: インターフェイス向けの機構を作る
     317    //継承先のクラスをメンバとして保持する
     318    pobj_InheritsClass = &inheritsInterface;
     319    */
     320
     321    return true;
    239322}
    240323void CClass::AddMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer ){
     
    9501033        if(pMember->IsStruct()){
    9511034            //循環参照でないかをチェック
    952             if(pobj_LoopRefCheck->check(pMember->GetClass().name)){
     1035            if(pobj_LoopRefCheck->check(pMember->GetClass())){
    9531036                extern int cp;
    9541037                SetError(124,pMember->GetClass().name,cp);
     
    10351118                }
    10361119
    1037                 //ループ継承でないかをチェック
    1038                 if(pobj_LoopRefCheck->check(temporary)){
    1039                     SetError(123,temporary,i);
     1120                //継承させる
     1121                if( !pobj_c->InheritsInterface( *pInheritsClass, i ) ){
    10401122                    goto Interface_InheritsError;
    10411123                }
    1042 
    1043                 if( pInheritsClass->ppobj_Member == 0 ){
    1044                     //継承先が読み取られていないとき
    1045                     pobj_LoopRefCheck->add(pobj_c->name);
    1046                     GetClass_recur(temporary);
    1047                     pobj_LoopRefCheck->del(pobj_c->name);
    1048                 }
    1049 
    1050                 //継承させる
    1051                 pobj_c->Inherits( pInheritsClass );
    10521124            }
    10531125            else{
     
    12071279                }
    12081280
    1209                 //ループ継承でないかをチェック
    1210                 if(pobj_LoopRefCheck->check(temporary)){
    1211                     SetError(123,temporary,i);
     1281                if( pInheritsClass->IsInterface() ){
     1282                    // クラスを継承していないとき
     1283                    CClass *pObjectClass = check("Object");
     1284                    if( !pObjectClass ){
     1285                        SetError(106,"Object",i);
     1286                        goto InheritsError;
     1287                    }
     1288
     1289                    if( !pobj_c->Inherits( *pObjectClass, i ) ){
     1290                        goto InheritsError;
     1291                    }
     1292                }
     1293
     1294                //継承させる
     1295                if( !pobj_c->Inherits( *pInheritsClass, i ) ){
    12121296                    goto InheritsError;
    12131297                }
    1214 
    1215                 if( pInheritsClass->ppobj_Member == 0 ){
    1216                     //継承先が読み取られていないとき
    1217                     pobj_LoopRefCheck->add(pobj_c->name);
    1218                     GetClass_recur(temporary);
    1219                     pobj_LoopRefCheck->del(pobj_c->name);
    1220                 }
    1221 
    1222                 //継承させる
    1223                 pobj_c->Inherits( pInheritsClass );
    12241298            }
    12251299InheritsError:
     
    14251499
    14261500void CDBClass::Compile_System_InitializeUserTypes(){
     1501    char temporary[VN_SIZE];
    14271502
    14281503    ////////////////////////////////////////////////////////////////////
     
    14361511        CClass *pClass = Iterator_GetNext();
    14371512
    1438         char temporary[VN_SIZE];
    14391513        sprintf( temporary
    14401514            , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\"))"
     
    14511525        ReallocNativeCodeBuffer();
    14521526    }
     1527
     1528
     1529    ////////////////////////////////////////////////////////////////////
     1530    // 基底クラスを登録
     1531    ////////////////////////////////////////////////////////////////////
     1532
     1533    sprintf(temporary, "%c%ctempType=Nothing%c%cTypeBaseImpl"
     1534        , HIBYTE( COM_DIM )
     1535        , LOBYTE( COM_DIM )
     1536        , 1
     1537        , ESC_AS
     1538        );
     1539    ChangeOpcode( temporary );
     1540
     1541    // イテレータをリセット
     1542    Iterator_Reset();
     1543
     1544    while( Iterator_HasNext() ){
     1545        CClass *pClass = Iterator_GetNext();
     1546
     1547        if( pClass->pobj_InheritsClass ){
     1548            sprintf( temporary
     1549                , "tempType=Search(\"%s\",\"%s\")"
     1550                , ""                // 名前空間 (TODO: 実装)
     1551                , pClass->name      // クラス名
     1552                );
     1553
     1554            // コンパイル
     1555            ChangeOpcode( temporary );
     1556
     1557            sprintf( temporary
     1558                , "tempType.SetBaseType(Search(\"%s\",\"%s\"))"
     1559                , ""                                // 名前空間 (TODO: 実装)
     1560                , pClass->pobj_InheritsClass->name  // 基底クラス名
     1561                );
     1562
     1563            // コンパイル
     1564            ChangeOpcode( temporary );
     1565        }
     1566
     1567        // ネイティブコードバッファの再確保
     1568        ReallocNativeCodeBuffer();
     1569    }
     1570
    14531571
    14541572
  • BasicCompiler_Common/Class.h

    r89 r90  
    7171    enum ClassType{
    7272        Class,
     73        Interface,
     74        Enum,
     75        Delegate,
    7376        Structure,
    74         Interface,
    7577    };
    7678
     
    99101    ~CClass();
    100102
     103    bool IsClass() const;
     104    bool IsInterface() const;
     105    bool IsEnum() const;
     106    bool IsDelegate() const;
    101107    bool IsStructure() const;
    102108
    103109    //継承させる
    104     void Inherits( CClass *pInheritsClass );
     110    bool Inherits( CClass &inheritsClass, int nowLine );
     111    bool InheritsInterface( CClass &inheritsClass, int nowLine );
    105112
    106113    //メンバ、メソッドの追加
  • BasicCompiler_Common/LoopRefCheck.cpp

    r4 r90  
    4545    }
    4646}
    47 BOOL CLoopRefCheck::check(char *lpszInheritsClass){
     47BOOL CLoopRefCheck::check(const CClass &inheritsClass) const
     48{
    4849    //ループ継承チェック
    4950    int i;
    5051    for(i=0;i<num;i++){
    51         if(lstrcmp(names[i],lpszInheritsClass)==0) return 1;
     52        if(lstrcmp(names[i],inheritsClass.name)==0) return 1;
    5253    }
    5354    return 0;
  • BasicCompiler_Common/ParamImpl.cpp

    r84 r90  
    1010#define OVERLOAD_MAX_LEVEL 4
    1111#define OVERLOAD_LEVEL0 0       // 型調整なし。厳密に等しい
    12 #define OVERLOAD_LEVEL1 1       // 型調整なし。整数型/実数型レベルでの同一性チェック
    13 #define OVERLOAD_LEVEL2 2       // 型調整あり。厳密に等しい
    14 #define OVERLOAD_LEVEL3 3       // 型調整あり。整数型/実数型レベルでの同一性チェック
    15 #define OVERLOAD_LEVEL4 4       // 型調整あり。数値型/クラス型レベルでの同一性チェック
     12#define OVERLOAD_LEVEL1 1       // 型調整なし。レベル1以上はオブジェクトの場合は派生関係を考慮
     13#define OVERLOAD_LEVEL2 2       // 型調整なし。整数型/実数型レベルでの同一性チェック
     14#define OVERLOAD_LEVEL3 3       // 型調整あり。厳密に等しい
     15#define OVERLOAD_LEVEL4 4       // 型調整あり。整数型/実数型レベルでの同一性チェック
     16#define OVERLOAD_LEVEL5 5       // 型調整あり。数値型/クラス型レベルでの同一性チェック
    1617
    1718ParamImpl::ParamImpl(const char *buffer):
     
    127128
    128129            NumOpe_GetType(Parms[i],
    129                 (level==OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1)? nullParam : param,
     130                ( level <= OVERLOAD_LEVEL2 )? nullParam : param,
    130131                argType);
    131132        }
     
    135136
    136137        if(argType.GetBasicType()!=param.GetBasicType()){
    137             if( level == OVERLOAD_LEVEL0 || level==OVERLOAD_LEVEL2 ){
     138            if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL3 ){
    138139                return false;
    139140            }
    140             else if( level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL3){
     141            else if( level == OVERLOAD_LEVEL2 || level==OVERLOAD_LEVEL4){
    141142                if(!(
    142143                    argType.IsWhole()&&param.IsWhole()||
     
    146147                }
    147148            }
    148             else if(level==OVERLOAD_LEVEL4){
     149            else if(level==OVERLOAD_LEVEL5){
    149150                if(argType.IsObject()||param.IsObject()) return false;
    150151            }
     
    158159            }
    159160            else if( NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT ){
    160                 if( !param.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
    161                     return false;
     161                if( level == OVERLOAD_LEVEL0 ){
     162                    if( !param.GetClass().IsEquals( &argType.GetClass() ) ){
     163                        return false;
     164                    }
     165                }
     166                else{
     167                    if( !param.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
     168                        return false;
     169                    }
    162170                }
    163171            }
     
    191199
    192200                pUserProc = pTempUserProc;
    193                 break;
    194201            }
    195202        }
  • BasicCompiler_Common/Procedure.h

    r89 r90  
    101101    bool isExport;
    102102    bool isSystem;
     103    bool isAutoGeneration;
    103104    bool isCompiled;
    104105
     
    114115      isExport( isExport ),
    115116      isSystem( false ),
     117      isAutoGeneration( false ),
    116118      isCompiled( false ),
    117119      pNextData( NULL )
     
    176178    {
    177179        return isSystem;
     180    }
     181    void ThisIsAutoGenerationProc(){
     182        isAutoGeneration = true;
     183    }
     184    bool IsAutoGeneration(){
     185        return isAutoGeneration;
    178186    }
    179187    void CompleteCompile(){
  • BasicCompiler_Common/common.h

    r89 r90  
    4747
    4848#ifdef _AMD64_
    49 #define VER_INFO        "(x64) β rev.194"
     49#define VER_INFO        "(x64) β rev.206"
    5050#else
    51 #define VER_INFO        "β rev.194"
     51#define VER_INFO        "β rev.206"
    5252#endif
    5353
     
    460460    void add(char *lpszInheritsClass);
    461461    void del(char *lpszInheritsClass);
    462     BOOL check(char *lpszInheritsClass);
     462    BOOL check(const CClass &inheritsClass) const;
    463463};
    464464extern CLoopRefCheck *pobj_LoopRefCheck;
Note: See TracChangeset for help on using the changeset viewer.