Changeset 20 in dev for BasicCompiler_Common/Variable.cpp


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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.