Index: /trunk/abdev/BasicCompiler32/BasicCompiler.vcproj
===================================================================
--- /trunk/abdev/BasicCompiler32/BasicCompiler.vcproj	(revision 269)
+++ /trunk/abdev/BasicCompiler32/BasicCompiler.vcproj	(revision 270)
@@ -1297,4 +1297,8 @@
 					</File>
 					<File
+						RelativePath="..\BasicCompiler_Common\src\Meta.cpp"
+						>
+					</File>
+					<File
 						RelativePath="..\BasicCompiler_Common\src\Method.cpp"
 						>
@@ -1478,4 +1482,8 @@
 					</File>
 					<File
+						RelativePath="..\BasicCompiler_Common\include\ObjectModule.h"
+						>
+					</File>
+					<File
 						RelativePath="..\BasicCompiler_Common\include\Parameter.h"
 						>
Index: /trunk/abdev/BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- /trunk/abdev/BasicCompiler64/BasicCompiler.vcproj	(revision 269)
+++ /trunk/abdev/BasicCompiler64/BasicCompiler.vcproj	(revision 270)
@@ -368,4 +368,8 @@
 					</File>
 					<File
+						RelativePath="..\BasicCompiler_Common\include\ObjectModule.h"
+						>
+					</File>
+					<File
 						RelativePath="..\BasicCompiler_Common\include\Parameter.h"
 						>
@@ -1156,4 +1160,8 @@
 					</File>
 					<File
+						RelativePath="..\BasicCompiler_Common\src\Meta.cpp"
+						>
+					</File>
+					<File
 						RelativePath="..\BasicCompiler_Common\src\Method.cpp"
 						>
Index: /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 270)
@@ -253,4 +253,8 @@
 
 				compiler.staticLibraryFilePaths.push_back( temporary );
+
+				ObjectModule *pStaticLibrary = new ObjectModule();
+				pStaticLibrary->ReadText( temporary );
+				compiler.staticLibraries.push_back( pStaticLibrary );
 
 				for(;;i2++){
@@ -361,5 +365,5 @@
 
 	bool isBeforeCharDelimitation = false;
-	temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,lstrlen(buffer)*2);
+	temporary=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,(lstrlen(buffer)+255)*2);
 	for(i=0,i2=0,IsStr=0;;i++,i2++){
 		if(buffer[i]=='\"') IsStr^=1;
Index: /trunk/abdev/BasicCompiler_Common/include/Class.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 270)
@@ -31,5 +31,5 @@
 typedef vector<InheritedInterface> Interfaces;
 
-class CClass: public Prototype
+class CClass: public Prototype, public Jenga::Common::ObjectInHashmap<CClass>
 {
 public:
@@ -148,4 +148,17 @@
 	}
 
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+	virtual bool IsDuplication( const CClass *pClass ) const
+	{
+		if( pClass->IsEqualSymbol( *this ) )
+		{
+			return true;
+		}
+		return false;
+	}
+
 	void Readed(){
 		isReady = true;
@@ -355,45 +368,7 @@
 };
 
