Changeset 349 in dev for trunk/abdev/BasicCompiler64
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler64
- Files:
-
- 3 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] -
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] -
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r346 r349 90 90 } 91 91 } 92 void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){ 93 int typeSize = classObj.GetSize(); 94 95 if(classObj.IsAbstract()){ 92 void Operator_New( const CClass &objClass, const char *objectSizeStr, const char *parameter, const Type &baseType ) 93 { 94 const CClass *pClass = &objClass; 95 int typeSize = pClass->GetSize(); 96 97 if( pClass->IsInterface() ) 98 { 99 pClass = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr(); 100 } 101 102 if( pClass->IsAbstract() ){ 96 103 //抽象クラスだったとき 97 SetError(125, classObj.GetName().c_str(),cp);104 SetError(125,pClass->GetName().c_str(),cp); 98 105 } 99 106 … … 177 184 178 185 179 const CMethod *method = classObj.GetDestructorMethod();186 const CMethod *method = pClass->GetDestructorMethod(); 180 187 if( method == NULL ) return; 181 188 … … 201 208 202 209 //仮想関数テーブルを初期化 203 if( classObj.IsExistVirtualFunctions()204 && ! classObj.IsAbstract() )210 if( pClass->IsExistVirtualFunctions() 211 && !pClass->IsAbstract() ) 205 212 { 206 213 // mov rcx,vtblAddress 207 compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, &classObj);214 compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, pClass ); 208 215 209 216 //mov qword ptr[rax],rcx … … 212 219 213 220 // 仮想関数になるメソッドに使用チェックをつける 214 BOOST_FOREACH( const CMethod *pMethod, classObj.GetDynamicMethods() )221 BOOST_FOREACH( const CMethod *pMethod, pClass->GetDynamicMethods() ) 215 222 { 216 223 if( pMethod->IsVirtual() ) … … 219 226 } 220 227 } 221 BOOST_FOREACH( const ::Interface *pInterface, classObj.GetInterfaces() )228 BOOST_FOREACH( const ::Interface *pInterface, pClass->GetInterfaces() ) 222 229 { 223 230 BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ) … … 238 245 //////////////////////////// 239 246 240 _call_constructor( &classObj,parameter,typeSize,bSomeObjects);247 _call_constructor(pClass,parameter,typeSize,bSomeObjects); 241 248 242 249
Note:
See TracChangeset
for help on using the changeset viewer.