Ignore:
Timestamp:
Oct 14, 2007, 9:41:03 PM (17 years ago)
Author:
dai_9181
Message:

インターフェイスを実装

File:
1 edited

Legend:

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

    r349 r350  
    156156        /////////////////////////////////
    157157        pMethod = NULL;
    158         if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOfInterfaceMethod( pUserProc );
     158        if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
    159159        if( ! pMethod ){
    160160            //動的メソッドが取得できなかったときは静的メソッドを当たる
     
    280280        //////////////////////////////////////////////////////
    281281        // メンバ関数の場合
    282         // ※_System_LocalThis パラメータをセット
     282        // ※_System_LocalThis パラメータをecxにセット
    283283        //////////////////////////////////////////////////////
    284284
     
    319319            }
    320320        }
    321 
    322         //push ecx
    323         compiler.codeGenerator.op_push(REG_ECX);
    324     }
    325 
    326     if( pUserProc->IsVirtual() && !isFixedClass ){
    327         //仮想関数(オブジェクトメソッド)呼び出し
    328         //pObj->func_table->func1
    329         //                ->func2
    330         //                ->func3
    331 
     321    }
     322
     323    if( pUserProc->IsVirtual() && !isFixedClass )
     324    {
    332325        int vtblIndex;
    333326        if( pobj_c->IsInterface() )
     
    347340
    348341            // インターフェイスの場合は更に__thisを取得する
    349             //mov rcx,qword ptr[rcx+offset_this]
     342            //mov ecx,qword ptr[ecx+offset_this]
    350343            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
    351344
     
    376369            // vtblのポインタを取得
    377370            //mov edx,dword ptr[edx+vtblMasterListIndex]
    378             compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 );
    379         }
     371            compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
     372        }
     373
     374        //push ecx
     375        compiler.codeGenerator.op_push(REG_ECX);   
    380376
    381377        //call dword ptr[edx+func_index]
     
    399395        //通常呼び出し
    400396
     397        if( pUserProc->GetParentClassPtr() && isStatic == false )
     398        {
     399            //push ecx
     400            compiler.codeGenerator.op_push(REG_ECX);
     401        }
     402
    401403        //call ProcAddr
    402404        compiler.codeGenerator.op_call(pUserProc);
Note: See TracChangeset for help on using the changeset viewer.