Changeset 109 in dev for BasicCompiler32/Compile_Func.cpp


Ignore:
Timestamp:
May 6, 2007, 7:09:04 PM (18 years ago)
Author:
dai_9181
Message:

ObjPtr関数を実装。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_Func.cpp

    r97 r109  
    1212        case FUNC_SIZEOF:
    1313        case FUNC_VARPTR:
     14        case FUNC_OBJPTR:
    1415            return DEF_DWORD;
    1516        case FUNC_GETDOUBLE:
     
    3536    if(lstrcmpi(FuncName,"SizeOf")==0)      return FUNC_SIZEOF;
    3637    if(lstrcmpi(FuncName,"VarPtr")==0)      return FUNC_VARPTR;
     38    if(lstrcmpi(FuncName,"ObjPtr")==0)      return FUNC_OBJPTR;
    3739    if(lstrcmpi(FuncName,"GetDouble")==0)   return FUNC_GETDOUBLE;
    3840    if(lstrcmpi(FuncName,"GetSingle")==0)   return FUNC_GETSINGLE;
     
    376378    SetVarPtrToEax(&RelativeVar);
    377379
     380    // TODO: 取り除く(この動きはObjPtrに託す)
    378381    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
    379382        //参照をオブジェクトポインタに変更
     
    381384        //mov eax,dword ptr[eax]
    382385        op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     386    }
     387}
     388void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
     389    if( isCallOn == false ){
     390        // 戻り値の型を取得するだけ
     391
     392        //変数のアドレスを取得
     393        if(!GetVarType( Parameter, resultType, true )) return;
     394
     395        resultType.PtrLevelUp();
     396
     397        return;
     398    }
     399
     400    RELATIVE_VAR RelativeVar;
     401
     402    //変数のアドレスを取得
     403    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
     404
     405    int beforeType = resultType.GetBasicType();
     406
     407    resultType.PtrLevelUp();
     408
     409    SetVarPtrToEax(&RelativeVar);
     410
     411    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     412        //参照をオブジェクトポインタに変更
     413
     414        //mov eax,dword ptr[eax]
     415        op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     416    }
     417    else{
     418        SetError(134,NULL,cp );
    383419    }
    384420}
     
    472508            Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
    473509            break;
     510        case FUNC_OBJPTR:
     511            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
     512            break;
    474513
    475514        case FUNC_GETDOUBLE:
Note: See TracChangeset for help on using the changeset viewer.