Changeset 349 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Oct 13, 2007, 11:45:58 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler32
- Files:
-
- 3 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] -
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] -
trunk/abdev/BasicCompiler32/Compile_Object.cpp
r346 r349 97 97 } 98 98 } 99 void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType ){ 100 int typeSize = classObj.GetSize(); 101 102 if(classObj.IsAbstract()){ 99 void Operator_New( const CClass &objClass, const char *objectSizeStr, const char *parameter, const Type &baseType ) 100 { 101 const CClass *pClass = &objClass; 102 int typeSize = pClass->GetSize(); 103 104 if( pClass->IsInterface() ) 105 { 106 pClass = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr(); 107 } 108 109 if(pClass->IsAbstract()){ 103 110 //抽象クラスだったとき 104 SetError(125, classObj.GetName(),cp);111 SetError(125,pClass->GetName(),cp); 105 112 } 106 113 … … 188 195 189 196 190 const CMethod *method = classObj.GetDestructorMethod();197 const CMethod *method = pClass->GetDestructorMethod(); 191 198 if( method == NULL ) return; 192 199 … … 207 214 208 215 //仮想関数テーブルを初期化 209 if( classObj.IsExistVirtualFunctions()210 && ! classObj.IsAbstract() )216 if( pClass->IsExistVirtualFunctions() 217 && !pClass->IsAbstract() ) 211 218 { 212 219 // mov ecx,vtblAddress 213 compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, &classObj);220 compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, pClass ); 214 221 215 222 //mov dword ptr[eax],ecx … … 217 224 218 225 // 仮想関数になるメソッドに使用チェックをつける 219 BOOST_FOREACH( const CMethod *pMethod, classObj.GetDynamicMethods() )226 BOOST_FOREACH( const CMethod *pMethod, pClass->GetDynamicMethods() ) 220 227 { 221 228 if( pMethod->IsVirtual() ) … … 224 231 } 225 232 } 226 BOOST_FOREACH( const ::Interface *pInterface, classObj.GetInterfaces() )233 BOOST_FOREACH( const ::Interface *pInterface, pClass->GetInterfaces() ) 227 234 { 228 235 BOOST_FOREACH( const CMethod *pMethod, pInterface->GetDynamicMethods() ) … … 248 255 //////////////////////////// 249 256 250 _call_constructor( &classObj,parameter,typeSize,bSomeObjects);257 _call_constructor(pClass,parameter,typeSize,bSomeObjects); 251 258 } 252 259 void OpcodeDelete(const char *Parameter, bool isSweeping){
Note:
See TracChangeset
for help on using the changeset viewer.