-#define MAX_CLASS_HASH 65535
-class Classes
+class Classes : public Jenga::Common::Hashmap<CClass>
 {
-	CClass *pobj_ClassHash[MAX_CLASS_HASH];
-	int GetHashCode(const char *name) const;
-
 	// XMLシリアライズ用
-private:
-	friend class boost::serialization::access;
-	BOOST_SERIALIZATION_SPLIT_MEMBER();
-	template<class Archive> void load(Archive& ar, const unsigned int version)
-	{
-		trace_for_serialize( "serializing(load) - Classes" );
-
-		std::vector<CClass *> vectorClasses;
-		ar & BOOST_SERIALIZATION_NVP( vectorClasses );
-
-		// 読み込み後の処理
-		Clear();
-		BOOST_FOREACH( CClass *pClass, vectorClasses )
-		{
-			Insert( pClass );
-		}
-		Iterator_Init();
-	}
-	template<class Archive> void save(Archive& ar, const unsigned int version) const
-	{
-		trace_for_serialize( "serializing(save) - Classes" );
-
-		// 保存準備
-		std::vector<CClass *> vectorClasses;
-		vectorClasses.clear();
-		Iterator_Reset();
-		while( Iterator_HasNext() )
-		{
-			vectorClasses.push_back( dynamic_cast<CClass *>(Iterator_GetNext()) );
-		}
-
-		ar & BOOST_SERIALIZATION_NVP( vectorClasses );
-	}
-
 public:
 	Classes()
@@ -401,33 +376,8 @@
 		, pStringClass( NULL )
 		, pObjectClass( NULL )
-		, ppobj_IteClass( NULL )
-		, iIteMaxNum( 0 )
-		, iIteNextNum( 0 )
-	{
-		memset( pobj_ClassHash, 0, MAX_CLASS_HASH * sizeof(CClass *) );
+	{
 	}
 	~Classes()
 	{
-		for(int i=0;i<MAX_CLASS_HASH;i++){
-			if(pobj_ClassHash[i]) DestroyClass(pobj_ClassHash[i]);
-		}
-	}
-	void DestroyClass(CClass *pobj_c)
-	{
-		if(pobj_c->pobj_NextClass){
-			DestroyClass(pobj_c->pobj_NextClass);
-		}
-
-		delete pobj_c;
-	}
-	void Clear()
-	{
-		if(ppobj_IteClass)
-		{
-			free(ppobj_IteClass);
-			ppobj_IteClass = NULL;
-		}
-		// TODO: ここはこれでいいのか…
-		memset( pobj_ClassHash, 0, MAX_CLASS_HASH * sizeof(CClass *) );
 	}
 
@@ -473,18 +423,3 @@
 	CClass *GetStringClassPtr() const;
 	CClass *GetObjectClassPtr() const;
-
-
-	/////////////////////
-	// イテレータ
-	/////////////////////
-private:
-	mutable CClass **ppobj_IteClass;
-	mutable int iIteMaxNum;
-	mutable int iIteNextNum;
-public:
-	void Iterator_Init() const;
-	void Iterator_Reset() const;
-	BOOL Iterator_HasNext() const;
-	CClass *Iterator_GetNext() const;
-	int Iterator_GetMaxCount() const;
 };
Index: /trunk/abdev/BasicCompiler_Common/include/Compiler.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Compiler.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Compiler.h	(revision 270)
@@ -6,4 +6,5 @@
 #include <DataTable.h>
 #include <CodeGenerator.h>
+#include <ObjectModule.h>
 #include <Linker.h>
 
@@ -28,5 +29,16 @@
 	{
 		delete pObjectModule;
+		Clear();
 	}
+	void Clear()
+	{
+		BOOST_FOREACH( ObjectModule *pStaticLibrary, staticLibraries )
+		{
+			delete pStaticLibrary;
+		}
+		staticLibraries.clear();
+	}
+
+	void StaticLink( ObjectModules &staticLibraries );
 
 	NamespaceSupporter &GetNamespaceSupporter()
@@ -46,4 +58,7 @@
 	// 静的リンクするオブジェクトファイル
 	std::vector<std::string> staticLibraryFilePaths;
+
+	// 静的リンクするオブジェクトモジュール
+	ObjectModules staticLibraries;
 
 	// オブジェクトモジュール
@@ -98,5 +113,4 @@
 
 
-
 	static bool StringToType( const std::string &typeName, Type &type );
 	static const std::string TypeToString( const Type &type );
Index: /trunk/abdev/BasicCompiler_Common/include/Hashmap.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Hashmap.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Hashmap.h	(revision 270)
@@ -52,4 +52,10 @@
 	}
 
