Index: trunk/abdev/BasicCompiler64/Compile_Object.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_Object.cpp	(revision 262)
+++ trunk/abdev/BasicCompiler64/Compile_Object.cpp	(revision 263)
@@ -60,5 +60,5 @@
 		if( subs.size() == 1 ){
 			char temporary[VN_SIZE];
-			sprintf( temporary, "ActiveBasic.Core._System_TypeBase.Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
+			sprintf( temporary, "_System_TypeBase_Search(\"\",\"%s\"))", pobj_c->GetName().c_str() );
 
 			Opcode_CallProc(temporary,
@@ -258,6 +258,5 @@
 
 	//jnzの番地
-	int jnz_back;
-	jnz_back=obp;
+	//int jnz_back=obp;
 
 	//mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
@@ -280,5 +279,5 @@
 
 	//jnz ↑
-	compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
+	//compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
 
 
Index: trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp	(revision 262)
+++ trunk/abdev/BasicCompiler64/Compile_ProcOp.cpp	(revision 263)
@@ -140,5 +140,4 @@
 		&& userProc.HasParentClass()
 		&& userProc.GetParentClass().GetName() == "_System_TypeBase" ){
-
 			compiler.objectModule.meta.GetClasses().Compile_System_InitializeUserTypes();
 	}
@@ -670,5 +669,5 @@
 
 
-	pUserProc->SetEndOpAddress( obp );
+	pUserProc->_endOpAddressOld = obp;
 
 
Index: trunk/abdev/BasicCompiler64/Compile_Statement.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_Statement.cpp	(revision 262)
+++ trunk/abdev/BasicCompiler64/Compile_Statement.cpp	(revision 263)
@@ -272,5 +272,4 @@
 		{
 			//jmp ...(schedule)
-			extern int obp;
 			compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
 		}
@@ -289,5 +288,4 @@
 		{
 			//jmp ...(schedule)
-			extern int obp;
 			compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
 		}
Index: trunk/abdev/BasicCompiler64/MakePeHdr.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/MakePeHdr.cpp	(revision 262)
+++ trunk/abdev/BasicCompiler64/MakePeHdr.cpp	(revision 263)
@@ -222,8 +222,6 @@
 
 	//コードと行番号の関係
-	extern LINEINFO *pLineInfo;
-	extern int MaxLineInfoNum;
-	pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,1);
-	MaxLineInfoNum=0;
+	extern SourceLines oldSourceLines;
+	oldSourceLines.clear();
 
 
@@ -387,5 +385,5 @@
 
 		//未完成
-		//OpBuffer[obp++]=(char)0xCC;
+		//breakpoint;
 
 		//sub rsp,スタックフレームサイズ
@@ -503,4 +501,11 @@
 	//////////////////////////////////////////////////////////
 
+
+
+	trace( "コード生成が終了しました。" );
+
+	vector<ObjectModule *> masterObjectModules;
+	masterObjectModules.push_back( &compiler.objectModule );
+	compiler.linker.Link( masterObjectModules );
 
 
@@ -836,28 +841,20 @@
 
 	//機械語コードとBasicコードの関係を整理
-	extern LINEINFO *pLineInfo;
-	extern int MaxLineInfoNum;
+	extern SourceLines oldSourceLines;
 	int MinObp,MaxObp;
-	LINEINFO *pTempLineInfo;
-	pTempLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,MaxLineInfoNum*sizeof(LINEINFO));
-	i2=0;
+	SourceLines tempSourceLines;
 	MaxObp=0;
 	while(1){
-		for(i3=0,MinObp=0x0FFFFFFF;i3<MaxLineInfoNum;i3++){
-			if(pLineInfo[i3].TopObp<MinObp&&MaxObp<pLineInfo[i3].TopObp){
-				MinObp=pLineInfo[i3].TopObp;
+		for(i3=0,MinObp=0x0FFFFFFF;i3<oldSourceLines.size();i3++){
+			if(oldSourceLines[i3].GetNativeCodePos()<MinObp&&MaxObp<oldSourceLines[i3].GetNativeCodePos()){
+				MinObp=oldSourceLines[i3].GetNativeCodePos();
 				i4=i3;
 			}
 		}
 		if(MinObp==0x0FFFFFFF) break;
-		pTempLineInfo[i2]=pLineInfo[i4];
-		MaxObp=pTempLineInfo[i2].TopObp;
-		i2++;
-	}
-	HeapDefaultFree(pLineInfo);
-	pLineInfo=(LINEINFO *)HeapAlloc(hHeap,0,i2*sizeof(LINEINFO));
-	memcpy(pLineInfo,pTempLineInfo,i2*sizeof(LINEINFO));
-	MaxLineInfoNum=i2;
-	HeapDefaultFree(pTempLineInfo);
+		tempSourceLines.push_back( oldSourceLines[i4] );
+		MaxObp=tempSourceLines.back().GetNativeCodePos();
+	}
+	oldSourceLines = tempSourceLines;
 
 	//デバッグセクションを生成
@@ -1165,4 +1162,21 @@
 
 
+
+	compiler.linker.SetImageBase( ImageBase );
+	compiler.linker.ResolveDataTableSchedules( MemPos_DataSection );
+	compiler.linker.ResolveDllProcSchedules( MemPos_CodeSection, MemPos_ImportSection, LookupSize, HintSize );
+	compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
+	compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
+
+	if( obp == compiler.linker.GetNativeCode().GetSize() )
+	{
+		memcpy( OpBuffer, compiler.linker.GetNativeCode().GetCodeBuffer(), compiler.linker.GetNativeCode().GetSize() );
+	}
+	else
+	{
+		SetError();
+	}
+
+
 	////////////////////////////////
 	// リソースアドレススケジュール
Index: trunk/abdev/BasicCompiler64/Opcode.h
===================================================================
--- trunk/abdev/BasicCompiler64/Opcode.h	(revision 262)
+++ trunk/abdev/BasicCompiler64/Opcode.h	(revision 263)
@@ -45,8 +45,11 @@
 
 
-class CStackFrame:public CSchedule{
+class CStackFrame
+{
 	///////////////////////////
 	// スタックフレーム管理
 	///////////////////////////
+
+	PertialSchedules pertialSchedules;
 
 	int lowest_sp;			//スタックポインタの最下位位置
Index: trunk/abdev/BasicCompiler64/stack_frame.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/stack_frame.cpp	(revision 262)
+++ trunk/abdev/BasicCompiler64/stack_frame.cpp	(revision 263)
@@ -39,10 +39,7 @@
 
 	//add reg,now_sp
-	compiler.codeGenerator.op_add_RV( reg, now_sp );
-
-	//スケジュールをセット
-	obp-=sizeof(long);
-	add();
-	obp+=sizeof(long);
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_add_RV( reg, now_sp, Schedule::None, true )
+	);
 }
 int CStackFrame::push(int reg){
@@ -53,10 +50,7 @@
 
 	//mov qword ptr[rsp+offset],reg
-	compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32);
-
-	//スケジュールをセット
-	obp-=sizeof(long);
-	add();
-	obp+=sizeof(long);
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true)
+	);
 
 	return now_sp;
