Changeset 640 in dev for trunk/ab5.0/abdev/ab_common/src/Lexical
- Timestamp:
- Jun 14, 2008, 12:16:27 PM (16 years ago)
- Location:
- trunk/ab5.0/abdev/ab_common/src/Lexical
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/ab_common/src/Lexical/Class.cpp
r639 r640 869 869 } 870 870 871 bool CClass::Resolve( const ObjectModule &resolver )871 bool CClass::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 872 872 { 873 873 // 型パラメータ 874 874 BOOST_FOREACH( GenericType &genericType, formalGenericTypes ) 875 875 { 876 genericType.GetType().Resolve( resolver );876 genericType.GetType().Resolve( resolver, resolveErrors ); 877 877 } 878 878 … … 882 882 if( this->pSuperClass->IsNeedResolve() ) 883 883 { 884 this->pSuperClass = resolver.meta.GetClasses().FindEx( *pSuperClass ); 884 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pSuperClass ); 885 if( pTempClass ) 886 { 887 this->pSuperClass = pTempClass; 888 } 889 else 890 { 891 resolveErrors.Add( ResolveError( this->pSuperClass->GetRelationalObjectModuleIndex(), this->pSuperClass->GetFullName() ) ); 892 } 885 893 } 886 894 } … … 889 897 BOOST_FOREACH( Type &superClassActualTypeParameter, superClassActualTypeParameters ) 890 898 { 891 superClassActualTypeParameter.Resolve( resolver );899 superClassActualTypeParameter.Resolve( resolver, resolveErrors ); 892 900 } 893 901 894 902 // Blittable型情報 895 blittableType.Resolve( resolver );903 blittableType.Resolve( resolver, resolveErrors ); 896 904 897 905 // 実装するインターフェイス 898 906 BOOST_FOREACH( ::Interface *pInterface, interfaces ) 899 907 { 900 pInterface->Resolve( resolver );908 pInterface->Resolve( resolver, resolveErrors ); 901 909 } 902 910 … … 904 912 BOOST_FOREACH( Member *pMember, dynamicMembers ) 905 913 { 906 pMember->Resolve( resolver );914 pMember->Resolve( resolver, resolveErrors ); 907 915 } 908 916 … … 910 918 BOOST_FOREACH( Member *pMember, staticMembers ) 911 919 { 912 pMember->Resolve( resolver );920 pMember->Resolve( resolver, resolveErrors ); 913 921 } 914 922 … … 916 924 BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() ) 917 925 { 918 pMethod->Resolve( resolver );926 pMethod->Resolve( resolver, resolveErrors ); 919 927 } 920 928 … … 922 930 BOOST_FOREACH( CMethod *pMethod, staticMethods ) 923 931 { 924 pMethod->Resolve( resolver );932 pMethod->Resolve( resolver, resolveErrors ); 925 933 } 926 934 … … 928 936 BOOST_FOREACH( ActiveBasic::Common::Lexical::ExpandedTemplateClass *pExpandedTemplateClass, expandedTemplateClasses ) 929 937 { 930 pExpandedTemplateClass->Resolve( resolver );938 pExpandedTemplateClass->Resolve( resolver, resolveErrors ); 931 939 } 932 940 -
trunk/ab5.0/abdev/ab_common/src/Lexical/Const.cpp
r639 r640 7 7 } 8 8 9 bool CConst::Resolve( const ObjectModule &resolver )9 bool CConst::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 10 10 { 11 type.Resolve( resolver );11 type.Resolve( resolver, resolveErrors ); 12 12 return true; 13 13 } … … 78 78 } 79 79 80 bool ConstMacro::Resolve( const ObjectModule &resolver )80 bool ConstMacro::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 81 81 { 82 82 // 依存関係を解決すべきメンバは無い -
trunk/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp
r639 r640 78 78 } 79 79 80 void DataTable::Resolve( const ObjectModule &resolver )80 void DataTable::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 81 81 { 82 82 BOOST_FOREACH( Schedule &schedule, schedules ) 83 83 { 84 schedule.Resolve( resolver );84 schedule.Resolve( resolver, resolveErrors ); 85 85 } 86 86 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/Delegate.cpp
r639 r640 19 19 } 20 20 21 bool Delegate::Resolve( const ObjectModule &resolver )21 bool Delegate::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 22 22 { 23 Procedure::Resolve( resolver );23 Procedure::Resolve( resolver, resolveErrors ); 24 24 25 25 BOOST_FOREACH( Parameter *pParameter, dynamicParams ) 26 26 { 27 pParameter->Resolve( resolver );27 pParameter->Resolve( resolver, resolveErrors ); 28 28 } 29 29 -
trunk/ab5.0/abdev/ab_common/src/Lexical/Interface.cpp
r639 r640 33 33 } 34 34 35 bool Interface::Equals( const Interface *pInterface ) const 36 { 37 // ポインタが等しいかどうかを見てみる 38 if( this == pInterface ) 39 { 40 return true; 41 } 42 else if( this->pInterfaceClass->IsNeedResolve() || pInterface->pInterfaceClass->IsNeedResolve() ) 43 { 44 // 依存関係解決前の状態であれば、パスが等しいかどうかを見てみる 45 if( this-pInterfaceClass->IsDuplication( pInterface->pInterfaceClass ) ) 46 { 47 return true; 48 } 49 } 50 return false; 51 } 52 35 53 std::string Interface::GetFullNameWithActualGenericTypeParameters() const 36 54 { … … 53 71 } 54 72 55 bool Interface::Resolve( const ObjectModule &resolver )73 bool Interface::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 56 74 { 57 75 // 動的メソッド 58 76 BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() ) 59 77 { 60 pMethod->Resolve( resolver );78 pMethod->Resolve( resolver, resolveErrors ); 61 79 } 62 80 … … 66 84 if( this->pInterfaceClass->IsNeedResolve() ) 67 85 { 68 this->pInterfaceClass = resolver.meta.GetClasses().FindLike( pInterfaceClass ); 86 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pInterfaceClass ); 87 if( pTempClass ) 88 { 89 this->pInterfaceClass = pTempClass; 90 } 91 else 92 { 93 resolveErrors.Add( ResolveError( this->pInterfaceClass->GetRelationalObjectModuleIndex(), this->pInterfaceClass->GetFullName() ) ); 94 } 69 95 } 70 96 } … … 72 98 BOOST_FOREACH( Type &actualTypeParameter, actualTypeParameters ) 73 99 { 74 actualTypeParameter.Resolve( resolver );100 actualTypeParameter.Resolve( resolver, resolveErrors ); 75 101 } 76 102 -
trunk/ab5.0/abdev/ab_common/src/Lexical/Member.cpp
r639 r640 41 41 } 42 42 43 bool Member::Resolve( const ObjectModule &resolver )43 bool Member::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 44 44 { 45 type.Resolve( resolver );45 type.Resolve( resolver, resolveErrors ); 46 46 return true; 47 47 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp
r639 r640 253 253 } 254 254 255 void Meta::Resolve( const ObjectModule &resolver )255 void Meta::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 256 256 { 257 257 // 関数・メソッド … … 261 261 { 262 262 UserProc *pUserProc = this->GetUserProcs().Iterator_GetNext(); 263 pUserProc->Resolve( resolver );263 pUserProc->Resolve( resolver, resolveErrors ); 264 264 } 265 265 … … 270 270 { 271 271 DllProc *pDllProc = this->GetDllProcs().Iterator_GetNext(); 272 pDllProc->Resolve( resolver );272 pDllProc->Resolve( resolver, resolveErrors ); 273 273 } 274 274 … … 279 279 { 280 280 CClass *pClass = this->GetClasses().Iterator_GetNext(); 281 pClass->Resolve( resolver );281 pClass->Resolve( resolver, resolveErrors ); 282 282 } 283 283 … … 285 285 BOOST_FOREACH( Variable *pVar, globalVars ) 286 286 { 287 pVar->Resolve( resolver );287 pVar->Resolve( resolver, resolveErrors ); 288 288 } 289 289 … … 294 294 { 295 295 CConst *pConst = this->GetGlobalConsts().Iterator_GetNext(); 296 pConst->Resolve( resolver );296 pConst->Resolve( resolver, resolveErrors ); 297 297 } 298 298 … … 303 303 { 304 304 ConstMacro *pConstMacro = this->GetGlobalConstMacros().Iterator_GetNext(); 305 pConstMacro->Resolve( resolver ); 305 pConstMacro->Resolve( resolver, resolveErrors ); 306 } 307 308 // blittable型 309 BOOST_FOREACH( BlittableType &blittableType, blittableTypes ) 310 { 311 blittableType.Resolve( resolver, resolveErrors ); 306 312 } 307 313 … … 309 315 BOOST_FOREACH( TypeDef &typeDef, typeDefs ) 310 316 { 311 typeDef.Resolve( resolver );317 typeDef.Resolve( resolver, resolveErrors ); 312 318 } 313 319 … … 315 321 BOOST_FOREACH( ProcPointer *pProcPointer, procPointers ) 316 322 { 317 pProcPointer->Resolve( resolver );323 pProcPointer->Resolve( resolver, resolveErrors ); 318 324 } 319 325 … … 324 330 { 325 331 Delegate *pDelegate = this->GetDelegates().Iterator_GetNext(); 326 pDelegate->Resolve( resolver );327 } 328 } 332 pDelegate->Resolve( resolver, resolveErrors ); 333 } 334 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/Method.cpp
r639 r640 1 1 #include "stdafx.h" 2 2 3 bool CMethod::Resolve( const ObjectModule &resolver )3 bool CMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 4 4 { 5 if( pUserProc )5 if( this->pUserProc ) 6 6 { 7 if( pUserProc->IsNeedResolve() )7 if( this->pUserProc->IsNeedResolve() ) 8 8 { 9 pUserProc = resolver.meta.GetUserProcs().FindLike( pUserProc ); 9 const UserProc *pTempUserProc = resolver.meta.GetUserProcs().FindLike( this->pUserProc ); 10 if( pTempUserProc ) 11 { 12 this->pUserProc = pTempUserProc; 13 } 14 else 15 { 16 resolveErrors.Add( ResolveError( this->pUserProc->GetRelationalObjectModuleIndex(), this->pUserProc->GetFullName() ) ); 17 } 10 18 } 11 19 } … … 41 49 } 42 50 43 bool DynamicMethod::Resolve( const ObjectModule &resolver )51 bool DynamicMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 44 52 { 45 CMethod::Resolve( resolver );53 CMethod::Resolve( resolver, resolveErrors ); 46 54 47 55 if( this->pInheritsClass ) … … 49 57 if( this->pInheritsClass->IsNeedResolve() ) 50 58 { 51 this->pInheritsClass = resolver.meta.GetClasses().FindLike( pInheritsClass ); 59 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( pInheritsClass ); 60 if( pTempClass ) 61 { 62 this->pInheritsClass = pTempClass; 63 } 64 else 65 { 66 resolveErrors.Add( ResolveError( this->pInheritsClass->GetRelationalObjectModuleIndex(), this->pInheritsClass->GetFullName() ) ); 67 } 52 68 } 53 69 } … … 62 78 } 63 79 64 bool StaticMethod::Resolve( const ObjectModule &resolver )80 bool StaticMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 65 81 { 66 CMethod::Resolve( resolver );82 CMethod::Resolve( resolver, resolveErrors ); 67 83 return true; 68 84 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp
r639 r640 19 19 } 20 20 21 bool Schedule::Resolve( const ObjectModule &resolver )21 bool Schedule::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 22 22 { 23 23 switch( type ) … … 26 26 case AddressOf: 27 27 case CatchAddress: 28 if( pUserProc->IsNeedResolve() ) 29 { 30 pUserProc = resolver.meta.GetUserProcs().FindLike( pUserProc ); 28 if( this->pUserProc->IsNeedResolve() ) 29 { 30 const ::UserProc *pTempUserProc = resolver.meta.GetUserProcs().FindLike( this->pUserProc ); 31 if( pTempUserProc ) 32 { 33 this->pUserProc = pTempUserProc; 34 } 35 else 36 { 37 resolveErrors.Add( ResolveError( this->pUserProc->GetRelationalObjectModuleIndex(), this->pUserProc->GetFullName() ) ); 38 } 31 39 } 32 40 break; 33 41 case DllProc: 34 if( pDllProc->IsNeedResolve() ) 35 { 36 pDllProc = resolver.meta.GetDllProcs().FindLike( pDllProc ); 42 if( this->pDllProc->IsNeedResolve() ) 43 { 44 const ::DllProc *pTempDllProc = resolver.meta.GetDllProcs().FindLike( this->pDllProc ); 45 if( pTempDllProc ) 46 { 47 this->pDllProc = pTempDllProc; 48 } 49 else 50 { 51 resolveErrors.Add( ResolveError( this->pDllProc->GetRelationalObjectModuleIndex(), this->pDllProc->GetFullName() ) ); 52 } 37 53 } 38 54 break; … … 40 56 case Vtbl: 41 57 case TypeInfo: 42 if( pClass->IsNeedResolve() ) 43 { 44 pClass = resolver.meta.GetClasses().FindLike( pClass ); 58 if( this->pClass->IsNeedResolve() ) 59 { 60 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass ); 61 if( pTempClass ) 62 { 63 this->pClass = pTempClass; 64 } 65 else 66 { 67 resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) ); 68 } 45 69 } 46 70 break; … … 191 215 } 192 216 193 void NativeCode::Resolve( const ObjectModule &resolver )217 void NativeCode::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 194 218 { 195 219 BOOST_FOREACH( Schedule &schedule, schedules ) 196 220 { 197 schedule.Resolve( resolver );198 } 199 } 221 schedule.Resolve( resolver, resolveErrors ); 222 } 223 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp
r639 r640 77 77 } 78 78 79 // 依存関係を解決80 this->Resolve();81 82 79 // TODO: basbufがいらなくなったら消す 83 80 extern char *basbuf; … … 85 82 } 86 83 87 void ObjectModule::Resolve( )88 { 89 this->meta.Resolve( *this );84 void ObjectModule::Resolve( ResolveErrors &resolveErrors ) 85 { 86 this->meta.Resolve( *this, resolveErrors ); 90 87 91 88 // グローバルネイティブコードを解決(スケジュールを解決する) 92 this->globalNativeCode.Resolve( *this );89 this->globalNativeCode.Resolve( *this, resolveErrors ); 93 90 94 91 // データテーブルを解決(スケジュールを解決する) 95 this->dataTable.Resolve( *this );92 this->dataTable.Resolve( *this, resolveErrors ); 96 93 } 97 94 -
trunk/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp
r639 r640 12 12 } 13 13 14 bool Procedure::Resolve( const ObjectModule &resolver )14 bool Procedure::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 15 15 { 16 16 BOOST_FOREACH( Parameter *pParameter, params ) 17 17 { 18 pParameter->Resolve( resolver );19 } 20 21 returnType.Resolve( resolver );18 pParameter->Resolve( resolver, resolveErrors ); 19 } 20 21 returnType.Resolve( resolver, resolveErrors ); 22 22 23 23 return true; … … 170 170 } 171 171 172 bool UserProc::Resolve( const ObjectModule &resolver ) 173 { 174 Procedure::Resolve( resolver ); 175 176 if( pParentClass ) 177 { 178 if( pParentClass->IsNeedResolve() ) 179 { 180 pParentClass = resolver.meta.GetClasses().FindLike( pParentClass ); 172 bool UserProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 173 { 174 Procedure::Resolve( resolver, resolveErrors ); 175 176 if( this->pParentClass ) 177 { 178 if( this->pParentClass->IsNeedResolve() ) 179 { 180 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pParentClass ); 181 if( pTempClass ) 182 { 183 this->pParentClass = pTempClass; 184 } 185 else 186 { 187 resolveErrors.Add( ResolveError( this->pParentClass->GetRelationalObjectModuleIndex(), this->pParentClass->GetFullName() ) ); 188 } 181 189 } 182 190 } … … 184 192 if( pInterface ) 185 193 { 186 const_cast<Interface *>(pInterface)->Resolve( resolver );194 const_cast<Interface *>(pInterface)->Resolve( resolver, resolveErrors ); 187 195 } 188 196 189 197 if( pMethod ) 190 198 { 191 pMethod->Resolve( resolver );199 pMethod->Resolve( resolver, resolveErrors ); 192 200 } 193 201 194 202 BOOST_FOREACH( Parameter *pParameter, realParams ) 195 203 { 196 pParameter->Resolve( resolver );204 pParameter->Resolve( resolver, resolveErrors ); 197 205 } 198 206 199 207 BOOST_FOREACH( Variable *pLocalVar, localVars ) 200 208 { 201 pLocalVar->Resolve( resolver );202 } 203 204 nativeCode.Resolve( resolver );209 pLocalVar->Resolve( resolver, resolveErrors ); 210 } 211 212 nativeCode.Resolve( resolver, resolveErrors ); 205 213 return true; 206 214 } … … 228 236 } 229 237 230 bool DllProc::Resolve( const ObjectModule &resolver )231 { 232 Procedure::Resolve( resolver );233 return true; 234 } 235 236 bool ProcPointer::Resolve( const ObjectModule &resolver )237 { 238 Procedure::Resolve( resolver );238 bool DllProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 239 { 240 Procedure::Resolve( resolver, resolveErrors ); 241 return true; 242 } 243 244 bool ProcPointer::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 245 { 246 Procedure::Resolve( resolver, resolveErrors ); 239 247 return true; 240 248 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/Template.cpp
r639 r640 9 9 } 10 10 11 bool ExpandedTemplateClass::Resolve( const ObjectModule &resolver )11 bool ExpandedTemplateClass::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 12 12 { 13 13 if( pClass->IsNeedResolve() ) 14 14 { 15 pClass = const_cast<CClass *>(resolver.meta.GetClasses().FindLike( pClass )); 15 CClass *pTempClass = const_cast<CClass *>(resolver.meta.GetClasses().FindLike( pClass )); 16 if( pTempClass ) 17 { 18 this->pClass = pTempClass; 19 } 20 else 21 { 22 resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) ); 23 } 16 24 } 17 25 18 26 BOOST_FOREACH( Type &actualType, actualTypes ) 19 27 { 20 actualType.Resolve( resolver );28 actualType.Resolve( resolver, resolveErrors ); 21 29 } 22 30 -
trunk/ab5.0/abdev/ab_common/src/Lexical/Type.cpp
r639 r640 129 129 bool Type::Equals( const Type &type ) const 130 130 { 131 if( basicType == type.basicType ){ 132 if( NATURAL_TYPE( basicType ) == DEF_OBJECT 133 || NATURAL_TYPE( basicType ) == DEF_STRUCT ){ 134 135 if( index == type.index ){ 131 if( basicType == type.basicType ) 132 { 133 if( NATURAL_TYPE( basicType ) == DEF_OBJECT || NATURAL_TYPE( basicType ) == DEF_STRUCT ) 134 { 135 // ポインタが等しいかどうかを見てみる 136 if( this->pClass == type.pClass ) 137 { 138 return true; 139 } 140 else if( this->pClass->IsNeedResolve() || type.pClass->IsNeedResolve() ) 141 { 142 // 依存関係解決前の状態であれば、パスが等しいかどうかを見てみる 143 if( this->pClass->IsDuplication( type.pClass ) ) 144 { 136 145 return true; 137 146 } 138 139 } 140 else{ 147 } 148 } 149 else 150 { 141 151 return true; 142 152 } … … 556 566 } 557 567 558 bool Type::Resolve( const ObjectModule &resolver )568 bool Type::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 559 569 { 560 570 if( this->HasMember() ) … … 562 572 if( this->pClass->IsNeedResolve() ) 563 573 { 564 this->pClass = resolver.meta.GetClasses().FindLike( this->pClass ); 574 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass ); 575 if( pTempClass ) 576 { 577 this->pClass = pTempClass; 578 } 579 else 580 { 581 resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) ); 582 } 565 583 } 566 584 567 585 BOOST_FOREACH( GenericType &actualGenericType, actualGenericTypes ) 568 586 { 569 actualGenericType.GetType().Resolve( resolver );587 actualGenericType.GetType().Resolve( resolver, resolveErrors ); 570 588 } 571 589 } … … 655 673 return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName() + "._Create"; 656 674 } 675 676 bool BlittableType::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 677 { 678 basicType.Resolve( resolver, resolveErrors ); 679 680 if( this->pClass->IsNeedResolve() ) 681 { 682 const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass ); 683 if( pTempClass ) 684 { 685 this->pClass = pTempClass; 686 } 687 else 688 { 689 resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) ); 690 } 691 } 692 693 return true; 694 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/TypeDef.cpp
r639 r640 8 8 } 9 9 10 bool TypeDef::Resolve( const ObjectModule &resolver )10 bool TypeDef::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 11 11 { 12 this->baseType.Resolve( resolver );12 this->baseType.Resolve( resolver, resolveErrors ); 13 13 return true; 14 14 } -
trunk/ab5.0/abdev/ab_common/src/Lexical/Variable.cpp
r639 r640 28 28 } 29 29 30 bool Variable::Resolve( const ObjectModule &resolver )30 bool Variable::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) 31 31 { 32 this->type.Resolve( resolver );32 this->type.Resolve( resolver, resolveErrors ); 33 33 return true; 34 34 }
Note:
See TracChangeset
for help on using the changeset viewer.