#include "stdafx.h" void Meta::Clear() { // 名前空間 namespaceScopesCollection.clear(); // 関数・メソッド userProcs.Clear(); // DLL関数 dllProcs.Clear(); // クラス classesImpl.Clear(); // グローバル変数 globalVars.Clear(); // グローバル定数 globalConsts.Clear(); // グローバル定数マクロ globalConstMacros.Clear(); // blittable型 blittableTypes.clear(); // TypeDef typeDefs.clear(); // 関数ポインタ procPointers.Clear(); } void Meta::StaticLink( Meta &meta, long dataSectionBaseOffset, const std::vector &relationTable ) { // 名前空間 foreach (NamespaceScopes const &namespaceScopes, meta.namespaceScopesCollection) { if( !this->namespaceScopesCollection.IsExist( namespaceScopes ) ) { this->namespaceScopesCollection.push_back( namespaceScopes ); } } // 関数・メソッド foreach (auto pUserProc, meta.GetUserProcs()) { if( pUserProc->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pUserProc->ResetRelationalObjectModuleIndex( relationTable ); pUserProc->GetNativeCode().ResetDataSectionBaseOffset( dataSectionBaseOffset ); this->userProcs.Put( pUserProc ); } meta.GetUserProcs().PullOutAll(); // DLL関数 foreach (auto pDllProc, meta.GetDllProcs()) { if( pDllProc->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pDllProc->ResetRelationalObjectModuleIndex( relationTable ); this->dllProcs.Put( pDllProc ); } meta.GetDllProcs().PullOutAll(); // クラス foreach (auto pClass, meta.GetClasses()) { if( pClass->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pClass->ResetRelationalObjectModuleIndex( relationTable ); pClass->Readed(); this->GetClasses().Put( pClass ); } meta.GetClasses().PullOutAll(); // グローバル変数 long initAreaBaseOffset = this->globalVars.initAreaBuffer.GetSize(); foreach( Variable *pVar, meta.globalVars ) { if( pVar->IsExternal() ) { // 外部参照の場合は取り込まない continue; } // 基底スコープレベルのグローバル変数の生存値をオンにする if( pVar->GetScopeLevel() == 0 ) { pVar->isLiving = true; } bool isResetOffsetAddress = true; if( pVar->HasInitData() ) { // 初期バッファがあるときはデータテーブルオフセットを適用する pVar->SetOffsetAddress( pVar->GetOffsetAddress() + initAreaBaseOffset ); isResetOffsetAddress = false; } pVar->ResetRelationalObjectModuleIndex( relationTable ); this->globalVars.Add( pVar, isResetOffsetAddress ); } meta.globalVars.PullOutAll(); this->globalVars.initAreaBuffer.Put( meta.globalVars.initAreaBuffer.GetBuffer(), meta.globalVars.initAreaBuffer.GetSize() ); // グローバル定数 foreach (auto pConst, meta.GetGlobalConsts()) { if( pConst->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pConst->ResetRelationalObjectModuleIndex( relationTable ); this->GetGlobalConsts().Put( pConst ); } meta.GetGlobalConsts().PullOutAll(); // グローバル定数マクロ foreach (auto pConstMacro, meta.GetGlobalConstMacros()) { if( pConstMacro->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pConstMacro->ResetRelationalObjectModuleIndex( relationTable ); this->GetGlobalConstMacros().Put( pConstMacro ); } meta.GetGlobalConstMacros().PullOutAll(); // blittable型 BOOST_FOREACH( BlittableType &blittableType, meta.blittableTypes ) { // TODO: coreモジュール以外でもBlittable型用のクラスモジュールを定義できるようにすべき this->blittableTypes.push_back( blittableType ); } meta.blittableTypes.clear(); // TypeDef BOOST_FOREACH( TypeDef &typeDef, meta.typeDefs ) { if( typeDef.IsExternal() ) { // 外部参照の場合は取り込まない continue; } typeDef.ResetRelationalObjectModuleIndex( relationTable ); this->typeDefs.push_back( typeDef ); } meta.typeDefs.clear(); // 関数ポインタ foreach( ProcPointer *pProcPointer, meta.procPointers ) { if( pProcPointer->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pProcPointer->ResetRelationalObjectModuleIndex( relationTable ); this->procPointers.push_back( pProcPointer ); } meta.procPointers.PullOutAll(); // デリゲート foreach (auto pDelegate, meta.GetDelegates()) { if( pDelegate->IsExternal() ) { // 外部参照の場合は取り込まない continue; } pDelegate->ResetRelationalObjectModuleIndex( relationTable ); this->GetDelegates().Put( pDelegate ); } meta.GetDelegates().PullOutAll(); } const ::Delegate &Meta::ToDelegate( const CClass &_class ) { auto dg = this->GetDelegates().GetHashArrayElement(_class.GetName()); foreach (auto t, dg) { if( t->IsEqualSymbol( _class.GetNamespaceScopes(), _class.GetName() ) ){ //名前空間とクラス名が一致した return *t; } } throw std::runtime_error("Meta::ToDelegate"); } const CClass *Meta::FindClassSupportedTypeDef( const Symbol &symbol ) { const CClass *pClass = this->GetClasses().FindEx( symbol ); if( pClass ) { return pClass; } // TypeDefも見る const TypeDef *pTypeDef = this->GetTypeDefs().Find( symbol ); if( pTypeDef ) { Type type = pTypeDef->GetBaseType(); if( type.IsObject() ) { return &type.GetClass(); } } return NULL; } void Meta::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) { // 関数・メソッド foreach (auto pUserProc, this->GetUserProcs()) { pUserProc->Resolve( resolver, resolveErrors ); } // DLL関数 foreach (auto pDllProc, this->GetDllProcs()) { pDllProc->Resolve( resolver, resolveErrors ); } // クラス foreach (auto pClass, this->GetClasses()) { pClass->Resolve( resolver, resolveErrors ); } // グローバル変数 foreach( Variable *pVar, globalVars ) { pVar->Resolve( resolver, resolveErrors ); } // グローバル定数 foreach (auto pConst, this->GetGlobalConsts()) { pConst->Resolve( resolver, resolveErrors ); } // グローバル定数マクロ foreach (auto pConstMacro, this->GetGlobalConstMacros()) { pConstMacro->Resolve( resolver, resolveErrors ); } // blittable型 BOOST_FOREACH( BlittableType &blittableType, blittableTypes ) { blittableType.Resolve( resolver, resolveErrors ); } // TypeDef BOOST_FOREACH( TypeDef &typeDef, typeDefs ) { typeDef.Resolve( resolver, resolveErrors ); } // 関数ポインタ foreach( ProcPointer *pProcPointer, procPointers ) { pProcPointer->Resolve( resolver, resolveErrors ); } // デリゲート foreach (auto pDelegate, this->GetDelegates()) { pDelegate->Resolve( resolver, resolveErrors ); } }