Changeset 330 in dev


Ignore:
Timestamp:
Sep 26, 2007, 3:00:09 AM (16 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler64
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler64/Compile_CallProc.cpp

    r325 r330  
    2424}
    2525
    26 bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
    27 
     26bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer)
     27{
    2828    extern BOOL bDebugCompile;
    2929    extern BOOL bDebugSupportProc;
     
    475475}
    476476
    477 void UnsafeCall( const char *methodPtrValueStr, const char *params )
     477void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
    478478{
     479    ///////////////////////////////////////////////////////////////
     480    // _System_LocalThisのダミーをセット
     481    ///////////////////////////////////////////////////////////////
     482
     483    char temporary[VN_SIZE]={0};
     484    if( objPtrValueStr && objPtrValueStr[0] ){
     485        //_System_LocalThis(第一パラメータ)のダミーを作成
     486        lstrcpy(temporary,"0,");
     487    }
     488    if( dg.ReturnType().IsStruct() ){
     489        // ※ByRef _System_ReturnValue パラメータのダミーをセット
     490        lstrcat(temporary,"0,");
     491    }
     492
     493    if(params[0]=='\0'&&temporary[0])
     494        temporary[lstrlen(temporary)-1]=0;
     495    else lstrcat(temporary,params);
     496
     497
     498    ParamImpl *pobj_parameter = new ParamImpl( params );
     499
     500    //スタックフレームに存在する既存のパラメータをバックアップ
     501    pobj_parameter->BackupParameter( (int)dg.Params().size() );
     502
     503    //一時オブジェクトを生成
     504    pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() );
     505
     506    //レジスタ、スタックフレームにセット
     507    pobj_parameter->SetParameter( dg.GetName(), dg.Params() );
     508
     509
     510    if( objPtrValueStr && objPtrValueStr[0] )
     511    {
     512        RELATIVE_VAR RelativeVar;
     513        //Constアクセスが不可能なメソッドの場合
     514        if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
     515            Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
     516            return;
     517        }
     518
     519        SetVarPtrToReg(REG_RCX,&RelativeVar);
     520
     521        // 参照を実体ポインタにする
     522        //mov rcx,qword ptr[rcx]
     523        compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
     524    }
     525
     526
     527    {
     528        ////////////////////////
     529        // call
     530        ////////////////////////
     531        RELATIVE_VAR RelativeVar;
     532        GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
     533        SetVarPtrToReg(REG_RAX,&RelativeVar);
     534
     535        //mov rax,qword ptr[rax]
     536        compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE);
     537
     538        //call rax
     539        compiler.codeGenerator.PutOld(
     540            (char)0xFF,
     541            (char)0xD0
     542        );
     543    }
     544
     545
     546    //レジスタのブロッキングを解除        ※パラメータセット時にロックされたレジスタ
     547    pobj_BlockReg->clear();
     548
     549    //一時オブジェクトを破棄
     550    pobj_parameter->DeleteTempParameters();
     551
     552    //スタックフレームに存在する既存のパラメータを復元
     553    pobj_parameter->RestoreParameter( (int)dg.Params().size() );
     554
     555    //パラメータオブジェクトを破棄
     556    delete pobj_parameter;
    479557}
  • trunk/abdev/BasicCompiler64/Compile_Func.cpp

    r325 r330  
    1414    if( lstrcmpi( FuncName, "VarPtr" ) == 0 )           return FUNC_VARPTR;
    1515    if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )           return FUNC_OBJPTR;
    16     if( lstrcmpi( FuncName, "__unsafe_call" ) == 0 )    return FUNC_UNSAFE_CALL;
     16    if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )    return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
     17    if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )     return FUNC_DELEGATE_STATICMETHOD_CALL;
    1718    if( lstrcmpi( FuncName, "GetDouble" ) == 0 )        return FUNC_GETDOUBLE;
    1819    if( lstrcmpi( FuncName, "GetSingle" ) == 0 )        return FUNC_GETSINGLE;
     
    253254}
    254255
    255 void Opcode_Func_unsafe_call( const char *paramsStr, Type &resultType, bool isCallOn )
     256void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
    256257{
    257258    if( isCallOn )
    258259    {
    259260        int i = 0;
    260         char methodPtrParamStr[8192];
    261         GetOneParameter( paramsStr, i, methodPtrParamStr );
    262         UnsafeCall( methodPtrParamStr, paramsStr + i );
     261        char methodPtrParamStr[VN_SIZE];
     262        i = GetOneParameter( paramsStr, i, methodPtrParamStr );
     263
     264        char objPtrValueStr[VN_SIZE];
     265        if( isDynamicCall )
     266        {
     267            i = GetOneParameter( paramsStr, i, objPtrValueStr );
     268        }
     269
     270        Opcode_CallDelegate( compiler.pCompilingClass->GetDelegate(), methodPtrParamStr, objPtrValueStr, paramsStr + i );
    263271    }
    264272
     
    311319            Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
    312320            break;
    313         case FUNC_UNSAFE_CALL:
    314             Opcode_Func_unsafe_call( Parameter, resultType, isCallOn );
     321        case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
     322            Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
     323            break;
     324        case FUNC_DELEGATE_STATICMETHOD_CALL:
     325            Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
    315326            break;
    316327
  • trunk/abdev/BasicCompiler64/FunctionValue.h

    r325 r330  
    1414#define FUNC_ADDRESSOF      0x0619
    1515#define FUNC_SIZEOF         0x0620
    16 #define FUNC_UNSAFE_CALL    0x0621
     16#define FUNC_DELEGATE_DYNAMICMETHOD_CALL    0x0621
     17#define FUNC_DELEGATE_STATICMETHOD_CALL     0x0622
    1718
    1819//ポインタ
  • trunk/abdev/BasicCompiler64/Opcode.h

    r327 r330  
    327327bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
    328328bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
    329 void UnsafeCall( const char *methodPtrValueStr, const char *params );
     329void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params );
    330330
    331331//Compile_ProcOp.cpp
Note: See TracChangeset for help on using the changeset viewer.