Changeset 76 in dev for BasicCompiler32/Compile_Func.cpp


Ignore:
Timestamp:
Mar 21, 2007, 9:26:56 PM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。32bitが未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Func.cpp

    r75 r76  
    4444}
    4545
    46 void Opcode_Func_Fix(const char *Parameter){
    47     int i;
    48 
    49     i=NumOpe(Parameter,0,0,0);
    50 
    51     if(i==DEF_DOUBLE){
     46void Opcode_Func_Fix(const char *lpszParms){
     47    Type resultType;
     48    if( !NumOpe( lpszParms, Type(), resultType ) ){
     49        return;
     50    }
     51
     52    if( resultType.IsDouble() ){
    5253        //fld qword ptr[esp]
    5354        op_fld_ptr_esp(DEF_DOUBLE);
     
    9697        op_add_esp(4);
    9798    }
    98     else if(i==DEF_SINGLE){
     99    else if( resultType.IsSingle() ){
    99100        //fld dword ptr[esp]
    100101        op_fld_ptr_esp(DEF_SINGLE);
     
    146147        op_add_esp(4);
    147148    }
    148     else if(Is64Type(i)){
     149    else if( resultType.Is64() ){
    149150        //pop eax
    150151        op_pop(REG_EAX);
     
    162163
    163164void Opcode_Func_CUDbl(const char *Parameter){
    164     int i;
    165 
    166     i=NumOpe(Parameter,0,0,0);
    167     ChangeTypeToLong(i);
     165    Type resultType;
     166    if( !NumOpe(Parameter,Type(),resultType) ){
     167        return;
     168    }
     169    ChangeTypeToLong(resultType.GetBasicType());
    168170
    169171    //pop eax
     
    186188}
    187189void Opcode_Func_Len(const char *Parameter){
    188     int type,TypeSize;
    189     LONG_PTR lpIndex;
    190190    BOOL bArrayHead;
    191 
    192     type=GetVarType(Parameter,&lpIndex,0);
    193191
    194192    const char *tempParm=Parameter;
    195193    char temporary[VN_SIZE];
    196194    char temp2[32];
    197     if(type==-1){
     195    Type type;
     196    if( !GetVarType(Parameter,type,0) ){
    198197        sprintf(temporary,"_System_DummyStr2=%s",Parameter);
    199198        OpcodeCalc(temporary);
     
    203202
    204203        extern CClass *pobj_StringClass;
    205         type=DEF_OBJECT;
    206         lpIndex=(LONG_PTR)pobj_StringClass;
    207     }
    208 
    209     Type TypeInfo={type,lpIndex};
    210     if(IsStringObjectType(TypeInfo)){
     204        type.SetType( DEF_OBJECT, pobj_StringClass );
     205    }
     206
     207    if( type.IsStringObject() ){
    211208        //Stringオブジェクトの場合
    212         char temporary[VN_SIZE];
    213209        sprintf(temporary,"%s.Length",tempParm);
    214210
    215         NumOpe(temporary,0,0,NULL,NULL);
     211        int reg=REG_RAX;
     212        NumOpe(temporary,Type(),Type());
    216213
    217214        //pop eax
     
    223220    int SubScripts[MAX_ARRAYDIM];
    224221    RELATIVE_VAR RelativeVar;
    225     if(!GetVarOffsetReadOnly(tempParm,&type,&RelativeVar,&lpIndex,SubScripts)) return;
    226 
    227     if(type&FLAG_PTR){
    228         type&=~FLAG_PTR;
     222    if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,SubScripts)) return;
     223
     224    if(type.GetBasicType()&FLAG_PTR){
     225        type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
    229226
    230227        bArrayHead=1;
     
    232229    else bArrayHead=0;
    233230
    234     TypeSize=GetTypeSize(type,lpIndex);
    235 
    236     if(bArrayHead) TypeSize*=JumpSubScripts(SubScripts);
     231    int typeSize = type.GetSize();
     232
     233    if(bArrayHead) typeSize*=JumpSubScripts(SubScripts);
    237234
    238235    //mov eax,TypeSize
    239236    OpBuffer[obp++]=(char)0xB8;
    240     *((long *)(OpBuffer+obp))=TypeSize;
     237    *((long *)(OpBuffer+obp))=typeSize;
    241238    obp+=sizeof(long);
    242239}
    243 void Opcode_Func_AddressOf(const char *name){
     240void Opcode_Func_AddressOf( const char *name ){
    244241    extern int cp;
    245242    UserProc *pUserProc;
     
    257254
    258255        //オーバーロードを解決
    259         extern ProcPointer **ppProcPtrInfo;
    260         pUserProc=OverloadSolution(name,subs,ppProcPtrInfo[ProcPtr_BaseIndex]->Params(), Type() );
     256        extern ProcPointer **ppProcPointer;
     257        pUserProc=OverloadSolution(name,subs,ppProcPointer[ProcPtr_BaseIndex]->Params(), Type() );
    261258
    262259        if(!pUserProc){
     
    289286            else{
    290287                RELATIVE_VAR RelativeVar;
    291                 int type;
    292                 if(!GetVarOffsetReadOnly(ObjectName,&type,&RelativeVar,(LONG_PTR *)&pobj_c)) return;
     288                Type type;
     289                if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
    293290                SetVarPtrToEax(&RelativeVar);
    294291
     
    297294
    298295                //参照タイプが整合しているかをチェック
    299                 if(type!=RefType) SetError(104,ObjectName,cp);
    300 
    301                 if(type==DEF_PTR_OBJECT){
     296                if(type.GetBasicType()!=RefType) SetError(104,ObjectName,cp);
     297
     298                if(type.IsObjectPtr()){
    302299                    //mov ecx,dword ptr[ecx]
    303300                    op_mov_RM(sizeof(long),REG_ECX,REG_ECX,0,MOD_BASE);
     
    360357    op_mov_RV( REG_EAX, size );
    361358}
    362 void Opcode_Func_VarPtr( const char *Parameter, Type &ReturnTypeInfo ){
     359void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
     360    if( isCallOn == false ){
     361        // 戻り値の型を取得するだけ
     362
     363        //変数のアドレスを取得
     364        if(!GetVarType( Parameter, resultType, true )) return;
     365
     366        resultType.PtrLevelUp();
     367
     368        return;
     369    }
     370
    363371    RELATIVE_VAR RelativeVar;
    364372
    365373    //変数のアドレスを取得
    366     if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
    367 
    368     int beforeType = ReturnTypeInfo.type;
    369 
    370     PTR_LEVEL_UP( ReturnTypeInfo.type );
     374    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
     375
     376    int beforeType = resultType.GetBasicType();
     377
     378    resultType.PtrLevelUp();
    371379
    372380    SetVarPtrToEax(&RelativeVar);
     
    380388}
    381389void Opcode_Func_GetPtrData(const char *Parameter,const int type){
    382     int i2;
    383 
    384     i2=NumOpe(Parameter,0,0,0);
    385     ChangeTypeToLong(i2);
     390    Type tempType;
     391    if( !NumOpe(Parameter,Type(),tempType) ){
     392        return;
     393    }
     394    if(!tempType.IsWhole()){
     395        SetError(11,Parameter,cp);
     396        return;
     397    }
     398    ChangeTypeToLong(tempType.GetBasicType());
    386399
    387400    if(type==DEF_DOUBLE){
     
    438451}
    439452
    440 void Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo ){
     453bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &resultType, bool isCallOn ){
    441454    switch(FuncNum){
    442455        case FUNC_FIX:
    443             Opcode_Func_Fix(Parameter);
    444             ReturnTypeInfo.type = DEF_LONG;
     456            if( isCallOn ) Opcode_Func_Fix(Parameter);
     457            resultType.SetBasicType( DEF_LONG );
    445458            break;
    446459        case FUNC_CUDBL:
    447             Opcode_Func_CUDbl(Parameter);
    448             ReturnTypeInfo.type = DEF_DOUBLE;
     460            if( isCallOn ) Opcode_Func_CUDbl(Parameter);
     461            resultType.SetBasicType( DEF_DOUBLE );
    449462            break;
    450463        case FUNC_LEN:
    451             Opcode_Func_Len(Parameter);
    452             ReturnTypeInfo.type = DEF_LONG;
     464            if( isCallOn ) Opcode_Func_Len(Parameter);
     465            resultType.SetBasicType( DEF_LONG );
    453466            break;
    454467        case FUNC_ADDRESSOF:
    455             Opcode_Func_AddressOf(Parameter);
    456             ReturnTypeInfo.type = DEF_PTR_VOID;
     468            if( isCallOn ) Opcode_Func_AddressOf(Parameter);
     469            resultType.SetBasicType( DEF_PTR_VOID );
    457470            break;
    458471        case FUNC_SIZEOF:
    459             Opcode_Func_SizeOf(Parameter);
    460             ReturnTypeInfo.type = DEF_LONG;
     472            if( isCallOn ) Opcode_Func_SizeOf(Parameter);
     473            resultType.SetBasicType( DEF_LONG );
    461474            break;
    462475        case FUNC_VARPTR:
    463             Opcode_Func_VarPtr( Parameter, ReturnTypeInfo );
     476            Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
    464477            break;
    465478
    466479        case FUNC_GETDOUBLE:
    467             Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
    468             ReturnTypeInfo.type = DEF_DOUBLE;
     480            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
     481            resultType.SetBasicType( DEF_DOUBLE );
    469482            break;
    470483        case FUNC_GETSINGLE:
    471             Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
    472             ReturnTypeInfo.type = DEF_SINGLE;
     484            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
     485            resultType.SetBasicType( DEF_SINGLE );
    473486            break;
    474487        case FUNC_GETQWORD:
    475             Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
    476             ReturnTypeInfo.type = DEF_QWORD;
     488            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
     489            resultType.SetBasicType( DEF_QWORD );
    477490            break;
    478491        case FUNC_GETDWORD:
    479             Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
    480             ReturnTypeInfo.type = DEF_DWORD;
     492            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
     493            resultType.SetBasicType( DEF_DWORD );
    481494            break;
    482495        case FUNC_GETWORD:
    483             Opcode_Func_GetPtrData(Parameter,DEF_WORD);
    484             ReturnTypeInfo.type = DEF_WORD;
     496            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
     497            resultType.SetBasicType( DEF_WORD );
    485498            break;
    486499        case FUNC_GETBYTE:
    487             Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
    488             ReturnTypeInfo.type = DEF_BYTE;
    489             break;
    490     }
    491 }
     500            if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
     501            resultType.SetBasicType( DEF_BYTE );
     502            break;
     503        default:
     504            return false;
     505    }
     506    return true;
     507}
Note: See TracChangeset for help on using the changeset viewer.