Ignore:
Timestamp:
Sep 26, 2007, 3:00:09 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 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}
Note: See TracChangeset for help on using the changeset viewer.