Changeset 370 in dev for trunk/abdev/BasicCompiler32
- Timestamp:
- Nov 15, 2007, 3:18:41 AM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler32
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_CallProc.cpp
r350 r370 326 326 if( pobj_c->IsInterface() ) 327 327 { 328 // インターフェイス メソッド呼び出し328 // インターフェイス メソッド呼び出し 329 329 330 330 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); … … 349 349 SetError(); 350 350 } 351 } 352 else if( pobj_c->IsComInterface() ) 353 { 354 // COMインターフェイス メソッド呼び出し 355 356 //仮想関数(オブジェクトメソッド)呼び出し 357 // pObj -> vtbl1 -> func1 358 // -> func2 359 // -> func3 360 361 int vtblMasterListIndex; 362 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 363 364 // vtblのポインタを取得 365 //mov edx,dword ptr[ecx] 366 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 351 367 } 352 368 else … … 364 380 365 381 // vtblマスターリストのポインタを取得 366 //mov edx,dword ptr[ecx ]367 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE);382 //mov edx,dword ptr[ecx+sizeof(com_vtbl)] 383 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 ); 368 384 369 385 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler32/Compile_Func.cpp
r359 r370 300 300 } 301 301 } 302 else if( pobj_c->IsComInterface() ) 303 { 304 // COMインターフェイス メソッド呼び出し 305 306 //仮想関数(オブジェクトメソッド)呼び出し 307 // pObj -> vtbl1 -> func1 308 // -> func2 309 // -> func3 310 311 int vtblMasterListIndex; 312 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 313 314 // vtblのポインタを取得 315 //mov edx,dword ptr[ecx] 316 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE ); 317 } 302 318 else 303 319 { … … 314 330 315 331 // vtblマスターリストのポインタを取得 316 //mov edx,dword ptr[ecx ]317 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE);332 //mov edx,dword ptr[ecx+sizeof(com_vtbl)] 333 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 ); 318 334 319 335 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler32/Compile_Object.cpp
r355 r370 218 218 && !pClass->IsAbstract() ) 219 219 { 220 // mov ecx, vtblAddress221 compiler.codeGenerator.op_mov_RV_ vtbl( REG_ECX, pClass );220 // mov ecx,com_vtbl 221 compiler.codeGenerator.op_mov_RV_com_vtbl( REG_ECX, pClass ); 222 222 223 223 //mov dword ptr[eax],ecx 224 224 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE ); 225 226 // mov rcx,vtblAddress 227 compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, pClass ); 228 229 //mov qword ptr[rax+sizeof(com_vtbl)],rcx 230 compiler.codeGenerator.op_mov_MR(sizeof(long),REG_ECX,REG_EAX,PTR_SIZE,MOD_BASE_DISP8); 225 231 226 232 // 仮想関数になるメソッドに使用チェックをつける -
trunk/abdev/BasicCompiler32/Compile_ProcOp.cpp
r365 r370 267 267 char temporary[1024]; 268 268 sprintf( temporary, 269 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",269 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )", 270 270 userProc.ReturnType().GetClass().GetName().c_str(), 271 271 vtblMasterListIndex -
trunk/abdev/BasicCompiler32/Compile_Statement.cpp
r342 r370 115 115 FreeTempObject(REG_EBX,&resultType.GetClass()); 116 116 } 117 118 //成功 119 return; 120 } 121 122 // 失敗 123 SetError(1, NULL,cp); 117 } 124 118 } 125 119 -
trunk/abdev/BasicCompiler32/Compile_Var.cpp
r350 r370 1215 1215 //New呼び出し 1216 1216 if( type.IsObject() 1217 && !type.IsInterface() 1217 && !type.IsInterface() && !type.IsComInterface() 1218 1218 &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0 1219 1219 &&InitBuf[0]=='\0') -
trunk/abdev/BasicCompiler32/NumOpe.cpp
r363 r370 278 278 } 279 279 280 SetError(); 281 280 282 return false; 281 283 } … … 331 333 if( !leftType.HasMember() ){ 332 334 // メンバを持たない型の場合 335 if( isProcedureCallOnly ) 336 { 337 SetError(1,NULL,cp); 338 } 333 339 return false; 334 340 } … … 550 556 } 551 557 558 if( isProcedureCallOnly ) 559 { 560 SetError(3, termLeft, cp ); 561 } 552 562 553 563 return false; -
trunk/abdev/BasicCompiler32/x86CodeGenerator.cpp
r357 r370 1319 1319 pNativeCode->PutUserProcSchedule( pUserProc, false ); 1320 1320 } 1321 void CodeGenerator::op_mov_RV_ vtbl( int reg, const CClass *pClass )1321 void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass ) 1322 1322 { 1323 1323 // mov reg,vtblAddress … … 1327 1327 1328 1328 //DISP32 1329 pNativeCode->PutComVtblSchedule( pClass ); 1330 } 1331 void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass ) 1332 { 1333 // mov reg,vtblAddress 1334 1335 //オペコード、レジスタ 1336 pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) ); 1337 1338 //DISP32 1329 1339 pNativeCode->PutVtblSchedule( pClass ); 1330 1340 }
Note:
See TracChangeset
for help on using the changeset viewer.