- Timestamp:
- Jun 29, 2008, 2:08:44 AM (16 years ago)
- Location:
- trunk/ab5.0/abdev
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/calculation.cpp
r598 r672 492 492 return false; 493 493 } 494 i64nums[pnum] = tempType.GetSize();494 i64nums[pnum] = compiler.SizeOf( tempType ); 495 495 StrPtr[pnum]=0; 496 496 } -
trunk/ab5.0/abdev/BasicCompiler_Common/include/Compiler.h
r636 r672 190 190 bool StringToType( const std::string &typeName, Type &type ); 191 191 const std::string TypeToString( const Type &type ); 192 193 // ジェネリック型の型パラメータ解決をサポートした上でSizeOf関数の戻り値を取得する 194 int SizeOf( const Type &type ); 192 195 193 196 void ClearCompilingUserProcAndClass(); -
trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp
r641 r672 351 351 } 352 352 353 int Compiler::SizeOf( const Type &type ) 354 { 355 Type tempType( type ); 356 if( this->IsCompilingClass() ) 357 { 358 if( this->pCompilingClass->IsExpanded() && tempType.IsTypeParameter() ) 359 { 360 // 現在コンパイル中のクラスがテンプレート展開済みのクラスで、 361 // 尚且つターゲットとなる型が型パラメータだったとき 362 363 // テンプレート展開情報を用いて型解決を行う 364 this->pCompilingClass->ResolveExpandedClassActualTypeParameter( tempType ); 365 } 366 } 367 return tempType.GetSize(); 368 } 369 353 370 void Compiler::ClearCompilingUserProcAndClass() 354 371 { -
trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
r668 r672 1440 1440 _class.GetClassType(), 1441 1441 _class.GetFormalGenericTypes(), 1442 actualTypes,1442 _class.GetSuperClassActualTypeParameters(), 1443 1443 _class.GetConstructorMemberSubIndex(), 1444 1444 _class.GetDestructorMemberSubIndex(), 1445 1445 0, 1446 _class.GetFixedAlignment() 1446 _class.GetFixedAlignment(), 1447 actualTypes 1447 1448 ); 1448 1449 -
trunk/ab5.0/abdev/ab_common/include/Lexical/Class.h
r640 r672 83 83 public: 84 84 ActiveBasic::Common::Lexical::ExpandedTemplateClasses expandedTemplateClasses; 85 Types expandedClassActualTypeParameters; 85 86 86 87 // XMLシリアライズ用 … … 117 118 ar & BOOST_SERIALIZATION_NVP( fixedAlignment ); 118 119 ar & BOOST_SERIALIZATION_NVP( expandedTemplateClasses ); 120 ar & BOOST_SERIALIZATION_NVP( expandedClassActualTypeParameters ); 119 121 } 120 122 … … 131 133 int DestructorMemberSubIndex, 132 134 int vtblNum, 133 int fixedAlignment ); 135 int fixedAlignment, 136 const Types &expandedClassActualTypeParameters ); 134 137 CClass(); 135 138 ~CClass(); … … 399 402 } 400 403 404 // 展開時の型パラメータ情報 405 bool IsExpanded() const 406 { 407 return !expandedClassActualTypeParameters.empty(); 408 } 409 void ResolveExpandedClassActualTypeParameter( Type &type ) const; 410 401 411 // メンバの総合サイズを取得 402 412 private: -
trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp
r640 r672 30 30 int DestructorMemberSubIndex, 31 31 int vtblNum, 32 int fixedAlignment ) 32 int fixedAlignment, 33 const Types &expandedClassActualTypeParameters ) 33 34 : ClassPrototype( symbol ) 34 35 , importedNamespaces( importedNamespaces ) … … 43 44 , vtblNum( vtblNum ) 44 45 , fixedAlignment( fixedAlignment ) 46 , expandedClassActualTypeParameters( expandedClassActualTypeParameters ) 45 47 , vtbl_offset( -1 ) 46 48 , comVtblOffset( 0 ) … … 379 381 } 380 382 383 void CClass::ResolveExpandedClassActualTypeParameter( Type &type ) const 384 { 385 if( !this->IsExpanded() ) 386 { 387 _ASSERTE( false ); 388 } 389 390 if( !type.IsTypeParameter() ) 391 { 392 // 型パラメータではない場合 393 return; 394 } 395 396 type = expandedClassActualTypeParameters[type.GetFormalTypeIndex()]; 397 } 398 381 399 //サイズを取得 382 400 int CClass::GetSize() const -
trunk/ab5.0/abdev/compiler_x64/Compile_Func.cpp
r667 r672 377 377 } 378 378 } 379 void Opcode_Func_SizeOf( const std::string &typeName ){ 379 void Opcode_Func_SizeOf( const std::string &typeName ) 380 { 380 381 Type tempType; 381 if( !compiler.StringToType( typeName, tempType ) ){ 382 if( !compiler.StringToType( typeName, tempType ) ) 383 { 382 384 compiler.errorMessenger.Output(3,typeName,cp); 383 385 return; 384 386 } 385 387 386 int typeSize = tempType.GetSize();387 388 388 //mov rax,size 389 compiler.codeGenerator.op_mov_RV( sizeof(_int64),REG_RAX,typeSize);389 compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, compiler.SizeOf( tempType ) ); 390 390 } 391 391 void Opcode_Func_ClassSizeOf( const std::string &typeName ) 392 392 { 393 393 Type tempType; 394 if( !compiler.StringToType( typeName, tempType ) ){ 394 if( !compiler.StringToType( typeName, tempType ) ) 395 { 395 396 compiler.errorMessenger.Output(3,typeName,cp); 396 397 return; 397 398 } 398 399 399 int typeSize = ( tempType.IsObject() ) ? 400 tempType.GetClass().GetSize() : tempType.GetSize(); 400 if( !tempType.IsObject() ) 401 { 402 compiler.errorMessenger.Output(1,typeName,cp); 403 return; 404 } 401 405 402 406 //mov rax,size 403 compiler.codeGenerator.op_mov_RV( sizeof(_int64),REG_RAX,typeSize);407 compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, tempType.GetClass().GetSize() ); 404 408 } 405 409 void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){ -
trunk/ab5.0/abdev/compiler_x86/Compile_Func.cpp
r666 r672 533 533 } 534 534 535 int typeSize = tempType.GetSize();536 537 535 //mov eax,size 538 compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize);536 compiler.codeGenerator.op_mov_RV( REG_EAX, compiler.SizeOf( tempType ) ); 539 537 } 540 538 void Opcode_Func_ClassSizeOf( const std::string &typeName ) … … 546 544 } 547 545 548 int typeSize = ( tempType.IsObject() ) ? 549 tempType.GetClass().GetSize() : tempType.GetSize(); 546 if( !tempType.IsObject() ) 547 { 548 compiler.errorMessenger.Output(1,typeName,cp); 549 return; 550 } 550 551 551 552 //mov eax,size 552 compiler.codeGenerator.op_mov_RV( REG_EAX, t ypeSize);553 compiler.codeGenerator.op_mov_RV( REG_EAX, tempType.GetClass().GetSize() ); 553 554 } 554 555 void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
Note:
See TracChangeset
for help on using the changeset viewer.