+	// 内容を破棄せずにすべて抜き取る
+	void PullOutAll()
+	{
+		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+	}
+
 	bool Put( T* value )
 	{
@@ -81,4 +87,8 @@
 
 	T* GetHashArrayElement( const char *keyName )
+	{
+		return hashArray[GetHash(keyName)];
+	}
+	const T* GetHashArrayElement( const char *keyName ) const
 	{
 		return hashArray[GetHash(keyName)];
@@ -222,4 +232,8 @@
 		return pNextObject;
 	}
+	const T *GetChainNext() const
+	{
+		return pNextObject;
+	}
 	void SetChainNext( T *pNextObject )
 	{
Index: /trunk/abdev/BasicCompiler_Common/include/Linker.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Linker.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Linker.h	(revision 270)
@@ -1,32 +1,3 @@
 #pragma once
-
-class ObjectModule : public Jenga::Common::BoostSerializationSupport<ObjectModule>
-{
-public:
-	// メタ情報
-	Meta meta;
-
-	// グローバル領域のネイティブコード
-	NativeCode globalNativeCode;
-
-	// データテーブル
-	DataTable dataTable;
-
-	// XMLシリアライズ用
-private:
-	virtual const char *RootTagName() const
-	{
-		return "objectModule";
-	}
-	friend class boost::serialization::access;
-	template<class Archive> void serialize(Archive& ar, const unsigned int version)
-	{
-		trace_for_serialize( "serializing - objectModule" );
-
-		ar & BOOST_SERIALIZATION_NVP( meta );
-		ar & BOOST_SERIALIZATION_NVP( globalNativeCode );
-		ar & BOOST_SERIALIZATION_NVP( dataTable );
-	}
-};
 
 class Linker
Index: /trunk/abdev/BasicCompiler_Common/include/Meta.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Meta.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Meta.h	(revision 270)
@@ -70,4 +70,7 @@
 	{
 	}
+
+	// 静的リンク
+	void StaticLink( Meta &meta );
 
 	const NamespaceScopesCollection &GetNamespaces() const
Index: /trunk/abdev/BasicCompiler_Common/include/ObjectModule.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/ObjectModule.h	(revision 270)
+++ /trunk/abdev/BasicCompiler_Common/include/ObjectModule.h	(revision 270)
@@ -0,0 +1,31 @@
+#pragma once
+
+class ObjectModule : public Jenga::Common::BoostSerializationSupport<ObjectModule>
+{
+public:
+	// メタ情報
+	Meta meta;
+
+	// グローバル領域のネイティブコード
+	NativeCode globalNativeCode;
+
+	// データテーブル
+	DataTable dataTable;
+
+	// XMLシリアライズ用
+private:
+	virtual const char *RootTagName() const
+	{
+		return "objectModule";
+	}
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - objectModule" );
+
+		ar & BOOST_SERIALIZATION_NVP( meta );
+		ar & BOOST_SERIALIZATION_NVP( globalNativeCode );
+		ar & BOOST_SERIALIZATION_NVP( dataTable );
+	}
+};
+typedef std::vector<ObjectModule *> ObjectModules;
Index: /trunk/abdev/BasicCompiler_Common/include/Procedure.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/Procedure.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/Procedure.h	(revision 270)
@@ -58,4 +58,5 @@
 
 public:
+	bool isTargetObjectModule;
 	Procedure( const NamespaceScopes &namespaceScopes, const string &name, Kind kind, bool isCdecl )
 		: Symbol( namespaceScopes, name )
@@ -64,7 +65,9 @@
 		, isUsing( false )
 		, codePos( -1 )
+		, isTargetObjectModule( true )
 	{
 	}
 	Procedure()
+		: isTargetObjectModule( true )
 	{
 	}
Index: /trunk/abdev/BasicCompiler_Common/include/option.h
===================================================================
--- /trunk/abdev/BasicCompiler_Common/include/option.h	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/include/option.h	(revision 270)
@@ -37,5 +37,5 @@
 
 	// XMLシリアライズに関するログを生成する
-	#define USE_TRACE_FOR_SERIALIZE
+	//#define USE_TRACE_FOR_SERIALIZE
 
 	// ソースコードステップに関するログを生成する
Index: /trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 270)
@@ -758,16 +758,4 @@
 }
 
