Changeset 349 in dev for trunk/abdev/BasicCompiler64/Compile_Func.cpp
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_Func.cpp
r348 r349 116 116 117 117 118 //仮想関数(オブジェクトメソッド) 119 //pObj->func_table->func1 120 // ->func2 121 // ->func3 122 123 int vtblMasterListIndex, vtblIndex; 124 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 125 126 // vtblマスターリストのポインタを取得 127 //mov r11,qword ptr[rcx] 128 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 129 130 // vtblのポインタを取得 131 //mov r11,dword ptr[r11+vtblMasterListIndex] 132 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 ); 118 int vtblIndex; 119 if( pobj_c->IsInterface() ) 120 { 121 // インターフェイスメソッド 122 123 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); 124 125 // vtblのポインタを取得 126 //mov r11,qword ptr[rcx+offset_vtbl] 127 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8); 128 129 int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" ); 130 131 // インターフェイスの場合は更に__thisを取得する 132 //mov rcx,qword ptr[rcx+offset_this] 133 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8); 134 135 int vtblMasterListIndex; 136 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 137 if( vtblMasterListIndex != 0 ) 138 { 139 SetError(); 140 } 141 } 142 else 143 { 144 //仮想関数(オブジェクトメソッド) 145 // pObj -> vtbl_master_list -> vtbl1 -> func1 146 // -> func2 147 // -> func3 148 // -> vtbl2 -> func1 149 // -> func2 150 // -> func3 151 152 int vtblMasterListIndex; 153 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 154 155 // vtblマスターリストのポインタを取得 156 //mov r11,qword ptr[rcx] 157 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 158 159 // vtblのポインタを取得 160 //mov r11,dword ptr[r11+vtblMasterListIndex] 161 compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 ); 162 } 133 163 134 164 //mov rax,qword ptr[r11+func_index]
Note:
See TracChangeset
for help on using the changeset viewer.