Changeset 299 in dev for trunk/abdev/BasicCompiler_Common/src
- Timestamp:
- Aug 23, 2007, 6:17:00 PM (17 years ago)
- Location:
- trunk/abdev/BasicCompiler_Common/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp
r288 r299 14 14 //boost libraries 15 15 #include <boost/foreach.hpp> 16 17 #include <jenga/include/common/String.h> 16 18 17 19 #include "../common.h" -
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r297 r299 188 188 } 189 189 190 // ジェネリクス構文を分解 190 191 char className[VN_SIZE]; 191 std::vector<std::string> typeParameters; 192 SplitGenericClassInstance( temporary, className, typeParameters ); 192 Jenga::Common::Strings typeParameterStrings; 193 SplitGenericClassInstance( temporary, className, typeParameterStrings ); 194 195 // 型パラメータ文字列から型データを取得 196 std::vector<Type> actualTypeParameters; 197 BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings ) 198 { 199 Type type; 200 compiler.StringToType( typeParameterStr, type ); 201 actualTypeParameters.push_back( type ); 202 } 193 203 194 204 //継承元クラスを取得 … … 206 216 isInheritsClass = true; 207 217 208 if( !InheritsClass( *pInheritsClass, nowLine ) ){218 if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){ 209 219 return false; 210 220 } … … 223 233 if( !isInheritsClass ){ 224 234 // クラスを一つも継承していないとき 225 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), nowLine ) ){235 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){ 226 236 return false; 227 237 } … … 241 251 242 252 char className[VN_SIZE]; 243 std::vector<std::string>typeParameters;253 Jenga::Common::Strings typeParameters; 244 254 SplitGenericClassInstance( temporary, className, typeParameters ); 245 255 … … 273 283 return true; 274 284 } 275 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){285 bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ){ 276 286 277 287 //ループ継承でないかをチェック … … 300 310 } 301 311 312 // メンバのみ、型パラメータを解決する(メソッドのほうは呼び出し時に解決する) 313 if( pMember->GetType().IsTypeParameter() ) 314 { 315 pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] ); 316 } 317 302 318 dynamicMembers.push_back( pMember ); 303 319 } … … 332 348 //継承先のクラスをメンバとして保持する 333 349 SetSuperClass( &inheritsClass ); 350 SetSuperClassActualTypeParameters( actualTypeParameters ); 334 351 335 352 return true; … … 1075 1092 namespaceScopes.clear(); 1076 1093 1094 // 呼び出し元でコンパイル中のクラスポインタをバックアップ 1095 const CClass *pBackCompilingClass = compiler.pCompilingClass; 1096 1077 1097 for(i=0;;i++){ 1078 1098 if(basbuf[i]=='\0') break; … … 1162 1182 1163 1183 //継承させる 1164 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){1184 if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){ 1165 1185 goto Interface_InheritsError; 1166 1186 } … … 1270 1290 1271 1291 char className[VN_SIZE]; 1272 std::vector<std::string>typeParameters;1292 Jenga::Common::Strings typeParameters; 1273 1293 SplitGenericClassInstance( temporary, className, typeParameters ); 1274 1294 … … 1476 1496 if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().GetClass())){ 1477 1497 //エラー回避 1478 pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().SetBasicType( DEF_PTR_VOID ); 1498 Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType()); 1499 type.SetBasicType( DEF_PTR_VOID ); 1479 1500 } 1480 1501 pobj_LoopRefCheck->del(pobj_c->GetName().c_str()); … … 1524 1545 } 1525 1546 1547 // 呼び出し元でコンパイル中のクラスポインタを元に戻す 1548 compiler.pCompilingClass = pBackCompilingClass; 1526 1549 1527 1550 // 名前空間を元に戻す -
trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
r290 r299 34 34 35 35 // ジェネリクスクラスを取得 36 const CClass *pGenericClass = compiler.GetObjectModule().meta.GetClasses().Find( className );36 const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className ); 37 37 38 38 // 型パラメータの型情報を取得 … … 62 62 //関数ポインタ(*Function) 63 63 type.SetBasicType( DEF_PTR_PROC ); 64 type.SetIndex( compiler.GetObjectModule().meta.GetProcPointers().Add( typeName ) );64 type.SetIndex( this->GetObjectModule().meta.GetProcPointers().Add( typeName ) ); 65 65 return true; 66 66 } … … 88 88 // Object型だったとき 89 89 if( typeName == "Object" ){ 90 type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() );90 type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 91 91 return true; 92 92 } … … 94 94 // String型だったとき 95 95 if( typeName == "String" ){ 96 type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );96 type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetStringClassPtr() ); 97 97 return true; 98 98 } … … 102 102 // TypeDefされた型 103 103 //////////////////// 104 int i= compiler.GetObjectModule().meta.GetTypeDefs().GetIndex( typeName );104 int i=this->GetObjectModule().meta.GetTypeDefs().GetIndex( typeName ); 105 105 if(i!=-1){ 106 type = compiler.GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();106 type = this->GetObjectModule().meta.GetTypeDefs()[i].GetBaseType(); 107 107 return true; 108 108 } 109 109 110 110 //クラス 111 const CClass *pobj_c = compiler.GetObjectModule().meta.GetClasses().Find( typeName );111 const CClass *pobj_c = this->GetObjectModule().meta.GetClasses().Find( typeName ); 112 112 if(pobj_c){ 113 113 if( pobj_c->IsStructure() ){ … … 126 126 127 127 // 型パラメータ 128 if( compiler.pCompilingClass )128 if( this->pCompilingClass ) 129 129 { 130 130 // クラスに属するメソッドをコンパイルしているとき 131 if( compiler.pCompilingClass->IsExistFormalGenericTypeParameter( typeName ) ) 131 int formalTypeIndex = this->pCompilingClass->GetFormalGenericTypeParameterIndex( typeName ); 132 if( formalTypeIndex != -1 ) 132 133 { 133 134 // コンパイル中クラスにおけるジェネリクス用の型パラメータのとき 134 135 type.SetBasicType( DEF_TYPE_PARAMETER ); 135 type.SetClassPtr( compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 136 type.SetClassPtr( this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() ); 137 type.SetFormalTypeName( typeName ); 138 type.SetFormalTypeIndex( formalTypeIndex ); 136 139 return true; 137 140 } … … 169 172 } 170 173 else{ 171 if( compiler.GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){174 if( this->GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){ 172 175 return "*Sub"; 173 176 } -
trunk/abdev/BasicCompiler_Common/src/Type.cpp
r292 r299 493 493 494 494 495 void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc ) 496 { 497 ///////////////////////////////////////////////////////// 498 // ☆★☆ ジェネリクスサポート ☆★☆ 499 500 if( typeParameter.IsTypeParameter() ) 501 { 502 // 型パラメータだったとき 503 504 // ポインタレベルを抽出 505 int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() ); 506 507 if( pUserProc ) 508 { 509 // 基底クラスでの自己解決 510 const CClass *pClass = &classType.GetClass(); 511 while( pClass->HasSuperClass() ) 512 { 513 if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() ) 514 { 515 if( pClass->GetSuperClassActualTypeParameters().size() ) 516 { 517 typeParameter = pClass->GetSuperClassActualTypeParameters()[0]; 518 } 519 } 520 pClass = &pClass->GetSuperClass(); 521 } 522 } 523 524 if( typeParameter.IsTypeParameter() ) 525 { 526 if( classType.HasActualGenericType() ) 527 { 528 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す 529 typeParameter = classType.GetDummyActualGenericType(); 530 } 531 else 532 { 533 // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする 534 typeParameter.SetBasicType( DEF_OBJECT ); 535 } 536 } 537 538 for( int i=0; i<ptrLevel; i++ ) 539 { 540 typeParameter.PtrLevelUp(); 541 } 542 } 543 544 // 545 ///////////////////////////////////////////////////////// 546 } 547 548 495 549 const string BlittableType::GetCreateStaticMethodFullName() const 496 550 { -
trunk/abdev/BasicCompiler_Common/src/TypeDef.cpp
r272 r299 13 13 , baseName( baseName ) 14 14 { 15 if( ! Compiler::StringToType( baseName, baseType ) ){15 if( !compiler.StringToType( baseName, baseType ) ){ 16 16 SmoothieException::Throw(3, baseName, nowLine ); 17 17 return;
Note:
See TracChangeset
for help on using the changeset viewer.