Changeset 349 in dev for trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
r348 r349 356 356 357 357 if( pUserProc->IsVirtual() && !isFixedClass ){ 358 //仮想関数(オブジェクトメソッド)呼び出し 359 //pObj->func_table->func1 360 // ->func2 361 // ->func3 362 363 int vtblMasterListIndex, vtblIndex; 364 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 365 366 // vtblマスターリストのポインタを取得 367 //mov r11,qword ptr[rcx] 368 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 369 370 // vtblのポインタを取得 371 //mov r11,dword ptr[r11+vtblMasterListIndex] 372 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 ); 358 int vtblIndex; 359 if( pobj_c->IsInterface() ) 360 { 361 // インターフェイスメソッド呼び出し 362 363 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); 364 365 // vtblのポインタを取得 366 //mov r11,qword ptr[rcx+offset_vtbl] 367 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8); 368 369 int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" ); 370 371 // インターフェイスの場合は更に__thisを取得する 372 //mov rcx,qword ptr[rcx+offset_this] 373 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8); 374 375 int vtblMasterListIndex; 376 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 377 if( vtblMasterListIndex != 0 ) 378 { 379 SetError(); 380 } 381 } 382 else 383 { 384 //仮想関数(オブジェクトメソッド)呼び出し 385 // pObj -> vtbl_master_list -> vtbl1 -> func1 386 // -> func2 387 // -> func3 388 // -> vtbl2 -> func1 389 // -> func2 390 // -> func3 391 392 int vtblMasterListIndex; 393 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 394 395 // vtblマスターリストのポインタを取得 396 //mov r11,qword ptr[rcx] 397 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 398 399 // vtblのポインタを取得 400 //mov r11,dword ptr[r11+vtblMasterListIndex] 401 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 ); 402 } 373 403 374 404 //call qword ptr[r11+func_index]
Note:
See TracChangeset
for help on using the changeset viewer.