Changeset 109 in dev


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

ObjPtr関数を実装。

Files:
5 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:
  • BasicCompiler32/FunctionValue.h

    r3 r109  
    1010//メモリ操作
    1111#define FUNC_VARPTR     0x0591
     12#define FUNC_OBJPTR     0x0592
    1213
    1314//その他
  • BasicCompiler64/Compile_Func.cpp

    r97 r109  
    1010        case FUNC_ADDRESSOF:
    1111        case FUNC_VARPTR:
     12        case FUNC_OBJPTR:
    1213            return DEF_PTR_VOID;
    1314        case FUNC_GETDOUBLE:
     
    3132    if(lstrcmpi(FuncName,"SizeOf")==0)      return FUNC_SIZEOF;
    3233    if(lstrcmpi(FuncName,"VarPtr")==0)      return FUNC_VARPTR;
     34    if(lstrcmpi(FuncName,"ObjPtr")==0)      return FUNC_OBJPTR;
    3335    if(lstrcmpi(FuncName,"GetDouble")==0)   return FUNC_GETDOUBLE;
    3436    if(lstrcmpi(FuncName,"GetSingle")==0)   return FUNC_GETSINGLE;
     
    221223    SetVarPtrToReg(REG_RAX,&RelativeVar);
    222224
     225    // TODO: 取り除く(この動きはObjPtrに託す)
    223226    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
    224227        //参照をオブジェクトポインタに変更
     
    226229        //mov rax,qword ptr[rax]
    227230        op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     231    }
     232}
     233void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
     234    if( isCallOn == false ){
     235        // 戻り値の型を取得するだけ
     236
     237        //変数のアドレスを取得
     238        if(!GetVarType( Parameter, resultType, true )) return;
     239
     240        resultType.PtrLevelUp();
     241
     242        return;
     243    }
     244
     245    RELATIVE_VAR RelativeVar;
     246
     247    //変数のアドレスを取得
     248    if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
     249
     250    int beforeType = resultType.GetBasicType();
     251
     252    resultType.PtrLevelUp();
     253
     254    SetVarPtrToReg(REG_RAX,&RelativeVar);
     255
     256    if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
     257        //参照をオブジェクトポインタに変更
     258
     259        //mov rax,qword ptr[rax]
     260        op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
     261    }
     262    else{
     263        SetError(134,NULL,cp );
    228264    }
    229265}
     
    270306            Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
    271307            break;
     308        case FUNC_OBJPTR:
     309            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
     310            break;
    272311
    273312        case FUNC_GETDOUBLE:
  • BasicCompiler64/FunctionValue.h

    r3 r109  
    99//メモリ操作
    1010#define FUNC_VARPTR     0x0591
     11#define FUNC_OBJPTR     0x0592
    1112
    1213//その他
  • BasicCompiler_Common/error.cpp

    r107 r109  
    188188    if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
    189189    if(num==133) lstrcpy(msg,"Thisに代入はできません。");
     190    if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
    190191
    191192    //Enum関連
Note: See TracChangeset for help on using the changeset viewer.