Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (18 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler64/Compile_Statement.cpp

    r73 r75  
    55    int i,i2;
    66    char buffer[8192];
    7     SubInfo *psi;
     7    UserProc *pUserProc;
    88
    99    for(i=0;;i++){
     
    4141        //////////////////////////////
    4242
    43         psi=GetSubHash(Command);
     43        pUserProc=GetSubHash(Command);
    4444
    4545        //GetSubHash内でエラー提示が行われた場合
    46         if(psi==(SubInfo *)-1) return;
    47 
    48         if(psi==0){
     46        if(pUserProc==(UserProc *)-1) return;
     47
     48        if(pUserProc==0){
    4949            char temporary[VN_SIZE];
    5050            lstrcpy(temporary,Command);
    5151
    5252            CharUpper(temporary);
    53             psi=GetSubHash(temporary);
     53            pUserProc=GetSubHash(temporary);
    5454
    5555            //GetSubHash内でエラー提示が行われた場合
    56             if(psi==(SubInfo *)-1) return;
    57         }
    58 
    59         if(psi){
    60             if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
    61 
    62             Opcode_CallProc("",psi,0,"",0);
     56            if(pUserProc==(UserProc *)-1) return;
     57        }
     58
     59        if(pUserProc){
     60            if( !pUserProc->IsMacro() ) SetError(10,Command,cp);
     61
     62            Opcode_CallProc("",pUserProc,0,"",0);
    6363
    6464            return;
     
    7272
    7373    int idProc;
    74     void *pInfo;
    75     idProc=GetProc(buffer,&pInfo);
     74    void *pProc;
     75    idProc=GetProc(buffer,(void **)&pProc);
    7676
    7777    int i4;
     
    9191        ////////////////
    9292
    93         LONG_PTR lp;
    94         i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
     93        Type resultType;
     94        CallProc(idProc,pProc,buffer,temp2,resultType);
    9595
    9696
     
    9999        /////////////////////
    100100
    101         if(i2==DEF_STRUCT){
     101        if( resultType.IsStruct() ){
    102102            //mov r14,rax
    103103            op_mov_RR(REG_R14,REG_RAX);
    104104
    105             FreeTempObject(REG_R14,(CClass *)lp);
     105            FreeTempObject(REG_R14,&resultType.GetClass());
    106106        }
    107107        return;
     
    116116
    117117void Judgment(char *buffer){
    118     int reg=REG_RAX,type;
    119     type=NumOpe(&reg,buffer,0,0,0);
     118    int reg=REG_RAX;
     119    Type resultType;
     120    if( !NumOpe(&reg,buffer,Type(),resultType) ){
     121        return;
     122    }
    120123
    121124    int offset;
    122125
    123     if(type==DEF_DOUBLE){
     126    if(resultType.IsDouble()){
    124127        double dbl=0;
    125128        offset=dataTable.Add( dbl );
     
    135138        obp+=sizeof(long);
    136139    }
    137     else if(type==DEF_SINGLE){
     140    else if(resultType.IsSingle()){
    138141        float flt=0;
    139142        offset=dataTable.Add( flt );
     
    152155
    153156        //cmp rax,0
    154         op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     157        op_cmp_value(resultType.GetSize(),REG_RAX,0);
    155158    }
    156159}
     
    340343void OpcodeFor(char *Parameter){
    341344    extern HANDLE hHeap;
     345    Type resultType;
    342346    int i,i2,i3;
    343347    char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
     
    400404    sprintf(temporary,"(%s)>=0",StepNum);
    401405
    402     int reg,type;
     406    int reg;
    403407    reg=REG_RAX;
    404     type=NumOpe(&reg,temporary,0,0,0);
     408    if( !NumOpe(&reg,temporary,Type(),resultType) ){
     409        return;
     410    }
    405411
    406412    //cmp rax,0
    407     op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     413    op_cmp_value(resultType.GetSize(),REG_RAX,0);
    408414
    409415    //je [カウンタ減少の場合の判定]
     
    417423
    418424    reg=REG_RAX;
    419     type=NumOpe(&reg,temporary,0,0,0);
     425    NumOpe(&reg,temporary,Type(),Type());
    420426
    421427    //jmp [カウンタ減少の場合の判定を飛び越す]
     
    430436
    431437    reg=REG_RAX;
    432     type=NumOpe(&reg,temporary,0,0,0);
     438    NumOpe(&reg,temporary,Type(),resultType);
    433439
    434440    *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
    435441
    436442    //cmp rax,0
    437     op_cmp_value(GetTypeSize(type,-1),REG_RAX,0);
     443    op_cmp_value(resultType.GetSize(),REG_RAX,0);
    438444
    439445ErrorStep:
     
    583589    extern HANDLE hHeap;
    584590
    585     extern BOOL bCompilingGlobal;
    586     if(bCompilingGlobal){
     591    if( UserProc::IsGlobalAreaCompiling() ){
    587592        SetError(12,"Exit Sub/Function",cp);
    588593        return;
     
    611616    CaseScheduleNum++;
    612617}
    613 void OpcodeSelect(char *Parameter){
     618void OpcodeSelect( const char *lpszParms ){
    614619    extern DWORD *pCaseSchedule;
    615620    extern int CaseScheduleNum;
     
    631636    NowCaseSchedule=0;
    632637
    633     int reg1=REG_RAX,type1;
    634     LONG_PTR lpIndex;
    635     type1=NumOpe(&reg1,Parameter,0,0,&lpIndex);
    636 
    637     if(type1==DEF_DOUBLE){
     638    int reg1=REG_RAX;
     639    Type type1;
     640    if( !NumOpe(&reg1,lpszParms,Type(), type1 ) ){
     641        return;
     642    }
     643
     644    if(type1.IsDouble()){
    638645        //movsd qword ptr[rsp+offset],xmm_reg       ※スタックフレームを利用
    639646        pobj_sf->push(reg1,sizeof(double));
    640647    }
    641     else if(type1==DEF_SINGLE){
     648    else if(type1.IsSingle()){
    642649        //movss dword ptr[rsp+offset],xmm_reg       ※スタックフレームを利用
    643650        pobj_sf->push(reg1,sizeof(float));
    644651    }
    645652    else{
    646         ExtendTypeTo64(type1,reg1);
     653        ExtendTypeTo64(type1.GetBasicType(),reg1);
    647654
    648655        //mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
     
    712719                cp=NowCaseCp;
    713720
    714                 int reg2=REG_RDX,type2;
    715                 LONG_PTR lpIndex2;
    716                 type2=NumOpe(&reg2,temporary,type1,lpIndex,&lpIndex2);
     721                int reg2=REG_RDX;
     722                Type type2;
     723                if( !NumOpe(&reg2,temporary,type1,type2) ){
     724                    return;
     725                }
    717726
    718727                cp=i2;
    719728
    720                 if(type1==DEF_OBJECT){
    721                     CClass *pobj_c;
    722                     pobj_c=(CClass *)lpIndex;
    723 
    724                     std::vector<SubInfo *> subs;
    725                     pobj_c->EnumMethod( CALC_EQUAL, subs );
     729                if(type1.IsObject()){
     730                    std::vector<UserProc *> subs;
     731                    type1.GetClass().EnumMethod( CALC_EQUAL, subs );
    726732                    if( subs.size() == 0 ){
    727733                        return;
    728734                    }
    729735
    730                     PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
    731                     int iParmNum=0;
    732                     ppi[iParmNum].bArray=0;
    733                     ppi[iParmNum].bByVal=0;
    734                     ppi[iParmNum].name=0;
    735                     ppi[iParmNum].type=type2;
    736                     ppi[iParmNum].u.index=lpIndex2;
    737                     ppi[iParmNum].SubScripts[0]=-1;
    738                     iParmNum++;
     736                    Parameters params;
     737                    params.push_back( new Parameter( "", Type( type2 ) ) );
    739738
    740739                    //オーバーロードを解決
    741                     SubInfo *psi;
    742                     psi=OverloadSolution("==",subs,ppi,iParmNum,NULL);
    743                     HeapDefaultFree(ppi);
    744 
    745                     if(!psi){
     740                    UserProc *pUserProc;
     741                    pUserProc=OverloadSolution("==",subs, params, NULL);
     742
     743                    delete params[0];
     744
     745                    if(!pUserProc){
    746746                        //エラー
    747747                        return;
     
    759759
    760760                    //call operator_proc    ※ ==演算子
    761                     op_call(psi);
     761                    op_call(pUserProc);
    762762
    763763                    //test rax,rax
     
    769769                }
    770770                else{
    771                     if(type1==DEF_DOUBLE){
     771                    if(type1.IsDouble()){
    772772                        int xmm_reg;
    773773                        if(IsXmmReg(reg2)) xmm_reg=reg2;
    774774                        else xmm_reg=REG_XMM5;
    775                         ChangeTypeToXmm_Double(type2,xmm_reg,reg2);
     775                        ChangeTypeToXmm_Double(type2.GetBasicType(),xmm_reg,reg2);
    776776
    777777                        //movsd xmm4,qword ptr[rsp+offset]  ※スタックフレームから参照
     
    781781                        op_comisd(xmm_reg,REG_XMM4);
    782782                    }
    783                     else if(type1==DEF_SINGLE){
     783                    else if(type1.IsSingle()){
    784784                        int xmm_reg;
    785785                        if(IsXmmReg(reg2)) xmm_reg=reg2;
    786786                        else xmm_reg=REG_XMM5;
    787                         ChangeTypeToXmm_Single(type2,xmm_reg,reg2);
     787                        ChangeTypeToXmm_Single(type2.GetBasicType(),xmm_reg,reg2);
    788788
    789789                        //movss xmm4,dword ptr[rsp+offset]  ※スタックフレームから参照
     
    796796                        //その他整数型
    797797
    798                         i2=NeutralizationType(type1,-1,type2,-1);
     798                        i2=NeutralizationType(type1.GetBasicType(),-1,type2.GetBasicType(),-1);
    799799
    800800                        //mov r14,qword ptr[rsp+offset]     ※スタックフレームから参照
     
    883883
    884884    //call _System_GetEip
    885     extern SubInfo *pSub_System_GetEip;
     885    extern UserProc *pSub_System_GetEip;
    886886    op_call(pSub_System_GetEip);
    887887
     
    938938}
    939939void OpcodeReturn(char *Parameter){
    940     extern BOOL bCompilingGlobal;
    941     if(bCompilingGlobal){
     940    if( UserProc::IsGlobalAreaCompiling() ){
    942941        SetError(62,NULL,cp);
    943942    }
     
    945944        //戻り値をセット
    946945        if(Parameter[0]){
    947             extern SubInfo *pCompilingSubInfo;
    948             char *temp;
    949             if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
    950                 temp="_System_ReturnValue";
    951             else temp=pCompilingSubInfo->name;
    952 
    953             /*
    954             TODO: 消す
    955             if( pCompilingSubInfo->isReturnRef ){
    956                 //参照型
    957                 SetRefVariable( temp, Parameter );
     946            UserProc &proc = UserProc::CompilingUserProc();
     947
     948            const char *temp = "_System_ReturnValue";
     949            if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
     950            {
    958951            }
    959952            else{
    960                 //値型*/
    961                 char temporary[VN_SIZE];
    962                 sprintf(temporary,"%s=%s",temp,Parameter);
    963                 OpcodeCalc(temporary);
    964             //}
     953                temp=proc.GetName().c_str();
     954            }
     955
     956            char temporary[VN_SIZE];
     957            sprintf(temporary,"%s=%s",temp,Parameter);
     958            OpcodeCalc(temporary);
    965959        }
    966960
     
    972966void Opcode_Input(const char *Parameter){
    973967    extern int cp;
    974     int i2,i3,i4,i5,type;
     968    int i2,i3,i4,i5;
    975969    BOOL bFile;
    976970    char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
     
    10541048        }
    10551049
    1056         LONG_PTR lpIndex;
    1057         type = GetVarType(temporary, &lpIndex, 1);
     1050        Type varType;
     1051        if( !GetVarType(temporary, varType, 1) ){
     1052            return;
     1053        }
    10581054
    10591055        sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
    10601056        OpcodeCalc(temp2);
    10611057
    1062         if(type==DEF_LONG) type=DEF_DWORD;
    1063         else if(type==DEF_INTEGER) type=DEF_WORD;
    1064         else if(type==DEF_OBJECT){
    1065             CClass *pobj_Class=(CClass *)lpIndex;
    1066             if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
    1067         }
    1068         sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
     1058        if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
     1059        else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
     1060        else if(varType.IsObject()){
     1061            varType.SetBasicType( DEF_OBJECT );
     1062            if( varType.IsStringObject() ){
     1063                varType.SetBasicType( DEF_STRING );
     1064            }
     1065        }
     1066        sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
    10691067        OpcodeCalc(temp2);
    10701068
     
    10751073    OpcodeCalc(temp2);
    10761074
    1077     SubInfo *psi;
    1078     if(bFile) psi=GetSubHash("INPUT_FromFile");
    1079     else psi=GetSubHash("INPUT_FromPrompt");
    1080     if(!psi){
     1075    UserProc *pUserProc;
     1076    if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
     1077    else pUserProc=GetSubHash("INPUT_FromPrompt");
     1078    if(!pUserProc){
    10811079        SetError(3,"Input",cp);
    10821080        return;
    10831081    }
    1084     Opcode_CallProc(buffer,psi,0,"",0);
     1082    Opcode_CallProc(buffer,pUserProc,0,"",0);
    10851083}
    10861084void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
     
    11771175    OpcodeCalc(temp2);
    11781176
    1179     SubInfo *psi;
    1180     if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
    1181     else psi=GetSubHash("PRINTUSING_ToPrompt");
    1182     if(!psi){
     1177    UserProc *pUserProc;
     1178    if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
     1179    else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
     1180    if(!pUserProc){
    11831181        SetError(3,"Print",cp);
    11841182        return;
    11851183    }
    1186     Opcode_CallProc(buffer,psi,0,"",0);
     1184    Opcode_CallProc(buffer,pUserProc,0,"",0);
    11871185}
    11881186void Opcode_Print(const char *Parameter,BOOL bWrite){
     
    12811279    if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
    12821280
    1283     SubInfo *psi;
    1284     if(bFile) psi=GetSubHash("PRINT_ToFile");
    1285     else psi=GetSubHash("PRINT_ToPrompt");
    1286     if(!psi){
     1281    UserProc *pUserProc;
     1282    if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
     1283    else pUserProc=GetSubHash("PRINT_ToPrompt");
     1284    if(!pUserProc){
    12871285        SetError(3,"Print",cp);
    12881286        return;
    12891287    }
    1290     Opcode_CallProc(buffer,psi,0,"",0);
     1288    Opcode_CallProc(buffer,pUserProc,0,"",0);
    12911289}
    12921290
     
    12991297
    13001298void OpcodeSetPtrData(char *Parameter,int type){
    1301     int i,i2;
     1299    int i;
    13021300    char temporary[VN_SIZE];
    13031301
     
    13211319
    13221320    int reg_ptr=REG_RAX;
    1323     i2=NumOpe(&reg_ptr,temporary,0,0,0);
    1324     if(!IsWholeNumberType(i2)){
     1321    Type resultType;
     1322    if( !NumOpe(&reg_ptr,temporary,Type(),resultType) ){
     1323        return;
     1324    }
     1325    if(!resultType.IsWhole()){
    13251326        SetError(11,Parameter,cp);
    13261327        return;
     
    13381339
    13391340    int temp_reg=REG_NON;
    1340     i2=NumOpe(&temp_reg,temporary,0,0,0);
     1341    if( !NumOpe(&temp_reg,temporary,Type(),resultType) ){
     1342        return;
     1343    }
    13411344
    13421345    //レジスタのブロッキングを解除
     
    13441347
    13451348    if(type==DEF_DOUBLE){
    1346         ChangeTypeToXmm_Double(i2,REG_XMM0,temp_reg);
     1349        ChangeTypeToXmm_Double(resultType.GetBasicType(),REG_XMM0,temp_reg);
    13471350
    13481351        //movsd qword ptr[reg_ptr],xmm0
     
    13501353    }
    13511354    else if(type==DEF_SINGLE){
    1352         ChangeTypeToXmm_Single(i2,REG_XMM0,temp_reg);
     1355        ChangeTypeToXmm_Single(resultType.GetBasicType(),REG_XMM0,temp_reg);
    13531356
    13541357        //movss dword ptr[reg_ptr],xmm0
     
    13561359    }
    13571360    else{
    1358         ChangeTypeToWhole(i2,type,REG_RCX,temp_reg);
     1361        ChangeTypeToWhole(resultType.GetBasicType(),type,REG_RCX,temp_reg);
    13591362
    13601363        //mov ptr[reg_ptr],rcx
Note: See TracChangeset for help on using the changeset viewer.