@@ -68,24 +62,20 @@
 	if(varSize==sizeof(double)){
 		//movlpd qword ptr[rsp+offset],xmm_reg
-		compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
+		);
 	}
 	if(varSize==sizeof(float)){
 		//movss dword ptr[rsp+offset],xmm_reg
-		compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
+		);
 	}
-
-	//スケジュールをセット
-	obp-=sizeof(long);
-	add();
-	obp+=sizeof(long);
 }
 void CStackFrame::ref_offset_data( int reg, int sp_offset ){
 	//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
-	compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32);
-
-	//スケジュールをセット
-	obp-=sizeof(long);
-	add();
-	obp+=sizeof(long);
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32, Schedule::None, true )
+	);
 }
 void CStackFrame::ref(int reg){
@@ -95,15 +85,14 @@
 	if(varSize==sizeof(double)){
 		//movlpd xmm_reg,qword ptr[rsp+offset]
-		compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32);
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
+		);
 	}
 	if(varSize==sizeof(float)){
 		//movss xmm_reg,dword ptr[rsp+offset]
-		compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32 );
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
+		);
 	}
-
-	//スケジュールをセット
-	obp-=sizeof(long);
-	add();
-	obp+=sizeof(long);
 }
 void CStackFrame::pop(int reg){
@@ -121,6 +110,7 @@
 }
 void CStackFrame::RunningSchedule( int stackFrameSize ){
-	for(int i=0;i<num;i++){
-		*((long *)(OpBuffer+pObpValues[i])) += stackFrameSize;
+	BOOST_FOREACH( const PertialSchedule *pPertialSchedule, pertialSchedules )
+	{
+		compiler.codeGenerator.opfix_offset( pPertialSchedule, stackFrameSize );
 	}
 }
