Index: trunk/abdev/BasicCompiler32/MakePeHdr.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/MakePeHdr.cpp	(revision 201)
+++ trunk/abdev/BasicCompiler32/MakePeHdr.cpp	(revision 206)
@@ -1,2 +1,4 @@
+#include "stdafx.h"
+
 #include <jenga/include/common/Environment.h>
 
@@ -4,9 +6,12 @@
 
 #include <LexicalScopingImpl.h>
-#include <ClassImpl.h>
+#include <Class.h>
 #include <Compiler.h>
 #include <NamespaceSupporter.h>
 
+#include <../Enum.h>
+
 #include "../BasicCompiler_Common/common.h"
+#include "../BasicCompiler_Common/DebugSection.h"
 #include "Opcode.h"
 
@@ -19,5 +24,5 @@
 
 // グローバル関数、静的メソッド
-UserProc
+const UserProc
 	*pSub_System_StartupProgram,
 	*pSub_DebugSys_StartProc,
@@ -51,5 +56,5 @@
 
 // 動的メソッド
-UserProc
+const UserProc
 	*pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
 
@@ -176,5 +181,5 @@
 
 	//クラス名を取得（詳細情報はGetAllClassInfoで取得）
-	//   GetSubInfo関数の中で参照されるオブジェクト名を事前に取得する。
+	//   CollectUserProcs関数の中で参照されるオブジェクト名を事前に取得する。
 	//     ※オブジェクトの内容までは取得しない
 	compiler.GetMeta().GetClasses().CollectClassesForNameOnly( Smoothie::Lexical::source );
@@ -186,10 +191,13 @@
 	GetConstInfo();
 
-	//サブルーチン（ユーザー定義、DLL関数）の識別子、アドレスを取得
-	Smoothie::Temp::pCompilingClass=0;
-	GetSubInfo();
-
-	//クラス情報を取得（※注 - GetSubInfoの後に呼び出す）
+	// サブルーチン（ユーザー定義、DLL関数）の識別子、アドレスを取得
+	compiler.pCompilingClass=0;
+	UserProcs::CollectUserProcs( Smoothie::Lexical::source, compiler.GetMeta().GetUserProcs() );
+
+	// クラス情報を取得（※注 - CollectUserProcsの後に呼び出す）
 	compiler.GetMeta().GetClasses().GetAllClassInfo();
+
+	// サブルーチン（ユーザー定義、DLL関数）のイテレータの準備
+	compiler.GetMeta().GetUserProcs().Iterator_Init();
 
 	if( !compiler.GetMeta().Write( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
@@ -197,9 +205,10 @@
 		MessageBox(0,"XML書き込みに失敗","test",0);
 	}
-	MetaImpl tempMeta;
-	if( !tempMeta.Read( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
+	MetaImpl *pTempMeta = new MetaImpl();
+	if( !pTempMeta->Read( Jenga::Common::Environment::GetAppDir() + "\\meta_test.xml" ) )
 	{
 		MessageBox(0,"XML読み込みに失敗","test",0);
 	}
+	compiler.GetMeta() = (*pTempMeta);
 
 	//コードと行番号の関係
@@ -401,4 +410,6 @@
 		extern DWORD dwContinueAddress;
 		dwContinueAddress=-1;
+
+		trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" );
 
 
@@ -451,5 +462,5 @@
 
 		//call _System_End
-		extern UserProc *pSub_System_End;
+		extern const UserProc *pSub_System_End;
 		op_call(pSub_System_End);
 
@@ -593,28 +604,26 @@
 		ExportNamesLength=lstrlen(lpExportNames)+1;
 
-		extern GlobalProc **ppSubHash;
-		GlobalProc *pUserProc,*psi2;
+		UserProc *pUserProc,*psi2;
 		while(1){
 			//辞書順にサーチ
 			temporary[0]=0;
-			for(i=0,psi2=0;i<MAX_HASH;i++){
-				pUserProc=ppSubHash[i];
-				while(pUserProc){
-					if(pUserProc->IsExport()){
-						if(temporary[0]=='\0'){
+			compiler.GetMeta().GetUserProcs().Iterator_Reset();
+			while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
+			{
+				pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
+				if(pUserProc->IsExport()){
+					if(temporary[0]=='\0'){
+						lstrcpy(temporary,pUserProc->GetName().c_str());
+						psi2=pUserProc;
+					}
+					else{
+						i3=lstrlen(temporary);
+						i4=(int)pUserProc->GetName().size();
+						if(i3<i4) i3=i4;
+						if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
 							lstrcpy(temporary,pUserProc->GetName().c_str());
 							psi2=pUserProc;
 						}
-						else{
-							i3=lstrlen(temporary);
-							i4=(int)pUserProc->GetName().size();
-							if(i3<i4) i3=i4;
-							if(memcmp(temporary,pUserProc->GetName().c_str(),i3)>0){
-								lstrcpy(temporary,pUserProc->GetName().c_str());
-								psi2=pUserProc;
-							}
-						}
 					}
-					pUserProc=pUserProc->pNextData;
 				}
 			}
@@ -625,9 +634,9 @@
 
 			if( pUserProc->GetName() == "DllMain" ){
-				DllMain_EntryPoint=pUserProc->beginOpAddress;
+				DllMain_EntryPoint=pUserProc->GetBeginOpAddress();
 			}
 
 			lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
-			lpdwExportAddressTable[ExportNum]=pUserProc->beginOpAddress;
+			lpdwExportAddressTable[ExportNum]=pUserProc->GetBeginOpAddress();
 
 			lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
@@ -808,7 +817,7 @@
 	//（デバッグ情報で利用される）
 	extern int AllInitGlobalVarSize;
-	BOOST_FOREACH( Variable *pVar, globalVars ){
-		if(pVar->offset&0x80000000){
-			pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
+	BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
+		if(pVar->GetOffsetAddress()&0x80000000){
+			pVar->SetOffsetAddress( (pVar->GetOffsetAddress()&0x7FFFFFFF)+AllInitGlobalVarSize );
 		}
 	}
@@ -1110,6 +1119,6 @@
 	// プロシージャポインタスケジュール
 	for(i=0;i<pobj_SubAddrSchedule->num;i++){
-		if(pobj_SubAddrSchedule->ppsi[i]->beginOpAddress==0
-			&&pobj_SubAddrSchedule->ppsi[i]->endOpAddress==0){
+		if(pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()==0
+			&&pobj_SubAddrSchedule->ppsi[i]->GetEndOpAddress()==0){
 			SetError(300,NULL,-1);
 		}
@@ -1117,9 +1126,9 @@
 		if(pobj_SubAddrSchedule->pbCall[i]){
 			*((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
-				pobj_SubAddrSchedule->ppsi[i]->beginOpAddress-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
+				pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()-(pobj_SubAddrSchedule->pObpValues[i]+sizeof(long));
 		}
 		else{
 			*((long *)(OpBuffer+pobj_SubAddrSchedule->pObpValues[i]))=
-				pobj_SubAddrSchedule->ppsi[i]->beginOpAddress+ImageBase+MemPos_CodeSection;
+				pobj_SubAddrSchedule->ppsi[i]->GetBeginOpAddress()+ImageBase+MemPos_CodeSection;
 		}
 	}
