Index: trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp	(revision 204)
+++ trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp	(revision 206)
@@ -1,2 +1,4 @@
+#include "stdafx.h"
+
 #include <jenga/include/smoothie/Smoothie.h>
 #include <jenga/include/smoothie/LexicalAnalysis.h>
@@ -5,6 +7,5 @@
 #include <Compiler.h>
 #include <LexicalScopingImpl.h>
-#include <ClassImpl.h>
-#include <VariableImpl.h>
+#include <Class.h>
 
 #include "../BasicCompiler_Common/common.h"
@@ -31,6 +32,5 @@
 		}
 
-		UserProc *pBackUserProc;
-		pBackUserProc = &UserProc::CompilingUserProc();
+		const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
 		UserProc::CompileStartForGlobalArea();
 
@@ -54,5 +54,5 @@
 
 		//_System_StartupProgramの呼び出し
-		extern UserProc *pSub_System_StartupProgram;
+		extern const UserProc *pSub_System_StartupProgram;
 		op_call(pSub_System_StartupProgram);
 
@@ -82,8 +82,8 @@
 		StackFrameSchedule=obp-sizeof(long);
 
-		BOOST_FOREACH( Variable *pVar, globalVars ){
+		BOOST_FOREACH( Variable *pVar, compiler.GetMeta().GetGlobalVars() ){
 			if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
 				//コンストラクタ呼び出し
-				if( pVar->IsObject() ){
+				if( pVar->GetType().IsObject() ){
 
 					//エラー用
@@ -92,7 +92,7 @@
 					CallConstructor(
 						pVar->GetName().c_str(),
-						pVar->GetSubScriptsPtr(),
-						*pVar,
-						pVar->paramStrForConstructor.c_str());
+						pVar->GetSubscripts(),
+						pVar->GetType(),
+						pVar->GetParamStrForConstructor().c_str());
 				}
 			}
@@ -113,6 +113,5 @@
 
 
-		UserProc *pBackUserProc;
-		pBackUserProc = &UserProc::CompilingUserProc();
+		const UserProc *pBackUserProc = &UserProc::CompilingUserProc();
 		UserProc::CompileStartForGlobalArea();
 
@@ -212,5 +211,5 @@
 	}
 }
-void AutoGeneration(UserProc &userProc){
+void AutoGeneration(const UserProc &userProc){
 	if( userProc.GetName() == "InitializeUserTypes"
 		&& userProc.HasParentClass()
@@ -229,8 +228,7 @@
 	}
 }
-void _compile_proc(UserProc *pUserProc){
+void _compile_proc(const UserProc *pUserProc){
 	extern char *basbuf;
 	extern HANDLE hHeap;
-	extern GlobalProc **ppSubHash;
 	extern BOOL bDebugCompile;
 	int i3,i4;
@@ -239,8 +237,10 @@
 	if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
 
-	if( pUserProc->localVars.size() ){
+	if( pUserProc->GetLocalVars().size() ){
 		SetError();
 		return;
 	}
+
+	trace_for_sourcecodestep( "★★★ " << pUserProc->GetFullName() << "のコンパイルを開始" );
 
 	pUserProc->CompleteCompile();
@@ -259,8 +259,8 @@
 	else bDebugSupportProc=0;
 
-	pUserProc->beginOpAddress=obp;
+	pUserProc->SetBeginOpAddress( obp );
 
 	//コンパイル中の関数が属するクラス
-	Smoothie::Temp::pCompilingClass=pUserProc->GetParentClassPtr();
+	compiler.pCompilingClass=pUserProc->GetParentClassPtr();
 
 	//コンパイルスタートをクラス管理クラスに追加
@@ -294,5 +294,5 @@
 		pobj_sf=0;
 
-		pUserProc->endOpAddress=obp;
+		pUserProc->SetEndOpAddress( obp );
 		return;
 	}
@@ -360,8 +360,8 @@
 		Parameter &param = *pUserProc->RealParams()[i3];
 
-		Variable *pVar = new VariableImpl( param.GetVarName(), param, false, param.IsRef() );
+		Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef(), "" );
 
 		if( param.IsArray() ){
-			pVar->SetArray( param.GetSubScriptsPtr() );
+			pVar->SetArray( param.GetSubscripts() );
 		}
 
@@ -381,12 +381,12 @@
 		}
 		AllLocalVarSize+=varSize;
-		pVar->offset=AllLocalVarSize;
+		pVar->SetOffsetAddress( AllLocalVarSize );
 
 		//レキシカルスコープ情報
-		pVar->ScopeLevel=GetLexicalScopes().GetNowLevel();
-		pVar->ScopeStartAddress=GetLexicalScopes().GetStartAddress();
+		pVar->SetScopeLevel( GetLexicalScopes().GetNowLevel() );
+		pVar->SetScopeStartAddress( GetLexicalScopes().GetStartAddress() );
 		pVar->bLiving=TRUE;
 
-		pUserProc->localVars.push_back( pVar );
+		pUserProc->GetLocalVars().push_back( pVar );
 	}
 
