Changeset 40 in dev for BasicCompiler_Common/Class.cpp


Ignore:
Timestamp:
Jan 28, 2007, 3:48:22 AM (17 years ago)
Author:
dai_9181
Message:

ByRef修飾子を関数戻り値とDimステートメントで指定可能にした。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Class.cpp

    r31 r40  
    1818
    1919
    20 CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, char *buffer, int NowLine ){
     20CMember::CMember( CClass *pobj_c, DWORD access, bool isConst, bool isRef, char *buffer, int NowLine ){
    2121    extern int cp;
    2222
     
    2525    char init_buf[VN_SIZE];
    2626    char constract_parameter[VN_SIZE];
    27     GetDimentionFormat(buffer,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);
     27    GetDimentionFormat(buffer,isRef,VarName,SubScripts,&TypeInfo,init_buf,constract_parameter);
    2828
    2929    //重複チェック
     
    4949    this->isConst = isConst;
    5050
     51    //参照型かどうか
     52    this->isRef = isRef;
     53
    5154    //初期データ
    5255    InitBuf=(char *)HeapAlloc(hHeap,0,lstrlen(init_buf)+1);
     
    7073    //定数扱いかどうか
    7174    isConst = pobj->isConst;
     75
     76    //参照型かどうか
     77    isRef = pobj->isRef;
    7278
    7379    //SubScripts
     
    9197bool CMember::IsConst(){
    9298    return isConst;
     99}
     100bool CMember::IsRef(){
     101    return isRef;
     102}
     103
     104int CMember::GetSize(){
     105    if( IsRef() ){
     106        // 参照型
     107        return PTR_SIZE;
     108    }
     109
     110    //メンバサイズを取得
     111    return GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    93112}
    94113
     
    264283    pobj_InheritsClass = pInheritsClass;
    265284}
    266 void CClass::AddMember( DWORD dwAccess, bool isConst, char *buffer ){
     285void CClass::AddMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer ){
    267286    ppobj_Member = (CMember **)HeapReAlloc( hHeap, 0, ppobj_Member, ( iMemberNum + 1 ) * sizeof(CMember *) );
    268     ppobj_Member[iMemberNum] = new CMember( this, dwAccess, isConst, buffer );
     287    ppobj_Member[iMemberNum] = new CMember( this, dwAccess, isConst, isRef, buffer );
    269288    iMemberNum++;
    270289}
    271 void CClass::AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine ){
     290void CClass::AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine ){
    272291    ppobj_StaticMember=(CMember **)HeapReAlloc(hHeap,0,ppobj_StaticMember,(iStaticMemberNum+1)*sizeof(CMember *));
    273     ppobj_StaticMember[iStaticMemberNum]=new CMember( this, dwAccess, isConst, buffer, NowLine );
     292    ppobj_StaticMember[iStaticMemberNum]=new CMember( this, dwAccess, isConst, isRef, buffer, NowLine );
    274293    iStaticMemberNum++;
    275294}
     
    439458    //コンポジションの関係にあるメンバも検査する
    440459    for(int i=0;i < iMemberNum;i++){
    441         if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
     460        if(ppobj_Member[i]->TypeInfo.type==DEF_OBJECT && ppobj_Member[i]->IsRef() == false){
    442461            if(ppobj_Member[i]->TypeInfo.u.pobj_Class->IsAbstract())
    443462                return true;
     
    809828    int i,i2,bRet=1;
    810829    for(i=0;i<pobj_c->iMemberNum;i++){
    811         if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
     830        CMember *pMember = pobj_c->ppobj_Member[i];
     831        if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef()==false ){
    812832            //循環参照でないかをチェック
    813             if(pobj_LoopRefCheck->check(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name)){
     833            if(pobj_LoopRefCheck->check(pMember->TypeInfo.u.pobj_Class->name)){
    814834                extern int cp;
    815                 SetError(123,pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class->name,cp);
     835                SetError(124,pMember->TypeInfo.u.pobj_Class->name,cp);
    816836                return 0;
    817837            }
     
    819839            pobj_LoopRefCheck->add(pobj_c->name);
    820840
    821             i2=MemberVar_LoopRefCheck(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
     841            i2=MemberVar_LoopRefCheck(pMember->TypeInfo.u.pobj_Class);
    822842            if(bRet==1) bRet=i2;
    823843
     
    11321152                }
    11331153
     1154                //Ref修飾子
     1155                bool isRef = false;
     1156                if( basbuf[i] == 1 && basbuf[i + 1] == ESC_BYREF ){
     1157                    isRef = true;
     1158                    i += 2;
     1159                }
     1160
    11341161                if(basbuf[i]==1&&(
    11351162                    basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE||
     
    12091236                        //静的メンバを追加
    12101237                        cp=i;   //エラー用
    1211                         pobj_c->AddStaticMember( dwAccess, isConst, temporary, i);
     1238                        pobj_c->AddStaticMember( dwAccess, isConst, isRef, temporary, i);
    12121239                    }
    12131240                    else{
    12141241                        //メンバを追加
    12151242                        cp=i;   //エラー用
    1216                         pobj_c->AddMember( dwAccess, isConst, temporary );
     1243                        pobj_c->AddMember( dwAccess, isConst, isRef, temporary );
    12171244
    12181245
     
    12371264                }
    12381265                else{
     1266                    // 文法エラーチェック
     1267                    if( isRef ){
     1268                        SetError(1,NULL,cp);
     1269                    }
     1270
    12391271                    //メソッドを追加
    12401272                    cp=i;   //エラー用
Note: See TracChangeset for help on using the changeset viewer.