Changeset 349 in dev for trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
r348 r349 330 330 // ->func3 331 331 332 int vtblMasterListIndex, vtblIndex; 333 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 334 335 // vtblマスターリストのポインタを取得 336 //mov edx,dword ptr[ecx] 337 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 338 339 // vtblのポインタを取得 340 //mov edx,dword ptr[edx+vtblMasterListIndex] 341 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 ); 332 int vtblIndex; 333 if( pobj_c->IsInterface() ) 334 { 335 // インターフェイスメソッド呼び出し 336 337 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); 338 339 340 // vtblのポインタを取得 341 //mov edx,dword ptr[ecx+offset_vtbl] 342 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 ); 343 344 int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" ); 345 346 347 348 // インターフェイスの場合は更に__thisを取得する 349 //mov rcx,qword ptr[rcx+offset_this] 350 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 ); 351 352 int vtblMasterListIndex; 353 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 354 if( vtblMasterListIndex != 0 ) 355 { 356 SetError(); 357 } 358 } 359 else 360 { 361 //仮想関数(オブジェクトメソッド)呼び出し 362 // pObj -> vtbl_master_list -> vtbl1 -> func1 363 // -> func2 364 // -> func3 365 // -> vtbl2 -> func1 366 // -> func2 367 // -> func3 368 369 int vtblMasterListIndex; 370 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 371 372 // vtblマスターリストのポインタを取得 373 //mov edx,dword ptr[ecx] 374 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 375 376 // vtblのポインタを取得 377 //mov edx,dword ptr[edx+vtblMasterListIndex] 378 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 ); 379 } 342 380 343 381 //call dword ptr[edx+func_index]
Note:
See TracChangeset
for help on using the changeset viewer.