Ignore:
Timestamp:
Sep 25, 2007, 8:56:38 AM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

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

    r320 r325  
    424424    return true;
    425425}
     426
     427void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
     428{
     429    ///////////////////////////////////////////////////////////////
     430    // _System_LocalThisのダミーをセット
     431    ///////////////////////////////////////////////////////////////
     432
     433    char temporary[VN_SIZE]={0};
     434    if( objPtrValueStr && objPtrValueStr[0] ){
     435        //_System_LocalThis(第一パラメータ)のダミーを作成
     436        lstrcpy(temporary,"0,");
     437    }
     438    if( dg.ReturnType().IsStruct() ){
     439        // ※ByRef _System_ReturnValue パラメータのダミーをセット
     440        lstrcat(temporary,"0,");
     441    }
     442
     443    if(params[0]=='\0'&&temporary[0])
     444        temporary[lstrlen(temporary)-1]=0;
     445    else lstrcat(temporary,params);
     446
     447
     448    ParamImpl *pobj_parameter = new ParamImpl( params );
     449
     450    //一時オブジェクトを生成
     451    pobj_parameter->NewTempParameters( dg.GetName(), dg.Params() );
     452
     453    //レジスタ、スタックフレームにセット
     454    int ParmSize = pobj_parameter->SetParameter( dg.GetName(), dg.Params() );
     455
     456
     457    if( objPtrValueStr && objPtrValueStr[0] )
     458    {
     459        RELATIVE_VAR RelativeVar;
     460        //Constアクセスが不可能なメソッドの場合
     461        if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
     462            Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
     463            return;
     464        }
     465
     466        SetVarPtrToEax(&RelativeVar);
     467
     468        // 参照を実体ポインタにする
     469        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
     470
     471        //push ecx
     472        compiler.codeGenerator.op_push(REG_ECX);
     473    }
     474
     475
     476    {
     477        ////////////////////////
     478        // call
     479        ////////////////////////
     480        RELATIVE_VAR RelativeVar;
     481        GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
     482        SetVarPtrToEax( &RelativeVar );
     483
     484        //mov eax,dword ptr[eax]
     485        compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
     486
     487        //call eax
     488        compiler.codeGenerator.op_call_R( REG_EAX );
     489    }
     490
     491
     492    //一時オブジェクトを破棄
     493    pobj_parameter->DeleteTempParameters();
     494
     495    //パラメータオブジェクトを破棄
     496    delete pobj_parameter;
     497}
Note: See TracChangeset for help on using the changeset viewer.