Changeset 370 in dev
- Timestamp:
- Nov 15, 2007, 3:18:41 AM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 30 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 } -
trunk/abdev/BasicCompiler64/CodeGenerator.cpp
r357 r370 1733 1733 pNativeCode->PutUserProcSchedule( pUserProc, false ); 1734 1734 } 1735 void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass ) 1736 { 1737 // mov reg,com_vtblAddress 1738 1739 //オペコード、レジスタ 1740 pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) ); 1741 1742 //DISP32 1743 pNativeCode->PutComVtblSchedule( pClass ); 1744 } 1735 1745 void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass ) 1736 1746 { -
trunk/abdev/BasicCompiler64/Compile_Calc.cpp
r331 r370 208 208 //変数アドレスを取得 209 209 RELATIVE_VAR VarRelativeVar; 210 if(!GetVarOffsetReadWrite(210 bool result = GetVarOffsetReadWrite( 211 211 variable, 212 212 &VarRelativeVar, 213 varType) ) return;213 varType); 214 214 215 215 //レジスタのブロッキングを解除 216 216 pobj_BlockReg->clear(); 217 218 if( !result ) 219 { 220 return; 221 } 217 222 218 223 if(varType.GetBasicType()&FLAG_PTR){ -
trunk/abdev/BasicCompiler64/Compile_CallProc.cpp
r350 r370 359 359 if( pobj_c->IsInterface() ) 360 360 { 361 // インターフェイス メソッド呼び出し361 // インターフェイス メソッド呼び出し 362 362 363 363 int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" ); … … 380 380 } 381 381 } 382 else if( pobj_c->IsComInterface() ) 383 { 384 // COMインターフェイス メソッド呼び出し 385 386 //仮想関数(オブジェクトメソッド)呼び出し 387 // pObj -> vtbl1 -> func1 388 // -> func2 389 // -> func3 390 391 int vtblMasterListIndex; 392 pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex ); 393 394 // vtblのポインタを取得 395 //mov r11,qword ptr[rcx] 396 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); } 382 397 else 383 398 { … … 394 409 395 410 // vtblマスターリストのポインタを取得 396 //mov r11,qword ptr[rcx ]397 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX, 0,MOD_BASE);411 //mov r11,qword ptr[rcx+sizeof(com_vtbl)] 412 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8); 398 413 399 414 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler64/Compile_Func.cpp
r359 r370 144 144 } 145 145 } 146 else if( pobj_c->IsComInterface() ) 147 { 148 //仮想関数(オブジェクトメソッド) 149 // pObj -> vtbl1 -> func1 150 // -> func2 151 // -> func3 152 153 int vtblMasterListIndex; 154 pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex ); 155 156 // vtblのポインタを取得 157 //mov r11,qword ptr[rcx] 158 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE); 159 } 146 160 else 147 161 { … … 158 172 159 173 // vtblマスターリストのポインタを取得 160 //mov r11,qword ptr[rcx ]161 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX, 0,MOD_BASE);174 //mov r11,qword ptr[rcx+sizeof(com_vtbl)] 175 compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8); 162 176 163 177 // vtblのポインタを取得 -
trunk/abdev/BasicCompiler64/Compile_Object.cpp
r355 r370 212 212 && !pClass->IsAbstract() ) 213 213 { 214 // mov rcx,com_vtbl 215 compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RCX, pClass ); 216 217 //mov qword ptr[rax],rcx 218 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE); 219 214 220 // mov rcx,vtblAddress 215 221 compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, pClass ); 216 222 217 //mov qword ptr[rax ],rcx218 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX, 0,MOD_BASE);223 //mov qword ptr[rax+sizeof(com_vtbl)],rcx 224 compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,PTR_SIZE,MOD_BASE_DISP8); 219 225 220 226 -
trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
r366 r370 189 189 char temporary[1024]; 190 190 sprintf( temporary, 191 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",191 "Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )", 192 192 userProc.ReturnType().GetClass().GetName().c_str(), 193 193 vtblMasterListIndex -
trunk/abdev/BasicCompiler64/Compile_Statement.cpp
r345 r370 96 96 pobj_reg=new CRegister(REG_RAX); 97 97 98 if( strstr(leftTerm,"赤")) 99 { 100 int test=0; 101 } 102 98 103 Type resultType; 99 104 bool isLiteral; … … 116 121 FreeTempObject(REG_R14,&resultType.GetClass()); 117 122 } 118 119 //成功 120 return; 121 } 122 123 // 失敗 124 SetError(1, NULL,cp); 123 } 125 124 } 126 125 -
trunk/abdev/BasicCompiler64/Compile_Var.cpp
r350 r370 1228 1228 //New呼び出し 1229 1229 if( type.IsObject() 1230 && !type.IsInterface() 1230 && !type.IsInterface() && !type.IsComInterface() 1231 1231 &&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0 1232 1232 &&InitBuf[0]=='\0') -
trunk/abdev/BasicCompiler64/NumOpe.cpp
r368 r370 291 291 } 292 292 293 SetError(); 294 293 295 return false; 294 296 } … … 344 346 if( !leftType.HasMember() ){ 345 347 // メンバを持たない型の場合 348 if( isProcedureCallOnly ) 349 { 350 SetError(1,NULL,cp); 351 } 346 352 return false; 347 353 } … … 580 586 } 581 587 588 if( isProcedureCallOnly ) 589 { 590 SetError(3, termLeft, cp ); 591 } 582 592 583 593 return false; -
trunk/abdev/BasicCompiler_Common/VariableOpe.cpp
r368 r370 850 850 if( !compiler.StringToType( temporary, type ) ){ 851 851 SetError(3,temporary,cp); 852 type.SetBasicType( DEF_LONG );852 return false; 853 853 } 854 854 -
trunk/abdev/BasicCompiler_Common/error.cpp
r366 r370 207 207 if(num==133) lstrcpy(msg,"Thisに代入はできません。"); 208 208 if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" ); 209 if(num==135) lstrcpy( msg, "クラス またはインターフェイス以外の型を継承元として指定することはできません。" );209 if(num==135) lstrcpy( msg, "クラス以外の型を継承元として指定することはできません。" ); 210 210 if(num==136) lstrcpy( msg, "非仮想関数に対してオーバーライドしようとしました。" ); 211 211 if(num==137) lstrcpy(msg,"ImplementsはClass定義内の先頭に記述する必要があります。"); … … 322 322 323 323 i2=0; 324 325 if( num == 300 ) 326 { 327 // 内部エラー 328 i2=0; 329 } 324 330 } 325 331 -
trunk/abdev/BasicCompiler_Common/include/Class.h
r369 r370 122 122 Class, 123 123 Interface, 124 ComInterface, 124 125 Enum, 125 126 Delegate, … … 204 205 , vtblNum( 0 ) 205 206 , vtbl_offset( -1 ) 207 , comVtblOffset( 0 ) 206 208 , isCompilingConstructor( false ) 207 209 , isCompilingDestructor( false ) … … 221 223 , vtblNum( 0 ) 222 224 , vtbl_offset( -1 ) 225 , comVtblOffset( 0 ) 223 226 , isCompilingConstructor( false ) 224 227 , isCompilingDestructor( false ) … … 339 342 bool IsClass() const; 340 343 bool IsInterface() const; 344 bool IsComInterface() const; 341 345 bool IsEnum() const; 342 346 bool IsDelegate() const; … … 516 520 private: 517 521 long vtbl_offset; 522 long comVtblOffset; 518 523 long vtblMasterListOffset; 519 524 std::vector<long> vtblMasterList; … … 521 526 void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const; 522 527 int GetVtblMasterListIndex( const CClass *pClass ) const; 528 long GetComVtblOffset() const; 523 529 long GetVtblMasterListOffset() const; 524 530 void GenerateVTableMasterList( const std::vector<long> &vtableMasterList, long &offset ); -
trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
r364 r370 374 374 void op_ret(); 375 375 void op_addressof( int reg, const UserProc *pUserProc ); 376 void op_mov_RV_com_vtbl( int reg, const CClass *pClass ); 376 377 void op_mov_RV_vtbl( int reg, const CClass *pClass ); 377 378 … … 455 456 void op_ret( short stackFrameSize ); 456 457 void op_addressof( int reg, const UserProc *pUserProc ); 458 void op_mov_RV_com_vtbl( int reg, const CClass *pClass ); 457 459 void op_mov_RV_vtbl( int reg, const CClass *pClass ); 458 460 #endif -
trunk/abdev/BasicCompiler_Common/include/NativeCode.h
r357 r370 24 24 AddressOf, // ユーザ定義関数位置スケジュール 25 25 DllProc, // DLL関数位置スケジュール 26 ComVtbl, // com_vtblスケジュール 26 27 Vtbl, // vtblスケジュール 27 28 TypeInfo, // TypeInfoスケジュール … … 59 60 ar & boost::serialization::make_nvp("pDllProc", const_cast<::DllProc *&>(pDllProc)); 60 61 break; 62 case ComVtbl: 61 63 case Vtbl: 62 64 case TypeInfo: … … 91 93 { 92 94 } 93 Schedule( const ::CClass *pClass, long offset )94 : type( Schedule::Vtbl )95 , offset( offset )96 , pClass( pClass )97 {98 }99 95 Schedule( Type type, const ::CClass *pClass, long offset ) 100 96 : type( type ) … … 102 98 , offset( offset ) 103 99 { 100 if( !( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo ) ) 101 { 102 DebugBreak(); 103 } 104 104 } 105 105 ~Schedule() … … 137 137 const ::CClass &GetClass() const 138 138 { 139 if( !( type == Schedule:: Vtbl || type == Schedule::TypeInfo ) )139 if( !( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo ) ) 140 140 { 141 141 SetError(); … … 293 293 void PutCatchAddressSchedule( const UserProc *pUserProc, long codePos ); 294 294 void PutDllProcSchedule( const DllProc *pDllProc ); 295 void PutComVtblSchedule( const CClass *pClass ); 295 296 void PutVtblSchedule( const CClass *pClass ); 296 297 -
trunk/abdev/BasicCompiler_Common/include/Type.h
r350 r370 190 190 bool IsDelegate() const; 191 191 bool IsInterface() const; 192 bool IsComInterface() const; 192 193 193 194 // オブジェクトや構造体など、メンバを持つ型かどうかを判別する -
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r369 r370 116 116 return classType == CClass::Interface; 117 117 } 118 bool CClass::IsComInterface() const 119 { 120 return classType == CClass::ComInterface; 121 } 118 122 bool CClass::IsEnum() const 119 123 { … … 241 245 } 242 246 243 if( pInheritsClass->IsInterface() ){ 244 // インターフェイスはあとで継承する 245 } 246 else if( pInheritsClass->IsClass() ){ 247 if( pInheritsClass->IsClass() ){ 247 248 // クラスを継承する 248 249 isInheritsClass = true; … … 253 254 } 254 255 else{ 255 S moothieException::Throw(135,NULL,nowLine);256 SetError(135,pInheritsClass->GetFullName().c_str(),nowLine); 256 257 return false; 257 258 } … … 268 269 return false; 269 270 } 270 }271 272 i=0;273 while( true ){274 275 char temporary[VN_SIZE];276 for( int i2=0;; i++, i2++ ){277 if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){278 temporary[i2] = 0;279 break;280 }281 temporary[i2] = inheritNames[i];282 }283 284 char className[VN_SIZE];285 Jenga::Common::Strings typeParameters;286 SplitGenericClassInstance( temporary, className, typeParameters );287 288 //継承元クラスを取得289 const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className);290 if( !pInheritsClass ){291 SmoothieException::Throw(106,className,nowLine);292 return false;293 }294 295 if( pInheritsClass->IsInterface() ){296 // インターフェイスを継承する297 if( !InheritsInterface( *pInheritsClass, nowLine ) ){298 return false;299 }300 }301 else if( pInheritsClass->IsClass() ){302 // クラスはさっき継承した303 }304 else{305 SmoothieException::Throw(135,NULL,nowLine);306 return false;307 }308 309 if( inheritNames[i] == '\0' ){310 break;311 }312 i++;313 271 } 314 272 … … 388 346 } 389 347 348 if( this->IsInterface() && inheritsClass.IsComInterface() ) 349 { 350 // COMインターフェイスを継承した場合はCOMインターフェイスにする 351 this->SetClassType( CClass::ComInterface ); 352 } 353 390 354 return true; 391 355 } 392 bool CClass::InheritsInterface( const CClass &inheritsInterface, int nowLine ){393 394 //ループ継承でないかをチェック395 if(pobj_LoopRefCheck->check(inheritsInterface)){396 SmoothieException::Throw(123,inheritsInterface.GetName(),nowLine);397 return false;398 }399 400 if( !inheritsInterface.IsReady() ){401 //継承先が読み取られていないとき402 pobj_LoopRefCheck->add(this->GetName().c_str());403 compiler.GetObjectModule().meta.GetClasses().GetClass_recur(inheritsInterface.GetName().c_str());404 pobj_LoopRefCheck->del(this->GetName().c_str());405 }406 407 //メソッドをコピー408 BOOST_FOREACH( const CMethod *pBaseMethod, inheritsInterface.GetDynamicMethods() ){409 CMethod *pMethod = new DynamicMethod( *pBaseMethod );410 411 // アクセシビリティ412 if(pBaseMethod->GetAccessibility() == Prototype::Private){413 pMethod->SetAccessibility( Prototype::None );414 }415 else{416 pMethod->SetAccessibility( pBaseMethod->GetAccessibility() );417 }418 419 //pobj_Inherits420 // ※継承元のClassIndexをセット(入れ子継承を考慮する)421 if(pBaseMethod->GetInheritsClassPtr()==0){422 pMethod->SetInheritsClassPtr( &inheritsInterface );423 }424 else{425 pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );426 }427 428 GetDynamicMethods().push_back( pMethod );429 }430 431 //interfaces.push_back( Interface( &inheritsInterface, vtblNum ) );432 433 //仮想関数の数434 AddVtblNum( inheritsInterface.GetVtblNum() );435 436 return true;437 }438 356 439 357 bool CClass::Implements( const CClass &interfaceClass, int nowLine ) 440 358 { 441 if( !interfaceClass.IsInterface() )359 if( !interfaceClass.IsInterface() && !interfaceClass.IsComInterface() ) 442 360 { 443 361 // インターフェイスではないとき … … 477 395 // キャストメソッドを追加(内部コードは自動生成すること) 478 396 ///////////////////////////////////////////////////////////////// 397 if( interfaceClass.IsInterface() ) 479 398 { 480 399 // Function Operator() As ITest … … 793 712 int i2; 794 713 795 //仮想関数が存在する場合は 関数リストへのポインタのサイズを追加796 int offset = IsExistVirtualFunctions() ? PTR_SIZE : 0;714 //仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加 715 int offset = IsExistVirtualFunctions() ? PTR_SIZE*2 : 0; 797 716 798 717 int alignment = 1; … … 944 863 return 0; 945 864 } 865 long CClass::GetComVtblOffset() const 866 { 867 return comVtblOffset; 868 } 946 869 long CClass::GetVtblMasterListOffset() const 947 870 { … … 992 915 993 916 pInterface->SetVtblOffset( tempVtblOffset ); 917 918 if( pInterface->GetClass().IsComInterface() ) 919 { 920 if( this->comVtblOffset ) 921 { 922 SetError(); 923 } 924 this->comVtblOffset = tempVtblOffset; 925 } 994 926 } 995 927 … … 1445 1377 pobj_c->SetConstructorMemberSubIndex( -1 ); 1446 1378 pobj_c->SetDestructorMemberSubIndex( -1 ); 1379 1380 if( memcmp( basbuf+i+1, "__COM", 5 ) == 0 && IsCommandDelimitation( basbuf[i+1+5] ) ) 1381 { 1382 // COMインターフェイス 1383 pobj_c->SetClassType( CClass::ComInterface ); 1384 1385 i += 6; 1386 } 1447 1387 1448 1388 if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){ -
trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
r318 r370 36 36 if( !pGenericClass ) 37 37 { 38 extern int cp;39 SetError(106, className, cp );40 38 return false; 41 39 } -
trunk/abdev/BasicCompiler_Common/src/DataTable.cpp
r355 r370 84 84 this->lastMadeConstObjectDataTableOffset = dataTableOffset; 85 85 86 // com_vtblスケジュール 87 this->schedules.push_back( Schedule( Schedule::ComVtbl, &objClass, dataTableOffset ) ); 88 86 89 // vtblスケジュール 87 this->schedules.push_back( Schedule( &objClass, dataTableOffset) );90 this->schedules.push_back( Schedule( Schedule::Vtbl, &objClass, dataTableOffset + PTR_SIZE ) ); 88 91 89 92 // TypeInfoスケジュール … … 235 238 236 239 // スケジューリング 237 this->schedules.push_back( Schedule( &strClass, headOffset ) ); 240 this->schedules.push_back( Schedule( Schedule::ComVtbl, &strClass, headOffset ) ); 241 this->schedules.push_back( Schedule( Schedule::Vtbl, &strClass, headOffset + PTR_SIZE ) ); 238 242 this->schedules.push_back( Schedule( Schedule::TypeInfo, &strClass, headOffset + offsetForTypeInfo ) ); 239 243 this->schedules.push_back( Schedule( Schedule::DataTable, headOffset + offsetForChars ) ); -
trunk/abdev/BasicCompiler_Common/src/Linker.cpp
r361 r370 165 165 BOOST_FOREACH( const Schedule &schedule, nativeCode.GetSchedules() ) 166 166 { 167 if( schedule.GetType() == Schedule::ComVtbl ) 168 { 169 LONG_PTR vtblOffset = schedule.GetClass().GetComVtblOffset(); 170 171 nativeCode.Overwrite( 172 schedule.GetOffset(), 173 static_cast<long>( vtblOffset + imageBase + dataSectionBaseOffset ) 174 ); 175 } 176 167 177 if( schedule.GetType() == Schedule::Vtbl ) 168 178 { … … 178 188 BOOST_FOREACH( const Schedule &schedule, dataTable.schedules ) 179 189 { 190 if( schedule.GetType() == Schedule::ComVtbl ) 191 { 192 LONG_PTR vtblOffset = schedule.GetClass().GetComVtblOffset(); 193 194 #ifdef _WIN64 195 dataTable.OverwriteInt64( 196 schedule.GetOffset(), 197 vtblOffset + imageBase + dataSectionBaseOffset 198 ); 199 #else 200 dataTable.Overwrite( 201 schedule.GetOffset(), 202 vtblOffset + imageBase + dataSectionBaseOffset 203 ); 204 #endif 205 } 206 180 207 if( schedule.GetType() == Schedule::Vtbl ) 181 208 { -
trunk/abdev/BasicCompiler_Common/src/Method.cpp
r353 r370 155 155 if( !pMethod->GetUserProc().IsUsing() ) 156 156 { 157 ts((char *)pMethod->GetUserProc().GetFullName().c_str());157 //ts((char *)pMethod->GetUserProc().GetFullName().c_str()); 158 158 } 159 159 pMethod->GetUserProc().Using(); -
trunk/abdev/BasicCompiler_Common/src/NativeCode.cpp
r364 r370 95 95 } 96 96 97 void NativeCode::PutComVtblSchedule( const CClass *pClass ) 98 { 99 schedules.push_back( Schedule( Schedule::ComVtbl, pClass, GetSize() ) ); 100 101 Put( (long)0 ); 102 } 103 97 104 void NativeCode::PutVtblSchedule( const CClass *pClass ) 98 105 { 99 schedules.push_back( Schedule( pClass, GetSize() ) );106 schedules.push_back( Schedule( Schedule::Vtbl, pClass, GetSize() ) ); 100 107 101 108 Put( (long)0 ); -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r350 r370 452 452 { 453 453 return ( IsObject() && GetClass().IsInterface() ); 454 } 455 bool Type::IsComInterface() const 456 { 457 return ( IsObject() && GetClass().IsComInterface() ); 454 458 } 455 459
Note:
See TracChangeset
for help on using the changeset viewer.