Changeset 40 in dev


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

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

Files:
27 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Calc.cpp

    r36 r40  
    600600    }
    601601}
     602
     603void SetRefVariable( const char *varname, const char *expression ){
     604    ////////////////////////////////////////
     605    // 変数のタイプ型を識別して、演算を行う
     606    ////////////////////////////////////////
     607
     608    int VarType,CalcType;
     609    LONG_PTR lpVarIndex,lpCalcIndex;
     610    RELATIVE_VAR VarRelativeVar;
     611    BOOL bCalcUseHeap;
     612
     613    //型を識別
     614    VarType=GetVarType(varname,&lpVarIndex,0);
     615    if(VarType==-1){
     616        SetError(300,NULL,cp);
     617        return;
     618    }
     619
     620    extern LONG_PTR ProcPtr_BaseIndex;
     621    if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     622    else ProcPtr_BaseIndex=-1;
     623
     624    if(VarType==DEF_OBJECT){
     625        //代入演算のオーバーロード オペレータに備える
     626
     627        //変数アドレスを取得
     628        if(!GetVarOffsetReadWrite(
     629            varname,
     630            &VarType,
     631            &VarRelativeVar,
     632            &lpVarIndex)) return;
     633
     634        SetVarPtrToEax(&VarRelativeVar);
     635
     636        //push eax
     637        op_push(REG_EAX);
     638    }
     639
     640
     641    //NumOpe...(スタックに答えが格納される)
     642    CalcType=NumOpe(expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
     643    if(VarType==-1||CalcType==-1) return;
     644
     645    //変数アドレスを取得
     646    if(!GetVarOffsetReadWrite(
     647        varname,
     648        &VarType,
     649        &VarRelativeVar,
     650        &lpVarIndex)) return;
     651
     652    if(VarType&FLAG_PTR){
     653        SetError(14,varname,cp);
     654        return;
     655    }
     656
     657
     658    if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
     659        // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
     660        VarType = PTR_LEVEL_UP( VarType );
     661
     662        VarRelativeVar.dwKind = VAR_LOCAL;
     663
     664        if( CalcType == DEF_OBJECT ){
     665            //右辺値が実体オブジェクトのときは、参照をコピー
     666            CalcType = PTR_LEVEL_UP( DEF_OBJECT );
     667        }
     668    }
     669    else{
     670        SetError(300,NULL,cp);
     671    }
     672
     673
     674    /////////////////////////////////
     675    // 右辺、左辺の型チェックを行う
     676    /////////////////////////////////
     677
     678    CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     679
     680
     681    /////////////////////////////////////////////////
     682    // スタックの内容を変数にコピーするコードを抽出
     683    /////////////////////////////////////////////////
     684
     685    if(VarType==DEF_BOOLEAN){
     686        //bool
     687        SetBooleanVariable(CalcType,&VarRelativeVar);
     688    }
     689    else if(VarType==DEF_CHAR||VarType==DEF_BYTE){
     690        //8ビット整数型変数へスタックの内容を格納する
     691        Set8Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     692    }
     693    else if(VarType==DEF_INTEGER||VarType==DEF_WORD){
     694        //16ビット整数型変数へスタックの内容を格納する
     695        Set16Variable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     696    }
     697    else if(VarType==DEF_LONG||VarType==DEF_DWORD||IsPtrType(VarType)){
     698        //32ビット整数型変数へスタックの内容を格納する
     699        if(VarType==DEF_LONG)
     700            SetLongVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     701        else
     702            SetDWordVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     703    }
     704    else if(VarType==DEF_INT64||VarType==DEF_QWORD){
     705        //64ビット整数型変数へスタックの内容を格納する
     706        SetInt64Variable(CalcType,&VarRelativeVar);
     707    }
     708    else if(VarType==DEF_DOUBLE){
     709        //Double型変数へスタックの内容を格納する
     710        SetDoubleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     711    }
     712    else if(VarType==DEF_SINGLE){
     713        //Single型変数へスタックの内容を格納する
     714        SetSingleVariable(CalcType,VarRelativeVar.dwKind,VarRelativeVar.offset,VarRelativeVar.bOffsetOffset);
     715    }
     716}
  • BasicCompiler32/Compile_CallProc.cpp

    r31 r40  
    337337    }
    338338
    339     if(psi->ReturnType==DEF_OBJECT){
     339    if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){
    340340        //_System_ReturnObject(第一または第二パラメータのダミーを作成)
    341341        sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
     
    375375
    376376
    377 
    378     if(psi->ReturnType==DEF_OBJECT){
     377    if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    379378        //////////////////////////////////////////////////////
    380379        // 戻り値にオブジェクト インスタンスを持つ場合
  • BasicCompiler32/Compile_Object.cpp

    r31 r40  
    7575    }
    7676}
    77 int Operator_New(char *Parameter,LONG_PTR *plpIndex){
     77int Operator_New(const char *Parameter,LONG_PTR *plpIndex){
    7878    char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
    7979    int i,i2;
  • BasicCompiler32/Compile_ProcOp.cpp

    r36 r40  
    374374        else temp=psi->name;
    375375
    376         if(psi->ReturnType==DEF_OBJECT){
     376        if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    377377            //戻り値用オブジェクトのコンストラクタを呼び出す
    378378            if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){
     
    383383        else{
    384384            //戻り値用の変数の定義
    385             sprintf(temporary,"%s%c%c",temp,1,ESC_AS);
     385            if( psi->isReturnRef ){
     386                sprintf(temporary,"%c%c",1,ESC_BYREF);
     387            }
     388            else temporary[0]=0;
     389
     390            sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS);
    386391            GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary));
     392
    387393            OpcodeDim(temporary,0);
    388394        }
     
    514520            else offset=0;
    515521            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
    516                 offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
    517 
    518                 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
    519                     if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
    520                         i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
    521                         if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
     522                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
     523
     524                offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL);
     525
     526                if(pMember->TypeInfo.type==DEF_OBJECT){
     527                    if(pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
     528                        i5=pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
     529                        if(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){  //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    522530
    523531                            MemberTypeSize=
    524                                 GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
    525                                     pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
     532                                GetTypeSize(pMember->TypeInfo.type,
     533                                    pMember->TypeInfo.u.lpIndex);
    526534
    527535                            MemberObjectNum=
    528                                 JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
     536                                JumpSubScripts(pMember->SubScripts);
    529537
    530538                            for(i4=0;i4<MemberObjectNum;i4++){
     
    542550
    543551                                //call constructor
    544                                 op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     552                                op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
    545553                            }
    546554                        }
     
    624632            offset=GetTypeSize(DEF_OBJECT,(LONG_PTR)pobj_CompilingClass);
    625633            for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
     634                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
     635
    626636                MemberTypeSize=
    627                     GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
    628                         pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
     637                    GetTypeSize(pMember->TypeInfo.type,
     638                        pMember->TypeInfo.u.lpIndex);
    629639
    630640                MemberObjectNum=
    631                     JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
     641                    JumpSubScripts(pMember->SubScripts);
    632642
    633643                offset-=MemberTypeSize*MemberObjectNum;
    634644
    635                 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
    636                     if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
     645                if(pMember->TypeInfo.type==DEF_OBJECT){
     646                    if(pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
    637647                        for(i4=MemberObjectNum-1;i4>=0;i4--){
    638648                            //Thisポインタをecxにコピー
     
    649659
    650660                            //call destructor
    651                             i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
    652                             op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     661                            i5=pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
     662                            op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
    653663                        }
    654664                    }
  • BasicCompiler32/Compile_Statement.cpp

    r36 r40  
    13591359            else temp=pCompilingSubInfo->name;
    13601360
    1361             char temporary[VN_SIZE];
    1362             sprintf(temporary,"%s=%s",temp,Parameter);
    1363             OpcodeCalc(temporary);
     1361            if( pCompilingSubInfo->isReturnRef ){
     1362                //参照型
     1363                SetRefVariable( temp, Parameter );
     1364            }
     1365            else{
     1366                //値型
     1367                char temporary[VN_SIZE];
     1368                sprintf(temporary,"%s=%s",temp,Parameter);
     1369                OpcodeCalc(temporary);
     1370            }
    13641371        }
    13651372
  • BasicCompiler32/Compile_Var.cpp

    r36 r40  
    179179    }
    180180
     181    CMember *pMember=pobj_c->ppobj_Member[i];
     182
    181183    //アクセシビリティをチェック
    182184    if(pobj_c==pobj_CompilingClass){
    183185        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    184         if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     186        if(pMember->dwAccess==ACCESS_NON){
    185187            if(isErrorEnabled) SetError(107,VarName,cp);
    186188            return 0;
     
    188190    }
    189191    else{
    190         if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    191             pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     192        if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)||
     193            pMember->dwAccess==ACCESS_NON){
    192194            if(isErrorEnabled) SetError(107,VarName,cp);
    193195            return 0;
    194196        }
    195         else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
     197        else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){
    196198            if(isErrorEnabled) SetError(108,VarName,cp);
    197199            return 0;
     
    201203    //Const定義の場合は書き込みアクセスを制限する
    202204    //※コンストラクタをコンパイル中の場合は例外的に許可する
    203     if( pobj_c->ppobj_Member[i]->IsConst() &&       //定数メンバである
     205    if( pMember->IsConst() &&       //定数メンバである
    204206        isWriteAccess &&                            //書き込みアクセスを要求されている
    205207        pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     
    209211    }
    210212
    211     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    212     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     213    *pType=pMember->TypeInfo.type;
     214    *plpNestIndex=pMember->TypeInfo.u.lpIndex;
    213215
    214216    //ポインタ変数の場合
    215217    if(IsPtrType(*pType)){
    216         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     218        if(pMember->SubScripts[0]==-1){
    217219            lstrcpy(lpPtrOffset,array);
    218220            array[0]=0;
     
    236238    if(array[0]){
    237239        //配列オフセット
    238         if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex))
     240        if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex))
    239241            if(isErrorEnabled) SetError(14,member,cp);
    240242    }
    241     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
     243    else if(pMember->SubScripts[0]!=-1){
    242244        *pType|=FLAG_PTR;
    243245    }
     
    320322            isErrorEnabled,
    321323            isWriteAccess,
    322             pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     324            pMember->TypeInfo.u.pobj_Class,
    323325            NestMember,
    324326            pType,
     
    357359}
    358360
    359 BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
     361BOOL GetVarOffset(bool isErrorEnabled, bool isWriteAccess, const char *NameBuffer, int *pType, RELATIVE_VAR *pRelativeVar, LONG_PTR *plpIndex, int *pss){
    360362    extern BOOL bCompilingGlobal;
    361363    int i,RefType;
     
    907909    ///////////////////////////////////////
    908910
    909     if( type == DEF_OBJECT){
    910         //オブジェクトの場合はありえない
    911         SetError(300,NULL,cp);
    912         return 0;
    913     }
    914 
    915911    if(SubScripts[0]!=-1){
    916912        SetError(41,0,cp);
     
    10641060}
    10651061
    1066 void dim(char *Parameter,DWORD dwFlag){
     1062void dim(char *Parameter,DWORD dwFlags){
    10671063    extern BOOL bCompilingGlobal;
    10681064    extern HANDLE hHeap;
     
    10711067
    10721068
    1073     if(dwFlag & DIMFLAG_CONST){
     1069    //参照型かどうか
     1070    bool isRef = false;
     1071
     1072    i2 = 0;
     1073
     1074    if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
     1075        //参照型
     1076        isRef = true;
     1077        Parameter += 2;
     1078    }
     1079
     1080
     1081    if(dwFlags & DIMFLAG_CONST){
    10741082        //////////////////////////////////
    10751083        // 定数変数の場合を考慮
    10761084        //////////////////////////////////
    1077         for(i2=0;;i2++){
     1085        for(;;i2++){
    10781086            if(Parameter[i2] == '=' ||
    10791087                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     
    11021110    char InitBuf[8192];
    11031111    char ConstractParameter[VN_SIZE];
    1104     if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
     1112    if(!GetDimentionFormat(Parameter, isRef, VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
    11051113        return;
    11061114
     
    11231131    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    11241132
    1125     if(dwFlag&DIMFLAG_STATIC){
     1133    if(dwFlags&DIMFLAG_STATIC){
    11261134        if(bCompilingGlobal){
    11271135            SetError(60,NULL,cp);
     
    11371145        GetNowStaticVarFullName(VarName,temporary);
    11381146
    1139         AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1147        AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11401148
    11411149        /*
     
    11501158            /////////////////////////
    11511159
    1152             AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1160            AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11531161        }
    11541162        else{
     
    11681176
    11691177            LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
     1178            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1179            MaxLocalVarNum++;
     1180
     1181            if( isRef ){
     1182                //参照型
     1183                pVar->fRef = REF_VARIABLE;
     1184                TypeSize = PTR_SIZE;
     1185            }
     1186            else pVar->fRef=0;
    11701187
    11711188            for(i2=1,i3=0;i3<255;i3++){
    11721189                //配列要素数
    1173                 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];
     1190                pVar->SubScripts[i3]=SubScripts[i3];
    11741191
    11751192                if(SubScripts[i3]==-1) break;
     
    11791196            if(VarSize%4) VarSize+=4-(VarSize%4);
    11801197
    1181             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1182 
    1183             MaxLocalVarNum++;
    1184 
    11851198            //変数データを追加
    11861199            lstrcpy(pVar->name,VarName);
    1187             pVar->fRef=0;
    1188             if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
     1200            if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    11891201            else pVar->bConst = false;
    11901202            if(SubScripts[0]==-1) pVar->bArray=0;
     
    12121224
    12131225                if(!result){
    1214                     //動的な式だった場合は代入演算を行う
    1215                     char temporary[8192];
    1216                     sprintf(temporary,"%s=%s",VarName,InitBuf);
    1217                     OpcodeCalc(temporary);
     1226                    if( isRef ){
     1227                        SetRefVariable( VarName, InitBuf );
     1228                    }
     1229                    else{
     1230                        char temporary[8192];
     1231                        sprintf(temporary,"%s=%s",VarName,InitBuf);
     1232                        OpcodeCalc(temporary);
     1233                    }
    12181234                }
    12191235
     
    12521268
    12531269        //コンストラクタ呼び出し
    1254         if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
     1270        if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    12551271            CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
    12561272        }
     
    12641280    }
    12651281}
    1266 void OpcodeDim(char *Parameter,DWORD dwFlag){
     1282void OpcodeDim(char *Parameter,DWORD dwFlags){
    12671283    int i,i2,i3,IsStr=0;
    12681284    char temporary[8192];
     
    12861302            temporary[i2]=0;
    12871303
    1288             dim(temporary,dwFlag);
     1304            dim(temporary,dwFlags);
    12891305
    12901306            if(Parameter[i]=='\0') break;
  • BasicCompiler32/NumOpe.cpp

    r38 r40  
    113113
    114114
    115 int NumOpe(char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
     115int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
    116116    extern HANDLE hHeap;
    117117    int i,i2,i3,i4;
  • BasicCompiler32/Opcode.h

    r38 r40  
    9595void ChangeTypeToByte(int OldType);
    9696void OpcodeCalc(char *Command);
     97void SetRefVariable( const char *varname, const char *expression );
    9798
    9899//NumOpe.cpp
    99100void PushReturnValue(int type);
    100 int NumOpe(char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
     101int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap=0);
    101102
    102103//NumOpe_Arithmetic.cpp
     
    167168
    168169//Compile_Object.cpp
    169 int Operator_New(char *Parameter,LONG_PTR *plpIndex);
     170int Operator_New(const char *Parameter,LONG_PTR *plpIndex);
    170171void OpcodeDelete(char *Parameter);
    171172
     
    173174void GetWithName(char *buffer);
    174175void SetThisPtrToReg(int reg);
    175 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
     176BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    176177BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
    177178#define DIMFLAG_INITDEBUGVAR            1
  • BasicCompiler64/Compile_Calc.cpp

    r36 r40  
    237237    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
    238238}
     239
     240void SetRefVariable( const char *varname, const char *expression ){
     241    ////////////////////////////////////////
     242    // 変数のタイプ型を識別して、演算を行う
     243    ////////////////////////////////////////
     244
     245    int VarType,CalcType;
     246    LONG_PTR lpVarIndex,lpCalcIndex;
     247    BOOL bCalcUseHeap;
     248
     249    //型を識別
     250    VarType=GetVarType(varname,&lpVarIndex,0);
     251    if(VarType==-1){
     252        SetError(300,NULL,cp);
     253        return;
     254    }
     255
     256    extern LONG_PTR ProcPtr_BaseIndex;
     257    if(VarType==DEF_PTR_PROC) ProcPtr_BaseIndex=lpVarIndex;
     258    else ProcPtr_BaseIndex=-1;
     259
     260    //NumOpe...(rax、またはxmm0に答えが格納される)
     261    int reg=REG_RAX;
     262    CalcType=NumOpe(&reg,expression,VarType,lpVarIndex,&lpCalcIndex,&bCalcUseHeap);
     263
     264    //結果を格納しているレジスタをブロッキング
     265    pobj_BlockReg->lock(reg);
     266
     267    if(VarType==-1||CalcType==-1) return;
     268
     269    //変数アドレスを取得
     270    RELATIVE_VAR VarRelativeVar;
     271    if(!GetVarOffsetReadWrite(
     272        varname,
     273        &VarType,
     274        &VarRelativeVar,
     275        &lpVarIndex)) return;
     276
     277    //レジスタのブロッキングを解除
     278    pobj_BlockReg->clear();
     279
     280    if(VarType&FLAG_PTR){
     281        SetError(14,varname,cp);
     282        return;
     283    }
     284
     285    if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
     286        // 参照型オブジェクトへの代入(初期化)はポインタ変数と同様の処理に値する
     287        VarType = PTR_LEVEL_UP( VarType );
     288
     289        VarRelativeVar.dwKind = VAR_LOCAL;
     290
     291        if( CalcType == DEF_OBJECT ){
     292            //右辺値が実体オブジェクトのときは、参照をコピー
     293            CalcType = PTR_LEVEL_UP( DEF_OBJECT );
     294        }
     295    }
     296    else{
     297        SetError(300,NULL,cp);
     298    }
     299
     300
     301    /////////////////////////////////
     302    // 右辺、左辺の型チェックを行う
     303    /////////////////////////////////
     304
     305    CheckDifferentType(VarType,lpVarIndex,CalcType,lpCalcIndex,0,0);
     306
     307
     308    /////////////////////////////////////////////////
     309    // rax(実数はxmm0)の内容を変数にコピー
     310    /////////////////////////////////////////////////
     311    SetVariableFromRax(VarType,CalcType,&VarRelativeVar);
     312}
  • BasicCompiler64/Compile_Calc_PushVar.cpp

    r3 r40  
    5353        }
    5454    }
    55     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     55    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    5656        if(pRelativeVar->bOffsetOffset){
    5757            //add r11,qword ptr[rsp+offset]
     
    134134        }
    135135    }
    136     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     136    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    137137        if(pRelativeVar->bOffsetOffset){
    138138            //add r11,qword ptr[rsp+offset]
     
    204204        }
    205205    }
    206     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     206    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    207207        if(pRelativeVar->bOffsetOffset){
    208208            //add r11,qword ptr[rsp+offset]
  • BasicCompiler64/Compile_CallProc.cpp

    r31 r40  
    339339    }
    340340
    341     if(psi->ReturnType==DEF_OBJECT){
     341    if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false ){
    342342        //_System_ReturnObject(第一または第二パラメータのダミーを作成)
    343343        sprintf(temporary+lstrlen(temporary),"%c%c0,",1,ESC_BYVAL);
     
    378378
    379379
    380     if(psi->ReturnType==DEF_OBJECT){
     380    if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    381381        //////////////////////////////////////////////////////
    382382        // 戻り値にオブジェクト インスタンスを持つ場合
  • BasicCompiler64/Compile_ProcOp.cpp

    r34 r40  
    461461        else temp=psi->name;
    462462
    463         if(psi->ReturnType==DEF_OBJECT){
     463        if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    464464            //戻り値用オブジェクトのコンストラクタを呼び出す
    465465            if(psi->u.Return_pobj_c->ConstructorMemberSubIndex!=-1){
     
    470470        else{
    471471            //戻り値用の変数の定義
    472             sprintf(temporary,"%s%c%c",temp,1,ESC_AS);
     472            if( psi->isReturnRef ){
     473                sprintf(temporary,"%c%c",1,ESC_BYREF);
     474            }
     475            else temporary[0]=0;
     476
     477            sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS);
    473478            GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary));
     479
    474480            OpcodeDim(temporary,0);
    475481        }
     
    568574            else offset=0;
    569575            for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
     576                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    570577                MemberTypeSize=
    571                     GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
    572                         pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
     578                    GetTypeSize(pMember->TypeInfo.type,
     579                        pMember->TypeInfo.u.lpIndex);
    573580
    574581                MemberObjectNum=
    575                     JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
    576 
    577                 offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
    578 
    579                 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
    580                     if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
    581                         i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
    582                         if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){    //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
     582                    JumpSubScripts(pMember->SubScripts);
     583
     584                offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL);
     585
     586                if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     587                    if(pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex!=-1){
     588                        i5=pMember->TypeInfo.u.pobj_Class->ConstructorMemberSubIndex;
     589                        if(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi->RealParmNum==1){  //Thisポインタを第一引数に持ち合わせるため、引数なしの場合はこの値が1になる
    583590                            for(i4=0;i4<MemberObjectNum;i4++){
    584591                                //Thisポインタをrcxにコピー
     
    589596
    590597                                //call constructor
    591                                 op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     598                                op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
    592599                            }
    593600                        }
     
    672679            int MemberObjectNum;
    673680            for(i3=pobj_CompilingClass->iMemberNum-1;i3>=0;i3--){
     681                CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
    674682                MemberTypeSize=
    675                     GetTypeSize(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type,
    676                         pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.lpIndex);
     683                    GetTypeSize(pMember->TypeInfo.type,
     684                        pMember->TypeInfo.u.lpIndex);
    677685
    678686                MemberObjectNum=
    679                     JumpSubScripts(pobj_CompilingClass->ppobj_Member[i3]->SubScripts);
    680 
    681                 offset=GetSizeOfClassMember(pobj_CompilingClass,pobj_CompilingClass->ppobj_Member[i3]->name,NULL);
    682 
    683                 if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.type==DEF_OBJECT){
    684                     if(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
     687                    JumpSubScripts(pMember->SubScripts);
     688
     689                offset=GetSizeOfClassMember(pobj_CompilingClass,pMember->name,NULL);
     690
     691                if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
     692                    if(pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex!=-1){
    685693                        for(i4=MemberObjectNum-1;i4>=0;i4--){
    686694                            //Thisポインタをrcxにコピー
     
    691699
    692700                            //call destructor
    693                             i5=pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
    694                             op_call(pobj_CompilingClass->ppobj_Member[i3]->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
     701                            i5=pMember->TypeInfo.u.pobj_Class->DestructorMemberSubIndex;
     702                            op_call(pMember->TypeInfo.u.pobj_Class->ppobj_Method[i5]->psi);
    695703                        }
    696704                    }
  • BasicCompiler64/Compile_Set_Var.cpp

    r36 r40  
    179179        }
    180180    }
    181     else if(pRelative->dwKind==VAR_REFLOCAL){
     181    else if( pRelative->dwKind == VAR_REFLOCAL ){
    182182        if(pRelative->bOffsetOffset){
    183183            //add r11,qword ptr[rsp+offset]
     
    267267        }
    268268    }
    269     else if(pRelative->dwKind==VAR_REFLOCAL){
     269    else if( pRelative->dwKind == VAR_REFLOCAL ){
    270270        if(pRelative->bOffsetOffset){
    271271            //add r11,qword ptr[rsp+offset]
     
    383383        }
    384384    }
    385     else if(pRelative->dwKind==VAR_REFLOCAL){
     385    else if( pRelative->dwKind == VAR_REFLOCAL ){
    386386        if(pRelative->bOffsetOffset){
    387387            //add r11,qword ptr[rsp+offset]
  • BasicCompiler64/Compile_Statement.cpp

    r36 r40  
    959959            else temp=pCompilingSubInfo->name;
    960960
    961             char temporary[VN_SIZE];
    962             sprintf(temporary,"%s=%s",temp,Parameter);
    963             OpcodeCalc(temporary);
     961            if( pCompilingSubInfo->isReturnRef ){
     962                //参照型
     963                SetRefVariable( temp, Parameter );
     964            }
     965            else{
     966                //値型
     967                char temporary[VN_SIZE];
     968                sprintf(temporary,"%s=%s",temp,Parameter);
     969                OpcodeCalc(temporary);
     970            }
    964971        }
    965972
  • BasicCompiler64/Compile_Var.cpp

    r36 r40  
    206206    }
    207207
     208    CMember *pMember=pobj_c->ppobj_Member[i];
     209
    208210
    209211    //アクセシビリティをチェック
    210212    if(pobj_c==pobj_CompilingClass){
    211213        //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    212         if(pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     214        if(pMember->dwAccess==ACCESS_NON){
    213215            if(isErrorEnabled) SetError(107,VarName,cp);
    214216            return 0;
     
    216218    }
    217219    else{
    218         if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
    219             pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
     220        if((bPrivateAccess==0&&pMember->dwAccess==ACCESS_PRIVATE)||
     221            pMember->dwAccess==ACCESS_NON){
    220222            if(isErrorEnabled) SetError(107,VarName,cp);
    221223            return 0;
    222224        }
    223         else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
     225        else if(bPrivateAccess==0&&pMember->dwAccess==ACCESS_PROTECTED){
    224226            if(isErrorEnabled) SetError(108,VarName,cp);
    225227            return 0;
     
    229231    //Const定義の場合は書き込みアクセスを制限する
    230232    //※コンストラクタをコンパイル中の場合は例外的に許可する
    231     if( pobj_c->ppobj_Member[i]->IsConst() &&       //定数メンバである
     233    if( pMember->IsConst() &&       //定数メンバである
    232234        isWriteAccess &&                            //書き込みアクセスを要求されている
    233235        pobj_c->IsCompilingConstructor() == false   //コンストラクタ コンパイル中を除く
     
    237239    }
    238240
    239     *pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
    240     *plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
     241    *pType=pMember->TypeInfo.type;
     242    *plpNestIndex=pMember->TypeInfo.u.lpIndex;
    241243
    242244    //ポインタ変数の場合
    243245    if(IsPtrType(*pType)){
    244         if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
     246        if(pMember->SubScripts[0]==-1){
    245247            lstrcpy(lpPtrOffset,array);
    246248            array[0]=0;
     
    265267    if(array[0]){
    266268        //配列オフセット
    267         if(!GetArrayOffset(pobj_c->ppobj_Member[i]->SubScripts,array,*pType,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex)){
     269        if(!GetArrayOffset(pMember->SubScripts,array,*pType,pMember->TypeInfo.u.lpIndex)){
    268270            if(isErrorEnabled) SetError(14,member,cp);
    269271        }
    270272    }
    271     else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
     273    else if(pMember->SubScripts[0]!=-1){
    272274        *pType|=FLAG_PTR;
    273275    }
     
    276278        //入れ子構造の場合
    277279
    278         if(*pType==DEF_OBJECT){
     280        if(*pType==DEF_OBJECT && pMember->IsRef() == false){
    279281            if(RefType!=DEF_OBJECT){
    280282                if(isErrorEnabled) SetError(104,member,cp);
     
    282284            }
    283285        }
    284         else if(*pType==DEF_PTR_OBJECT){
     286        else if(*pType==DEF_PTR_OBJECT || ( *pType==DEF_OBJECT && pMember->IsRef() )){
    285287            //構造体ポインタ型メンバ変数
    286288
    287289            if(lpPtrOffset[0]){
    288290                //pObj[n].member
    289                 if(RefType!=DEF_OBJECT){
     291                if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_OBJECT){
    290292                    if(isErrorEnabled) SetError(104,member,cp);
    291293                    return 0;
     
    300302            else{
    301303                //pObj->member
    302                 if(RefType!=DEF_PTR_OBJECT){
     304                if(*pType==DEF_PTR_OBJECT&&RefType!=DEF_PTR_OBJECT){
    303305                    if(isErrorEnabled) SetError(104,member,cp);
    304306                    return 0;
     
    347349            isErrorEnabled,
    348350            isWriteAccess,
    349             pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
     351            pMember->TypeInfo.u.pobj_Class,
    350352            NestMember,
    351353            pType,
     
    383385    SetReg_WholeVariable(DEF_PTR_VOID,&RelativeVar,reg);
    384386}
    385 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     387BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    386388    extern BOOL bCompilingGlobal;
    387389    int i,RefType;
     
    432434            pRelativeVar->offset=-LocalVar[i].offset;
    433435            pRelativeVar->bOffsetOffset=0;
    434             if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
     436            if(LocalVar[i].fRef){
     437                // 参照型
     438                pRelativeVar->dwKind = VAR_REFLOCAL;
     439            }
    435440            else pRelativeVar->dwKind=VAR_LOCAL;
    436441            *pType=LocalVar[i].type;
     
    10451050
    10461051
    1047 void dim(char *Parameter,DWORD dwFlag){
     1052void dim(char *Parameter,DWORD dwFlags){
    10481053    extern BOOL bCompilingGlobal;
    10491054    extern HANDLE hHeap;
     
    10511056    char VarName[VN_SIZE];
    10521057
    1053 
    1054     if(dwFlag & DIMFLAG_CONST){
     1058    //参照型かどうか
     1059    bool isRef = false;
     1060
     1061    i2 = 0;
     1062
     1063    if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
     1064        //参照型
     1065        isRef = true;
     1066        Parameter += 2;
     1067    }
     1068
     1069    if(dwFlags & DIMFLAG_CONST){
     1070
    10551071        //////////////////////////////////
    10561072        // 定数変数の場合を考慮
    10571073        //////////////////////////////////
    1058         for(i2=0;;i2++){
     1074        for(;;i2++){
    10591075            if(Parameter[i2] == '=' ||
    10601076                Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
     
    10831099    char InitBuf[8192];
    10841100    char ConstractParameter[VN_SIZE];
    1085     if(!GetDimentionFormat(Parameter,VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
     1101    if(!GetDimentionFormat(Parameter, isRef , VarName,SubScripts,&TypeInfo,InitBuf,ConstractParameter))
    10861102        return;
    10871103
     
    11041120    TypeSize=GetTypeSize(TypeInfo.type,TypeInfo.u.lpIndex);
    11051121
    1106     if(dwFlag&DIMFLAG_STATIC){
     1122    if(dwFlags&DIMFLAG_STATIC){
    11071123        if(bCompilingGlobal){
    11081124            SetError(60,NULL,cp);
     
    11181134        GetNowStaticVarFullName(VarName,temporary);
    11191135
    1120         AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1136        AddGlobalVariable(temporary,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11211137
    11221138        /*
     
    11311147            /////////////////////////
    11321148
    1133             AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlag);
     1149            AddGlobalVariable(VarName,SubScripts,&TypeInfo,TypeSize,InitBuf,ConstractParameter,dwFlags);
    11341150        }
    11351151        else{
     
    11491165
    11501166            LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
     1167            VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
     1168            MaxLocalVarNum++;
     1169
     1170            if( isRef ){
     1171                //参照型
     1172                pVar->fRef = REF_VARIABLE;
     1173                TypeSize = PTR_SIZE;
     1174            }
     1175            else pVar->fRef=0;
    11511176
    11521177            for(i2=1,i3=0;i3<255;i3++){
    11531178                //配列要素数
    1154                 LocalVar[MaxLocalVarNum].SubScripts[i3]=SubScripts[i3];
     1179                pVar->SubScripts[i3]=SubScripts[i3];
    11551180
    11561181                if(SubScripts[i3]==-1) break;
     
    11601185            if(VarSize%8) VarSize+=8-(VarSize%8);
    11611186
    1162             VARIABLE *pVar = &LocalVar[MaxLocalVarNum];
    1163 
    1164             MaxLocalVarNum++;
    1165 
    11661187            //変数データを追加
    11671188            lstrcpy(pVar->name,VarName);
    1168             pVar->fRef=0;
    1169             if(dwFlag & DIMFLAG_CONST) pVar->bConst = true;
     1189            if(dwFlags & DIMFLAG_CONST) pVar->bConst = true;
    11701190            else pVar->bConst = false;
    11711191            if(SubScripts[0]==-1) pVar->bArray=0;
     
    11941214                if(!result){
    11951215                    //動的な式だった場合は代入演算を行う
    1196                     char temporary[8192];
    1197                     sprintf(temporary,"%s=%s",VarName,InitBuf);
    1198                     OpcodeCalc(temporary);
     1216                    if( isRef ){
     1217                        SetRefVariable( VarName, InitBuf );
     1218                    }
     1219                    else{
     1220                        char temporary[8192];
     1221                        sprintf(temporary,"%s=%s",VarName,InitBuf);
     1222                        OpcodeCalc(temporary);
     1223                    }
    11991224                }
    12001225
     
    12271252
    12281253        //コンストラクタ呼び出し
    1229         if(TypeInfo.type==DEF_OBJECT&&(dwFlag&DIMFLAG_NONCALL_CONSTRACTOR)==0){
     1254        if(TypeInfo.type==DEF_OBJECT&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0&& isRef == false ){
    12301255            CallConstractor(VarName,SubScripts,TypeInfo,ConstractParameter);
    12311256        }
     
    12391264    }
    12401265}
    1241 void OpcodeDim(char *Parameter,DWORD dwFlag){
     1266void OpcodeDim(char *Parameter,DWORD dwFlags){
    12421267    int i,i2,i3,IsStr=0;
    12431268    char temporary[8192];
     
    12611286            temporary[i2]=0;
    12621287
    1263             dim(temporary,dwFlag);
     1288            dim(temporary,dwFlags);
    12641289
    12651290            if(Parameter[i]=='\0') break;
     
    13221347        }
    13231348    }
    1324     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     1349    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    13251350        if(pRelativeVar->bOffsetOffset){
    13261351            //add r11,qword ptr[rsp+offset]
  • BasicCompiler64/Opcode.h

    r38 r40  
    5252
    5353//変数の種類
    54 #define NON_VAR         0
    55 #define VAR_GLOBAL      1   //Global Variable
    56 #define VAR_LOCAL       2   //Local Variable
    57 #define VAR_REFLOCAL    3   //Local Refference Variable
    58 #define VAR_DIRECTMEM   4   //Direct memory
     54#define NON_VAR             0
     55#define VAR_GLOBAL          1   //Global Variable
     56#define VAR_LOCAL           2   //Local Variable
     57#define VAR_REFLOCAL        3   //Local Refference Variable
     58#define VAR_DIRECTMEM       5   //Direct memory
     59
    5960
    6061extern int cp;
     
    245246void SetVariableFromRax(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar);
    246247void OpcodeCalc(char *Command);
     248void SetRefVariable( const char *varname, const char *expression );
    247249
    248250//NumOpe.cpp
     
    310312void GetWithName(char *buffer);
    311313void SetThisPtrToReg(int reg);
    312 BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
     314BOOL GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    313315BOOL SetInitGlobalData(int offset,int type,LONG_PTR lpIndex,int *SubScripts,char *InitBuf);
    314 #define DIMFLAG_INITDEBUGVAR            1
    315 #define DIMFLAG_NONCALL_CONSTRACTOR     2
    316 #define DIMFLAG_STATIC                  4
    317 #define DIMFLAG_CONST                   8
     316#define DIMFLAG_INITDEBUGVAR            0x01
     317#define DIMFLAG_NONCALL_CONSTRACTOR     0x02
     318#define DIMFLAG_STATIC                  0x04
     319#define DIMFLAG_CONST                   0x08
    318320void OpcodeDim(char *Parameter,DWORD dwFlag);
    319321void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
  • BasicCompiler64/WatchList.cpp

    r3 r40  
    2424        return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
    2525    }
    26     else if(pRelativeVar->dwKind==VAR_REFLOCAL){
     26    else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
    2727        extern HWND hDebugWnd;
    2828        i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
  • BasicCompiler_Common/BasicFixed.h

    r36 r40  
    5454#define NATURAL_TYPE(t) ((t)&MASK_NATURAL)
    5555#define MAKE_PTR_TYPE(t,p)  ((t)|((p)<<8))
     56#define PTR_LEVEL_UP(t) MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1)
    5657
    5758#define DEF_PTR_BYTE    MAKE_PTR_TYPE(DEF_BYTE,1)
     
    168169#define ESC_ENDTRY      'm' //End Try
    169170//EXEファイル用制御エスケープシーケンス
    170 #define ESC_USING       'n' //Print命令語のUsing
    171 #define ESC_FOR         'o' //Open命令語のFor
    172 #define ESC_LINENUM     'p' //行番号を示す
     171#define ESC_USING       'o' //Print命令語のUsing
     172#define ESC_FOR         'p' //Open命令語のFor
     173#define ESC_LINENUM     'q' //行番号を示す
    173174
    174175//オブジェクト指向エスケープシーケンス
  • 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;   //エラー用
  • BasicCompiler_Common/Class.h

    r29 r40  
    2020class CMember{
    2121    bool isConst;
     22    bool isRef;
    2223public:
    2324    char *name;
     
    3334
    3435
    35     CMember( CClass *pobj_c, DWORD access, bool idConst, char *buffer, int NowLine=-1 );
     36    CMember( CClass *pobj_c, DWORD access, bool idConst, bool isRef, char *buffer, int NowLine=-1 );
    3637    CMember( CMember *pobj );
    3738    CMember();
     
    3940
    4041    bool IsConst();
     42    bool IsRef();
     43    int GetSize();
    4144
    4245
     
    98101    void Inherits( CClass *pInheritsClass );
    99102
    100     void AddMember( DWORD dwAccess, bool idConst, char *buffer );
    101     void AddStaticMember( DWORD dwAccess, bool isConst, char *buffer, int NowLine );
     103    void AddMember( DWORD dwAccess, bool idConst, bool isRef, char *buffer );
     104    void AddStaticMember( DWORD dwAccess, bool isConst, bool isRef, char *buffer, int NowLine );
    102105    void AddMethod( SUBINFO *psi,DWORD dwAccess, bool isConst, BOOL bAbstract, BOOL bVirtual );
    103106    void AddStaticMethod(SUBINFO *psi,DWORD dwAccess);
  • BasicCompiler_Common/Intermediate_Step2.cpp

    r37 r40  
    375375                break;
    376376            case ESC_CONST:
     377            case ESC_BYREF:
    377378                KillStringSpaces(Command+2);
    378379                break;
  • BasicCompiler_Common/Object.cpp

    r34 r40  
    1717
    1818    for(i=0;i<pobj_c->iMemberNum;i++){
    19         if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
     19        CMember *pMember = pobj_c->ppobj_Member[i];
     20
     21        if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){
    2022            //メンバクラスのアラインメントを取得
    21             member_size=GetAlignment(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
     23            member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class);
    2224        }
    2325        else{
    2426            //メンバサイズを取得
    25             member_size=GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
     27            member_size = pMember->GetSize();
    2628        }
    2729
     
    4951    int iMaxAlign=0;
    5052    for(i=0;i<pobj_c->iMemberNum;i++){
    51         //メンバ変数の型サイズを取得
    52         i2=GetTypeSize(pobj_c->ppobj_Member[i]->TypeInfo.type,pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
    53         if(i2==-1) return -1;
     53        CMember *pMember = pobj_c->ppobj_Member[i];
     54
     55        i2 = pMember->GetSize();
    5456
    5557        //アラインメントを算出
    5658        int member_size;
    57         if(pobj_c->ppobj_Member[i]->TypeInfo.type==DEF_OBJECT){
     59        if(pMember->TypeInfo.type==DEF_OBJECT){
    5860            //メンバクラスのアラインメントを取得
    59             member_size=GetAlignment(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class);
     61            member_size=GetAlignment(pMember->TypeInfo.u.pobj_Class);
    6062        }
    6163        else{
     
    8385        if(pMemberName){
    8486            //メンバ指定がある場合は、オフセットを返す
    85             if(lstrcmp(pobj_c->ppobj_Member[i]->name,pMemberName)==0){
     87            if(lstrcmp(pMember->name,pMemberName)==0){
    8688                if(pMemberNum) *pMemberNum=i;
    8789                return offset;
     
    9092
    9193        //配列を考慮したメンバサイズを取得
    92         member_size=i2 * JumpSubScripts(pobj_c->ppobj_Member[i]->SubScripts);
     94        member_size=i2 * JumpSubScripts(pMember->SubScripts);
    9395
    9496        //メンバサイズを加算
  • BasicCompiler_Common/Subroutine.cpp

    r38 r40  
    687687        ///////////////////
    688688
     689        psi->isReturnRef = false;
     690
    689691        if(pobj_c){
    690692            if(lstrcmp(psi->name,pobj_c->name)==0||
     
    701703        for(;i2>0;i2--){
    702704            if(buffer[i2]==')') break;
     705
    703706            if(buffer[i2]==1&&buffer[i2+1]==ESC_AS){
     707                if( buffer[i2-2] == 1 && buffer[i2-1] == ESC_BYREF ){
     708                    //参照型
     709                    psi->isReturnRef = true;
     710                }
     711
    704712                i2+=2;
    705713                i3=0;
     
    10331041    }
    10341042
    1035     if(psi->ReturnType==DEF_OBJECT){
     1043    if(psi->ReturnType==DEF_OBJECT && psi->isReturnRef == false){
    10361044        i = psi->RealParmNum;
    10371045
  • BasicCompiler_Common/Variable.cpp

    r36 r40  
    629629    return type;
    630630}
    631 int GetVarType(char *NameBuffer,LONG_PTR *plpIndex,BOOL bError){
     631int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError){
    632632    extern BOOL bCompilingGlobal;
    633633    int i;
     
    840840}
    841841
    842 BOOL GetVarOffsetReadOnly(char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     842BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    843843    //読み取り専用で変数へアクセス
    844844    return GetVarOffset(
     
    851851        pss);
    852852}
    853 BOOL GetVarOffsetReadWrite(char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
     853BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
    854854    //読み書き両用で変数へアクセス
    855855    return GetVarOffset(
     
    865865
    866866
    867 BOOL GetDimentionFormat(char *buffer,char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter){
     867BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter){
    868868    int i,i2,i3,IsStr;
    869869    char variable[VN_SIZE],temporary[8192];
     
    998998        else{
    999999            //初期値の型を判別して自動的に型情報を付加する
    1000 
    10011000            TYPEINFO BaseType = GetStringTypeInfo();
    10021001            int result = NumOpe_GetType( InitBuf, &BaseType, &pTypeInfo->u.lpIndex );
     
    10151014    }
    10161015
    1017     if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' ){
     1016    if( pTypeInfo->type == DEF_OBJECT && InitBuf[0] != '\0' && InitBuf[0] != '[' && isRef == false ){
    10181017        lstrcpy( ConstractParameter, InitBuf );
    10191018        InitBuf[0] = 0;
  • BasicCompiler_Common/Variable.h

    r10 r40  
    2222void GetArrange(char *variable,char *variAnswer,int *SubScripts);
    2323int GetTypeFromSimpleName(char *variable);
    24 int GetVarType(char *NameBuffer,LONG_PTR *plpIndex,BOOL bError);
    25 BOOL GetVarOffsetReadOnly(char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    26 BOOL GetVarOffsetReadWrite(char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
    27 BOOL GetDimentionFormat(char *buffer,char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter);
     24int GetVarType(const char *NameBuffer,LONG_PTR *plpIndex,BOOL bError);
     25BOOL GetVarOffsetReadOnly(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
     26BOOL GetVarOffsetReadWrite(const char *NameBuffer,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss=0);
     27BOOL GetDimentionFormat(const char *buffer, const bool isRef, char *VarName,int *SubScripts,TYPEINFO *pTypeInfo,char *InitBuf,char *ConstractParameter);
    2828BOOL GetNowStaticVarFullName(char *VarName,char *FullName);
    2929void AddGlobalVariable(char *name,int *SubScripts,TYPEINFO *pTypeInfo,int TypeSize,char *InitBuf,char *ConstractParameter,DWORD dwFlag);
  • BasicCompiler_Common/common.h

    r38 r40  
    157157#define REF_PARAMETER 1
    158158#define OBJECT_PARAMETER 2
     159#define REF_VARIABLE 4
    159160struct VARIABLE{
    160161    char name[255];
     
    243244        CClass *Return_pobj_c;
    244245    }u;
     246    bool isReturnRef;
    245247
    246248    DWORD CompileAddress;
     
    574576
    575577//error.cpp
    576 void SetError(int ErrorNum,char *KeyWord,int pos);
     578void SetError(int ErrorNum,const char *KeyWord,int pos);
    577579void CompileMessage(char *buffer);
    578580void CheckDifferentType(int VarType,LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,char *pszFuncName,int ParmNum);
  • BasicCompiler_Common/error.cpp

    r34 r40  
    11#include "../BasicCompiler_Common/common.h"
    22
    3 BOOL GetErrorMsg(int num,char *KeyWord,char *msg,int pos){
     3BOOL GetErrorMsg(int num,const char *KeyWord,char *msg,int pos){
    44    extern HANDLE hHeap;
    55    int i2;
    66    char temporary[64];
    77
     8    char tempKeyWord[1024];
    89    if(KeyWord){
     10        lstrcpy(tempKeyWord,KeyWord);
    911        for(i2=0;;i2++){
    10             if(KeyWord[i2]=='\0') break;
    11             if(KeyWord[i2]==1){
    12                 GetDefaultNameFromES(KeyWord[i2+1],temporary);
    13                 SlideString(KeyWord+i2+2,lstrlen(temporary)-2);
    14                 memcpy(KeyWord+i2,temporary,lstrlen(temporary));
     12            if(tempKeyWord[i2]=='\0') break;
     13            if(tempKeyWord[i2]==1){
     14                GetDefaultNameFromES(tempKeyWord[i2+1],temporary);
     15                SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2);
     16                memcpy(tempKeyWord+i2,temporary,lstrlen(temporary));
    1517            }
    1618        }
    1719    }
    18 
    19     if(num==-1||num==-2) lstrcpy(msg,KeyWord);  //部分エラー
     20    else{
     21        lstrcpy(tempKeyWord,"");
     22    }
     23
     24    if(num==-1||num==-2) lstrcpy(msg,tempKeyWord);  //部分エラー
    2025
    2126    if(num==3){
    22         temporary[0]=KeyWord[0];
     27        temporary[0]=tempKeyWord[0];
    2328        for(i2=1;;i2++){
    24             if((!IsVariableChar(KeyWord[i2]))||i2>=255){
     29            if((!IsVariableChar(tempKeyWord[i2]))||i2>=255){
    2530                temporary[i2]=0;
    2631                break;
    2732            }
    28             temporary[i2]=KeyWord[i2];
     33            temporary[i2]=tempKeyWord[i2];
    2934        }
    3035
     
    5257#if defined(JPN)
    5358        //日本語
    54         if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",KeyWord);
     59        if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
    5560        else lstrcpy(msg,"文法が間違っています");
    5661#else
    5762        //英語
    58         if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",KeyWord);
     63        if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord);
    5964        else lstrcpy(msg,"Syntax Error.");
    6065#endif
     
    6974    //日本語
    7075    ////////////////////
    71     if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",KeyWord);
    72     if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",KeyWord);
    73     if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",KeyWord);
    74     if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",KeyWord);
    75     if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",KeyWord);
    76     if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",KeyWord);
    77     if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",KeyWord);
     76    if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord);
     77    if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord);
     78    if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord);
     79    if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord);
     80    if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord);
     81    if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord);
     82    if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord);
    7883#else
    7984#endif
     
    9196    if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません");
    9297    //num==3は予約されています
    93     if(num==4) sprintf(msg,"%sの相互関係が一致しません",KeyWord);
     98    if(num==4) sprintf(msg,"%sの相互関係が一致しません",tempKeyWord);
    9499    if(num==5) sprintf(msg,"ダブルクォートの数が一致しません");
    95     if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です",KeyWord);
     100    if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です",tempKeyWord);
    96101    if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)");
    97102    if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています");
    98103    if(num==9) sprintf(msg,"型が違います");
    99     if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています",KeyWord);
    100     if(num==11) sprintf(msg,"\"%s\" 型が違います",KeyWord);
    101     if(num==12) sprintf(msg,"\"%s\" の使い方が不正です",KeyWord);
    102     if(num==13) sprintf(msg,"\"%s\" を参照できません",KeyWord);
    103     if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です",KeyWord);
    104     if(num==15) sprintf(msg,"\"%s\" はすでに定義されています",KeyWord);
    105     if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています",KeyWord);
     104    if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています",tempKeyWord);
     105    if(num==11) sprintf(msg,"\"%s\" 型が違います",tempKeyWord);
     106    if(num==12) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
     107    if(num==13) sprintf(msg,"\"%s\" を参照できません",tempKeyWord);
     108    if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です",tempKeyWord);
     109    if(num==15) sprintf(msg,"\"%s\" はすでに定義されています",tempKeyWord);
     110    if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています",tempKeyWord);
    106111    if(num==17) sprintf(msg,"リソース データが不正です");
    107     if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません",KeyWord);
    108     if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません",KeyWord);
     112    if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません",tempKeyWord);
     113    if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません",tempKeyWord);
    109114    if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)");
    110115    if(num==21) sprintf(msg,"If制御のブロック指定が不正です");
    111     if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません",KeyWord,KeyWord);
    112     if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗",KeyWord);
     116    if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません",tempKeyWord,tempKeyWord);
     117    if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗",tempKeyWord);
    113118    if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)");
    114     if(num==27) sprintf(msg,"\"%s\" は定義されていません",KeyWord);
    115     if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)",KeyWord);
     119    if(num==27) sprintf(msg,"\"%s\" は定義されていません",tempKeyWord);
     120    if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)",tempKeyWord);
    116121    if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください");
    117122    //num==30は予約されています
    118     if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",KeyWord);
    119     if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",KeyWord);
     123    if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",tempKeyWord);
     124    if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",tempKeyWord);
    120125    if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています");
    121126    if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい");
    122     if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",KeyWord);
    123     if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",KeyWord);
     127    if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",tempKeyWord);
     128    if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",tempKeyWord);
    124129    if(num==40) lstrcpy(msg,"関数の戻り値にオブジェクトを指定することはできません");
    125130    if(num==41) lstrcpy(msg,"初期データが不正です");
    126131    if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています");
    127132    if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています");
    128     if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",KeyWord);
     133    if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",tempKeyWord);
    129134    if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています");
    130135    if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています");
    131     if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",KeyWord);
     136    if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",tempKeyWord);
    132137    if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています");
    133     if(num==50) sprintf(msg,"%sに変換できません",KeyWord);
     138    if(num==50) sprintf(msg,"%sに変換できません",tempKeyWord);
    134139    if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません");
    135     if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",KeyWord);
    136     if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",KeyWord);
    137     if(num==54) sprintf(msg,"対応する%sが存在しません。",KeyWord);
    138     if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",KeyWord);
     140    if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",tempKeyWord);
     141    if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",tempKeyWord);
     142    if(num==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
     143    if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
    139144    if(num==56) lstrcpy(msg,"ゼロ割りが行われました。");
    140145    if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
    141146    if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
    142     if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",KeyWord);
     147    if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
    143148    if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
    144     if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",KeyWord);
    145     if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",KeyWord);
     149    if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord);
     150    if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord);
    146151
    147152
    148153    //オブジェクト関連
    149     if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",KeyWord);
    150     if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",KeyWord);
    151     if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",KeyWord);
    152     if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",KeyWord);
    153     if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",KeyWord);
    154     if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",KeyWord);
    155     if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",KeyWord);
    156     if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",KeyWord);
    157     if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",KeyWord);
     154    if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",tempKeyWord);
     155    if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",tempKeyWord);
     156    if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",tempKeyWord);
     157    if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",tempKeyWord);
     158    if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",tempKeyWord);
     159    if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
     160    if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",tempKeyWord);
     161    if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
     162    if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",tempKeyWord);
    158163    if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります");
    159     if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",KeyWord);
    160     if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",KeyWord);
     164    if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",tempKeyWord);
     165    if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",tempKeyWord);
    161166    if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません");
    162167    if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません");
     
    164169    if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません");
    165170    if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません");
    166     if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",KeyWord);
     171    if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",tempKeyWord);
    167172    if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です");
    168173    if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません");
     
    170175    if(num==123) lstrcpy(msg,"ループ継承が行われました");
    171176    if(num==124) lstrcpy(msg,"循環参照が行われました");
    172     if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",KeyWord);
     177    if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
    173178    if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
    174179    if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
    175180    if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
    176     if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",KeyWord);
    177     if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord);
     181    if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord);
     182    if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord);
    178183    if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
    179184    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
    180185
    181186    //Enum関連
    182     if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",KeyWord);
    183     if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",KeyWord);
     187    if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",tempKeyWord);
     188    if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",tempKeyWord);
    184189
    185190    //リンカ
    186     if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",KeyWord);
    187     if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",KeyWord);
     191    if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",tempKeyWord);
     192    if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",tempKeyWord);
    188193
    189194    //原因不明
     
    197202    if(num==2) sprintf(msg,"Left operand must be l-value.");
    198203    //num==3は予約されています
    199     if(num==4) sprintf(msg,"Correlation of %s is wrong.",KeyWord);
     204    if(num==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord);
    200205    if(num==5) sprintf(msg,"Correlation of double quotes is wrong.");
    201     if(num==6) sprintf(msg,"\"%s\" Label not found.",KeyWord);
     206    if(num==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord);
    202207    if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
    203208    if(num==8) lstrcpy(msg,"The inaccurate characters are contained.");
    204209    if(num==9) sprintf(msg,"Type is wrong.");
    205     if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",KeyWord);
    206     if(num==11) sprintf(msg,"\"%s\" Type is wrong.",KeyWord);
    207     if(num==12) sprintf(msg,"\"%s\" Not a valid use.",KeyWord);
    208     if(num==13) sprintf(msg,"Cannot refer to \"%s\".",KeyWord);
    209     if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",KeyWord);
    210     if(num==15) sprintf(msg,"\"%s\" is already defined.",KeyWord);
    211     if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",KeyWord);
     210    if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord);
     211    if(num==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord);
     212    if(num==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord);
     213    if(num==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord);
     214    if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord);
     215    if(num==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord);
     216    if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord);
    212217    if(num==17) sprintf(msg,"Invalid resource data.");
    213     if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",KeyWord);
    214     if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",KeyWord);
     218    if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord);
     219    if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord);
    215220    if(num==21) sprintf(msg,"Wrong structure of \"If\" block.");
    216     if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",KeyWord,KeyWord);
    217     if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",KeyWord);
     221    if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord);
     222    if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord);
    218223    if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
    219     if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",KeyWord);
    220     if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",KeyWord);
     224    if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord);
     225    if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord);
    221226    if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
    222227    //num==30は予約されています
    223     if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",KeyWord);
    224     if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",KeyWord);
     228    if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord);
     229    if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord);
    225230    if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
    226231    if(num==34) sprintf(msg,"Constant formula must be defined in the module level.");
    227     if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",KeyWord);
    228     if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",KeyWord);
     232    if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord);
     233    if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord);
    229234    if(num==40) lstrcpy(msg,"Cannot set a object to return value.");
    230235    if(num==41) lstrcpy(msg,"Init data is wrong.");
     
    233238
    234239    //オブジェクト関連
    235     if(num==102) sprintf(msg,"\"%s\" The object is not defined.",KeyWord);
    236     if(num==103) sprintf(msg,"\"%s\" The member is not defined.",KeyWord);
    237     if(num==104) sprintf(msg,"\"%s\" The reference character is different.",KeyWord);
    238     if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",KeyWord);
    239     if(num==106) sprintf(msg,"\"%s\" It class is not defined.",KeyWord);
    240     if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",KeyWord);
    241     if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",KeyWord);
    242     if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",KeyWord);
    243     if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",KeyWord);
     240    if(num==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord);
     241    if(num==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord);
     242    if(num==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord);
     243    if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord);
     244    if(num==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord);
     245    if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord);
     246    if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord);
     247    if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord);
     248    if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord);
    244249    if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
    245     if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",KeyWord);
    246     if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",KeyWord);
     250    if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord);
     251    if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord);
    247252    if(num==114) lstrcpy(msg,"Destructor cannot have a parameter.");
    248253    if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
     
    250255    if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
    251256    if(num==118) lstrcpy(msg,"Super class is not found.");
    252     if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",KeyWord);
     257    if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord);
    253258
    254259    //Enum関連
    255     if(num==150) sprintf(msg,"\"%s\" The value is not set",KeyWord);
    256     if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",KeyWord);
     260    if(num==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord);
     261    if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord);
    257262
    258263    //リンカ
    259     if(num==200) sprintf(msg,"\"%s\" Unknown error.",KeyWord);
     264    if(num==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord);
    260265#endif
    261266
    262267    return 1;
    263268}
    264 void SetError(int num,char *KeyWord,int pos){
     269void SetError(int num,const char *KeyWord,int pos){
    265270    extern HANDLE hHeap;
    266271    extern HWND hMainDlg;
Note: See TracChangeset for help on using the changeset viewer.