Changeset 511 in dev for trunk/ab5.0/abdev/BasicCompiler_Common/src/Class_Collect.cpp
- Timestamp:
- Apr 30, 2008, 8:04:04 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/src/Class_Collect.cpp
r507 r511 11 11 #include "../../compiler_x86/opcode.h" 12 12 #endif 13 14 using namespace ActiveBasic::Compiler; 13 15 14 16 … … 70 72 CLoopRefCheck *pobj_LoopRefCheck; 71 73 72 73 void Classes::CollectClassesForNameOnly( const BasicSource &source ) 74 { 75 int i, i2; 76 char temporary[VN_SIZE]; 77 78 // 名前空間管理 79 NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes(); 80 namespaceScopes.clear(); 81 82 // Importsされた名前空間の管理 83 NamespaceScopesCollection &importedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces(); 84 importedNamespaces.clear(); 85 86 for(i=0;;i++){ 87 if(source[i]=='\0') break; 88 89 if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){ 90 for(i+=2,i2=0;;i2++,i++){ 91 if( IsCommandDelimitation( source[i] ) ){ 92 temporary[i2]=0; 93 break; 94 } 95 temporary[i2]=source[i]; 96 } 97 namespaceScopes.push_back( temporary ); 98 99 continue; 100 } 101 else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){ 102 if( namespaceScopes.size() <= 0 ){ 103 compiler.errorMessenger.Output(12, "End Namespace", i ); 104 } 105 else{ 106 namespaceScopes.pop_back(); 107 } 108 109 i += 2; 110 continue; 111 } 112 else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){ 113 for(i+=2,i2=0;;i2++,i++){ 114 if( IsCommandDelimitation( source[i] ) ){ 115 temporary[i2]=0; 116 break; 117 } 118 temporary[i2]=source[i]; 119 } 120 if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) ) 121 { 122 compiler.errorMessenger.Output(64,temporary,i ); 123 } 124 125 continue; 126 } 127 else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED ){ 128 importedNamespaces.clear(); 129 continue; 130 } 131 132 if(source[i]==1&&( 133 source[i+1]==ESC_CLASS|| 134 source[i+1]==ESC_TYPE|| 135 source[i+1]==ESC_INTERFACE 136 )) 137 { 138 int nowLine = i; 139 i += 2; 140 141 Type blittableType; 142 if(memicmp(source.GetBuffer()+i,"Align(",6)==0){ 143 //アラインメント修飾子 144 i+=6; 145 i=JumpStringInPare(source.GetBuffer(),i)+1; 146 } 147 else if( memicmp( source.GetBuffer() + i, "Blittable(", 10 ) == 0 ){ 148 // Blittable修飾子 149 i+=10; 150 i+=GetStringInPare_RemovePare(temporary,source.GetBuffer()+i)+1; 151 compiler.StringToType( temporary, blittableType ); 152 } 153 154 bool isEnum = false; 155 bool isDelegate = false; 156 if( source[i] == 1 && source[i+1] == ESC_ENUM ){ 157 // 列挙型の場合 158 isEnum = true; 159 160 i += 2; 161 } 162 else if( source[i] == 1 && source[i+1] == ESC_DELEGATE ) 163 { 164 // デリゲートの場合 165 isDelegate = true; 166 167 i += 2; 168 } 169 170 for(i2=0;;i++,i2++){ 171 if(!IsVariableChar(source[i])){ 172 temporary[i2]=0; 173 break; 174 } 175 temporary[i2]=source[i]; 176 } 177 178 //クラスを追加 179 CClass *pClass = this->Add(namespaceScopes, importedNamespaces, temporary,nowLine); 180 if( pClass ){ 181 if( source[nowLine+1] == ESC_CLASS ){ 182 if( isEnum ) 183 { 184 pClass->SetClassType( CClass::Enum ); 185 } 186 else if( isDelegate ) 187 { 188 pClass->SetClassType( CClass::Delegate ); 189 } 190 else{ 191 pClass->SetClassType( CClass::Class ); 192 } 193 } 194 else if( source[nowLine+1] == ESC_INTERFACE ){ 195 pClass->SetClassType( CClass::Interface ); 196 } 197 else{ 198 pClass->SetClassType( CClass::Structure ); 199 } 200 } 201 202 // Blittable型の場合 203 if( !blittableType.IsNull() ){ 204 pClass->SetBlittableType( blittableType ); 205 206 // Blittable型として登録 207 compiler.GetObjectModule().meta.GetBlittableTypes().push_back( BlittableType( blittableType, pClass ) ); 208 } 209 } 210 } 211 } 212 213 bool Classes::MemberVar_LoopRefCheck(const CClass &objClass){ 74 bool MemberVar_LoopRefCheck(const CClass &objClass){ 214 75 if( objClass.HasSuperClass() ) 215 76 { … … 246 107 } 247 108 248 void Classes::GetClass_recur(const char *lpszInheritsClass){ 109 void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract, 110 bool isVirtual, bool isOverride, const char *interfaceName, bool isAutoGeneration, int nowLine) 111 { 112 if( isAutoGeneration ) 113 { 114 // コード自動生成 115 pUserProc->ThisIsAutoGenerationProc(); 116 } 117 118 119 //////////////////////////////////////////////////////////// 120 // コンストラクタ、デストラクタの場合の処理 121 //////////////////////////////////////////////////////////// 122 BOOL fConstructor=0,bDestructor=0; 123 124 if( pUserProc->GetName() == pobj_c->GetName() ){ 125 //コンストラクタの場合 126 127 //標準コンストラクタ(引数なし) 128 if(pUserProc->Params().size()==0) fConstructor=1; 129 130 //強制的にConst修飾子をつける 131 isConst = true; 132 } 133 else if(pUserProc->GetName()[0]=='~'){ 134 //デストラクタの場合はその名前が正しいかチェックを行う 135 if(lstrcmp(pUserProc->GetName().c_str()+1,pobj_c->GetName().c_str())!=0) 136 compiler.errorMessenger.Output(117,NULL,nowLine); 137 else 138 bDestructor=1; 139 } 140 if(fConstructor||bDestructor){ 141 // コンストラクタ、デストラクタのアクセシビリティをチェック 142 143 //強制的にConst修飾子をつける 144 isConst = true; 145 } 146 147 if( fConstructor == 1 ) 148 pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() ); 149 else if( bDestructor ) 150 pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() ); 151 152 153 154 ////////////////// 155 // 重複チェック 156 ////////////////// 157 158 if(pobj_c->DupliCheckMember( pUserProc->GetName().c_str() )){ 159 compiler.errorMessenger.Output(15,pUserProc->GetName(),nowLine); 160 return; 161 } 162 163 //メソッド 164 BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() ) 165 { 166 //基底クラスと重複する場合はオーバーライドを行う 167 if( pMethod->GetInheritsClassPtr() ) continue; 168 169 if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) ) 170 { 171 //関数名、パラメータ、戻り値が合致したとき 172 compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine); 173 return; 174 } 175 } 176 177 //仮想関数の場合 178 if( isAbstract ) pUserProc->CompleteCompile(); 179 180 // メソッドのオーバーライド 181 CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ); 182 if( pMethodForOverride ) 183 { 184 pMethodForOverride->Override( pUserProc, accessibility, isOverride ); 185 pUserProc->SetMethod( pMethodForOverride ); 186 return; 187 } 188 else 189 { 190 // インターフェイス メソッドのオーバーライド 191 BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() ) 192 { 193 if( interfaceName[0] ) 194 { 195 if( pInterface->GetClass().GetName() != interfaceName ) 196 { 197 // 指定されたインターフェイス名と整合しないとき 198 continue; 199 } 200 } 201 202 if( !pInterface->GetClass().IsReady() ){ 203 // インターフェイスが未解析のとき 204 LexicalAnalyzer::LookaheadClass( 205 pInterface->GetClass().GetName().c_str(), 206 compiler.GetObjectModule().meta.GetClasses() 207 ); 208 } 209 210 CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc ); 211 if( pMethodForOverride ) 212 { 213 pMethodForOverride->Override( pUserProc, accessibility, isOverride ); 214 pUserProc->SetMethod( pMethodForOverride ); 215 return; 216 } 217 } 218 } 219 220 if( interfaceName[0] ) 221 { 222 compiler.errorMessenger.Output(139,interfaceName,nowLine); 223 } 224 225 if( isVirtual ){ 226 pobj_c->AddVtblNum( 1 ); 227 } 228 229 if( isOverride ){ 230 compiler.errorMessenger.Output(12,"Override",nowLine); 231 } 232 233 if(bStatic){ 234 pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility ); 235 } 236 else{ 237 pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual); 238 } 239 } 240 241 bool LexicalAnalyzer::Inherits( CClass ¤tClass, const char *inheritNames, int nowLine ){ 242 int i = 0; 243 bool isInheritsClass = false; 244 while( true ){ 245 246 char temporary[VN_SIZE]; 247 for( int i2=0;; i++, i2++ ){ 248 if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){ 249 temporary[i2] = 0; 250 break; 251 } 252 temporary[i2] = inheritNames[i]; 253 } 254 255 // ジェネリクス構文を分解 256 char className[VN_SIZE]; 257 Jenga::Common::Strings typeParameterStrings; 258 SplitGenericClassInstance( temporary, className, typeParameterStrings ); 259 260 // 型パラメータ文字列から型データを取得 261 Types actualTypeParameters; 262 BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings ) 263 { 264 Type type; 265 compiler.StringToType( typeParameterStr, type ); 266 actualTypeParameters.push_back( type ); 267 } 268 269 //継承元クラスを取得 270 const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className); 271 if( !pInheritsClass ){ 272 compiler.errorMessenger.Output(106,className,nowLine); 273 return false; 274 } 275 276 if( pInheritsClass->IsClass() ){ 277 // クラスを継承する 278 isInheritsClass = true; 279 280 //ループ継承でないかをチェック 281 if( !LexicalAnalyzer::LoopRefCheck(*pInheritsClass) ) 282 { 283 compiler.errorMessenger.Output(123,pInheritsClass->GetName(),nowLine); 284 return false; 285 } 286 287 if( !pInheritsClass->IsReady() ){ 288 //継承先が読み取られていないとき 289 LexicalAnalyzer::LookaheadClass( 290 pInheritsClass->GetName().c_str(), 291 compiler.GetObjectModule().meta.GetClasses() 292 ); 293 } 294 295 if( !currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){ 296 return false; 297 } 298 } 299 else{ 300 compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine); 301 return false; 302 } 303 304 if( inheritNames[i] == '\0' ){ 305 break; 306 } 307 i++; 308 } 309 310 if( !isInheritsClass ){ 311 const CClass *pObjectClass = compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(); 312 //ループ継承でないかをチェック 313 if( !LexicalAnalyzer::LoopRefCheck( *pObjectClass ) ) 314 { 315 compiler.errorMessenger.Output(123,pObjectClass->GetName(),nowLine); 316 return false; 317 } 318 319 if( !pObjectClass->IsReady() ){ 320 //継承先が読み取られていないとき 321 LexicalAnalyzer::LookaheadClass( 322 pObjectClass->GetName().c_str(), 323 compiler.GetObjectModule().meta.GetClasses() 324 ); 325 } 326 327 // クラスを一つも継承していないとき 328 if( !currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){ 329 return false; 330 } 331 } 332 333 return true; 334 } 335 336 bool LexicalAnalyzer::Implements( CClass ¤tClass, const char *interfaceNames, int nowLine ) 337 { 338 Jenga::Common::Strings paramStrs; 339 SplitParameter( interfaceNames, paramStrs ); 340 341 BOOST_FOREACH( const std::string ¶mStr, paramStrs ) 342 { 343 char className[VN_SIZE]; 344 Jenga::Common::Strings typeParameterStrings; 345 SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings ); 346 347 Types actualTypeParameters; 348 BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings ) 349 { 350 Type type; 351 compiler.StringToType( typeParameterStr, type ); 352 actualTypeParameters.push_back( type ); 353 } 354 355 //継承元クラスを取得 356 const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( className ); 357 if( !pInterfaceClass ){ 358 compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine); 359 continue; 360 } 361 362 if( !pInterfaceClass->IsReady() ){ 363 // インターフェイスが未解析のとき 364 LexicalAnalyzer::LookaheadClass( 365 pInterfaceClass->GetName().c_str(), 366 compiler.GetObjectModule().meta.GetClasses() 367 ); 368 } 369 370 // インターフェイスを継承する 371 currentClass.Implements( *pInterfaceClass, actualTypeParameters, nowLine ); 372 } 373 374 return true; 375 } 376 377 void GetClass_recur( const char *lpszInheritsClass, Classes &classes ) 378 { 249 379 extern char *basbuf; 250 380 int i,i2,i3,sub_address,top_pos; … … 331 461 SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames ); 332 462 333 CClass *pobj_c = const_cast<CClass *>( this->Find(namespaceScopes, className) );463 CClass *pobj_c = const_cast<CClass *>( classes.Find(namespaceScopes, className) ); 334 464 if(!pobj_c) continue; 335 465 … … 352 482 for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ ) 353 483 { 354 Type baseType( DEF_OBJECT, * GetObjectClassPtr() );484 Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() ); 355 485 if( typeParameterBaseClassNames[i2].size() ) 356 486 { … … 398 528 399 529 //継承元クラスを取得 400 const Classes &classes = *this;401 530 const CClass *pInheritsClass = classes.Find(temporary); 402 531 if( !pInheritsClass ){ 403 532 compiler.errorMessenger.Output(106,temporary,i); 533 goto Interface_InheritsError; 534 } 535 536 //ループ継承でないかをチェック 537 if( !LexicalAnalyzer::LoopRefCheck( *pInheritsClass ) ) 538 { 539 compiler.errorMessenger.Output(123,pInheritsClass->GetName(),i); 404 540 goto Interface_InheritsError; 405 541 } … … 469 605 } 470 606 471 //メンバ関数を追加 472 pobj_c->AddMethod(pobj_c, 473 Prototype::Public, //Publicアクセス権 474 0, // bStatic 475 false, // isConst 476 true, // isAbstract 477 true, // isVirtual 478 false, // isOverride 479 false, // isAutoGeneration 480 temporary, 481 sub_address 482 ); 607 //関数ハッシュへ登録 608 char interfaceName[VN_SIZE] = ""; 609 UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,true,pobj_c, false, interfaceName ); 610 if( pUserProc ) 611 { 612 compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i ); 613 614 //メンバ関数を追加 615 LexicalAnalyzer::AddMethod(pobj_c, 616 pUserProc, 617 Prototype::Public, //Publicアクセス権 618 0, // bStatic 619 false, // isConst 620 true, // isAbstract 621 true, // isVirtual 622 false, // isOverride 623 interfaceName, 624 false, // isAutoGeneration 625 sub_address 626 ); 627 } 483 628 } 484 629 } … … 540 685 SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames ); 541 686 542 CClass *pobj_c = const_cast<CClass *>( this->Find(namespaceScopes, className) );687 CClass *pobj_c = const_cast<CClass *>( classes.Find(namespaceScopes, className) ); 543 688 if(!pobj_c) continue; 544 689 … … 552 697 } 553 698 699 if( lstrcmp(className,"Control")==0) 700 { 701 int test=0; 702 } 703 554 704 if(pobj_c->IsReady()){ 555 705 //既に先読みされているとき … … 562 712 for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ ) 563 713 { 564 Type baseType( DEF_OBJECT, * GetObjectClassPtr() );714 Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() ); 565 715 if( typeParameterBaseClassNames[i2].size() ) 566 716 { … … 624 774 lstrcpy( temporary, "Object" ); 625 775 } 626 pobj_c->Inherits(temporary, i );776 LexicalAnalyzer::Inherits( *pobj_c, temporary, i ); 627 777 628 778 if( basbuf[i+1] == 1 && basbuf[i+2] == ESC_IMPLEMENTS ) … … 632 782 GetCommandToken( temporary, basbuf, i ); 633 783 634 pobj_c->Implements(temporary, i );784 LexicalAnalyzer::Implements( *pobj_c, temporary, i ); 635 785 } 636 786 } … … 761 911 if( !pobj_c->GetDynamicMembers().back()->GetType().GetClass().IsReady() ){ 762 912 //参照先が読み取られていないとき 763 GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str());913 GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str(), classes ); 764 914 } 765 915 } … … 779 929 } 780 930 else{ 781 //メソッドを追加 782 cp=i; //エラー用 783 pobj_c->AddMethod(pobj_c, 784 accessibility, 785 bStatic, 786 isConst, 787 isAbstract, 788 isVirtual, 789 isOverride, 790 false, 791 temporary, 792 sub_address); 931 //関数ハッシュへ登録 932 char interfaceName[VN_SIZE] = ""; 933 UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,isVirtual,pobj_c, (bStatic!=0), interfaceName ); 934 if( pUserProc ) 935 { 936 compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, i ); 937 938 //メソッドを追加 939 cp=i; //エラー用 940 LexicalAnalyzer::AddMethod(pobj_c, 941 pUserProc, 942 accessibility, 943 bStatic, 944 isConst, 945 isAbstract, 946 isVirtual, 947 isOverride, 948 interfaceName, 949 false, 950 sub_address); 951 } 793 952 794 953 if( isAbstract ) continue; … … 831 990 } 832 991 833 void Classes::LookaheadClass( const char *className)992 void LexicalAnalyzer::LookaheadClass( const char *className, Classes &classes ) 834 993 { 835 994 pobj_LoopRefCheck->add( className ); 836 compiler.GetObjectModule().meta.GetClasses().GetClass_recur( className);995 GetClass_recur( className, classes ); 837 996 pobj_LoopRefCheck->del( className ); 838 997 } 839 998 840 bool Classes::LoopRefCheck( const CClass &objClass )999 bool LexicalAnalyzer::LoopRefCheck( const CClass &objClass ) 841 1000 { 842 1001 if( pobj_LoopRefCheck->check( objClass ) ) … … 848 1007 } 849 1008 850 void Classes::GetAllClassInfo(void){1009 void LexicalAnalyzer::CollectClasses( const char *source, Classes &classes ){ 851 1010 //ループ継承チェック用のクラス 852 1011 pobj_LoopRefCheck=new CLoopRefCheck(); 853 1012 854 1013 //クラスを取得 855 GetClass_recur( 0);1014 GetClass_recur( 0, classes ); 856 1015 857 1016 delete pobj_LoopRefCheck; … … 859 1018 860 1019 // イテレータの準備 861 this->Iterator_Init();1020 classes.Iterator_Init(); 862 1021 }
Note:
See TracChangeset
for help on using the changeset viewer.