Changeset 8 in dev


Ignore:
Timestamp:
Dec 7, 2006, 3:10:05 AM (17 years ago)
Author:
dai_9181
Message:

Constステートメントで定数変数を宣言できるように改良。

Location:
BasicCompiler32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Var.cpp

    r3 r8  
    853853    int CalcType;
    854854    LONG_PTR lpCalcIndex;
    855     CalcType=StaticCalculation(true, InitBuf,type,&i64data,&lpCalcIndex);
     855    CalcType=StaticCalculation(false, InitBuf,type,&i64data,&lpCalcIndex);
     856    if(!CalcType){
     857        //動的データだった場合
     858        return 0;
     859    }
    856860    if(IsRealNumberType(CalcType)){
    857861        memcpy(&dbl,&i64data,sizeof(double));
     
    995999    extern HANDLE hHeap;
    9961000    int i2,i3,VarSize;
     1001    char VarName[VN_SIZE];
     1002
     1003
     1004    if(dwFlag & DIMFLAG_CONST){
     1005        //////////////////////////////////
     1006        // 定数変数の場合を考慮
     1007        //////////////////////////////////
     1008        for(i2=0;;i2++){
     1009            if(Parameter[i2] == '=' ||
     1010                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     1011                Parameter[i2] =='('){
     1012                    VarName[i2] = 0;
     1013                    break;
     1014            }
     1015            VarName[i2] = Parameter[i2];
     1016        }
     1017
     1018        //定数と2重定義されていないる場合は抜け出す
     1019        if(CDBConst::obj.GetType(VarName)){
     1020            return;
     1021        }
     1022
     1023        //定数マクロとして定義されている場合は抜け出す
     1024        if(GetConstHash(VarName)){
     1025            return;
     1026        }
     1027    }
     1028
    9971029
    9981030    //構文を解析
    999     char VarName[VN_SIZE];
    10001031    int SubScripts[MAX_ARRAYDIM];
    10011032    TYPEINFO TypeInfo;
     
    10051036        return;
    10061037
     1038
     1039    //定数と2重定義されていないかを調べる
     1040    if(CDBConst::obj.GetType(VarName)){
     1041        SetError(15,VarName,cp);
     1042        return;
     1043    }
     1044
     1045    //定数マクロとして定義されている場合
     1046    if(GetConstHash(VarName)){
     1047        SetError(15,VarName,cp);
     1048        return;
     1049    }
     1050
     1051
    10071052    //タイプサイズを取得
    10081053    int TypeSize;
    10091054    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    1010 
    1011     //定数と2重定義されていないかを調べる
    1012     if(GetConstHash(VarName)){
    1013         SetError(15,VarName,cp);
    1014         return;
    1015     }
    10161055
    10171056    if(dwFlag&DIMFLAG_STATIC){
     
    10711110            if(VarSize%4) VarSize+=4-(VarSize%4);
    10721111
     1112            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1113
     1114            MaxLocalVarNum++;
     1115
    10731116            //変数データを追加
    1074             lstrcpy(LocalVar[MaxLocalVarNum].name,VarName);
    1075             LocalVar[MaxLocalVarNum].fRef=0;
    1076             if(SubScripts[0]==-1) LocalVar[MaxLocalVarNum].bArray=0;
    1077             else LocalVar[MaxLocalVarNum].bArray=1;
    1078             LocalVar[MaxLocalVarNum].type=TypeInfo.type;
    1079             LocalVar[MaxLocalVarNum].u.index=TypeInfo.u.lpIndex;
     1117            lstrcpy(pVar->name,VarName);
     1118            pVar->fRef=0;
     1119            if(dwFlag & DIMFLAG_CONST) pVar->bConst = 1;
     1120            else pVar->bConst = 0;
     1121            if(SubScripts[0]==-1) pVar->bArray=0;
     1122            else pVar->bArray=1;
     1123            pVar->type=TypeInfo.type;
     1124            pVar->u.index=TypeInfo.u.lpIndex;
    10801125            AllLocalVarSize+=VarSize;
    1081             LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
     1126            pVar->offset=AllLocalVarSize;
    10821127
    10831128            //レキシカルスコープ
    1084             LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
    1085             LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
    1086             LocalVar[MaxLocalVarNum].bLiving=TRUE;
     1129            pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
     1130            pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
     1131            pVar->bLiving=TRUE;
    10871132
    10881133            if(InitBuf[0]){
    1089                 InitLocalVar(-LocalVar[MaxLocalVarNum].offset,
    1090                     LocalVar[MaxLocalVarNum].type,
    1091                     LocalVar[MaxLocalVarNum].u.index,
    1092                     LocalVar[MaxLocalVarNum].SubScripts,
     1134                int result = InitLocalVar(-pVar->offset,
     1135                    pVar->type,
     1136                    pVar->u.index,
     1137                    pVar->SubScripts,
    10931138                    InitBuf);
     1139
     1140                if(!result){
     1141                    //動的な式だった場合は代入演算を行う
     1142                    char temporary[8192];
     1143                    sprintf(temporary,"%s=%s",VarName,InitBuf);
     1144                    OpcodeCalc(temporary);
     1145                }
    10941146            }
    10951147            else{
     
    11061158                //add eax,offset
    11071159                OpBuffer[obp++]=(char)0x05;
    1108                 *((long *)(OpBuffer+obp))=-LocalVar[MaxLocalVarNum].offset;
     1160                *((long *)(OpBuffer+obp))=-pVar->offset;
    11091161                AddLocalVarAddrSchedule();
    11101162                obp+=sizeof(long);
     
    11221174                obp+=sizeof(long);
    11231175            }
    1124 
    1125             MaxLocalVarNum++;
    11261176        }
    11271177
  • BasicCompiler32/NumOpe.cpp

    r3 r8  
    438438                    //////////////
    439439
    440                     i3=GetConstValue(term,&dbl,temporary,&index_stack[sp]);
    441                     if(i3!=-1){
     440                    i3 = CDBConst::obj.GetType(term);
     441                    if(i3){
    442442                        type[sp]=i3;
    443443                        if(IsRealNumberType(i3)){
    444444                            //実数
     445                            double dbl = CDBConst::obj.GetDoubleData(term);
    445446                            memcpy(&i64data,&dbl,sizeof(double));
    446447                            goto Literal;
     
    448449                        else if(IsWholeNumberType(i3)){
    449450                            //整数
    450                             i64data=(_int64)dbl;
     451                            i64data = CDBConst::obj.GetWholeData(term);
    451452                            goto Literal;
    452453                        }
    453                         else if(Is64Type(i3)){
    454                             //64ビット整数値
    455                             memcpy(&i64data,&dbl,sizeof(_int64));
    456                             goto Literal;
    457                         }
    458                         else if(i3==DEF_STRING){
     454                        /*else if(i3==DEF_STRING){
    459455                            //リテラル文字列
    460456
     
    464460                            memcpy(term,temporary,i3);
    465461                            goto StrLiteral;
    466                         }
     462                        }*/
    467463                        else{
    468464                            SetError(300,NULL,cp);
  • BasicCompiler32/Opcode.h

    r3 r8  
    174174BOOL GetVarOffset(BOOL bError,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    175175BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
    176 #define DIMFLAG_INITDEBUGVAR 1
    177 #define DIMFLAG_NONCALL_CONSTRACTOR 2
    178 #define DIMFLAG_STATIC 4
     176#define DIMFLAG_INITDEBUGVAR            1
     177#define DIMFLAG_NONCALL_CONSTRACTOR     2
     178#define DIMFLAG_STATIC                  4
     179#define DIMFLAG_CONST                   8
    179180void OpcodeDim(char *Parameter,DWORD dwFlag);
    180181void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar);
Note: See TracChangeset for help on using the changeset viewer.