Changeset 20 in dev for BasicCompiler_Common


Ignore:
Timestamp:
Dec 28, 2006, 5:24:48 AM (18 years ago)
Author:
dai_9181
Message:

参照型パラメータに関数の戻り値オブジェクトを指定した場合などの、一時オブジェクトの扱いを可能にした。
Dimで指定される初期値を見分けることで、As指定を省略できるようにした。

Location:
BasicCompiler_Common
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Object.cpp

    r5 r20  
    257257            op_call(pSub_free);
    258258        }
    259         if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
     259        else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){
    260260            //デストラクタの呼び出し
    261261            i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex;
  • BasicCompiler_Common/Variable.cpp

    r11 r20  
    281281    }
    282282    return 1;
     283}
     284
     285TYPEINFO GetStringTypeInfo(){
     286    extern CClass *pobj_StringClass;
     287    TYPEINFO TypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
     288    return TypeInfo;
    283289}
    284290
     
    765771    }
    766772
     773    //変数として見つからなかったとき
    767774    if(bError) SetError(3,variable,cp);
    768775    return -1;
     
    957964    }
    958965    else{
    959         //As指定なし
    960         pTypeInfo->type=GetTypeFromSimpleName(variable);
    961 
    962         i2=lstrlen(variable)-1;
    963         if(i2>=0){
    964             if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
    965                 SetError(-103,variable,cp);
    966         }
     966        /////////////////
     967        // As指定なし
     968        /////////////////
     969
     970        if( InitBuf[0] == '\0' ){
     971            //As指定も、初期値指定もない場合
     972            pTypeInfo->type=GetTypeFromSimpleName(variable);
     973
     974            i2=lstrlen(variable)-1;
     975            if(i2>=0){
     976                if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
     977                    SetError(-103,variable,cp);
     978            }
     979        }
     980        else{
     981            //初期値の型を判別して自動的に型情報を付加する
     982
     983            TYPEINFO BaseType = GetStringTypeInfo();
     984            int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
     985
     986            //エラーの場合
     987            if( result == -1 ) return 0;
     988
     989            pTypeInfo->type = result;
     990        }
     991
     992    }
     993
     994    if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
     995        //初期値とコンストラクタパラメータが同時に呼び出されているとき
     996        SetError(132, NULL, cp);
     997    }
     998
     999    if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' ){
     1000        lstrcpy( ConstractParameter, InitBuf );
     1001        InitBuf[0] = 0;
    9671002    }
    9681003
     
    10771112        AllInitGlobalVarSize);
    10781113    if(InitBuf[0]){
    1079         //初期代入時のみ、書き込みアクセスを許可する
    1080         bool bConstBack = pVar->bConst;
    1081         pVar->bConst = false;
    1082 
    1083         int result = SetInitGlobalData(pVar->offset,
    1084             pVar->type,
    1085             pVar->u.index,
    1086             pVar->SubScripts,
    1087             InitBuf);
    1088 
    1089         if(!result){
    1090             //動的な式だった場合は代入演算を行う
    1091             char temporary[8192];
    1092             sprintf(temporary,"%s=%s",name,InitBuf);
    1093             OpcodeCalc(temporary);
    1094         }
    1095 
    1096         pVar->bConst = bConstBack;
     1114        if( pVar->type == DEF_OBJECT && InitBuf[0] != '[' ){
     1115            //単発式が初期値のオブジェクトの場合
     1116            //初期値をコピーコンストラクタに渡す
     1117        }
     1118        else{
     1119            int result = SetInitGlobalData(pVar->offset,
     1120                pVar->type,
     1121                pVar->u.index,
     1122                pVar->SubScripts,
     1123                InitBuf);
     1124
     1125            if(!result){
     1126                //動的な式だった場合は代入演算を行う
     1127
     1128                //初期代入時のみ、書き込みアクセスを許可する
     1129                bool bConstBack = pVar->bConst;
     1130                pVar->bConst = false;
     1131
     1132                //代入
     1133                char temporary[8192];
     1134                sprintf(temporary,"%s=%s",name,InitBuf);
     1135                OpcodeCalc(temporary);
     1136
     1137                //アクセス制限を元に戻す
     1138                pVar->bConst = bConstBack;
     1139            }
     1140        }
    10971141    }
    10981142
  • BasicCompiler_Common/error.cpp

    r18 r20  
    176176    if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord);
    177177    if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
     178    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
    178179
    179180    //Enum関連
Note: See TracChangeset for help on using the changeset viewer.