-
-int Classes::GetHashCode(const char *name) const
-{
-	int key;
-
-	for(key=0;*name!='\0';name++){
-		key=((key<<8)+ *name )%MAX_CLASS_HASH;
-	}
-
-	return key;
-}
-
 CClass *Classes::Create( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name){
 	return new CClass(namespaceScopes, importedNamespaces, name);
@@ -789,24 +777,8 @@
 	/////////////////////////////////
 
-	int key;
-	key=GetHashCode( pClass->GetName().c_str() );
-
-	if(pobj_ClassHash[key]){
-		CClass *pobj_c2;
-		pobj_c2=pobj_ClassHash[key];
-		while(1){
-			if( ((const Prototype *)pobj_c2)->IsEqualSymbol( *(const Prototype *)pClass ) ){
-				//名前空間及びクラス名が重複した場合
-				SmoothieException::Throw(15,pClass->GetName());
-				return false;
-			}
-
-			if(pobj_c2->pobj_NextClass==0) break;
-			pobj_c2=pobj_c2->pobj_NextClass;
-		}
-		pobj_c2->pobj_NextClass=pClass;
-	}
-	else{
-		pobj_ClassHash[key]=pClass;
+	if( !Put( pClass ) )
+	{
+		SetError(15,pClass->GetName(), cp);
+		return false;
 	}
 	return true;
@@ -961,16 +933,9 @@
 
 void Classes::ActionVtblSchedule(LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection){
-	int i;
-	for(i=0;i<MAX_CLASS_HASH;i++){
-		if(pobj_ClassHash[i]){
-			CClass *pobj_c;
-			pobj_c=pobj_ClassHash[i];
-			while(1){
-				pobj_c->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
-
-				if(pobj_c->pobj_NextClass==0) break;
-				pobj_c=pobj_c->pobj_NextClass;
-			}
-		}
+	Iterator_Reset();
+	while( Iterator_HasNext() )
+	{
+		CClass *pClass = Iterator_GetNext();
+		pClass->ActionVtblSchedule(ImageBase,MemPos_CodeSection);
 	}
 }
@@ -981,9 +946,9 @@
 
 	//イテレータをリセット
-	this->Iterator_Reset();
 
 	extern int cp;
 	int back_cp=cp;
 
+	this->Iterator_Reset();
 	while(this->Iterator_HasNext()){
 		CClass &objClass = *this->Iterator_GetNext();
@@ -1634,7 +1599,4 @@
 const CClass *Classes::Find( const NamespaceScopes &namespaceScopes, const string &name ) const
 {
-	int key;
-	key=GetHashCode(name.c_str());
-
 	if( namespaceScopes.size() == 0 && name == "Object" ){
 		return GetObjectClassPtr();
@@ -1644,16 +1606,12 @@
 	}
 
-	if(pobj_ClassHash[key]){
-		CClass *pobj_c;
-		pobj_c=pobj_ClassHash[key];
-		while(1){
-			if( pobj_c->IsEqualSymbol( namespaceScopes, name ) ){
-				//名前空間とクラス名が一致した
-				return pobj_c;
-			}
-
-			if(pobj_c->pobj_NextClass==0) break;
-			pobj_c=pobj_c->pobj_NextClass;
-		}
+	const CClass *pClass = GetHashArrayElement( name.c_str() );
+	while( pClass )
+	{
+		if( pClass->IsEqualSymbol( namespaceScopes, name ) ){
+			//名前空間とクラス名が一致した
+			return pClass;
+		}
+		pClass = pClass->GetChainNext();
 	}
 
@@ -1711,51 +1669,2 @@
 	return pObjectClass;
 }
-
-
-//////////////////////
-// イテレータ
-//////////////////////
-
-void Classes::Iterator_Init() const
-{
-	if(ppobj_IteClass) free(ppobj_IteClass);
-
-	iIteMaxNum=0;
-	iIteNextNum=0;
-	ppobj_IteClass=(CClass **)malloc(1);
-
-	int i;
-	for(i=0;i<MAX_CLASS_HASH;i++){
-		if(pobj_ClassHash[i]){
-			CClass *pobj_c;
-			pobj_c=pobj_ClassHash[i];
-			while(1){
-				ppobj_IteClass=(CClass **)realloc(ppobj_IteClass,(iIteMaxNum+1)*sizeof(CClass *));
-				ppobj_IteClass[iIteMaxNum]=pobj_c;
-				iIteMaxNum++;
-
-				if(pobj_c->pobj_NextClass==0) break;
-				pobj_c=pobj_c->pobj_NextClass;
-			}
-		}
-	}
-}
-void Classes::Iterator_Reset() const
-{
-	iIteNextNum = 0;
-}
-BOOL Classes::Iterator_HasNext() const
-{
-	if(iIteNextNum<iIteMaxNum) return 1;
-	return 0;
-}
-CClass *Classes::Iterator_GetNext() const
-{
-	CClass *pobj_c = ppobj_IteClass[iIteNextNum];
-	iIteNextNum++;
-	return pobj_c;
-}
-int Classes::Iterator_GetMaxCount() const
-{
-	return iIteMaxNum;
-}
Index: /trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 270)
@@ -7,4 +7,13 @@
 
 Compiler compiler;
+
+void Compiler::StaticLink( ObjectModules &staticLibraries )
+{
+	BOOST_FOREACH( ObjectModule *pStaticLibrary, staticLibraries )
+	{
+		// メタ情報
+		pNowObjectModule->meta.StaticLink( pStaticLibrary->meta );
+	}
+}
 
 bool Compiler::StringToType( const string &typeName, Type &type ){
Index: /trunk/abdev/BasicCompiler_Common/src/Meta.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 270)
+++ /trunk/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 270)
@@ -0,0 +1,49 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+void Meta::StaticLink( Meta &meta )
+{
+	// 名前空間
+	BOOST_FOREACH( NamespaceScopes &namespaceScopes, meta.namespaceScopesCollection )
+	{
+		if( !this->namespaceScopesCollection.IsExist( namespaceScopes ) )
+		{
+			this->namespaceScopesCollection.push_back( namespaceScopes );
+		}
+	}
+
+	// 関数・メソッド
+	meta.GetUserProcs().Iterator_Reset();
+	while( meta.GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = meta.GetUserProcs().Iterator_GetNext();
+		pUserProc->isTargetObjectModule = false;
+		this->userProcs.Put( pUserProc );
+	}
+	meta.GetUserProcs().PullOutAll();
+
+	// DLL関数
+	meta.GetDllProcs().Iterator_Reset();
+	while( meta.GetDllProcs().Iterator_HasNext() )
+	{
+		DllProc *pDllProc = meta.GetDllProcs().Iterator_GetNext();
+		pDllProc->isTargetObjectModule = false;
+		this->dllProcs.Put( pDllProc );
+	}
+	meta.GetDllProcs().PullOutAll();
+
+	// クラス
+
+	// グローバル変数
+
+	// グローバル定数
+
+	// グローバル定数マクロ
+
+	// blittable型
+
+	// TypeDef
+
+	// 関数ポインタ
+}
Index: /trunk/abdev/BasicCompiler_Common/src/Source.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/src/Source.cpp	(revision 269)
+++ /trunk/abdev/BasicCompiler_Common/src/Source.cpp	(revision 270)
@@ -821,5 +821,6 @@
 
 	// basic.sbpをインクルード
-	const char *headCode = "\n";
+	const char *headCode = "#include <basic.sbp>\n";
+	//const char *headCode = "\n";
 	Realloc( length + lstrlen(headCode) );
 	Text::SlideString( buffer, lstrlen(headCode) );