@@ -507,10 +507,10 @@
 
 		//call _DebugSys_StartProc
-		extern UserProc *pSub_DebugSys_StartProc;
+		extern const UserProc *pSub_DebugSys_StartProc;
 		op_call(pSub_DebugSys_StartProc);
 	}
 
-	if(Smoothie::Temp::pCompilingClass){
-		if( pUserProc->GetName() == Smoothie::Temp::pCompilingClass->GetName() ){
+	if(compiler.pCompilingClass){
+		if( pUserProc->GetName() == compiler.pCompilingClass->GetName() ){
 			////////////////////////////////////
 			// コンストラクタをコンパイルするとき
@@ -518,11 +518,11 @@
 
 			//コンストラクタのコンパイル開始を通知
-			Smoothie::Temp::pCompilingClass->NotifyStartConstructorCompile();
+			compiler.pCompilingClass->NotifyStartConstructorCompile();
 
 			//基底クラスかどうかの識別
 			//（継承元がインターフェイスの場合も基底クラスと見なす）
 			BOOL bThisIsSuperClass;
-			if( !Smoothie::Temp::pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
-			else if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
+			if( !compiler.pCompilingClass->HasSuperClass() ) bThisIsSuperClass=1;
+			else if( compiler.pCompilingClass->GetSuperClass().GetConstructorMethod() == NULL ){
 				//インターフェイスを継承したときはコンストラクタを持たない
 				bThisIsSuperClass=1;
@@ -543,5 +543,5 @@
 					temporary[i4]=basbuf[i3];
 				}
-				if( Smoothie::Temp::pCompilingClass->GetSuperClass().GetName() == temporary ){
+				if( compiler.pCompilingClass->GetSuperClass().GetName() == temporary ){
 					//基底クラスのコンストラクタを呼び出す
 					cp=i3;
@@ -560,6 +560,6 @@
 					Type dummyType;
 					CallProc( PROC_DEFAULT
-						, Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc
-						, Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc->GetName().c_str()
+						, &compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc()
+						, compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc().GetName().c_str()
 						, temporary
 						, dummyType );
@@ -568,5 +568,5 @@
 					//基底クラスのコンストラクタを暗黙的に呼び出す
 					Opcode_CallProc("",
-						Smoothie::Temp::pCompilingClass->GetSuperClass().GetConstructorMethod()->pUserProc,
+						&compiler.pCompilingClass->GetSuperClass().GetConstructorMethod()->GetUserProc(),
 						0,
 						"",
@@ -576,8 +576,8 @@
 
 			//仮想関数テーブルを初期化
-			if( Smoothie::Temp::pCompilingClass->IsExistVirtualFunctions()
-				&& !Smoothie::Temp::pCompilingClass->IsAbstract() ){
+			if( compiler.pCompilingClass->IsExistVirtualFunctions()
+				&& !compiler.pCompilingClass->IsAbstract() ){
 					//関数テーブルに値をセット
-					int offset = (int)Smoothie::Temp::pCompilingClass->GetVtblGlobalOffset();
+					int offset = (int)compiler.pCompilingClass->GetVtblGlobalOffset();
 
 					//mov rax,offset
@@ -598,5 +598,5 @@
 
 			//デストラクタのコンパイル開始を通知
-			Smoothie::Temp::pCompilingClass->NotifyStartDestructorCompile();
+			compiler.pCompilingClass->NotifyStartDestructorCompile();
 		}
 	}
@@ -624,11 +624,11 @@
 	//////////////////////////////////////////
 
-	if( Smoothie::Temp::pCompilingClass ){
-
-		if( Smoothie::Temp::pCompilingClass->IsCompilingConstructor() ){
+	if( compiler.pCompilingClass ){
+
+		if( compiler.pCompilingClass->IsCompilingConstructor() ){
 			// コンストラクタをコンパイルしていたとき
 
 			// コンストラクタのコンパイルが完了したことを通知
-			Smoothie::Temp::pCompilingClass->NotifyFinishConstructorCompile();
+			compiler.pCompilingClass->NotifyFinishConstructorCompile();
 		}
 		else if( pUserProc->IsDestructor() ){
@@ -638,14 +638,14 @@
 
 			// デストラクタのコンパイルが完了したことを通知
-			Smoothie::Temp::pCompilingClass->NotifyFinishDestructorCompile();
-
-			if( Smoothie::Temp::pCompilingClass->HasSuperClass() ){
+			compiler.pCompilingClass->NotifyFinishDestructorCompile();
+
+			if( compiler.pCompilingClass->HasSuperClass() ){
 				/* サブクラスのデストラクタをコンパイルしているときは、
 					基底クラスのデストラクタを呼び出す */
 
-				const CMethod *method = Smoothie::Temp::pCompilingClass->GetSuperClass().GetDestructorMethod();
+				const CMethod *method = compiler.pCompilingClass->GetSuperClass().GetDestructorMethod();
 				if( method ){
 					Opcode_CallProc("",
-						method->pUserProc,
+						&method->GetUserProc(),
 						0,
 						"",
@@ -694,5 +694,5 @@
 	if(bDebugCompile&&bDebugSupportProc==0){
 		//call _DebugSys_EndProc
-		extern UserProc *pSub_DebugSys_EndProc;
+		extern const UserProc *pSub_DebugSys_EndProc;
 		op_call(pSub_DebugSys_EndProc);
 	}
@@ -745,7 +745,9 @@
 	}
 	HeapDefaultFree(pLocalVarAddrSchedule);
-	BOOST_FOREACH( Variable *pVar, pUserProc->localVars ){
+	BOOST_FOREACH( Variable *pVar, pUserProc->GetLocalVars() ){
 		//後にデバッグで利用する
-		pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset;
+		pVar->SetOffsetAddress(
+			AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->GetOffsetAddress()
+		);
 	}
 
@@ -785,5 +787,5 @@
 
 
-	pUserProc->endOpAddress=obp;
+	pUserProc->SetEndOpAddress( obp );
 
 
@@ -793,5 +795,5 @@
 }
 
-void CompileBufferInProcedure( UserProc &userProc ){
+void CompileBufferInProcedure( const UserProc &userProc ){
 	if( userProc.IsUsing() == false || userProc.IsCompiled() ) return;
 
@@ -809,11 +811,8 @@
 }
 void CompileLocal(){
-	extern GlobalProc **ppSubHash;
-	int i2;
-
 	extern BOOL bDll;
 	if(bDll){
 		//DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
-		UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
+		const UserProc *pUserProc = GetSubHash("_System_InitDllGlobalVariables");
 		if(pUserProc){
 			CompileBufferInProcedure( *pUserProc );
@@ -823,24 +822,22 @@
 
 	//_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
-	extern UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
+	extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
 	pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
 
 	//_System_InitStaticLocalVariablesは一番最後にコンパイル
 	//※一般関数内の静的変数オブジェクトをすべて収集しなければならない
-	extern UserProc *pSub_System_InitStaticLocalVariables;
+	extern const UserProc *pSub_System_InitStaticLocalVariables;
 	pSub_System_InitStaticLocalVariables->CompleteCompile();
 
 	//_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
-	extern UserProc *pSub_System_Call_Destructor_of_GlobalObject;
+	extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
 	pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
 
 repeat:
-	GlobalProc *pGlobalProc;
-	for(i2=0;i2<MAX_HASH;i2++){
-		pGlobalProc=ppSubHash[i2];
-		while(pGlobalProc){
-			CompileBufferInProcedure( *pGlobalProc );
-			pGlobalProc=pGlobalProc->pNextData;
-		}
+	compiler.GetMeta().GetUserProcs().Iterator_Reset();
+	while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
+		CompileBufferInProcedure( *pUserProc );
 	}
 
@@ -856,10 +853,10 @@
 	if( IsNeedProcCompile() ){
 		//プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
-		for(i2=0;i2<MAX_HASH;i2++){
-			pGlobalProc=ppSubHash[i2];
-			while(pGlobalProc){
-				CompileBufferInProcedure( *pGlobalProc );
-				pGlobalProc=pGlobalProc->pNextData;
-			}
+
+		compiler.GetMeta().GetUserProcs().Iterator_Reset();
+		while( compiler.GetMeta().GetUserProcs().Iterator_HasNext() )
+		{
+			UserProc *pUserProc = compiler.GetMeta().GetUserProcs().Iterator_GetNext();
+			CompileBufferInProcedure( *pUserProc );
 		}
 	}
