Changeset 29 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Jan 10, 2007, 2:27:58 AM (17 years ago)
Author:
dai_9181
Message:

Ver5.0β10としてリリース。
すべてのクラスをObjectからの派生にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r28 r29  
    215215    }
    216216}
     217void CClass::Inherits( CClass *pInheritsClass ){
     218    int i3;
     219
     220    //メンバをコピー
     221    ppobj_Member=(CMember **)HeapReAlloc(
     222        hHeap,
     223        0,
     224        ppobj_Member,
     225        pInheritsClass->iMemberNum*sizeof(CMember *));
     226    iMemberNum=pInheritsClass->iMemberNum;
     227    for(i3=0;i3<pInheritsClass->iMemberNum;i3++){
     228        ppobj_Member[i3]=new CMember(pInheritsClass->ppobj_Member[i3]);
     229
     230        //dwAccess
     231        if(pInheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
     232            ppobj_Member[i3]->dwAccess=ACCESS_NON;
     233        else ppobj_Member[i3]->dwAccess=pInheritsClass->ppobj_Member[i3]->dwAccess;
     234    }
     235
     236    //メソッドをコピー
     237    ppobj_Method=(CMethod **)HeapReAlloc(
     238        hHeap,
     239        0,
     240        ppobj_Method,
     241        pInheritsClass->iMethodNum*sizeof(CMethod *));
     242    iMethodNum=pInheritsClass->iMethodNum;
     243    for(i3=0;i3<pInheritsClass->iMethodNum;i3++){
     244        ppobj_Method[i3]=new CMethod(pInheritsClass->ppobj_Method[i3]);
     245
     246        //dwAccess
     247        if(pInheritsClass->ppobj_Method[i3]->dwAccess==ACCESS_PRIVATE)
     248            ppobj_Method[i3]->dwAccess=ACCESS_NON;
     249        else ppobj_Method[i3]->dwAccess=pInheritsClass->ppobj_Method[i3]->dwAccess;
     250
     251        //pobj_Inherits
     252        // ※継承元のClassIndexをセット(入れ子継承を考慮する)
     253        if(pInheritsClass->ppobj_Method[i3]->pobj_InheritsClass==0)
     254            ppobj_Method[i3]->pobj_InheritsClass=pInheritsClass;
     255        else
     256            ppobj_Method[i3]->pobj_InheritsClass=
     257                pInheritsClass->ppobj_Method[i3]->pobj_InheritsClass;
     258    }
     259
     260    //仮想関数の数
     261    vtbl_num=pInheritsClass->vtbl_num;
     262
     263    //継承先のクラスをメンバとして保持する
     264    pobj_InheritsClass = pInheritsClass;
     265}
    217266void CClass::AddMember( DWORD dwAccess, bool isConst, char *buffer ){
    218267    ppobj_Member = (CMember **)HeapReAlloc( hHeap, 0, ppobj_Member, ( iMemberNum + 1 ) * sizeof(CMember *) );
     
    849898
    850899                //継承元クラスを取得
    851                 pobj_c->pobj_InheritsClass=check(temporary);
    852                 if(!pobj_c->pobj_InheritsClass){
     900                CClass *pInheritsClass = check(temporary);
     901                if( !pInheritsClass ){
    853902                    SetError(106,temporary,i);
    854903                    goto Interface_InheritsError;
     
    861910                }
    862911
    863                 if(pobj_c->pobj_InheritsClass->ppobj_Member==0){
     912                if( pInheritsClass->ppobj_Member == 0 ){
    864913                    //継承先が読み取られていないとき
    865914                    pobj_LoopRefCheck->add(pobj_c->name);
     
    868917                }
    869918
    870                 //メンバ変数をコピー
    871                 pobj_c->ppobj_Member=(CMember **)HeapReAlloc(
    872                     hHeap,
    873                     0,
    874                     pobj_c->ppobj_Member,
    875                     pobj_c->pobj_InheritsClass->iMemberNum*sizeof(CMember *));
    876                 pobj_c->iMemberNum=pobj_c->pobj_InheritsClass->iMemberNum;
    877                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMemberNum;i3++){
    878                     pobj_c->ppobj_Member[i3]=new CMember(pobj_c->pobj_InheritsClass->ppobj_Member[i3]);
    879 
    880                     //dwAccess
    881                     if(pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
    882                         pobj_c->ppobj_Member[i3]->dwAccess=ACCESS_NON;
    883                     else pobj_c->ppobj_Member[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess;
    884                 }
    885 
    886                 //メンバ関数をコピー
    887                 pobj_c->ppobj_Method=(CMethod **)HeapReAlloc(
    888                     hHeap,
    889                     0,
    890                     pobj_c->ppobj_Method,
    891                     pobj_c->pobj_InheritsClass->iMethodNum*sizeof(CMethod *));
    892                 pobj_c->iMethodNum=pobj_c->pobj_InheritsClass->iMethodNum;
    893                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMethodNum;i3++){
    894                     pobj_c->ppobj_Method[i3]=new CMethod(pobj_c->pobj_InheritsClass->ppobj_Method[i3]);
    895 
    896                     //dwAccess
    897                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess==ACCESS_PRIVATE)
    898                         pobj_c->ppobj_Method[i3]->dwAccess=ACCESS_NON;
    899                     else pobj_c->ppobj_Method[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess;
    900 
    901                     //pobj_Inherits
    902                     // ※継承元のClassIndexをセット(入れ子継承を考慮する)
    903                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass==0)
    904                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=pobj_c->pobj_InheritsClass;
    905                     else
    906                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=
    907                             pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass;
    908                 }
    909 
    910                 //仮想関数の数
    911                 pobj_c->vtbl_num=pobj_c->pobj_InheritsClass->vtbl_num;
     919                //継承させる
     920                pobj_c->Inherits( pInheritsClass );
    912921            }
    913922            else{
     
    10391048            else dwAccess=ACCESS_PUBLIC;
    10401049
    1041             if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
    1042                 //継承を行う場合
    1043                 for(i+=3,i2=0;;i++,i2++){
    1044                     if(IsCommandDelimitation(basbuf[i])){
    1045                         temporary[i2]=0;
    1046                         break;
     1050            if( lstrcmp( pobj_c->name, "Object" ) == 0 || dwClassType == ESC_TYPE ){
     1051                //継承無し
     1052                pobj_c->pobj_InheritsClass=0;
     1053
     1054                //仮想関数の数を初期化
     1055                pobj_c->vtbl_num=0;
     1056            }
     1057            else{
     1058                if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
     1059                    //継承を行う場合
     1060                    for(i+=3,i2=0;;i++,i2++){
     1061                        if(IsCommandDelimitation(basbuf[i])){
     1062                            temporary[i2]=0;
     1063                            break;
     1064                        }
     1065                        temporary[i2]=basbuf[i];
    10471066                    }
    1048                     temporary[i2]=basbuf[i];
    1049                 }
    1050 
    1051                 if(lstrcmpi(temporary,pobj_c->name)==0){
    1052                     SetError(105,temporary,i);
    1053                     goto InheritsError;
     1067
     1068                    if(lstrcmpi(temporary,pobj_c->name)==0){
     1069                        SetError(105,temporary,i);
     1070                        goto InheritsError;
     1071                    }
     1072                }
     1073                else{
     1074                    //Objectを継承する
     1075                    lstrcpy( temporary, "Object" );
    10541076                }
    10551077
    10561078                //継承元クラスを取得
    1057                 pobj_c->pobj_InheritsClass=check(temporary);
    1058                 if(!pobj_c->pobj_InheritsClass){
     1079                CClass *pInheritsClass = check(temporary);
     1080                if( !pInheritsClass ){
    10591081                    SetError(106,temporary,i);
    10601082                    goto InheritsError;
     
    10671089                }
    10681090
    1069                 if(pobj_c->pobj_InheritsClass->ppobj_Member==0){
     1091                if( pInheritsClass->ppobj_Member == 0 ){
    10701092                    //継承先が読み取られていないとき
    10711093                    pobj_LoopRefCheck->add(pobj_c->name);
     
    10741096                }
    10751097
    1076                 //メンバをコピー
    1077                 pobj_c->ppobj_Member=(CMember **)HeapReAlloc(
    1078                     hHeap,
    1079                     0,
    1080                     pobj_c->ppobj_Member,
    1081                     pobj_c->pobj_InheritsClass->iMemberNum*sizeof(CMember *));
    1082                 pobj_c->iMemberNum=pobj_c->pobj_InheritsClass->iMemberNum;
    1083                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMemberNum;i3++){
    1084                     pobj_c->ppobj_Member[i3]=new CMember(pobj_c->pobj_InheritsClass->ppobj_Member[i3]);
    1085 
    1086                     //dwAccess
    1087                     if(pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess==ACCESS_PRIVATE)
    1088                         pobj_c->ppobj_Member[i3]->dwAccess=ACCESS_NON;
    1089                     else pobj_c->ppobj_Member[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Member[i3]->dwAccess;
    1090                 }
    1091 
    1092                 //メソッドをコピー
    1093                 pobj_c->ppobj_Method=(CMethod **)HeapReAlloc(
    1094                     hHeap,
    1095                     0,
    1096                     pobj_c->ppobj_Method,
    1097                     pobj_c->pobj_InheritsClass->iMethodNum*sizeof(CMethod *));
    1098                 pobj_c->iMethodNum=pobj_c->pobj_InheritsClass->iMethodNum;
    1099                 for(i3=0;i3<pobj_c->pobj_InheritsClass->iMethodNum;i3++){
    1100                     pobj_c->ppobj_Method[i3]=new CMethod(pobj_c->pobj_InheritsClass->ppobj_Method[i3]);
    1101 
    1102                     //dwAccess
    1103                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess==ACCESS_PRIVATE)
    1104                         pobj_c->ppobj_Method[i3]->dwAccess=ACCESS_NON;
    1105                     else pobj_c->ppobj_Method[i3]->dwAccess=pobj_c->pobj_InheritsClass->ppobj_Method[i3]->dwAccess;
    1106 
    1107                     //pobj_Inherits
    1108                     // ※継承元のClassIndexをセット(入れ子継承を考慮する)
    1109                     if(pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass==0)
    1110                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=pobj_c->pobj_InheritsClass;
    1111                     else
    1112                         pobj_c->ppobj_Method[i3]->pobj_InheritsClass=
    1113                             pobj_c->pobj_InheritsClass->ppobj_Method[i3]->pobj_InheritsClass;
    1114                 }
    1115 
    1116                 //仮想関数の数
    1117                 pobj_c->vtbl_num=pobj_c->pobj_InheritsClass->vtbl_num;
    1118             }
    1119             else{
    1120                 //継承無し
    1121                 pobj_c->pobj_InheritsClass=0;
    1122 
    1123                 //仮想関数の数を初期化
    1124                 pobj_c->vtbl_num=0;
     1098                //継承させる
     1099                pobj_c->Inherits( pInheritsClass );
    11251100            }
    11261101InheritsError:
Note: See TracChangeset for help on using the changeset viewer.