Changeset 349 in dev for trunk/abdev/BasicCompiler32/Compile_Func.cpp
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Func.cpp
r348 r349 269 269 270 270 271 //仮想関数(オブジェクトメソッド) 272 //pObj->func_table->func1 273 // ->func2 274 // ->func3 275 276 int vtblMasterListIndex, vtblIndex; 277 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 278 279 // vtblマスターリストのポインタを取得 280 //mov edx,dword ptr[ecx] 281 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 282 283 // vtblのポインタを取得 284 //mov edx,dword ptr[edx+vtblMasterListIndex] 285 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 ); 271 int vtblIndex; 272 if( pobj_c->IsInterface() ) 273 { 274 // インターフェイスメソッド呼び出し 275 276 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); 277 278 279 // vtblのポインタを取得 280 //mov edx,dword ptr[ecx+offset_vtbl] 281 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 ); 282 283 int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" ); 284 285 286 287 // インターフェイスの場合は更に__thisを取得する 288 //mov rcx,qword ptr[rcx+offset_this] 289 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 ); 290 291 int vtblMasterListIndex; 292 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 293 if( vtblMasterListIndex != 0 ) 294 { 295 SetError(); 296 } 297 } 298 else 299 { 300 //仮想関数(オブジェクトメソッド)呼び出し 301 // pObj -> vtbl_master_list -> vtbl1 -> func1 302 // -> func2 303 // -> func3 304 // -> vtbl2 -> func1 305 // -> func2 306 // -> func3 307 308 int vtblMasterListIndex; 309 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 310 311 // vtblマスターリストのポインタを取得 312 //mov edx,dword ptr[ecx] 313 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 314 315 // vtblのポインタを取得 316 //mov edx,dword ptr[edx+vtblMasterListIndex] 317 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex, MOD_BASE_DISP32 ); 318 } 286 319 287 320 //mov eax,dword ptr[edx+func_index]
Note:
See TracChangeset
for help on using the changeset viewer.