Ignore:
Timestamp:
Mar 2, 2008, 5:40:44 AM (17 years ago)
Author:
dai_9181
Message:

Select Caseに指定された値でエラーが起こったとき、スコープ処理に不具合が生じてしまう問題を修正。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r402 r408  
    922922std::vector<SelectSchedule> selectSchedules;
    923923
    924 void OpcodeSelect(const char *lpszParms){
     924void OpcodeSelect(const char *lpszParms)
     925{
    925926    extern HANDLE hHeap;
    926927    extern char *basbuf;
     
    929930   
    930931    Type type1;
    931     if( !NumOpe(lpszParms,Type(), type1 ) ){
    932         return;
    933     }
     932    bool result = NumOpe(lpszParms,Type(), type1 );
    934933
    935934    selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
    936935
    937     if( selectSchedules.back().typeSize < sizeof(long) ){
    938         selectSchedules.back().typeSize = sizeof(long);
    939     }
    940 
    941     for(i=cp,sw=0;;i++){
    942         if(basbuf[i]=='\0'){
    943             selectSchedules.pop_back();
    944             SetError(22,"Select",cp);
    945             return;
    946         }
    947         if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
    948             for(i2=0;;i++){
    949                 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
    950                 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
    951                     i2--;
    952                     if(i2==0) break;
     936    if( result )
     937    {
     938        if( selectSchedules.back().typeSize < sizeof(long) ){
     939            selectSchedules.back().typeSize = sizeof(long);
     940        }
     941
     942        for(i=cp,sw=0;;i++){
     943            if(basbuf[i]=='\0'){
     944                selectSchedules.pop_back();
     945                SetError(22,"Select",cp);
     946                return;
     947            }
     948            if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
     949                for(i2=0;;i++){
     950                    if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
     951                    if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
     952                        i2--;
     953                        if(i2==0) break;
     954                    }
    953955                }
    954             }
    955             continue;
    956         }
    957         if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
    958             if(sw==0){
    959                 //add esp,CaseTypeSize
    960                 compiler.codeGenerator.op_add_esp( selectSchedules.back().typeSize );
    961             }
    962             break;
    963         }
    964         if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
    965             NowCaseCp=i;
    966 
    967             i++;
    968             while(1){
    969                 for(i++,i2=0;;i++,i2++){
    970                     if(basbuf[i]=='\"'){
    971                         i3=GetStringInQuotation(temporary+i2,basbuf+i);
    972                         i+=i3-1;
    973                         i2+=i3-1;
    974                         continue;
     956                continue;
     957            }
     958            if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
     959                if(sw==0){
     960                    //add esp,CaseTypeSize
     961                    compiler.codeGenerator.op_add_esp( selectSchedules.back().typeSize );
     962                }
     963                break;
     964            }
     965            if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
     966                NowCaseCp=i;
     967
     968                i++;
     969                while(1){
     970                    for(i++,i2=0;;i++,i2++){
     971                        if(basbuf[i]=='\"'){
     972                            i3=GetStringInQuotation(temporary+i2,basbuf+i);
     973                            i+=i3-1;
     974                            i2+=i3-1;
     975                            continue;
     976                        }
     977                        if(basbuf[i]=='('){
     978                            i3=GetStringInPare(temporary+i2,basbuf+i);
     979                            i+=i3-1;
     980                            i2+=i3-1;
     981                            continue;
     982                        }
     983                        if(basbuf[i]=='['){
     984                            i3=GetStringInBracket(temporary+i2,basbuf+i);
     985                            i+=i3-1;
     986                            i2+=i3-1;
     987                            continue;
     988                        }
     989
     990                        if(IsCommandDelimitation(basbuf[i])){
     991                            temporary[i2]=0;
     992                            break;
     993                        }
     994                        if(basbuf[i]==','){
     995                            temporary[i2]=0;
     996                            break;
     997                        }
     998
     999                        temporary[i2]=basbuf[i];
    9751000                    }
    976                     if(basbuf[i]=='('){
    977                         i3=GetStringInPare(temporary+i2,basbuf+i);
    978                         i+=i3-1;
    979                         i2+=i3-1;
    980                         continue;
    981                     }
    982                     if(basbuf[i]=='['){
    983                         i3=GetStringInBracket(temporary+i2,basbuf+i);
    984                         i+=i3-1;
    985                         i2+=i3-1;
    986                         continue;
    987                     }
    988 
    989                     if(IsCommandDelimitation(basbuf[i])){
    990                         temporary[i2]=0;
    991                         break;
    992                     }
    993                     if(basbuf[i]==','){
    994                         temporary[i2]=0;
    995                         break;
    996                     }
    997 
    998                     temporary[i2]=basbuf[i];
    999                 }
    1000 
    1001                 //エラー用
    1002                 i2=cp;
    1003                 cp=NowCaseCp;
    1004 
    1005                 Type type2;
    1006                 if( !NumOpe(temporary,type1,type2) ){
    1007                     return;
    1008                 }
    1009 
    1010                 cp=i2;
    1011 
    1012                 if(type1.IsObject()){
    1013                     std::vector<const UserProc *> subs;
    1014                     type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
    1015                     if( subs.size() == 0 ){
     1001
     1002                    //エラー用
     1003                    i2=cp;
     1004                    cp=NowCaseCp;
     1005
     1006                    Type type2;
     1007                    if( !NumOpe(temporary,type1,type2) ){
    10161008                        return;
    10171009                    }
    10181010
    1019                     Parameters params;
    1020                     params.push_back( new Parameter( "", Type( type2 ) ) );
    1021 
    1022                     //オーバーロードを解決
    1023                     const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
    1024 
    1025                     delete params[0];
    1026 
    1027                     if(!pUserProc){
    1028                         //エラー
    1029                         return;
     1011                    cp=i2;
     1012
     1013                    if(type1.IsObject()){
     1014                        std::vector<const UserProc *> subs;
     1015                        type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
     1016                        if( subs.size() == 0 ){
     1017                            return;
     1018                        }
     1019
     1020                        Parameters params;
     1021                        params.push_back( new Parameter( "", Type( type2 ) ) );
     1022
     1023                        //オーバーロードを解決
     1024                        const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
     1025
     1026                        delete params[0];
     1027
     1028                        if(!pUserProc){
     1029                            //エラー
     1030                            return;
     1031                        }
     1032
     1033
     1034                        //pop edx
     1035                        compiler.codeGenerator.op_pop(REG_EDX);
     1036
     1037                        //mov ecx,dword ptr[esp]
     1038                        compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
     1039
     1040                        //push edx
     1041                        compiler.codeGenerator.op_push(REG_EDX);
     1042
     1043                        //push ecx
     1044                        compiler.codeGenerator.op_push(REG_ECX);
     1045
     1046                        //call operator_proc    ※ ==演算子
     1047                        compiler.codeGenerator.op_call(pUserProc);
     1048
     1049                        //test eax,eax
     1050                        compiler.codeGenerator.op_test(REG_EAX,REG_EAX);
     1051
     1052                        //jne ...
     1053                        selectSchedules.back().casePertialSchedules.push_back(
     1054                            compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     1055                        );
    10301056                    }
    1031 
    1032 
    1033                     //pop edx
    1034                     compiler.codeGenerator.op_pop(REG_EDX);
    1035 
    1036                     //mov ecx,dword ptr[esp]
    1037                     compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
    1038 
    1039                     //push edx
    1040                     compiler.codeGenerator.op_push(REG_EDX);
    1041 
    1042                     //push ecx
    1043                     compiler.codeGenerator.op_push(REG_ECX);
    1044 
    1045                     //call operator_proc    ※ ==演算子
    1046                     compiler.codeGenerator.op_call(pUserProc);
    1047 
    1048                     //test eax,eax
    1049                     compiler.codeGenerator.op_test(REG_EAX,REG_EAX);
    1050 
    1051                     //jne ...
    1052                     selectSchedules.back().casePertialSchedules.push_back(
    1053                         compiler.codeGenerator.op_jne( 0, sizeof(long), true )
    1054                     );
     1057                    else if(type1.IsDouble()){
     1058                        ChangeTypeToDouble(type2.GetBasicType());
     1059
     1060                        //fld qword ptr[esp]
     1061                        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1062
     1063                        //add esp,CaseTypeSize
     1064                        compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
     1065
     1066                        //fld qword ptr[esp]
     1067                        compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     1068
     1069                        //fcompp
     1070                        compiler.codeGenerator.op_fcompp();
     1071
     1072                        //fnstsw ax
     1073                        compiler.codeGenerator.op_fnstsw_ax();
     1074
     1075                        //test ah,40
     1076                        compiler.codeGenerator.op_test_ah( (char)0x40 );
     1077
     1078                        //jne ...
     1079                        selectSchedules.back().casePertialSchedules.push_back(
     1080                            compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     1081                        );
     1082                    }
     1083                    else if(type1.IsSingle()){
     1084                        ChangeTypeToSingle(type2.GetBasicType());
     1085
     1086                        //fld dword ptr[esp]
     1087                        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1088
     1089                        //add esp,CaseTypeSize
     1090                        compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
     1091
     1092                        //fld dword ptr[esp]
     1093                        compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     1094
     1095                        //fcompp
     1096                        compiler.codeGenerator.op_fcompp();
     1097
     1098                        //fnstsw ax
     1099                        compiler.codeGenerator.op_fnstsw_ax();
     1100
     1101                        //test ah,40
     1102                        compiler.codeGenerator.op_test_ah( (char)0x40 );
     1103
     1104                        //jne ...
     1105                        selectSchedules.back().casePertialSchedules.push_back(
     1106                            compiler.codeGenerator.op_jne( 0, sizeof(long), true )
     1107                        );
     1108                    }
     1109                    else{
     1110                        //その他整数型
     1111
     1112                        //pop ebx
     1113                        compiler.codeGenerator.op_pop(REG_EBX);
     1114
     1115                        //mov eax,dword ptr[esp]
     1116                        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
     1117
     1118                        //cmp eax,ebx
     1119                        compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
     1120
     1121                        //je ...
     1122                        selectSchedules.back().casePertialSchedules.push_back(
     1123                            compiler.codeGenerator.op_je( 0, sizeof(long), true )
     1124                        );
     1125                    }
     1126
     1127                    if(basbuf[i]!=',') break;
    10551128                }
    1056                 else if(type1.IsDouble()){
    1057                     ChangeTypeToDouble(type2.GetBasicType());
    1058 
    1059                     //fld qword ptr[esp]
    1060                     compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    1061 
    1062                     //add esp,CaseTypeSize
    1063                     compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
    1064 
    1065                     //fld qword ptr[esp]
    1066                     compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
    1067 
    1068                     //fcompp
    1069                     compiler.codeGenerator.op_fcompp();
    1070 
    1071                     //fnstsw ax
    1072                     compiler.codeGenerator.op_fnstsw_ax();
    1073 
    1074                     //test ah,40
    1075                     compiler.codeGenerator.op_test_ah( (char)0x40 );
    1076 
    1077                     //jne ...
    1078                     selectSchedules.back().casePertialSchedules.push_back(
    1079                         compiler.codeGenerator.op_jne( 0, sizeof(long), true )
    1080                     );
    1081                 }
    1082                 else if(type1.IsSingle()){
    1083                     ChangeTypeToSingle(type2.GetBasicType());
    1084 
    1085                     //fld dword ptr[esp]
    1086                     compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    1087 
    1088                     //add esp,CaseTypeSize
    1089                     compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
    1090 
    1091                     //fld dword ptr[esp]
    1092                     compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
    1093 
    1094                     //fcompp
    1095                     compiler.codeGenerator.op_fcompp();
    1096 
    1097                     //fnstsw ax
    1098                     compiler.codeGenerator.op_fnstsw_ax();
    1099 
    1100                     //test ah,40
    1101                     compiler.codeGenerator.op_test_ah( (char)0x40 );
    1102 
    1103                     //jne ...
    1104                     selectSchedules.back().casePertialSchedules.push_back(
    1105                         compiler.codeGenerator.op_jne( 0, sizeof(long), true )
    1106                     );
    1107                 }
    1108                 else{
    1109                     //その他整数型
    1110 
    1111                     //pop ebx
    1112                     compiler.codeGenerator.op_pop(REG_EBX);
    1113 
    1114                     //mov eax,dword ptr[esp]
    1115                     compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
    1116 
    1117                     //cmp eax,ebx
    1118                     compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
    1119 
    1120                     //je ...
    1121                     selectSchedules.back().casePertialSchedules.push_back(
    1122                         compiler.codeGenerator.op_je( 0, sizeof(long), true )
    1123                     );
    1124                 }
    1125 
    1126                 if(basbuf[i]!=',') break;
    1127             }
    1128         }
    1129         if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
    1130             sw=1;
    1131 
    1132             //jmp ...
    1133             selectSchedules.back().casePertialSchedules.push_back(
    1134                 compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
    1135             );
     1129            }
     1130            if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
     1131                sw=1;
     1132
     1133                //jmp ...
     1134                selectSchedules.back().casePertialSchedules.push_back(
     1135                    compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
     1136                );
     1137            }
    11361138        }
    11371139    }
Note: See TracChangeset for help on using the changeset viewer.