Index: /BasicCompiler32/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler32/BasicCompiler.vcproj	(revision 75)
+++ /BasicCompiler32/BasicCompiler.vcproj	(revision 76)
@@ -600,4 +600,8 @@
 				</File>
 				<File
+					RelativePath="..\BasicCompiler_Common\OldStatement.cpp"
+					>
+				</File>
+				<File
 					RelativePath="..\BasicCompiler_Common\Overload.cpp"
 					>
@@ -1046,4 +1050,39 @@
 						>
 					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VarList.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\WatchList.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="English_Rel|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+					</File>
 				</Filter>
 				<Filter
@@ -1227,33 +1266,9 @@
 					>
 					<File
-						RelativePath="..\BasicCompiler_Common\Variable.cpp"
-						>
-						<FileConfiguration
-							Name="Debug|Win32"
-							>
-							<Tool
-								Name="VCCLCompilerTool"
-								PreprocessorDefinitions=""
-							/>
-						</FileConfiguration>
-						<FileConfiguration
-							Name="Release|Win32"
-							>
-							<Tool
-								Name="VCCLCompilerTool"
-								PreprocessorDefinitions=""
-							/>
-						</FileConfiguration>
-						<FileConfiguration
-							Name="English_Rel|Win32"
-							>
-							<Tool
-								Name="VCCLCompilerTool"
-								PreprocessorDefinitions=""
-							/>
-						</FileConfiguration>
-					</File>
-					<File
-						RelativePath="..\BasicCompiler_Common\Variable.h"
+						RelativePath="..\BasicCompiler_Common\VariableOpe.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VariableOpe.h"
 						>
 					</File>
@@ -1861,64 +1876,4 @@
 			</Filter>
 			<Filter
-				Name="Debug"
-				>
-				<File
-					RelativePath="VarList.cpp"
-					>
-					<FileConfiguration
-						Name="Debug|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="English_Rel|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-				</File>
-				<File
-					RelativePath="WatchList.cpp"
-					>
-					<FileConfiguration
-						Name="Debug|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="English_Rel|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions=""
-						/>
-					</FileConfiguration>
-				</File>
-			</Filter>
-			<Filter
 				Name="CommonClasses"
 				>
@@ -1929,4 +1884,8 @@
 				<File
 					RelativePath="..\BasicCompiler_Common\Type.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Variable.cpp"
 					>
 				</File>
Index: /BasicCompiler32/CParameter.cpp
===================================================================
--- /BasicCompiler32/CParameter.cpp	(revision 75)
+++ /BasicCompiler32/CParameter.cpp	(revision 76)
@@ -39,13 +39,12 @@
 		}
 
-		Type DummyTypeInfo;
+		Type dummyType;
 		BOOL bByVal;
 		if(bEllipse){
-			DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
 			bByVal=1;
 		}
 		else{
-			DummyTypeInfo.type=params[i2]->GetBasicType();
-			DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();
+			dummyType = *params[i2];
 			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
 		}
@@ -59,14 +58,13 @@
 			}
 
-			LONG_PTR lpVarIndex;
-			if( GetVarType( Parms[i2], &lpVarIndex, FALSE ) == -1 ){
+			if( !GetVarType( Parms[i2], Type(), FALSE ) ){
 				//変数ではないとき
-				int reg = REG_RAX;
-				int type = NumOpe( Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
+				Type calcType;
+				NumOpe( Parms[i2], dummyType, calcType );
 				//↑ここでスタックに積む
 
 				nCountOfTempObjects++;
 
-				if( type != DEF_STRUCT ){
+				if( !calcType.IsStruct() ){
 					//一時参照を作成
 
@@ -78,8 +76,6 @@
 
 				bool result = CheckDifferentType(
-					DummyTypeInfo.type,
-					DummyTypeInfo.u.lpIndex,
-					type,
-					lpVarIndex,
+					dummyType,
+					calcType,
 					procName.c_str(),
 					i2);
@@ -89,6 +85,5 @@
 					useTempObject = true;
 
-					types[i2].type = type;
-					types[i2].u.lpIndex = lpVarIndex;
+					types[i2] = calcType;
 				}
 			}
@@ -107,5 +102,5 @@
 	for(int i2=ParmsNum-1;i2>=0;i2--){
 		if( useTempParameters[i2] ){
-			if( types[i2].type == DEF_STRUCT ){
+			if( types[i2].IsStruct() ){
 				// 構造体の一時メモリ
 
@@ -117,5 +112,5 @@
 			}
 			else{
-				if( Is64Type( types[i2].type ) ){
+				if( types[i2].Is64() ){
 					//pop ... 参照を消す
 					//pop ... 上位32ビット
@@ -133,6 +128,6 @@
 }
 
-void ParamImpl::SetStructParameter(CClass *pobj_Class,LPSTR Parameter){
-	int object_size = pobj_Class->GetSize();
+void ParamImpl::SetStructParameter( const Type &baseType, const char *expression ){
+	int object_size = baseType.GetClass().GetSize();
 
 	//push object_size
@@ -143,80 +138,19 @@
 	op_call(pSub_calloc);
 
+	//push eax（ここでプッシュされた値が実際にパラメータとして引き渡される）
+	op_push(REG_EAX);
+
 	//push eax
 	op_push(REG_EAX);
 
-
-	Type BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
-	Type CalcType;
-	CalcType.type=NumOpe_GetType_Old(Parameter,&BaseType,&CalcType.u.lpIndex);
-
-	/*
-	TODO: 消す
-	if( pobj_Class->GetCopyConstructorMethod()
-		&& CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
-		////////////////////////////////////
-		// コピーコンストラクタを呼び出す
-		////////////////////////////////////
-
-		//push eax
-		op_push(REG_EAX);
-
-		BOOL bUseHeap;
-		CalcType.type=NumOpe(Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
-
-		//pop ecx
-		op_pop(REG_ECX);
-
-		//pop eax
-		op_pop(REG_EAX);
-
-		if(bUseHeap){
-			//※解放用に退避
-			//mov esi,ecx
-			op_mov_RR(REG_ESI,REG_ECX);
-		}
-
-		//push ecx
-		op_push(REG_ECX);
-
-		//push eax
-		op_push(REG_EAX);
-
-		//call constructor
-		op_call(pobj_Class->GetCopyConstructorMethod()->pUserProc);
-
-
-		if(bUseHeap){
-			FreeTempObject(REG_ESI,pobj_Class);
-		}
-	}
-	else{*/
-
-
-		//push eax
-		op_push(REG_EAX);
-
-/*
-			TODO: 消す
-			if( pobj_Class->GetConstructorMethod() ){
-				////////////////////////////////
-				// コンストラクタを呼び出す
-				////////////////////////////////
-
-				//push this
-				op_push(REG_EAX);
-
-				//call constructor
-				op_call(pobj_Class->GetConstructorMethod()->pUserProc);
-			}
-*/
-
-			BOOL bUseHeap;
-			CalcType.type=NumOpe(Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
-
-
-
-		SetStructVariable((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,bUseHeap);
-	//}
+	Type calcType;
+	BOOL bUseHeap;
+	NumOpe( expression,
+		baseType,
+		calcType,
+		&bUseHeap );
+
+	// ※スタックにある二つのデータ（コピー先、コピー元）の値を必要とする
+	SetStructVariable( baseType, calcType, bUseHeap );
 }
 
@@ -247,7 +181,4 @@
 
 	//パラメータをレジスタとスタックに格納
-	int CalcType;
-	LONG_PTR lpCalcIndex;
-	BOOL bCalcUseHeap;
 	int ParmSize=0;
 	RELATIVE_VAR RelativeVar;
@@ -269,14 +200,13 @@
 		}
 
-		Type DummyTypeInfo;
+		Type dummyType;
 		BOOL bByVal;
 		if(bEllipse){
-			DummyTypeInfo.type=NumOpe_GetType_Old(Parms[i2],NULL,&DummyTypeInfo.u.lpIndex);
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
 			bByVal=1;
 		}
 		else{
-			DummyTypeInfo.type=params[i2]->GetBasicType();
-			DummyTypeInfo.u.lpIndex=params[i2]->GetIndex();
-			bByVal = (params[i2]->IsRef() == false ) ? TRUE:FALSE;
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
 		}
 
@@ -291,81 +221,100 @@
 			}
 
-			if(DummyTypeInfo.type==DEF_STRUCT){
-				SetStructParameter(DummyTypeInfo.u.pobj_Class,Parms[i2]);
+			if( dummyType.IsStruct() ){
+				SetStructParameter( dummyType, Parms[i2] );
 				goto next;
 			}
 
-
 			extern LONG_PTR ProcPtr_BaseIndex;
-			LONG_PTR back_ProcPtr_BaseIndex;
-			back_ProcPtr_BaseIndex=ProcPtr_BaseIndex;
-			if(DummyTypeInfo.type==DEF_PTR_PROC) ProcPtr_BaseIndex=DummyTypeInfo.u.lpIndex;
-			else ProcPtr_BaseIndex=-1;
-
-			CalcType=NumOpe(Parms[i2],DummyTypeInfo.type,DummyTypeInfo.u.lpIndex,&lpCalcIndex,&bCalcUseHeap);
+			LONG_PTR back_ProcPtr_BaseIndex = ProcPtr_BaseIndex;
+			if( dummyType.IsProcPtr() ){
+				ProcPtr_BaseIndex = dummyType.GetIndex();
+			}
+			else{
+				ProcPtr_BaseIndex=-1;
+			}
+
+			BOOL bCalcUseHeap;
+			Type calcType;
+			if( !NumOpe( Parms[i2], dummyType, calcType, &bCalcUseHeap ) ){
+				break;
+			}
 
 			ProcPtr_BaseIndex=back_ProcPtr_BaseIndex;
 
-			if(CalcType==-1) break;
-
-			if(CalcType==DEF_OBJECT){
-				if( DummyTypeInfo.type != DEF_OBJECT
+			if( calcType.IsObject() ){
+				if( !dummyType.IsObject()
 					||
-					DummyTypeInfo.type == DEF_OBJECT &&
-					!DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
+					dummyType.IsObject() &&
+					!dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
 						//キャスト演算子のオーバーロードに対応する
-						CallCastOperatorProc(CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+						CallCastOperatorProc( calcType, bCalcUseHeap,dummyType );
 				}
 			}
 
 			if(!bEllipse){
+				//型チェック
+				// TODO: _System_ReturnValueが考慮されていない？
+				if(bHas_System_LocalThis) i3=i2-1;
+				else i3=i2;
+				CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i3);
+			}
+
+			if( dummyType.IsDouble() ){
+				ChangeTypeToDouble( calcType.GetBasicType() );
+				ParmSize+=sizeof(long)*2;
+			}
+			else if( dummyType.IsSingle() ){
+				ChangeTypeToSingle( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else if( dummyType.Is64() ){
+				ChangeTypeToInt64( calcType.GetBasicType() );
+				ParmSize+=sizeof(long)*2;
+			}
+			else if( dummyType.IsLong() || dummyType.IsDWord()
+				|| dummyType.IsPointer()
+				|| dummyType.IsObject() || dummyType.IsStruct() ){
+					ChangeTypeToLong( calcType.GetBasicType() );
+					ParmSize+=sizeof(long);
+			}
+			else if( dummyType.IsInteger() || dummyType.IsWord() ){
+				ChangeTypeToInteger( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else if( dummyType.IsSByte() || dummyType.IsByte() || dummyType.IsBoolean() ){
+				ChangeTypeToByte( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else{
+				SetError(300,NULL,cp);
+			}
+		}
+		else{
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+
+				Type calcType;
+				if( !NumOpe( Parms[i2]+2, dummyType, calcType) ){
+					break;
+				}
+
+				ChangeTypeToLong( calcType.GetBasicType() );
+
+				dummyType.PtrLevelUp();
+
 				//型チェック
 				if(bHas_System_LocalThis) i3=i2-1;
 				else i3=i2;
 				CheckDifferentType(
-					DummyTypeInfo.type,
-					DummyTypeInfo.u.lpIndex,
-					CalcType,
-					lpCalcIndex,
+					dummyType,
+					calcType,
 					procName.c_str(),
 					i3);
-			}
-
-			if(DummyTypeInfo.type==DEF_DOUBLE){
-				ChangeTypeToDouble(CalcType);
-				ParmSize+=sizeof(long)*2;
-			}
-			else if(DummyTypeInfo.type==DEF_SINGLE){
-				ChangeTypeToSingle(CalcType);
-				ParmSize+=sizeof(long);
-			}
-			else if(DummyTypeInfo.type==DEF_INT64||DummyTypeInfo.type==DEF_QWORD){
-				ChangeTypeToInt64(CalcType);
-				ParmSize+=sizeof(long)*2;
-			}
-			else if(DummyTypeInfo.type==DEF_LONG||DummyTypeInfo.type==DEF_DWORD||DummyTypeInfo.type==DEF_OBJECT||DummyTypeInfo.type==DEF_STRUCT||
-				(IsPtrType(DummyTypeInfo.type)/*&&DummyTypeInfo.type!=DEF_PTR_VOID&&DummyTypeInfo.type!=DEF_PTR_BYTE*/)){
-				ChangeTypeToLong(CalcType);
-				ParmSize+=sizeof(long);
-			}
-			else if(DummyTypeInfo.type==DEF_INTEGER||DummyTypeInfo.type==DEF_WORD || (isUnicode&&DummyTypeInfo.type==DEF_CHAR)){
-				ChangeTypeToInteger(CalcType);
-				ParmSize+=sizeof(long);
-			}
-			else if(DummyTypeInfo.type==DEF_SBYTE||DummyTypeInfo.type==DEF_BYTE||DummyTypeInfo.type==DEF_BOOLEAN || (isUnicode==false&&DummyTypeInfo.type==DEF_CHAR)){
-				ChangeTypeToByte(CalcType);
-				ParmSize+=sizeof(long);
-			}
-			else{
-				SetError(300,NULL,cp);
-			}
-		}
-		else{
-			//ポインタ参照
-			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
-				//ポインタ指定
-				i3=NumOpe(Parms[i2]+2,0,0,0);
-
-				ChangeTypeToLong(i3);
 			}
 			else{
@@ -373,5 +322,5 @@
 					//一時オブジェクトをコピー
 
-					if( types[i2].type != DEF_STRUCT ){
+					if( !types[i2].IsStruct() ){
 						// 一時参照のための領域を考慮する
 						nCountOfNowTempObjects++;
@@ -393,28 +342,27 @@
 				else{
 					//変数のアドレスを取得
-					int VarType;
-					LONG_PTR lpVarIndex;
+					Type varType;
 					if(GetVarOffset(
 						false,
 						false,
 						Parms[i2],
-						&VarType,
 						&RelativeVar,
-						&lpVarIndex)){
-							if(DummyTypeInfo.type!=DEF_ANY){
+						varType)){
+							if( !dummyType.IsAny() ){
 								//型チェックを行う
-								if(DummyTypeInfo.type==VarType){
-									if(DummyTypeInfo.type==DEF_OBJECT){
-										if( !DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpVarIndex ) ){
+								if( dummyType.GetBasicType() == varType.GetBasicType() ){
+									if( dummyType.IsObject() ){
+										if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){
 											SetError(11,Parms[i2],cp);
 										}
 									}
-									else if(DummyTypeInfo.type==DEF_STRUCT){
-										if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
+									else if( dummyType.IsStruct() ){
+										if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){
 											SetError(11,Parms[i2],cp);
 										}
 									}
 								}
-								else if((VarType&FLAG_PTR)&&((int)(VarType^FLAG_PTR)==DummyTypeInfo.type)){
+								else if( (varType.GetBasicType()&FLAG_PTR)
+									&&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){
 									//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
 								}
Index: /BasicCompiler32/Compile_CallProc.cpp
===================================================================
--- /BasicCompiler32/Compile_CallProc.cpp	(revision 75)
+++ /BasicCompiler32/Compile_CallProc.cpp	(revision 76)
@@ -32,8 +32,5 @@
 
 
-int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex){
-	extern HANDLE hHeap;
-	int i;
-
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
 
 	extern BOOL bDebugCompile;
@@ -49,10 +46,10 @@
 	//パラメータオブジェクトを生成
 	ParamImpl *pobj_parameter=0;
-	pobj_parameter=new ParamImpl(Parameter);
+	pobj_parameter=new ParamImpl(lpszParms);
 
 	//エラーチェック
 	if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pProcPointer->ReturnType().GetBasicType();
+		return false;
 	}
 
@@ -69,6 +66,5 @@
 	////////////////////////
 	RELATIVE_VAR RelativeVar;
-	LONG_PTR lp;
-	GetVarOffsetReadOnly(variable,&i,&RelativeVar,&lp);
+	GetVarOffsetReadOnly(variable,&RelativeVar,Type());
 	SetVarPtrToEax(&RelativeVar);
 
@@ -89,10 +85,8 @@
 	delete pobj_parameter;
 
-	if(plpIndex) *plpIndex=pProcPointer->ReturnType().GetIndex();
-
-	return pProcPointer->ReturnType().GetBasicType();
+	return true;
 }
 
-void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType){
+bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
 	int i2;
 
@@ -100,13 +94,13 @@
 		if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
 			Opcode_Print(Parameter,0);
-			return;
+			return true;
 		}
 		if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
 			Opcode_Input(Parameter);
-			return;
+			return true;
 		}
 		if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
 			Opcode_Print(Parameter,1);
-			return;
+			return true;
 		}
 	}
@@ -115,5 +109,5 @@
 
 	bool isStatic = false;
-	CClass *pobj_c = NULL;
+	const CClass *pobj_c = NULL;
 	CMethod *pMethod = NULL;
 	if( pUserProc->GetParentClassPtr() ){
@@ -126,6 +120,8 @@
 			else{
 				//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
-				int type = GetVarType(ObjectName,(LONG_PTR *)&pobj_c,0);
-				if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
+				Type varType;
+				GetVarType( ObjectName, varType, false );
+				pobj_c = &varType.GetClass();
+				if( NATURAL_TYPE( varType.GetBasicType() ) != DEF_OBJECT ){
 					pobj_c=pobj_DBClass->check(ObjectName);
 					if( pobj_c ){
@@ -160,5 +156,5 @@
 			if( !pMethod ){
 				SetError(300,NULL,cp);
-				return;
+				return false;
 			}
 
@@ -179,5 +175,5 @@
 				if(dwAccess==ACCESS_NON){
 					SetError(109,pUserProc->GetName(),cp);
-					return;
+					return false;
 				}
 			}
@@ -186,9 +182,9 @@
 					dwAccess==ACCESS_NON){
 					SetError(109,pUserProc->GetName(),cp);
-					return;
+					return false;
 				}
 				if(dwAccess==ACCESS_PROTECTED){
 					SetError(110,pUserProc->GetName(),cp);
-					return;
+					return false;
 				}
 			}
@@ -198,9 +194,8 @@
 			if(dwAccess==ACCESS_NON){
 				SetError(109,pUserProc->GetName(),cp);
-				return;
-			}
-		}
-	}
-
+				return false;
+			}
+		}
+	}
 
 
@@ -220,5 +215,4 @@
 
 
-
 	////////////////////////
 	// パラメータをセット
@@ -232,5 +226,5 @@
 	if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return;
+		return false;
 	}
 
@@ -278,9 +272,13 @@
 				if( pMethod->isConst ){
 					//Constアクセスが可能なメソッドの場合
-					if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return;
+					if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){
+						return false;
+					}
 				}
 				else{
 					//Constアクセスが不可能なメソッドの場合
-					if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return;
+					if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){
+						return false;
+					}
 				}
 
@@ -351,10 +349,9 @@
 	//パラメータオブジェクトを破棄
 	delete pobj_parameter;
+
+	return true;
 }
 
-int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex){
-	char *temporary;
-
-	temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
+bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
 
 	extern BOOL bDebugCompile;
@@ -371,10 +368,10 @@
 	//パラメータオブジェクトを生成
 	ParamImpl *pobj_parameter=0;
-	pobj_parameter=new ParamImpl(Parameter);
+	pobj_parameter=new ParamImpl(lpszParms);
 
 	//エラーチェック
 	if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
 		//パラメータにエラーがあるときは処理を終える
-		return pDllProc->ReturnType().GetBasicType();
+		return false;
 	}
 
@@ -406,8 +403,4 @@
 	delete pobj_parameter;
 
-	if(plpIndex) *plpIndex=pDllProc->ReturnType().GetIndex();
-
-	HeapDefaultFree(temporary);
-
-	return pDllProc->ReturnType().GetBasicType();
+	return true;
 }
Index: /BasicCompiler32/Compile_Func.cpp
===================================================================
--- /BasicCompiler32/Compile_Func.cpp	(revision 75)
+++ /BasicCompiler32/Compile_Func.cpp	(revision 76)
@@ -44,10 +44,11 @@
 }
 
-void Opcode_Func_Fix(const char *Parameter){
-	int i;
-
-	i=NumOpe(Parameter,0,0,0);
-
-	if(i==DEF_DOUBLE){
+void Opcode_Func_Fix(const char *lpszParms){
+	Type resultType;
+	if( !NumOpe( lpszParms, Type(), resultType ) ){
+		return;
+	}
+
+	if( resultType.IsDouble() ){
 		//fld qword ptr[esp]
 		op_fld_ptr_esp(DEF_DOUBLE);
@@ -96,5 +97,5 @@
 		op_add_esp(4);
 	}
-	else if(i==DEF_SINGLE){
+	else if( resultType.IsSingle() ){
 		//fld dword ptr[esp]
 		op_fld_ptr_esp(DEF_SINGLE);
@@ -146,5 +147,5 @@
 		op_add_esp(4);
 	}
-	else if(Is64Type(i)){
+	else if( resultType.Is64() ){
 		//pop eax
 		op_pop(REG_EAX);
@@ -162,8 +163,9 @@
 
 void Opcode_Func_CUDbl(const char *Parameter){
-	int i;
-
-	i=NumOpe(Parameter,0,0,0);
-	ChangeTypeToLong(i);
+	Type resultType;
+	if( !NumOpe(Parameter,Type(),resultType) ){
+		return;
+	}
+	ChangeTypeToLong(resultType.GetBasicType());
 
 	//pop eax
@@ -186,14 +188,11 @@
 }
 void Opcode_Func_Len(const char *Parameter){
-	int type,TypeSize;
-	LONG_PTR lpIndex;
 	BOOL bArrayHead;
-
-	type=GetVarType(Parameter,&lpIndex,0);
 
 	const char *tempParm=Parameter;
 	char temporary[VN_SIZE];
 	char temp2[32];
-	if(type==-1){
+	Type type;
+	if( !GetVarType(Parameter,type,0) ){
 		sprintf(temporary,"_System_DummyStr2=%s",Parameter);
 		OpcodeCalc(temporary);
@@ -203,15 +202,13 @@
 
 		extern CClass *pobj_StringClass;
-		type=DEF_OBJECT;
-		lpIndex=(LONG_PTR)pobj_StringClass;
-	}
-
-	Type TypeInfo={type,lpIndex};
-	if(IsStringObjectType(TypeInfo)){
+		type.SetType( DEF_OBJECT, pobj_StringClass );
+	}
+
+	if( type.IsStringObject() ){
 		//Stringオブジェクトの場合
-		char temporary[VN_SIZE];
 		sprintf(temporary,"%s.Length",tempParm);
 
-		NumOpe(temporary,0,0,NULL,NULL);
+		int reg=REG_RAX;
+		NumOpe(temporary,Type(),Type());
 
 		//pop eax
@@ -223,8 +220,8 @@
 	int SubScripts[MAX_ARRAYDIM];
 	RELATIVE_VAR RelativeVar;
-	if(!GetVarOffsetReadOnly(tempParm,&type,&RelativeVar,&lpIndex,SubScripts)) return;
-
-	if(type&FLAG_PTR){
-		type&=~FLAG_PTR;
+	if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,SubScripts)) return;
+
+	if(type.GetBasicType()&FLAG_PTR){
+		type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
 
 		bArrayHead=1;
@@ -232,14 +229,14 @@
 	else bArrayHead=0;
 
-	TypeSize=GetTypeSize(type,lpIndex);
-
-	if(bArrayHead) TypeSize*=JumpSubScripts(SubScripts);
+	int typeSize = type.GetSize();
+
+	if(bArrayHead) typeSize*=JumpSubScripts(SubScripts);
 
 	//mov eax,TypeSize
 	OpBuffer[obp++]=(char)0xB8;
-	*((long *)(OpBuffer+obp))=TypeSize;
+	*((long *)(OpBuffer+obp))=typeSize;
 	obp+=sizeof(long);
 }
-void Opcode_Func_AddressOf(const char *name){
+void Opcode_Func_AddressOf( const char *name ){
 	extern int cp;
 	UserProc *pUserProc;
@@ -257,6 +254,6 @@
 
 		//オーバーロードを解決
-		extern ProcPointer **ppProcPtrInfo;
-		pUserProc=OverloadSolution(name,subs,ppProcPtrInfo[ProcPtr_BaseIndex]->Params(), Type() );
+		extern ProcPointer **ppProcPointer;
+		pUserProc=OverloadSolution(name,subs,ppProcPointer[ProcPtr_BaseIndex]->Params(), Type() );
 
 		if(!pUserProc){
@@ -289,6 +286,6 @@
 			else{
 				RELATIVE_VAR RelativeVar;
-				int type;
-				if(!GetVarOffsetReadOnly(ObjectName,&type,&RelativeVar,(LONG_PTR *)&pobj_c)) return;
+				Type type;
+				if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
 				SetVarPtrToEax(&RelativeVar);
 
@@ -297,7 +294,7 @@
 
 				//参照タイプが整合しているかをチェック
-				if(type!=RefType) SetError(104,ObjectName,cp);
-
-				if(type==DEF_PTR_OBJECT){
+				if(type.GetBasicType()!=RefType) SetError(104,ObjectName,cp);
+
+				if(type.IsObjectPtr()){
 					//mov ecx,dword ptr[ecx]
 					op_mov_RM(sizeof(long),REG_ECX,REG_ECX,0,MOD_BASE);
@@ -360,13 +357,24 @@
 	op_mov_RV( REG_EAX, size );
 }
-void Opcode_Func_VarPtr( const char *Parameter, Type &ReturnTypeInfo ){
+void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
+	if( isCallOn == false ){
+		// 戻り値の型を取得するだけ
+
+		//変数のアドレスを取得
+		if(!GetVarType( Parameter, resultType, true )) return;
+
+		resultType.PtrLevelUp();
+
+		return;
+	}
+
 	RELATIVE_VAR RelativeVar;
 
 	//変数のアドレスを取得
-	if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
-
-	int beforeType = ReturnTypeInfo.type;
-
-	PTR_LEVEL_UP( ReturnTypeInfo.type );
+	if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
+
+	int beforeType = resultType.GetBasicType();
+
+	resultType.PtrLevelUp();
 
 	SetVarPtrToEax(&RelativeVar);
@@ -380,8 +388,13 @@
 }
 void Opcode_Func_GetPtrData(const char *Parameter,const int type){
-	int i2;
-
-	i2=NumOpe(Parameter,0,0,0);
-	ChangeTypeToLong(i2);
+	Type tempType;
+	if( !NumOpe(Parameter,Type(),tempType) ){
+		return;
+	}
+	if(!tempType.IsWhole()){
+		SetError(11,Parameter,cp);
+		return;
+	}
+	ChangeTypeToLong(tempType.GetBasicType());
 
 	if(type==DEF_DOUBLE){
@@ -438,54 +451,57 @@
 }
 
-void Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo ){
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &resultType, bool isCallOn ){
 	switch(FuncNum){
 		case FUNC_FIX:
-			Opcode_Func_Fix(Parameter);
-			ReturnTypeInfo.type = DEF_LONG;
+			if( isCallOn ) Opcode_Func_Fix(Parameter);
+			resultType.SetBasicType( DEF_LONG );
 			break;
 		case FUNC_CUDBL:
-			Opcode_Func_CUDbl(Parameter);
-			ReturnTypeInfo.type = DEF_DOUBLE;
+			if( isCallOn ) Opcode_Func_CUDbl(Parameter);
+			resultType.SetBasicType( DEF_DOUBLE );
 			break;
 		case FUNC_LEN:
-			Opcode_Func_Len(Parameter);
-			ReturnTypeInfo.type = DEF_LONG;
+			if( isCallOn ) Opcode_Func_Len(Parameter);
+			resultType.SetBasicType( DEF_LONG );
 			break;
 		case FUNC_ADDRESSOF:
-			Opcode_Func_AddressOf(Parameter);
-			ReturnTypeInfo.type = DEF_PTR_VOID;
+			if( isCallOn ) Opcode_Func_AddressOf(Parameter);
+			resultType.SetBasicType( DEF_PTR_VOID );
 			break;
 		case FUNC_SIZEOF:
-			Opcode_Func_SizeOf(Parameter);
-			ReturnTypeInfo.type = DEF_LONG;
+			if( isCallOn ) Opcode_Func_SizeOf(Parameter);
+			resultType.SetBasicType( DEF_LONG );
 			break;
 		case FUNC_VARPTR:
-			Opcode_Func_VarPtr( Parameter, ReturnTypeInfo );
+			Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
 			break;
 
 		case FUNC_GETDOUBLE:
-			Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
-			ReturnTypeInfo.type = DEF_DOUBLE;
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
+			resultType.SetBasicType( DEF_DOUBLE );
 			break;
 		case FUNC_GETSINGLE:
-			Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
-			ReturnTypeInfo.type = DEF_SINGLE;
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
+			resultType.SetBasicType( DEF_SINGLE );
 			break;
 		case FUNC_GETQWORD:
-			Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
-			ReturnTypeInfo.type = DEF_QWORD;
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
+			resultType.SetBasicType( DEF_QWORD );
 			break;
 		case FUNC_GETDWORD:
-			Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
-			ReturnTypeInfo.type = DEF_DWORD;
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
+			resultType.SetBasicType( DEF_DWORD );
 			break;
 		case FUNC_GETWORD:
-			Opcode_Func_GetPtrData(Parameter,DEF_WORD);
-			ReturnTypeInfo.type = DEF_WORD;
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
+			resultType.SetBasicType( DEF_WORD );
 			break;
 		case FUNC_GETBYTE:
-			Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
-			ReturnTypeInfo.type = DEF_BYTE;
-			break;
-	}
-}
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
+			resultType.SetBasicType( DEF_BYTE );
+			break;
+		default:
+			return false;
+	}
+	return true;
+}
Index: /BasicCompiler32/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler32/Compile_ProcOp.cpp	(revision 75)
+++ /BasicCompiler32/Compile_ProcOp.cpp	(revision 76)
@@ -26,8 +26,7 @@
 		}
 
-		extern BOOL bCompilingGlobal;
-		BOOL bBackCompilingGlobal;
-		bBackCompilingGlobal=bCompilingGlobal;
-		bCompilingGlobal=1;
+		UserProc *pBackUserProc;
+		pBackUserProc = &UserProc::CompilingUserProc();
+		UserProc::CompileStartForGlobalArea();
 
 		int BackCp;
@@ -49,5 +48,5 @@
 		GetGlobalDataForDll();
 
-		bCompilingGlobal=bBackCompilingGlobal;
+		UserProc::CompileStartForUserProc( pBackUserProc );
 		cp=BackCp;
 
@@ -58,23 +57,17 @@
 		//静的ローカルオブジェクトのコンストラクタ呼び出し
 
-		extern int MaxGlobalVarNum;
-		extern VARIABLE *GlobalVar;
-		int i;
-		for(i=0;i<MaxGlobalVarNum;i++){
-			if(_memicmp(GlobalVar[i].name,"Static%",7)==0){
+		foreach( Variable *pVar, globalVars ){
+			if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
 				//コンストラクタ呼び出し
-				if(GlobalVar[i].type==DEF_OBJECT){
+				if( pVar->IsObject() ){
 
 					//エラー用
-					cp=GlobalVar[i].source_code_address;
-
-					Type TypeInfo;
-					TypeInfo.type=GlobalVar[i].type;
-					TypeInfo.u.lpIndex=GlobalVar[i].u.index;
+					cp=pVar->source_code_address;
+
 					CallConstructor(
-						GlobalVar[i].name,
-						GlobalVar[i].SubScripts,
-						TypeInfo,
-						GlobalVar[i].ConstractParameter);
+						pVar->GetName().c_str(),
+						pVar->GetSubScriptsPtr(),
+						*pVar,
+						pVar->paramStrForConstructor.c_str());
 				}
 			}
@@ -86,12 +79,11 @@
 	else if(lstrcmp(name,"_System_Call_Destructor_of_GlobalObject")==0){
 
-		extern BOOL bCompilingGlobal;
-		BOOL bBackCompilingGlobal;
-		bBackCompilingGlobal=bCompilingGlobal;
-		bCompilingGlobal=1;
+		UserProc *pBackUserProc;
+		pBackUserProc = &UserProc::CompilingUserProc();
+		UserProc::CompileStartForGlobalArea();
 
 		obj_LexScopes.CallDestructorsOfScopeEnd();
 
-		bCompilingGlobal=bBackCompilingGlobal;
+		UserProc::CompileStartForUserProc( pBackUserProc );
 
 
@@ -219,10 +211,13 @@
 	extern UserProc **ppSubHash;
 	extern BOOL bDebugCompile;
-	int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset;
+	int i3,i4,LocalVarSchedule,EspOffsetSchedule,BaseOffset;
 	char temporary[VN_SIZE];
 
-	BufferSize=128;
-
 	if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
+
+	if( pUserProc->localVars.size() ){
+		SetError();
+		return;
+	}
 
 	pUserProc->CompleteCompile();
@@ -235,6 +230,4 @@
 	if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
 		if(!bDebugCompile){
-			pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
-			pUserProc->VarNum=0;
 			return;
 		}
@@ -246,7 +239,5 @@
 
 	if(pUserProc->IsSystem()){
-		extern int MaxLocalVarNum;
 		extern int AllLocalVarSize;
-		MaxLocalVarNum=0;
 		AllLocalVarSize=0;
 
@@ -254,6 +245,4 @@
 
 		pUserProc->endOpAddress=obp;
-		pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
-		pUserProc->VarNum=0;
 		return;
 	}
@@ -266,9 +255,5 @@
 
 	//ローカル変数に関する情報
-	extern VARIABLE *LocalVar;
-	extern int MaxLocalVarNum;
 	extern int AllLocalVarSize;
-	LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
-	MaxLocalVarNum=0;
 	AllLocalVarSize=0;
 
@@ -283,49 +268,33 @@
 		Parameter &param = *pUserProc->RealParams()[i3];
 
-		//変数データを追加
-		LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE));
-
-		lstrcpy( LocalVar[MaxLocalVarNum].name,param.GetVarName().c_str() );
-
-		// TODO: パラメータのConst定義の指定が未完成
-		LocalVar[MaxLocalVarNum].bConst=false;
-
-		LocalVar[MaxLocalVarNum].bArray=param.IsArray()?TRUE:FALSE;
-		memcpy(LocalVar[MaxLocalVarNum].SubScripts,param.GetSubScriptsPtr(),MAX_ARRAYDIM*sizeof(int));
-
-		LocalVar[MaxLocalVarNum].type=param.GetBasicType();
-		if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
-			||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
-				if(pUserProc->IsExport())
-					SetError(24,NULL,cp);
-		}
-
-		LocalVar[MaxLocalVarNum].u.index=param.GetIndex();
-
+		Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef() );
+
+		if( param.IsArray() ){
+			pVar->SetArray( param.GetSubScriptsPtr() );
+		}
+
+		int varSize;
 		if( param.IsRef() == false && param.IsStruct() ){
 			//構造体のByValパラメータ
-			LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;
-			VarSize=PTR_SIZE;
+			pVar->ThisIsParameter();
+			varSize=PTR_SIZE;
 		}
 		else{
-			if( param.IsRef() == false && param.IsArray() == false ){
-				LocalVar[MaxLocalVarNum].fRef=0;
-				VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index);
-				if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE);
+			if( param.IsArray() == false ){
+				varSize = pVar->GetMemorySize();
 			}
 			else{
-				LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER;
-				VarSize=PTR_SIZE;
-			}
-		}
-		AllLocalVarSize+=VarSize;
-		LocalVar[MaxLocalVarNum].offset=AllLocalVarSize;
+				varSize=PTR_SIZE;
+			}
+		}
+		AllLocalVarSize+=varSize;
+		pVar->offset=AllLocalVarSize;
 
 		//レキシカルスコープ情報
-		LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();
-		LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();
-		LocalVar[MaxLocalVarNum].bLiving=TRUE;
-
-		MaxLocalVarNum++;
+		pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
+		pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
+		pVar->bLiving=TRUE;
+
+		pUserProc->localVars.push_back( pVar );
 	}
 
@@ -346,6 +315,5 @@
 
 	//コンパイル中の関数
-	extern UserProc *pCompilingUserProc;
-	pCompilingUserProc=pUserProc;
+	UserProc::CompileStartForUserProc( pUserProc );
 
 
@@ -507,9 +475,8 @@
 			}
 
-
 			//実体クラスを持つメンバのコンストラクタ（引数有りを除く）を呼び出す
 			for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){
 				CMember *pMember = pobj_CompilingClass->ppobj_Member[i3];
-				if(pMember->TypeInfo.type==DEF_OBJECT){
+				if(pMember->IsObject()){
 					// オブジェクトメンバを発見したとき
 
@@ -517,9 +484,8 @@
 						pMember->name,
 						1, ESC_NEW,
-						pMember->TypeInfo.u.pobj_Class->name );
+						pMember->GetClass().name );
 					OpcodeCalc( temporary );
 				}
 			}
-
 
 			//仮想関数テーブルを初期化
@@ -686,5 +652,4 @@
 		//戻り値をeax、edxに設定
 		RELATIVE_VAR RelativeVar;
-		LONG_PTR lpIndex;
 
 		const char *temp = pUserProc->GetName().c_str();
@@ -692,5 +657,5 @@
 			temp="_System_ReturnValue";
 		}
-		GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex);
+		GetVarOffsetReadWrite(temp,&RelativeVar,Type());
 
 		i3=pUserProc->ReturnType().GetBasicType();
@@ -773,6 +738,7 @@
 	}
 	HeapDefaultFree(pLocalVarAddrSchedule);
-	for(i3=0;i3<MaxLocalVarNum;i3++){
-		LocalVar[i3].offset=AllLocalVarSize-LocalVar[i3].offset;//後にデバッグで利用する
+	foreach( Variable *pVar, pUserProc->localVars ){
+		//後にデバッグで利用する
+		pVar->offset = AllLocalVarSize - pVar->offset;
 	}
 
@@ -828,7 +794,6 @@
 	}
 
+
 	pUserProc->endOpAddress=obp;
-	pUserProc->pVar=LocalVar;
-	pUserProc->VarNum=MaxLocalVarNum;
 
 
Index: /BasicCompiler32/Compile_Statement.cpp
===================================================================
--- /BasicCompiler32/Compile_Statement.cpp	(revision 75)
+++ /BasicCompiler32/Compile_Statement.cpp	(revision 76)
@@ -71,8 +71,7 @@
 	}
 
-
 	int idProc;
-	void *pInfo;
-	idProc=GetProc(buffer,&pInfo);
+	void *pProc;
+	idProc=GetProc(buffer,(void **)&pProc);
 
 	int i4;
@@ -92,6 +91,6 @@
 		////////////////
 
-		LONG_PTR lp;
-		i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
+		Type resultType;
+		CallProc(idProc,pProc,buffer,temp2,resultType);
 
 
@@ -100,14 +99,14 @@
 		/////////////////////
 
-		if(i2==DEF_DOUBLE||i2==DEF_SINGLE){
+		if( resultType.IsReal() ){
 			//fstp st(0)
 			OpBuffer[obp++]=(char)0xDD;
 			OpBuffer[obp++]=(char)0xD8;
 		}
-		if(i2==DEF_STRUCT){
+		else if( resultType.IsStruct() ){
 			//mov ebx,eax
 			op_mov_RR(REG_EBX,REG_EAX);
 
-			FreeTempObject(REG_EBX,(CClass *)lp);
+			FreeTempObject(REG_EBX,&resultType.GetClass());
 		}
 		return;
@@ -122,5 +121,6 @@
 
 void OpcodeIf(char *Parameter){
-	int i,i2,i3,i4,type;
+	int i,i2,i3,i4;
+	Type tempType;
 
 	for(i=0;;i++){
@@ -135,11 +135,9 @@
 	}
 
-	type=NumOpe(Parameter,0,0,0);
-
-	if(type==-1){
+	if( !NumOpe(Parameter,Type(),tempType) ){
 		//NumOpe内でエラー
 		i3=-1;	//ダミー
 	}
-	else if(type==DEF_DOUBLE){
+	else if( tempType.IsDouble() ){
 		//fld qword ptr[esp]
 		op_fld_ptr_esp(DEF_DOUBLE);
@@ -175,5 +173,5 @@
 		i3=obp;
 	}
-	else if(type==DEF_SINGLE){
+	else if( tempType.IsSingle() ){
 		//fld dword ptr[esp]
 		op_fld_ptr_esp(DEF_SINGLE);
@@ -209,5 +207,5 @@
 		i3=obp;
 	}
-	else if(type==DEF_INT64||type==DEF_QWORD){
+	else if( tempType.Is64() ){
 		//64ビット型
 
@@ -383,5 +381,5 @@
 void OpcodeWhile(char *Parameter){
 	extern HANDLE hHeap;
-	int i2,i3,type;
+	int i2,i3 = 0;
 
 	//Continueアドレスのバックアップとセット
@@ -392,8 +390,12 @@
 
 	if(!Parameter[0]) SetError(10,"While",cp);
-	type=NumOpe(Parameter,0,0,0);
 
 	int je_schedule;
-	if(type==DEF_DOUBLE){
+	Type tempType;
+	if( !NumOpe(Parameter,Type(),tempType) ){
+		//ダミー
+		i3=-1;
+	}
+	else if( tempType.IsDouble() ){
 		//fld qword ptr[esp]
 		op_fld_ptr_esp(DEF_DOUBLE);
@@ -429,5 +431,5 @@
 		je_schedule=obp;
 	}
-	else if(type==DEF_SINGLE){
+	else if( tempType.IsSingle() ){
 		//fld dword ptr[esp]
 		op_fld_ptr_esp(DEF_SINGLE);
@@ -463,5 +465,5 @@
 		je_schedule=obp;
 	}
-	else if(type==DEF_INT64||type==DEF_QWORD){
+	else if( tempType.Is64() ){
 		//64ビット型
 
@@ -533,4 +535,8 @@
 
 	obj_LexScopes.CallDestructorsOfScopeEnd();
+
+	if( i3 == -1 ){
+		return;
+	}
 
 	//jmp ...
@@ -605,5 +611,5 @@
 	//増加か減少かを区別する
 	sprintf(temporary,"(%s)>=0",StepNum);
-	NumOpe(temporary,0,0,0);
+	NumOpe(temporary,Type(),Type());
 
 	//pop eax
@@ -623,5 +629,5 @@
 	//判定（カウンタ増加の場合）
 	sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
-	NumOpe(temporary,0,0,0);
+	NumOpe(temporary,Type(),Type());
 
 	//pop eax
@@ -637,5 +643,5 @@
 	//判定（カウンタ減少の場合）
 	sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
-	NumOpe(temporary,0,0,0);
+	NumOpe(temporary,Type(),Type());
 
 	//pop eax
@@ -687,5 +693,5 @@
 void OpcodeDo(char *Parameter){
 	extern HANDLE hHeap;
-	int i,i2,i3,i4,type;
+	int i,i2,i3,i4;
 
 	if(Parameter[0]) SetError(10,"Do",cp);
@@ -724,7 +730,8 @@
 			}
 
-			type=NumOpe(temporary,0,0,0);
-
-			if(type==DEF_DOUBLE){
+			Type tempType;
+			NumOpe(temporary,Type(),tempType);
+
+			if( tempType.IsDouble() ){
 				//fld qword ptr[esp]
 				op_fld_ptr_esp(DEF_DOUBLE);
@@ -767,5 +774,5 @@
 				}
 			}
-			else if(type==DEF_SINGLE){
+			else if( tempType.IsSingle() ){
 				//fld dword ptr[esp]
 				op_fld_ptr_esp(DEF_SINGLE);
@@ -808,5 +815,5 @@
 				}
 			}
-			else if(type==DEF_INT64||type==DEF_QWORD){
+			else if( tempType.Is64() ){
 				//64ビット型
 
@@ -933,6 +940,5 @@
 	extern HANDLE hHeap;
 
-	extern BOOL bCompilingGlobal;
-	if(bCompilingGlobal){
+	if( UserProc::IsGlobalAreaCompiling() ){
 		SetError(12,"Exit Sub/Function",cp);
 		return;
@@ -963,5 +969,5 @@
 
 int CaseTypeSize;
-void OpcodeSelect(const char *lpszParams){
+void OpcodeSelect(const char *lpszParms){
 	extern DWORD *pCaseSchedule;
 	extern int CaseScheduleNum;
@@ -970,5 +976,5 @@
 	extern HANDLE hHeap;
 	extern char *basbuf;
-	int i,i2,i3,sw,type1,type2,NowCaseCp;
+	int i,i2,i3,sw,NowCaseCp;
 	char temporary[VN_SIZE];
 
@@ -986,15 +992,12 @@
 	NowCaseSchedule=0;
 
-	LONG_PTR lpIndex;
-	type1=NumOpe(lpszParams,0,0,&lpIndex);
-	if(type1==DEF_INTEGER||
-		type1==DEF_WORD||
-		type1==DEF_SBYTE||
-		type1==DEF_BYTE||
-		type1==DEF_BOOLEAN||
-		type1==DEF_CHAR) CaseTypeSize=sizeof(long);
-	else{
-		CaseTypeSize=GetTypeSize(type1,lpIndex);
-		if(type1==DEF_OBJECT) CaseTypeSize=PTR_SIZE;
+	Type type1;
+	if( !NumOpe(lpszParms,Type(), type1 ) ){
+		return;
+	}
+
+	CaseTypeSize = type1.GetSize();
+	if( CaseTypeSize < sizeof(long) ){
+		CaseTypeSize=sizeof(long);
 	}
 
@@ -1067,15 +1070,14 @@
 				cp=NowCaseCp;
 
-				LONG_PTR lpIndex2;
-				type2=NumOpe(temporary,type1,lpIndex,&lpIndex2);
+				Type type2;
+				if( !NumOpe(temporary,type1,type2) ){
+					return;
+				}
 
 				cp=i2;
 
-				if(type1==DEF_OBJECT){
-					CClass *pobj_c;
-					pobj_c=(CClass *)lpIndex;
-
+				if(type1.IsObject()){
 					std::vector<UserProc *> subs;
-					pobj_c->EnumMethod( CALC_EQUAL, subs );
+					type1.GetClass().EnumMethod( CALC_EQUAL, subs );
 					if( subs.size() == 0 ){
 						return;
@@ -1083,5 +1085,5 @@
 
 					Parameters params;
-					params.push_back( new Parameter( "", Type( type2, lpIndex2 ) ) );
+					params.push_back( new Parameter( "", Type( type2 ) ) );
 
 					//オーバーロードを解決
@@ -1121,6 +1123,6 @@
 					obp+=sizeof(long);
 				}
-				else if(type1==DEF_DOUBLE){
-					ChangeTypeToDouble(type2);
+				else if(type1.IsDouble()){
+					ChangeTypeToDouble(type2.GetBasicType());
 
 					//fld qword ptr[esp]
@@ -1152,6 +1154,6 @@
 					obp+=sizeof(long);
 				}
-				else if(type1==DEF_SINGLE){
-					ChangeTypeToSingle(type2);
+				else if(type1.IsSingle()){
+					ChangeTypeToSingle(type2.GetBasicType());
 
 					//fld dword ptr[esp]
@@ -1314,6 +1316,5 @@
 }
 void OpcodeReturn(char *Parameter){
-	extern BOOL bCompilingGlobal;
-	if(bCompilingGlobal){
+	if( UserProc::IsGlobalAreaCompiling() ){
 		//Gosub～Returnとして扱う
 
@@ -1324,10 +1325,13 @@
 		//戻り値をセット
 		if(Parameter[0]){
-			extern UserProc *pCompilingUserProc;
+			UserProc &proc = UserProc::CompilingUserProc();
+
 			const char *temp = "_System_ReturnValue";
-			if(pCompilingUserProc->GetName()[0]==1&&pCompilingUserProc->GetName()[1]==ESC_OPERATOR)
+			if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
 			{
 			}
-			else temp=pCompilingUserProc->GetName().c_str();
+			else{
+				temp=proc.GetName().c_str();
+			}
 
 			char temporary[VN_SIZE];
@@ -1341,427 +1345,10 @@
 }
 
-void Opcode_Input(const char *Parameter){
-	extern int cp;
-	int i2,i3,i4,i5,type;
-	BOOL bFile;
-	char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
-
-	if(Parameter[0]=='#'){
-		bFile=1;
-		for(i2=0,i3=1;;i2++,i3++){
-			buffer[i2]=Parameter[i3];
-			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
-		}
-		buffer[i2+1]=0;
-		i2=i3+1;
-	}
-	else{
-		bFile=0;
-		i2=0;
-		buffer[0]=0;
-
-		//表示用文字列パラメータをセット
-		if(Parameter[0]=='\"'){
-			buffer[0]='\"';
-			for(i2=1;;i2++){
-				if(Parameter[i2]=='\"'){
-					buffer[i2]=0;
-					break;
-				}
-				buffer[i2]=Parameter[i2];
-			}
-			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
-			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
-			else SetError(10,"Input",cp);
-			i2+=2;
-		}
-		else if((Parameter[0]=='e'||Parameter[0]=='E')&&
-			(Parameter[1]=='x'||Parameter[1]=='X')&&
-			Parameter[2]=='\"'){
-			memcpy(buffer,Parameter,3);
-			for(i2=3;;i2++){
-				if(Parameter[i2]=='\"'){
-					buffer[i2]=0;
-					break;
-				}
-				buffer[i2]=Parameter[i2];
-			}
-			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
-			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
-			else SetError(10,"Input",cp);
-			i2+=2;
-		}
-		else{
-			lstrcpy(buffer,"\"? \"");
-			i2=0;
-		}
-	}
-
-	//変数ポインタ、変数のタイプをセット
-	i4=0;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(Parameter[i2]=='('){
-				i5=GetStringInPare(temporary+i3,Parameter+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-			}
-			if(Parameter[i2]=='['){
-				i5=GetStringInBracket(temporary+i3,Parameter+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-			}
-			if(Parameter[i2]==','){
-				temporary[i3]=0;
-				i2++;
-				break;
-			}
-			temporary[i3]=Parameter[i2];
-			if(Parameter[i2]=='\0') break;
-		}
-		if(temporary[0]=='\0'){
-			SetError(10,"Input",cp);
-			return;
-		}
-
-		LONG_PTR lpIndex;
-		type = GetVarType(temporary,&lpIndex,1);
-
-		sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
-		OpcodeCalc(temp2);
-
-		if(type==DEF_LONG) type=DEF_DWORD;
-		else if(type==DEF_INTEGER) type=DEF_WORD;
-		else if(type==DEF_OBJECT){
-			CClass *pobj_Class=(CClass *)lpIndex;
-			if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
-		}
-		sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
-		OpcodeCalc(temp2);
-
-		i4++;
-		if(Parameter[i2]=='\0') break;
-	}
-	sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
-	OpcodeCalc(temp2);
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
-	else pUserProc=GetSubHash("INPUT_FromPrompt");
-	if(!pUserProc){
-		SetError(3,"Input",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
-	extern int cp;
-	int i2,i3,i4,i5;
-	char temporary[VN_SIZE],temp2[8192];
-	BOOL bReturnLine;
-
-	char parms[8192];
-	lstrcpy( parms, Parameter );
-
-	i2=lstrlen(parms);
-	if(parms[i2-1]==';'){
-		bReturnLine=0;
-		parms[i2-1]=0;
-	}
-	else bReturnLine=1;
-
-	i3=lstrlen(buffer);
-	for(i2=0;;i2++,i3++){
-		if(parms[i2]==';'){
-			buffer[i3]=0;
-			break;
-		}
-		buffer[i3]=parms[i2];
-		if(parms[i2]=='\0') break;
-	}
-	if(parms[i2]==';') i2++;
-
-	if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
-
-	//データポインタ、データのタイプをセット
-	i4=0;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(parms[i2]=='\"'){
-				temporary[i3]=parms[i2];
-				for(i2++,i3++;;i2++,i3++){
-					temporary[i3]=parms[i2];
-					if(parms[i2]=='\"') break;
-				}
-				continue;
-			}
-			if(parms[i2]=='('){
-				i5=GetStringInPare(temporary+i3,parms+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-				continue;
-			}
-			if(parms[i2]=='['){
-				i5=GetStringInBracket(temporary+i3,parms+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-				continue;
-			}
-			if(parms[i2]==','){
-				temporary[i3]=0;
-				i2++;
-				break;
-			}
-			temporary[i3]=parms[i2];
-			if(parms[i2]=='\0') break;
-		}
-		if(temporary[0]=='\0'){
-			SetError(10,"Print",cp);
-			return;
-		}
-
-		int iResult;
-		iResult=IsStrCalculation(temporary);
-
-		if(iResult==1){
-			//文字列
-			sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
-			OpcodeCalc(temp2);
-
-			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
-			OpcodeCalc(temp2);
-		}
-		else if(iResult==0){
-			//数値
-			sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
-			OpcodeCalc(temp2);
-
-			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
-			OpcodeCalc(temp2);
-		}
-		//else if(iResult==-1) エラー
-
-		i4++;
-		if(parms[i2]=='\0') break;
-	}
-	sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
-	OpcodeCalc(temp2);
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
-	else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
-	if(!pUserProc){
-		SetError(3,"Print",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-void Opcode_Print(const char *Parameter,BOOL bWrite){
-	int i2,i3,i4,sw;
-	char temporary[VN_SIZE],buffer[VN_SIZE];
-	BOOL bFile;
-
-	if(Parameter[0]=='#'){
-		bFile=1;
-		for(i2=0,i3=1;;i2++,i3++){
-			buffer[i2]=Parameter[i3];
-			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
-		}
-		buffer[i2+1]=0;
-		if(Parameter[i3]==',') i3++;
-		i2=i3;
-	}
-	else{
-		bFile=0;
-		i2=0;
-		buffer[0]=0;
-	}
-	if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
-		Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
-		return;
-	}
-
-	lstrcat(buffer,"_System_DummyStr+");
-
-	sw=1;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(Parameter[i2]=='\"'){
-				temporary[i3]=Parameter[i2];
-				for(i2++,i3++;;i2++,i3++){
-					temporary[i3]=Parameter[i2];
-					if(Parameter[i2]=='\"') break;
-				}
-				continue;
-			}
-			if(Parameter[i2]=='('){
-				i4=GetStringInPare(temporary+i3,Parameter+i2);
-				i2+=i4-1;
-				i3+=i4-1;
-				continue;
-			}
-			if(Parameter[i2]=='['){
-				i4=GetStringInBracket(temporary+i3,Parameter+i2);
-				i2+=i4-1;
-				i3+=i4-1;
-				continue;
-			}
-			if(Parameter[i2]==','||Parameter[i2]==';'){
-				temporary[i3]=0;
-				break;
-			}
-			temporary[i3]=Parameter[i2];
-			if(Parameter[i2]=='\0') break;
-		}
-
-		if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
-		else{
-			int iResult;
-			iResult=IsStrCalculation(temporary);
-			if(iResult==-1){
-				//エラー
-				lstrcat(buffer,"\"\"");
-			}
-			else if(iResult){
-				//文字列
-				lstrcat(buffer,temporary);
-			}
-			else{
-				//数値
-				sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
-			}
-		}
-
-		if(Parameter[i2]==','){
-			if(bWrite) lstrcat(buffer,"+\",\"+");
-			else lstrcat(buffer,"+\"\t\"+");
-		}
-		else if(Parameter[i2]==';'){
-			if(Parameter[i2+1]=='\0'){
-				sw=0;
-				break;
-			}
-			if(bWrite) lstrcat(buffer,"+\",\"+");
-			else lstrcat(buffer,"+\" \"+");
-		}
-		else if(Parameter[i2]=='\0') break;
-
-		i2++;
-	}
-
-	if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
-	else pUserProc=GetSubHash("PRINT_ToPrompt");
-	if(!pUserProc){
-		SetError(3,"Print",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-
-
-
 
 ////////////
 // ポインタ
 
-void OpcodeCallPtr(char *Parameter){
-	extern HANDLE hHeap;
-	int i,i2,i3,num,types[255];
-	BOOL bCdecl;
-	char szFuncPtr[VN_SIZE],temporary[VN_SIZE],*Parms[255];
-
-	//関数ポインタを取得
-	i=GetOneParameter(Parameter,0,szFuncPtr);
-
-	if(lstrcmpi(szFuncPtr,"cdecl")==0){
-		//cdeclが指定された場合は、第2パラメータを関数ポインタとして扱う
-		bCdecl=1;
-
-		i=GetOneParameter(Parameter,i,szFuncPtr);
-	}
-	else bCdecl=0;
-
-	if(Parameter[0]=='\0'){
-		SetError(10,"CallPtr",cp);
-	}
-
-	num=0;
-	while(Parameter[i]){
-		i=GetOneParameter(Parameter,i,temporary);
-
-		types[num]=DEF_LONG;
-
-		for(i2=0;;i2++){
-			if(temporary[i2]=='\0') break;
-			if(temporary[i2]==1&&temporary[i2+1]==ESC_AS){
-				LONG_PTR lp;
-				types[num]=GetTypeFixed(temporary+i2+2,&lp);
-
-				if(types[num]==DEF_OBJECT){
-					SetError(11,temporary+i2+2,cp);
-				}
-
-				temporary[i2]=0;
-				break;
-			}
-		}
-
-		Parms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-		lstrcpy(Parms[num],temporary);
-
-		num++;
-	}
-
-	int ParmSize=0;
-
-	for(i=num-1;i>=0;i--){
-		//スタックへプッシュ
-		i3=NumOpe(Parms[i],0,0,0);
-
-		switch(types[i]){
-			case DEF_INT64:
-			case DEF_QWORD:
-				ChangeTypeToInt64(i3);
-				break;
-			case DEF_SINGLE:
-				ChangeTypeToSingle(i3);
-				break;
-			case DEF_DOUBLE:
-				ChangeTypeToDouble(i3);
-				break;
-
-			default:
-				ChangeTypeToLong(i3);
-				break;
-		}
-
-		ParmSize+=GetTypeSize(types[i],0);
-
-		HeapDefaultFree(Parms[i]);
-	}
-
-	i3=NumOpe(szFuncPtr,0,0,0);
-	ChangeTypeToLong(i3);
-
-	//pop eax
-	op_pop(REG_EAX);
-
-	//call eax
-	OpBuffer[obp++]=(char)0xFF;
-	OpBuffer[obp++]=(char)0xD0;
-
-	if(bCdecl){
-		//スタックを戻す
-
-		//add esp,ParmSize
-		op_add_esp(ParmSize);
-	}
-}
-
 void OpcodeSetPtrData(char *Parameter,int type){
-	int i,i2;
+	int i;
 	char temporary[VN_SIZE];
 
@@ -1784,6 +1371,14 @@
 	}
 
-	i2=NumOpe(temporary,0,0,0);
-	ChangeTypeToLong(i2);
+	Type resultType;
+	if( !NumOpe(temporary,Type(),resultType) ){
+		return;
+	}
+	if(!resultType.IsWhole()){
+		SetError(11,Parameter,cp);
+		return;
+	}
+
+	ChangeTypeToLong( resultType.GetBasicType() );
 
 	//第２パラメータを取得
@@ -1794,7 +1389,10 @@
 	}
 
-	i2=NumOpe(temporary,0,0,0);
+	if( !NumOpe(temporary,Type(),resultType) ){
+		return;
+	}
+
 	if(type==DEF_DOUBLE){
-		ChangeTypeToDouble_ToFpuReg(i2);
+		ChangeTypeToDouble_ToFpuReg( resultType.GetBasicType() );
 
 		//pop eax
@@ -1806,5 +1404,5 @@
 	}
 	else if(type==DEF_SINGLE){
-		ChangeTypeToSingle(i2);
+		ChangeTypeToSingle( resultType.GetBasicType() );
 
 		//pop ebx
@@ -1819,5 +1417,5 @@
 	}
 	else if(type==DEF_QWORD){
-		ChangeTypeToInt64(i2);
+		ChangeTypeToInt64( resultType.GetBasicType() );
 
 		//pop ecx
@@ -1840,5 +1438,5 @@
 	}
 	else if(type==DEF_DWORD){
-		ChangeTypeToLong(i2);
+		ChangeTypeToLong( resultType.GetBasicType() );
 
 		//pop ebx
@@ -1853,5 +1451,5 @@
 	}
 	else if(type==DEF_WORD){
-		ChangeTypeToLong(i2);
+		ChangeTypeToLong( resultType.GetBasicType() );
 
 		//pop ebx
@@ -1867,5 +1465,5 @@
 	}
 	else if(type==DEF_BYTE){
-		ChangeTypeToLong(i2);
+		ChangeTypeToLong( resultType.GetBasicType() );
 
 		//pop ebx
Index: /BasicCompiler32/Compile_Var.cpp
===================================================================
--- /BasicCompiler32/Compile_Var.cpp	(revision 75)
+++ /BasicCompiler32/Compile_Var.cpp	(revision 76)
@@ -3,11 +3,10 @@
 
 //変数
-VARIABLE *GlobalVar;
-int MaxGlobalVarNum;
+Variables globalVars;
 int AllGlobalVarSize;
 int AllInitGlobalVarSize;
-VARIABLE *LocalVar;
-int MaxLocalVarNum;
+
 int AllLocalVarSize;
+
 
 void SetRelativeOffset( Type &resultType, RELATIVE_VAR *pRelativeVar,const char *lpPtrOffset){
@@ -351,5 +350,4 @@
 	//自身のオブジェクトのThisポインタをregにコピー
 
-	extern VARIABLE *LocalVar;
 	RELATIVE_VAR RelativeVar;
 	RelativeVar.dwKind=VAR_LOCAL;
@@ -466,5 +464,5 @@
 		}
 
-		if(_memicmp(variable,"This.",5)==0){
+		if(memicmp(variable,"This.",5)==0){
 			//Thisオブジェクトのメンバを参照するとき
 			SlideString(variable+5,-5);
Index: /BasicCompiler32/MakePeHdr.cpp
===================================================================
--- /BasicCompiler32/MakePeHdr.cpp	(revision 75)
+++ /BasicCompiler32/MakePeHdr.cpp	(revision 76)
@@ -150,7 +150,7 @@
 
 	//関数ポインタ情報を初期化
-	extern ProcPointer **ppProcPtrInfo;
+	extern ProcPointer **ppProcPointer;
 	extern int ProcPtrInfoNum;
-	ppProcPtrInfo=(ProcPointer **)HeapAlloc(hHeap,0,1);
+	ppProcPointer=(ProcPointer **)HeapAlloc(hHeap,0,1);
 	ProcPtrInfoNum=0;
 
@@ -309,4 +309,15 @@
 
 
+	/////////////////////////////////////////////////////////////////
+	// デバッグコンパイル用のログを生成する
+	/////////////////////////////////////////////////////////////////
+#ifdef _DEBUG
+	{
+		ofstream ofs("middle_code.txt");
+		ofs << basbuf << endl;
+		ofs.close();
+	}
+#endif
+
 
 	//////////////////////
@@ -315,7 +326,5 @@
 
 	cp=-1;
-	extern BOOL bCompilingGlobal;
-	bCompilingGlobal=1;
-	pobj_CompilingClass=0;
+	UserProc::CompileStartForGlobalArea();
 
 	if(!bDll){
@@ -434,6 +443,4 @@
 	// ローカル実行領域
 	/////////////////////
-
-	bCompilingGlobal=0;
 
 	//プロシージャをコンパイル開始
@@ -736,10 +743,8 @@
 	//グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
 	//（デバッグ情報で利用される）
-	extern int MaxGlobalVarNum;
-	extern VARIABLE *GlobalVar;
 	extern int AllInitGlobalVarSize;
-	for(i=0;i<MaxGlobalVarNum;i++){
-		if(GlobalVar[i].offset&0x80000000){
-			GlobalVar[i].offset=(GlobalVar[i].offset&0x7FFFFFFF)+AllInitGlobalVarSize;
+	foreach( Variable *pVar, globalVars ){
+		if(pVar->offset&0x80000000){
+			pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
 		}
 	}
Index: /BasicCompiler32/NumOpe.cpp
===================================================================
--- /BasicCompiler32/NumOpe.cpp	(revision 75)
+++ /BasicCompiler32/NumOpe.cpp	(revision 76)
@@ -67,5 +67,5 @@
 }
 
-void NewStringObject(LPSTR lpszText){
+void NewStringObject( const char *str ){
 	///////////////////////////////////////////////////////
 	// lpszTextを元にStringオブジェクトを生成し、
@@ -73,11 +73,10 @@
 	///////////////////////////////////////////////////////
 
-	char *parameter = (char *)malloc( lstrlen( lpszText ) + 32 );
-	sprintf( parameter, "\"%s\"%c%c*Char", lpszText, 1, ESC_AS );
+	char *parameter = (char *)malloc( lstrlen( str ) + 32 );
+	sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS );
 	SetStringQuotes( parameter );
 
 	extern CClass *pobj_StringClass;
-	Type baseTypeInfo = { DEF_OBJECT, (LONG_PTR)pobj_StringClass };
-	Operator_New( *pobj_StringClass, "", parameter, baseTypeInfo );
+	Operator_New( *pobj_StringClass, "", parameter, Type( DEF_OBJECT, *pobj_StringClass ) );
 
 	free( parameter );
@@ -85,20 +84,25 @@
 
 
-int NumOpe(const char *Command,int BaseType,LONG_PTR lpBaseIndex,LONG_PTR *plpIndex,BOOL *pbUseHeap){
-	extern HANDLE hHeap;
+bool NumOpe( const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			BOOL *pbUseHeap ){
+
 	int i,i2,i3,i4;
-	char temporary[8192],temp2[1024],temp3[1024];
-
-	if(Command[0]=='\0'){
+	char temporary[1024],temp2[1024],temp3[1024];
+
+	if(expression[0]=='\0'){
 		SetError(1,NULL,cp);
-		return -1;
-	}
-
-	if(Command[0]==1&& Command[1]==ESC_NEW ){
+		return false;
+	}
+
+	if(expression[0]==1&& expression[1]==ESC_NEW ){
 		//New演算子（オブジェクト生成）
-		Type baseTypeInfo = { BaseType, lpBaseIndex };
-		int resultType = Operator_New(Command+2,plpIndex, baseTypeInfo );
-
-		return resultType;
+
+		if( !Operator_New( expression+2, baseType, resultType ) ){
+			return false;
+		}
+
+		return true;
 	}
 
@@ -112,9 +116,9 @@
 	long stack[255];
 	int pnum;
-	if(!GetNumOpeElements(Command,&pnum,values,calc,stack)){
+	if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
 		for(i=0;i<pnum;i++){
 			if(values[i]) HeapDefaultFree(values[i]);
 		}
-		return 0;
+		return false;
 	}
 
@@ -146,5 +150,5 @@
 	double dbl;
 	int sp;
-	int type[255];
+	int type_stack[255];
 	LONG_PTR index_stack[255];
 	BOOL bUseHeap[255];
@@ -155,8 +159,7 @@
 
 		if(idCalc){
-			if(type[sp-2]==DEF_OBJECT){
+			if(type_stack[sp-2]==DEF_OBJECT){
 				//オーバーロードされたオペレータを呼び出す
-				Type BaseTypeInfo={BaseType,lpBaseIndex};
-				i2=CallOperatorProc(idCalc,&BaseTypeInfo,type,index_stack,bUseHeap,sp);
+				i2=CallOperatorProc(idCalc,baseType,type_stack,index_stack,bUseHeap,sp);
 				if(i2==0){
 					if(idCalc==CALC_EQUAL) lstrcpy(temp2,"==");
@@ -171,5 +174,5 @@
 			}
 
-			if(!CheckCalcType(idCalc,type,sp)) goto error;
+			if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
 		}
 
@@ -192,10 +195,7 @@
 StrLiteral:
 
-					if(BaseType==DEF_OBJECT){
-						CClass *pobj_Class;
-						pobj_Class=(CClass *)lpBaseIndex;
-						Type BaseTypeInfo = {BaseType,lpBaseIndex};
-						if(IsStringObjectType(BaseTypeInfo)){
-							//要求タイプがオブジェクトであり、Stringの受け入れが可能な場合
+					if( baseType.IsObject() ){
+						if( baseType.IsStringObject() ){
+							//要求タイプがStringのとき
 
 							//String型オブジェクトを生成
@@ -203,5 +203,5 @@
 
 							extern CClass *pobj_StringClass;
-							type[sp]=DEF_OBJECT;
+							type_stack[sp]=DEF_OBJECT;
 							index_stack[sp]=(LONG_PTR)pobj_StringClass;
 							bLiteralCalculation=0;
@@ -213,6 +213,5 @@
 
 
-					type[sp]=typeOfPtrChar;
-					index_stack[sp]=LITERAL_STRING;
+					type_stack[sp]=typeOfPtrChar;
 					bLiteralCalculation=0;
 
@@ -252,8 +251,8 @@
 						i4=GetStringInPare_RemovePare(temp2,term+i2+1);
 
-						int idProc;
 						void *pInfo;
-						idProc=GetProc(temporary,&pInfo);
-
+						int idProc=GetProc(temporary,(void **)&pInfo);
+
+						Type resultType;
 						if(idProc){
 							//閉じカッコ")"に続く文字がNULLでないとき
@@ -272,6 +271,6 @@
 							////////////////
 
-							i2=CallProc(idProc,pInfo,temporary,temp2,&index_stack[sp]);
-							if(i2==-1){
+							CallProc(idProc,pInfo,temporary,temp2,resultType);
+							if(resultType.IsNull()){
 								//戻り値が存在しないとき
 								for(i2=2;;i2++){
@@ -292,16 +291,19 @@
 
 							//大きな型への暗黙の変換
-							type[sp]=AutoBigCast(BaseType,i2);
+							type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
+							index_stack[sp] = resultType.GetIndex();
 							bLiteralCalculation=0;
 
 							//スタックへプッシュ
-							PushReturnValue(i2);
-
-							if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
-								//必要に応じて64ビット拡張
-								ExtendStackTo64(i2);
+							PushReturnValue( resultType.GetBasicType() );
+
+							if( Is64Type(type_stack[sp])
+								&& resultType.IsWhole()
+								&& resultType.GetBasicSize() <= sizeof(long) ){
+									//必要に応じて64ビット拡張
+									ExtendStackTo64( resultType.GetBasicType() );
 							}
 
-							if(i2==DEF_STRUCT){
+							if( resultType.IsStruct() ){
 								//構造体が戻ったときはヒープ領域にインスタンスが格納されている
 								//※後にfreeする必要あり
@@ -321,11 +323,14 @@
 
 							//マクロ関数の場合
-							type[sp]=NumOpe(temp3,0,0,&index_stack[sp]);
-
-							if(!IS_LITERAL(index_stack[sp])){
+							NumOpe(temp3,Type(),resultType);
+
+							if(!IS_LITERAL(resultType.GetIndex())){
 								//リテラル値ではなかったとき
 								bLiteralCalculation=0;
 							}
 
+							type_stack[sp] = resultType.GetBasicType();
+							index_stack[sp] = resultType.GetIndex();
+
 							sp++;
 							break;
@@ -335,15 +340,14 @@
 
 
-
+					//インデクサ（getアクセサ）
 					char variable[VN_SIZE],array_element[VN_SIZE];
-					CClass *pobj_c;
 					GetArrayElement(term,variable,array_element);
 					if(array_element[0]){
-						i2=GetVarType(variable,(LONG_PTR *)&pobj_c,0);
-						if(i2==DEF_OBJECT){
-							Type RetTypeInfo;
-							CallIndexerGetterProc(pobj_c,variable,array_element,RetTypeInfo);
-							type[sp]=RetTypeInfo.type;
-							index_stack[sp]=RetTypeInfo.u.lpIndex;
+						Type resultType;
+						GetVarType(variable,resultType,0);
+						if( resultType.IsObject() ){
+							CallIndexerGetterProc(&resultType.GetClass(),variable,array_element,resultType);
+							type_stack[sp]=resultType.GetBasicType();
+							index_stack[sp]=resultType.GetIndex();
 							bLiteralCalculation=0;
 
@@ -359,7 +363,7 @@
 					// Nothing
 					if( lstrcmp( term, "Nothing" ) == 0 ){
-						type[sp] = DEF_OBJECT;
-						if( BaseType == DEF_OBJECT ){
-							index_stack[sp] = lpBaseIndex;
+						type_stack[sp] = DEF_OBJECT;
+						if( baseType.IsObject() ){
+							index_stack[sp] = baseType.GetIndex();
 						}
 						else{
@@ -377,10 +381,16 @@
 
 
+					if( (string)term=="value"){
+						int test=0;
+					}
+
 
 					RELATIVE_VAR RelativeVar;
+					Type varType;
 					if(GetVarOffset(
 						false,	//エラー表示あり
 						false,	//読み込み専用
-						term,&i2,&RelativeVar,&index_stack[sp])){
+						term,
+						&RelativeVar,varType)){
 						//////////
 						// 変数
@@ -388,10 +398,11 @@
 
 						//大きな型への暗黙の変換
-						type[sp]=AutoBigCast(BaseType,i2);
+						type_stack[sp]=AutoBigCast(baseType.GetBasicType(),varType.GetBasicType());
+						index_stack[sp] = varType.GetIndex();
 						bLiteralCalculation=0;
 
-						if(i2&FLAG_PTR){
+						if(varType.GetBasicType()&FLAG_PTR){
 							//配列ポインタ
-							type[sp]=GetPtrType(i2^FLAG_PTR,index_stack[sp]);
+							type_stack[sp]=GetPtrType(varType.GetBasicType()^FLAG_PTR);
 
 							SetVarPtrToEax(&RelativeVar);
@@ -400,39 +411,38 @@
 							op_push(REG_EAX);
 						}
-						else if(i2==DEF_DOUBLE||
-							i2==DEF_INT64||
-							i2==DEF_QWORD){
+						else if( varType.IsStruct() ){
+							//構造体ポインタをeaxへ格納（構造体は値型）
+							SetVarPtrToEax(&RelativeVar);
+
+							//push eax
+							op_push(REG_EAX);
+						}
+						else if( varType.GetBasicSize() == sizeof(_int64) ){
 							//64ビット型
 							PushDoubleVariable(&RelativeVar);
 						}
-						else if(i2==DEF_LONG||i2==DEF_DWORD||i2==DEF_SINGLE||
-							IsPtrType(i2) || i2==DEF_OBJECT){
+						else if( varType.GetBasicSize() == sizeof(long) ){
 							//32ビット型
 							PushLongVariable(&RelativeVar);
 						}
-						else if(i2==DEF_INTEGER || (isUnicode&&i2==DEF_CHAR)){
+						else if( varType.IsInteger() ){
 							PushIntegerVariable(&RelativeVar);
 						}
-						else if(i2==DEF_WORD){
+						else if( varType.IsWord() ){
 							PushWordVariable(&RelativeVar);
 						}
-						else if(i2==DEF_SBYTE || (isUnicode==false&&i2==DEF_CHAR)){
+						else if( varType.IsSByte() ){
 							PushCharVariable(&RelativeVar);
 						}
-						else if(i2==DEF_BYTE||i2==DEF_BOOLEAN){
+						else if( varType.IsByte() || varType.IsBoolean() ){
 							PushByteVariable(&RelativeVar);
 						}
-						else if(i2==DEF_STRUCT){
-							//構造体ポインタをeaxへ格納（構造体は値型）
-							SetVarPtrToEax(&RelativeVar);
-
-							//push eax
-							op_push(REG_EAX);
-						}
 						else SetError(11,term,cp);
 
-						if(Is64Type(type[sp])&&IsWholeNumberType(i2)&&GetTypeSize(i2,-1)<=sizeof(long)){
+						if( Is64Type(type_stack[sp])
+							&& varType.IsWhole()
+							&& varType.GetBasicSize()<=sizeof(long)){
 							//必要に応じて64ビット拡張
-							ExtendStackTo64(i2);
+								ExtendStackTo64( varType.GetBasicType() );
 						}
 
@@ -448,5 +458,5 @@
 					i3 = CDBConst::obj.GetType(term);
 					if(i3){
-						type[sp]=i3;
+						type_stack[sp]=i3;
 						if(IsRealNumberType(i3)){
 							//実数
@@ -483,5 +493,5 @@
 					i3=GetTypeFixed(term,&lp);
 					if(i3!=-1){
-						type[sp]=i3|FLAG_CAST;
+						type_stack[sp]=i3|FLAG_CAST;
 						index_stack[sp]=lp;
 						sp++;
@@ -500,17 +510,16 @@
 
 					if(GetSubHash(VarName,0)){
-						Type RetTypeInfo;
-						CallPropertyMethod(term,NULL,&RetTypeInfo);
+						Type resultType;
+						CallPropertyMethod(term,NULL,resultType);
 
 						//大きな型への暗黙の変換
-						type[sp]=AutoBigCast(BaseType,RetTypeInfo.type);
-
-						index_stack[sp]=RetTypeInfo.u.lpIndex;
+						type_stack[sp]=AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
+						index_stack[sp]=resultType.GetIndex();
 						bLiteralCalculation=0;
 
 						//スタックへプッシュ
-						PushReturnValue(RetTypeInfo.type);
-
-						if(type[sp]==DEF_STRUCT){
+						PushReturnValue( resultType.GetBasicType() );
+
+						if(type_stack[sp]==DEF_STRUCT){
 							//構造体が戻ったときはヒープ領域にインスタンスが格納されている
 							//※後にfreeする必要あり
@@ -527,13 +536,13 @@
 					bError=1;
 					SetError(3,term,cp);
-					type[sp]=DEF_DOUBLE;
+					type_stack[sp]=DEF_DOUBLE;
 				}
 				else{
 					//リテラル値
-					type[sp]=GetLiteralValue(term,&i64data,BaseType);
+					type_stack[sp]=GetLiteralValue(term,&i64data,baseType.GetBasicType());
 Literal:
-					if(type[sp]==DEF_INT64||
-						type[sp]==DEF_QWORD||
-						type[sp]==DEF_DOUBLE){
+					if(type_stack[sp]==DEF_INT64||
+						type_stack[sp]==DEF_QWORD||
+						type_stack[sp]==DEF_DOUBLE){
 						//64ビット（符号有り整数/実数）
 
@@ -544,5 +553,5 @@
 						op_push_V(*(long *)(&i64data));
 					}
-					else if(type[sp]==DEF_SINGLE){
+					else if(type_stack[sp]==DEF_SINGLE){
 						//single実数
 
@@ -566,5 +575,5 @@
 
 					//リテラル値の種類
-					if(Is64Type(type[sp])==0&&IsRealNumberType(type[sp])==0){
+					if(Is64Type(type_stack[sp])==0&&IsRealNumberType(type_stack[sp])==0){
 						//整数（符号有り/無し）
 
@@ -579,20 +588,20 @@
 				//value[sp-2] xor= value[sp-1]
 				//xor演算
-				if(!Calc_Xor(type,index_stack,&sp)) goto error;
+				if(!Calc_Xor(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_OR:
 				//value[sp-2] or= value[sp-1]
 				//or演算
-				if(!Calc_Or(type,index_stack,&sp)) goto error;
+				if(!Calc_Or(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_AND:
 				//value[sp-2] and= value[sp-1]
 				//and演算
-				if(!Calc_And(type,index_stack,&sp)) goto error;
+				if(!Calc_And(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_NOT:
 				//value[sp-1]=Not value[sp-1]
 				//NOT演算子
-				if(!Calc_Not(type,sp)) goto error;
+				if(!Calc_Not(type_stack,sp)) goto error;
 				break;
 
@@ -600,25 +609,25 @@
 			case CALC_PE:
 				//value[sp-2]<=value[sp-1]
-				if(!Calc_Relation_PE(type,index_stack,&sp)) goto error;
+				if(!Calc_Relation_PE(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_QE:
 				//value[sp-2]>=value[sp-1]
-				if(!Calc_Relation_QE(type,index_stack,&sp)) goto error;
+				if(!Calc_Relation_QE(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_P:
 				//value[sp-2]<value[sp-1]
-				if(!Calc_Relation_P(type,index_stack,&sp)) goto error;
+				if(!Calc_Relation_P(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_Q:
 				//value[sp-2]>value[sp-1]
-				if(!Calc_Relation_Q(type,index_stack,&sp)) goto error;
+				if(!Calc_Relation_Q(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_NOTEQUAL:
 				//value[sp-2]<>value[sp-1]
-				if(!Calc_Relation_NotEqual(type,&sp)) goto error;
+				if(!Calc_Relation_NotEqual(type_stack,&sp)) goto error;
 				break;
 			case CALC_EQUAL:
 				//value[sp-2]=value[sp-1]
-				if(!Calc_Relation_Equal(type,&sp)) goto error;
+				if(!Calc_Relation_Equal(type_stack,&sp)) goto error;
 				break;
 
@@ -626,9 +635,9 @@
 			case CALC_SHL:
 				//value[sp-2]=value[sp-2]<<value[sp-1]
-				if(!Calc_SHL(type,&sp)) goto error;
+				if(!Calc_SHL(type_stack,&sp)) goto error;
 				break;
 			case CALC_SHR:
 				//value[sp-2]=value[sp-2]>>value[sp-1]
-				if(!Calc_SHR(type,&sp)) goto error;
+				if(!Calc_SHR(type_stack,&sp)) goto error;
 				break;
 
@@ -637,5 +646,5 @@
 			case CALC_SUBTRACTION:
 			case CALC_PRODUCT:
-				if(!CalcTwoTerm_Arithmetic(idCalc,type,index_stack,&sp)) goto error;
+				if(!CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp)) goto error;
 				break;
 
@@ -643,34 +652,34 @@
 				//value[sp-2]%=value[sp-1]
 				//剰余演算
-				if(!Calc_Mod(type,&sp)) goto error;
+				if(!Calc_Mod(type_stack,&sp)) goto error;
 				break;
 			case CALC_QUOTIENT:
 				//value[sp-2]/=value[sp-1];
 				//除算
-				if(!Calc_Divide(type,&sp,BaseType)) goto error;
+				if(!Calc_Divide(type_stack,&sp,baseType.GetBasicType())) goto error;
 				break;
 			case CALC_INTQUOTIENT:
 				//value[sp-2]/=value[sp-1]
 				//整数除算
-				if(!Calc_IntDivide(type,index_stack,&sp)) goto error;
+				if(!Calc_IntDivide(type_stack,index_stack,&sp)) goto error;
 				break;
 			case CALC_MINUSMARK:
 				//value[sp-1]=-value[sp-1]
 				//符号反転
-				if(!Calc_MinusMark(type,sp)) goto error;
+				if(!Calc_MinusMark(type_stack,sp)) goto error;
 				index_stack[sp-1]=-1;
 				break;
 			case CALC_POWER:
 				//べき乗演算（浮動小数点演算のみ）
-				if(!Calc_Power(type,&sp)) goto error;
+				if(!Calc_Power(type_stack,&sp)) goto error;
 				break;
 			case CALC_AS:
 				//キャスト
-				if(!Calc_Cast(type,index_stack,&sp)) goto error;
+				if(!Calc_Cast(type_stack,index_stack,&sp)) goto error;
 				break;
 
 			case CALC_BYVAL:
 				//ポインタ型→参照型
-				if( PTR_LEVEL( type[sp-1] ) <= 0 ){
+				if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
 					//ポインタ型ではないとき
 					SetError( 3, NULL, cp );
@@ -678,5 +687,5 @@
 				}
 
-				type[sp-1] = PTR_LEVEL_DOWN( type[sp-1] );
+				type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
 
 				break;
@@ -697,6 +706,6 @@
 	if(bLiteralCalculation){
 		//右辺値が数値の定数式の場合
-		LONG_PTR lpClassIndex;
-		i2=StaticCalculation(true, Command,BaseType,&i64data,&lpClassIndex);
+		Type resultType;
+		StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
 
 		obp=BeforeObp;
@@ -705,7 +714,5 @@
 		pobj_Reloc->copy(pobj_BackReloc);
 
-		if(i2==DEF_INT64||
-			i2==DEF_QWORD||
-			i2==DEF_DOUBLE){
+		if( resultType.GetBasicSize() == sizeof(_int64) ){
 			//64ビット（符号有り整数/実数）
 
@@ -716,5 +723,5 @@
 			op_push_V(*(long *)(&i64data));
 		}
-		else if(i2==DEF_SINGLE){
+		else if( resultType.IsSingle() ){
 			//single実数
 
@@ -733,6 +740,6 @@
 			i3=(long)i64data;
 
-			if(i2==DEF_SBYTE||i2==DEF_BYTE||i2==DEF_BOOLEAN || (isUnicode==false&&i2==DEF_CHAR)) i3=i3&0x000000FF;
-			if(i2==DEF_INTEGER||i2==DEF_WORD || (isUnicode&&i2==DEF_CHAR)) i3=i3&0x0000FFFF;
+			if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
+			if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
 
 			//push term
@@ -740,6 +747,6 @@
 		}
 
-		type[0]=i2;
-		index_stack[0]=lpClassIndex;
+		type_stack[0]=resultType.GetBasicType();
+		index_stack[0]=resultType.GetIndex();
 	}
 	else{
@@ -748,14 +755,14 @@
 	}
 
-	if(plpIndex) *plpIndex=index_stack[0];
 	if(pbUseHeap) *pbUseHeap=bUseHeap[0];
 
-	int RetType;
-	RetType=type[0];
+	resultType.SetType( type_stack[0], index_stack[0] );
+
+	bool isSuccessful = true;
 	goto finish;
 
 
 error:
-	RetType=-1;
+	isSuccessful = false;
 	goto finish;
 
@@ -770,4 +777,4 @@
 	delete pobj_BackReloc;
 
-	return RetType;
+	return isSuccessful;
 }
Index: /BasicCompiler32/Opcode.h
===================================================================
--- /BasicCompiler32/Opcode.h	(revision 75)
+++ /BasicCompiler32/Opcode.h	(revision 76)
@@ -202,8 +202,8 @@
 class ParamImpl{
 	char *Parms[255];
-	Type types[255];
+	vector<Type> types;
 	int ParmsNum;
 
-	Type ReturnTypeInfo;
+	Type returnType;
 
 	//一時オブジェクト管理用
@@ -219,5 +219,5 @@
 
 private:
-	BOOL _overload_check( const Parameters &params,Type *pReturnTypeInfo,int overload_level);
+	bool _overload_check( int level, const Parameters &targetParms, const Type &targetResultType );
 	UserProc *OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs );
 public:
@@ -226,5 +226,5 @@
 	bool ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum = -1 );
 	void MacroParameterSupport( const Parameters &params );
-	void SetStructParameter(CClass *pobj_Class,LPSTR Parameter);
+	void SetStructParameter( const Type &baseType, const char *expression );
 	int SetParameter( const string &procName, const Parameters &params, int SecondParmNum = -1 );
 
@@ -237,7 +237,7 @@
 void AddLocalVarAddrSchedule();
 #define PROCFLAG_NEW	1
-int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex);
-void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType);
-int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex);
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
+bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType);
+bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc );
 
 //Compile_ProcOp.cpp
@@ -247,11 +247,11 @@
 int GetFunctionType(int FuncNum);
 int GetFunctionFromName(char *FuncName);
-void Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &ReturnTypeInfo );
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, Type &resultType, bool isCallOn = true );
 
 //OperatorProc.cpp
-void FreeTempObject(int reg,CClass *pobj_c);
-int CallOperatorProc(int idCalc,Type *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
+void FreeTempObject(int reg,const CClass *pobj_c);
+int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp);
 void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType);
-void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,Type &RetTypeInfo);
+void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType);
 
 //Compile_Statement.cpp
@@ -264,11 +264,8 @@
 void OpcodeContinue(void);
 void OpcodeExitSub(void);
-void OpcodeSelect(const char *Parameter);
+void OpcodeSelect(const char *lpszParms);
 void OpcodeCase(char *Parameter);
 void OpcodeGosub(char *Parameter);
 void OpcodeReturn(char *Parameter);
-void Opcode_Input(const char *Parameter);
-void Opcode_Print(const char *Parameter,BOOL bWrite);
-void OpcodeCallPtr(char *Parameter);
 void OpcodeSetPtrData(char *Parameter,int type);
 
Index: /BasicCompiler32/OperatorProc.cpp
===================================================================
--- /BasicCompiler32/OperatorProc.cpp	(revision 75)
+++ /BasicCompiler32/OperatorProc.cpp	(revision 76)
@@ -2,5 +2,5 @@
 #include "Opcode.h"
 
-void FreeTempObject(int reg,CClass *pobj_c){
+void FreeTempObject(int reg,const CClass *pobj_c){
 	if(!IsSafeReg(reg)) SetError(300,NULL,cp);
 
@@ -22,5 +22,5 @@
 }
 
-int CallOperatorProc(int idCalc,Type *pBaseTypeInfo,int *type,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
+int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,BOOL *bUseHeap,int &sp){
 	//オーバーロードされたオペレータ関数を呼び出す
 	CClass *pobj_c;
@@ -39,22 +39,4 @@
 
 
-	int i;
-	BOOL bReturnTypeIsObject=1;
-	Type ReturnType={DEF_OBJECT,subs[0]->ReturnType().GetIndex()};
-	foreach( UserProc *pUserProc, subs ){
-		if(pUserProc->ReturnType().IsObject())
-			bReturnTypeIsObject=0;
-	}
-
-	if(bReturnTypeIsObject==0){
-		if(pBaseTypeInfo){
-			if(pBaseTypeInfo->type==DEF_OBJECT){
-				ReturnType.u.lpIndex=pBaseTypeInfo->u.lpIndex;
-			}
-		}
-	}
-
-
-
 	/////////////////////////////////////////////
 	// オーバーロード解決用のパラメータを設定
@@ -64,5 +46,5 @@
 
 	if(bTwoTerm){
-		params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) );
+		params.push_back( new Parameter( "", Type( type_stack[sp-1], index_stack[sp-1] ) ) );
 	}
 
@@ -71,10 +53,5 @@
 	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
 	else GetCalcName(idCalc,temporary);
-	Type returnType;
-	if( pBaseTypeInfo ){
-		returnType.SetBasicType( pBaseTypeInfo->type );
-		returnType.SetIndex( pBaseTypeInfo->u.lpIndex );
-	}
-	UserProc *pUserProc = OverloadSolution( temporary, subs, params, returnType );
+	UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
 
 	if(!pUserProc){
@@ -94,5 +71,5 @@
 	}
 
-	for(i=0;i<(int)params.size();i++){
+	for(int i=0;i<(int)params.size();i++){
 		CheckDifferentType(
 			pUserProc->Params()[i]->GetBasicType(),
@@ -108,5 +85,5 @@
 	}
 
-	int right_side_size = GetTypeSize(type[sp-1],index_stack[sp-1]);
+	int right_side_size = GetTypeSize(type_stack[sp-1],index_stack[sp-1]);
 
 	if(bTwoTerm){
@@ -224,5 +201,5 @@
 
 	sp--;
-	type[sp-1]=pUserProc->ReturnType().GetBasicType();
+	type_stack[sp-1]=pUserProc->ReturnType().GetBasicType();
 	index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
 
@@ -237,6 +214,6 @@
 }
 
-void CallCastOperatorProc(int &CalcType,LONG_PTR &lpCalcIndex,BOOL bCalcUseHeap,int ToType,LONG_PTR lpToIndex){
-	int type[10];
+void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType){
+	int type_stack[10];
 	LONG_PTR index_stack[10];
 	BOOL array_bUseHeap[10];
@@ -249,19 +226,16 @@
 
 	//左辺
-	type[0]=CalcType;
-	index_stack[0]=lpCalcIndex;
+	type_stack[0]=calcType.GetBasicType();
+	index_stack[0]=calcType.GetIndex();
 	array_bUseHeap[0]=0;
-	type[1]=ToType;
-	index_stack[1]=lpToIndex;
+	type_stack[1]=toType.GetBasicType();
+	index_stack[1]=toType.GetIndex();
 	array_bUseHeap[1]=0;
 
-	Type BaseTypeInfo={ToType,lpToIndex};
-
-	int iRet;
-	iRet=CallOperatorProc(CALC_AS,&BaseTypeInfo,type,index_stack,array_bUseHeap,sp);
+	int iRet = CallOperatorProc(CALC_AS,toType,type_stack,index_stack,array_bUseHeap,sp);
+
 	if(iRet==1){
 		//成功したとき
-		CalcType=type[0];
-		lpCalcIndex=index_stack[0];
+		calcType.SetType( type_stack[0], index_stack[0] );
 		return;
 	}
@@ -274,5 +248,5 @@
 	SetError(-1,"キャスト演算子がオーバーロードされていません。",cp);
 }
-void CallIndexerGetterProc(CClass *pobj_Class,char *ObjectName,char *Parameter,Type &RetTypeInfo){
+void CallIndexerGetterProc(const CClass *pobj_Class,char *ObjectName,char *Parameter,Type &resultType){
 	std::vector<UserProc *> subs;
 	pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
@@ -282,5 +256,4 @@
 
 	Opcode_CallProc(Parameter,subs[0],0,ObjectName,DEF_OBJECT);
-	RetTypeInfo.type = subs[0]->ReturnType().GetBasicType();
-	RetTypeInfo.u.lpIndex = subs[0]->ReturnType().GetIndex();
-}
+	resultType = subs[0]->ReturnType();
+}
Index: sicCompiler32/VarList.cpp
===================================================================
--- /BasicCompiler32/VarList.cpp	(revision 75)
+++ 	(revision )
@@ -1,1335 +1,0 @@
-#include "../BasicCompiler_Common/common.h"
-
-//デバッグ用
-#include "../BasicCompiler_Common/debug.h"
-
-//変数リストのツリーハンドル
-HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
-
-int VarList_Array(HWND hVarTree,HTREEITEM hParent,DWORD offset,int type,int *SubScripts,LONG_PTR lpIndex);
-void VarList_Member(HWND hVarTree,HTREEITEM hParent,DWORD pTopOffset,CClass *pobj_c,BOOL bPtr);
-void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,char *VarName,int type,DWORD offset,LONG_PTR lpIndex){
-	extern HANDLE hDebugProcess;
-	int i2;
-	char temporary[255],temp2[255];
-	DWORD dwData,dwAccessByte;
-	double dbl;
-	float flt;
-	WORD wData;
-	BYTE byteData;
-	HTREEITEM hParent;
-
-	if(type==DEF_OBJECT||type==DEF_STRUCT){
-		if( type==DEF_OBJECT ){
-			// 参照型ということを考慮する
-			ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(void *),&dwAccessByte);
-			offset = dwData;
-		}
-
-		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,offset);
-		lptv->item.iImage=1;
-		lptv->item.iSelectedImage=1;
-		hParent=TreeView_InsertItem(hVarTree,lptv);
-
-		VarList_Member(hVarTree,hParent,offset,(CClass *)lpIndex,0);
-		return;
-	}
-	if(type==DEF_PTR_OBJECT||type==DEF_PTR_STRUCT){
-		i2=ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte);
-
-		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,dwData);
-		lptv->item.iImage=4;
-		lptv->item.iSelectedImage=4;
-		hParent=TreeView_InsertItem(hVarTree,lptv);
-
-		if(i2) VarList_Member(hVarTree,hParent,dwData,(CClass *)lpIndex,1);
-		return;
-	}
-	else{
-		if(type==MAKE_PTR_TYPE(DEF_SBYTE,1)||type==MAKE_PTR_TYPE(DEF_BYTE,1)){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
-				for(i2=0;;i2++){
-					if(!ReadProcessMemory(hDebugProcess,(void *)(dwData+i2),&temporary[i2],1,&dwAccessByte)){
-						i2=-1;
-						break;
-					}
-					if(temporary[i2]=='\0') break;
-					if(i2==64){
-						lstrcpy(temporary+i2,"...");
-						break;
-					}
-				}
-				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,dwData,dwData);
-				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,dwData,dwData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_DOUBLE){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_SINGLE){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_INT64){
-			_int64 i64data;
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&dwAccessByte)){
-				_i64toa(i64data,temporary,10);
-				_i64toa(i64data,temp2,16);
-				CharUpper(temp2);
-				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_QWORD){
-			_int64 i64data;
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&dwAccessByte)){
-				_ui64toa(i64data,temporary,10);
-				_ui64toa(i64data,temp2,16);
-				CharUpper(temp2);
-				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_LONG){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,dwData,dwData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_DWORD||IsPtrType(type)){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dwData,sizeof(DWORD),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,dwData,dwData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_INTEGER || (isUnicode&&type==DEF_CHAR)){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_WORD){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&dwAccessByte)){
-				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_SBYTE || (isUnicode==false&&type==DEF_CHAR)){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&dwAccessByte)){
-				temporary[0]=byteData;
-				temporary[1]=0;
-				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_BYTE){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&dwAccessByte)){
-				temporary[0]=byteData;
-				temporary[1]=0;
-				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type==DEF_BOOLEAN){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&dwAccessByte)){
-				if( byteData ) lstrcpy( temporary, "True" );
-				else lstrcpy( temporary, "False" );
-				sprintf(lptv->item.pszText,"%s %s",VarName,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		lptv->item.iImage=2;
-		lptv->item.iSelectedImage=2;
-	}
-	TreeView_InsertItem(hVarTree,lptv);
-}
-void VarList_Member(HWND hVarTree,HTREEITEM hParent,DWORD pTopOffset,CClass *pobj_c,BOOL bPtr){
-	int i,i2;
-	char VarData[VN_SIZE],VarName[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=hParent;
-	tv.item.pszText=VarData;
-
-	for(i=0;i<pobj_c->iMemberNum;i++){
-		if(bPtr){
-			lstrcpy(VarName,"->");
-			lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
-		}
-		else{
-			lstrcpy(VarName,".");
-			lstrcat(VarName,pobj_c->ppobj_Member[i]->name);
-		}
-
-		LONG_PTR offset = pobj_c->GetMemberOffset( pobj_c->ppobj_Member[i]->name, &i2 );
-
-		if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
-			//構造体内の配列
-			sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree,&tv);
-
-			VarList_Array(hVarTree,hParent,
-				pTopOffset+offset,
-				pobj_c->ppobj_Member[i]->TypeInfo.type,
-				pobj_c->ppobj_Member[i]->SubScripts,
-				pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
-		}
-		else{
-			//メンバ変数
-			VarList_Insert(hVarTree,
-				&tv,
-				VarName,
-				pobj_c->ppobj_Member[i]->TypeInfo.type,
-				pTopOffset+offset,
-				pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex);
-		}
-	}
-}
-int VarList_Array(HWND hVarTree,HTREEITEM hParent,DWORD offset,int type,int *SubScripts,LONG_PTR lpIndex){
-	int i,i2,i3,ElementNum,MemCounter,UseCount[255],TypeSize;
-	char temporary[VN_SIZE],temp2[DIGIT_SIZE];
-
-	TV_INSERTSTRUCT tv;
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=hParent;
-	tv.item.pszText=temporary;
-
-	TypeSize=GetTypeSize(type,lpIndex);
-
-	for(i=0;i<255;i++){
-		if(SubScripts[i]==-1) break;
-		UseCount[i]=0;
-	}
-	UseCount[i]=-2;
-	MemCounter=0;
-	while(1){
-		UseCount[i]++;
-		for(ElementNum=0;SubScripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
-			UseCount[i-ElementNum]=0;
-			if(i-ElementNum-1<0) return MemCounter;
-			UseCount[i-ElementNum-1]++;
-		}
-
-		if(MemCounter<50){
-			temporary[0]='[';
-			temporary[1]=0;
-			for(i2=0;i2<i;i2++){
-				sprintf(temp2,"%d",UseCount[i2]);
-				lstrcat(temporary,temp2);
-				lstrcat(temporary,",");
-			}
-			i3=lstrlen(temporary);
-			temporary[i3-1]=']';
-			temporary[i3]=0;
-
-			VarList_Insert(hVarTree,&tv,temporary,type,offset+MemCounter*TypeSize,lpIndex);
-		}
-
-		MemCounter++;
-		if(MemCounter==50){
-			lstrcpy(tv.item.pszText,"...");
-			TreeView_InsertItem(hVarTree,&tv);
-		}
-	}
-	return 0;
-}
-void RefreshGlobalVar(void){
-	extern DWORD ImageBase;
-	int i;
-	char temporary[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-	HTREEITEM hParent;
-
-	TreeView_DeleteAllItems(hVarTree_Global);
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=TVI_ROOT;
-	tv.item.pszText=temporary;
-
-	extern HANDLE hDebugProcess;
-	extern int MemPos_RWSection;
-	extern int MaxGlobalVarNum;
-	extern VARIABLE *GlobalVar;
-
-	for(i=0;i<MaxGlobalVarNum;i++){
-		VARIABLE *pVar=&GlobalVar[i];
-
-		//スコープ外の場合は無視
-		if(pVar->ScopeLevel!=0){
-			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0]  &&
-				pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
-				//範囲内
-			}
-			else{
-				//範囲外
-				continue;
-			}
-		}
-
-		if(!pobj_nv->bShow_DefaultSystem_Var){
-			if(memcmp(pVar->name,"_System_",8)==0||
-				memcmp(pVar->name,"_DebugSys_",10)==0||
-				memcmp(pVar->name,"_PromptSys_",11)==0) continue;
-		}
-		if(!pobj_nv->bShow_Rad_Var){
-			if(memcmp(pVar->name,"_RadSys_",8)==0) continue;
-		}
-		if(!pobj_nv->bShow_GUID_Var){
-			if(memcmp(pVar->name,"GUID_",5)==0||
-				memcmp(pVar->name,"IID_",4)==0||
-				memcmp(pVar->name,"CLSID_",6)==0) continue;
-		}
-
-		//静的メンバ
-		if(strstr(pVar->name,".")) continue;
-
-		if(pVar->bArray){
-			sprintf(temporary,"%s %s(&H%X)",
-				pVar->name,
-				STRING_ARRAY,
-				ImageBase+MemPos_RWSection+pVar->offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_Global,&tv);
-
-			VarList_Array(hVarTree_Global,hParent,
-				ImageBase+MemPos_RWSection+pVar->offset,
-				pVar->type,
-				pVar->SubScripts,
-				pVar->u.index);
-		}
-		else{
-			VarList_Insert(hVarTree_Global,
-				&tv,
-				pVar->name,
-				pVar->type,
-				ImageBase+MemPos_RWSection+pVar->offset,
-				pVar->u.index);
-		}
-	}
-}
-void RefreshLocalVar(void){
-	int i,i2,i3,sw;
-	char temporary[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-	HTREEITEM hParent;
-	ULONG_PTR lpData;
-	LONG_PTR offset;
-	ULONG_PTR lpAccBytes;
-
-	TreeView_DeleteAllItems(hVarTree_Local);
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=TVI_ROOT;
-	tv.item.pszText=temporary;
-
-	extern HANDLE hDebugProcess;
-	extern HWND hDebugWnd;
-	i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-	i2=pobj_dti->iProcLevel-i2;
-
-	if(pobj_dti->lplpSpBase[i2]==0) return;
-
-	extern UserProc **ppSubHash;
-	UserProc *pUserProc;
-	for(i3=0,sw=0;i3<MAX_HASH;i3++){
-		pUserProc=ppSubHash[i3];
-		while(pUserProc){
-			if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-				sw=1;
-				break;
-			}
-
-			pUserProc=pUserProc->pNextData;
-		}
-		if(sw) break;
-	}
-	if(!pUserProc) return;
-
-	for(i=0;i<pUserProc->VarNum;i++){
-		VARIABLE *pVar=&pUserProc->pVar[i];
-
-		//スコープ外の場合は無視
-		if(pVar->ScopeLevel!=0){
-			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
-				//範囲内
-			}
-			else{
-				//範囲外
-				continue;
-			}
-		}
-
-		if(pVar->bArray){
-			sprintf(temporary,"%s %s(&H%X)",
-				pVar->name,
-				STRING_ARRAY,
-				pobj_dti->lplpSpBase[i2]+pVar->offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_Local,&tv);
-
-			VarList_Array(hVarTree_Local,hParent,
-				pobj_dti->lplpSpBase[i2]+pVar->offset,
-				pVar->type,
-				pVar->SubScripts,
-				pVar->u.index);
-		}
-		else{
-			offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
-			if(pVar->fRef){
-				ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(ULONG_PTR),&lpAccBytes);
-				offset=lpData;
-			}
-			VarList_Insert(hVarTree_Local,&tv,
-				pVar->name,
-				pVar->type,
-				offset,
-				pVar->u.index);
-		}
-	}
-
-
-
-	/////////////////////////////
-	// Thisオブジェクトのリスト
-	/////////////////////////////
-
-	TreeView_DeleteAllItems(hVarTree_This);
-	if(!pUserProc->GetParentClassPtr()) return;
-
-	//Thisポインタを取得
-	LONG_PTR pThis;
-	for(i=0;i<pUserProc->VarNum;i++){
-		if(lstrcmp(pUserProc->pVar[i].name,"_System_LocalThis")==0) break;
-	}
-	if(i==pUserProc->VarNum) return;
-	lpData=pobj_dti->lplpSpBase[i2]+pUserProc->pVar[i].offset;
-	ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&lpAccBytes);
-
-	for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){
-		offset = pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->name, &i2 );
-
-		if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){
-			//配列
-			sprintf(temporary,"%s %s(&H%X)",
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
-				STRING_ARRAY,
-				offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_This,&tv);
-
-			VarList_Array(hVarTree_This,hParent,
-				pThis+offset,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.type,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.u.lpIndex);
-		}
-		else{
-			VarList_Insert(hVarTree_This,&tv,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.type,
-				pThis+offset,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->TypeInfo.u.lpIndex);
-		}
-	}
-}
-void RefreshGlobalVar_with_WindowLock(void){
-	extern HWND hDebugWnd;
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
-
-	//リフレッシュ
-	RefreshGlobalVar();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
-}
-void RefreshLocalVar_with_WindowLock(void){
-	extern HWND hDebugWnd;
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
-
-	//リフレッシュ
-	RefreshLocalVar();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
-}
-
-void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
-	int i;
-	char temporary[255],temp2[255];
-
-	//エスケープシーケンスをセット
-	SetEscapeSequenceFormat(buffer);
-
-	//ブランクを除去
-	KillStringSpaces(buffer);
-
-	//カッコを相互チェック
-	if(!CheckParenthesis2(buffer)){
-		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
-		return;
-	}
-
-	double dbl;
-	_int64 i64data;
-	i=StaticCalculation(true, buffer,0,&i64data,0,1);
-	if(IsRealNumberType(i)){
-		memcpy(&dbl,&i64data,sizeof(double));
-	}
-
-	if(i==0){
-		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
-	}
-	else if(i==-1){
-		ListView_SetItemText(hListView,iItem,1,STRING_CANNOTACCESS);
-	}
-	else{
-		if(IsRealNumberType(i))
-			sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
-		else if(Is64Type(i)){
-			_i64toa(i64data,temporary,10);
-			_i64toa(i64data,temp2,16);
-			CharUpper(temp2);
-			sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
-		}
-		else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
-
-		ListView_SetItemText(hListView,iItem,1,temporary);
-	}
-}
-void RefreshWatchList(void){
-	extern HWND hDebugWnd;
-	HWND hListView;
-	int i,i2;
-	char temporary[VN_SIZE];
-
-	hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
-	i2=ListView_GetItemCount(hListView);
-	for(i=0;i<i2-1;i++){
-		ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
-
-		//演算結果を表示
-		SetCalcToWatchList(hListView,i,temporary);
-	}
-}
-
-BOOL SetDebugProcCombo(HWND hProcCombo){
-	int i2,i3;
-	char temporary[255];
-
-	extern DWORD ImageBase;
-	extern int MemPos_CodeSection;
-
-	//行番号情報
-	extern int MaxLineInfoNum;
-	extern LINEINFO *pLineInfo;
-	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
-		for(i2=0;i2<MaxLineInfoNum-1;i2++){
-			if((pLineInfo[i2].TopObp+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
-				pobj_dti->lplpObp[i3]<=(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
-		}
-		if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
-		else{
-			pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
-		}
-	}
-	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
-		if(pobj_dti->lpdwCp[i3]==-1){
-			pobj_dti->iProcLevel--;
-			for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
-				pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
-				pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
-				pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
-			}
-			i3--;
-			continue;
-		}
-	}
-
-	if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
-		extern HWND hMainDlg;
-		//"デバッグ情報の取得に失敗"
-		MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
-		return 0;
-	}
-	ShowErrorLine(i2,temporary);
-
-	//プロシージャ コンボボックス
-	extern UserProc **ppSubHash;
-	UserProc *pUserProc;
-	int sw;
-	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
-	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
-		for(i3=0,sw=0;i3<MAX_HASH;i3++){
-			pUserProc=ppSubHash[i3];
-			while(pUserProc){
-				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-					lstrcpy(temporary,pUserProc->GetName().c_str());
-					sw=1;
-					break;
-				}
-				pUserProc=pUserProc->pNextData;
-			}
-			if(sw) break;
-		}
-		if(!pUserProc){
-			if(i2==0){
-				lstrcpy(temporary,"Global");
-				pobj_dti->lplpSpBase[i2]=0;
-			}
-			else lstrcpy(temporary,"error");
-		}
-		SendMessage(hProcCombo,CB_ADDSTRING,0,(long)temporary);
-	}
-	SendMessage(hProcCombo,CB_SETCURSEL,0,0);
-
-	return pobj_dti->iProcLevel;
-}
-
-//IDC_THREADCOMBOプロシージャ
-LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern WNDPROC OldThreadComboProc;
-	int i2;
-	DWORD dwThreadID;
-	char temporary[255];
-
-	switch(message){
-		case WM_COMMAND:
-			if(HIWORD(wParam)==CBN_SELCHANGE){
-				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(long)temporary);
-				sscanf(temporary+2,"%X",&dwThreadID);
-
-				i2=0;
-				while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
-
-				//次回のステップ実行対象を指定
-				extern int NextStepThreadNum;
-				NextStepThreadNum=i2;
-
-				//スレッド情報をリフレッシュ
-				pobj_dti->Reflesh(i2);
-
-				SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
-
-				SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
-			}
-			break;
-	}
-	return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
-}
-//IDC_PROCCOMBOプロシージャ
-LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern WNDPROC OldProcComboProc;
-	int i2,i3;
-	char temporary[MAX_PATH];
-
-	switch(message){
-		case WM_COMMAND:
-			if(HIWORD(wParam)==CBN_SELCHANGE){
-				i2=SendMessage(hwnd,CB_GETCURSEL,0,0);
-				GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
-				ShowErrorLine(i3,temporary);
-
-				RefreshLocalVar_with_WindowLock();
-			}
-			break;
-	}
-	return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
-}
-void InitVarList(DWORD dwThreadId){
-	extern HWND hDebugWnd;
-	int i2,i3,i5;
-	char temporary[255];
-
-
-	//スレッド
-	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
-	extern DWORD _DebugSys_dwThreadID[256];
-	for(i2=0;i2<256;i2++){
-		if(_DebugSys_dwThreadID[i2]){
-			sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
-			SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
-			if(_DebugSys_dwThreadID[i2]==dwThreadId){
-				extern int NextStepThreadNum;
-				NextStepThreadNum=i2;
-			}
-		}
-	}
-	sprintf(temporary,"&H%08X",dwThreadId);
-	i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
-	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
-
-	i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
-
-
-	///////////////////////////////////////////////
-	// 実行中のプロシージャのローカル変数をセット
-	///////////////////////////////////////////////
-
-	extern VARIABLE *LocalVar;
-	extern int MaxLocalVarNum;
-	int sw;
-
-	MaxLocalVarNum=0;
-	pobj_CompilingClass=0;
-
-	i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-	i2=pobj_dti->iProcLevel-i2;
-
-	if(pobj_dti->lplpSpBase[i2]){
-		extern UserProc **ppSubHash;
-		UserProc *pUserProc;
-		for(i3=0,sw=0;i3<MAX_HASH;i3++){
-			pUserProc=ppSubHash[i3];
-			while(pUserProc){
-				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-					sw=1;
-					break;
-				}
-
-				pUserProc=pUserProc->pNextData;
-			}
-			if(sw) break;
-		}
-
-
-		if(pUserProc){
-			LocalVar=pUserProc->pVar;
-			MaxLocalVarNum=pUserProc->VarNum;
-
-			pobj_CompilingClass=pUserProc->GetParentClassPtr();
-		}
-	}
-
-
-	////////////////////////
-	// 変数リストを再表示
-	////////////////////////
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
-	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
-
-	//リフレッシュ
-	RefreshLocalVar();
-	RefreshGlobalVar();
-	RefreshWatchList();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
-	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
-}
-
-
-
-
-//////////////////////////////////////
-// エディタに埋め込み表示のデバッガ
-//////////////////////////////////////
-
-BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-
-	//デバッガ用ツールバー
-#define BMPNUM_DEBUGGERTOOLBAR 3
-#define BTNNUM_DEBUGGERTOOLBAR 4
-	TBBUTTON DebuggerToolBar[]={
-		{0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-		{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
-		{1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-		{2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-	};
-	TOOLTIPTEXT *pTipText;
-
-	static HIMAGELIST hImageList,hImageList_Disabled;
-
-	switch(message){
-		case WM_INITDIALOG:
-			//ツールバーを生成
-			extern HWND hDebuggerToolbar;
-			hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
-				NULL,
-				0,0,0,
-				DebuggerToolBar,
-				BTNNUM_DEBUGGERTOOLBAR,	/*アイテムの個数*/
-				0,0,16,15,sizeof(TBBUTTON));
-
-			hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
-				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
-			SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
-			hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
-				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
-			SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
-
-			break;
-		case WM_COMMAND:
-			switch(LOWORD(wParam)){
-				case IDC_DEBUG_START:
-					DestroyWindow(GetParent(hwnd));
-					return 1;
-				case IDC_DEBUG_STEPIN:
-					Debugger_StepIn();
-					return 1;
-				case IDC_DEBUG_STEPOVER:
-					Debugger_StepOver();
-					return 1;
-			}
-			break;
-		case WM_NOTIFY:
-			pTipText=(TOOLTIPTEXT *)lParam;
-			if(pTipText->hdr.code==TTN_NEEDTEXT){
-				//ツールチップを表示
-				switch(pTipText->hdr.idFrom){
-					case IDC_DEBUG_START:
-						pTipText->lpszText="実行";
-						break;
-					case IDC_DEBUG_STEPOVER:
-						pTipText->lpszText="ステップ アウト";
-						break;
-					case IDC_DEBUG_STEPIN:
-						pTipText->lpszText="ステップ イン";
-						break;
-				}
-			}
-			break;
-		case WM_SIZE:
-			MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
-			return 1;
-
-		case WM_DESTROY:
-			ImageList_Destroy(hImageList);
-			ImageList_Destroy(hImageList_Disabled);
-			return 1;
-	}
-	return 0;
-}
-
-WNDPROC OldTabProc;
-LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HINSTANCE hInst;
-
-	static HMENU hDummyMenu,hMenu=0;
-
-	switch(message){
-		case WM_CONTEXTMENU:
-			if(hMenu==0){
-				hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
-				hMenu=GetSubMenu(hDummyMenu,0);
-			}
-
-			MENUITEMINFO mi;
-			mi.cbSize=sizeof(MENUITEMINFO);
-			mi.fMask=MIIM_STATE;
-			mi.fState=MFS_CHECKED;
-
-			if(pobj_nv->bShow_DefaultSystem_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
-			if(pobj_nv->bShow_Rad_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
-			if(pobj_nv->bShow_GUID_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
-
-			TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
-
-			break;
-		case WM_COMMAND:
-			mi.cbSize=sizeof(MENUITEMINFO);
-			mi.fMask=MIIM_STATE;
-			switch(LOWORD(wParam)){
-				case IDM_SHOW_DEFAULTSYSTEM_VAR:
-					if(pobj_nv->bShow_DefaultSystem_Var){
-						pobj_nv->bShow_DefaultSystem_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_DefaultSystem_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-				case IDM_SHOW_RAD_VAR:
-					if(pobj_nv->bShow_Rad_Var){
-						pobj_nv->bShow_Rad_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_Rad_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-				case IDM_SHOW_GUID_VAR:
-					if(pobj_nv->bShow_GUID_Var){
-						pobj_nv->bShow_GUID_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_GUID_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-			}
-			break;
-		case WM_DESTROY:
-			DestroyMenu(hMenu);
-			hMenu=0;
-			break;
-	}
-	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
-}
-
-BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HANDLE hHeap;
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-	extern double width_ratio_VarList;
-	RECT rect;
-	int i,i2,i3;
-	char temporary[VN_SIZE];
-	LV_DISPINFO *lvinfo;
-	LVITEM ListView_Item;
-
-	static POINT pos_VarList;
-	static POINT pos_WatchList;
-
-	switch(message){
-		case WM_INITDIALOG:
-			extern HWND hDebugWnd;
-			hDebugWnd=hwnd;
-
-			//変数リストの初期位置を取得
-			GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
-			pos_VarList.x=rect.left;
-			pos_VarList.y=rect.top;
-			ScreenToClient(hwnd,&pos_VarList);
-
-			//ウォッチリストの初期位置を取得
-			pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
-			pos_WatchList.y=0;
-
-			//ツールバーのベースウィンドウを生成
-			static HWND hBase_ToolBar;
-			hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,DebuggerButtonsProc);
-			MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
-
-			extern WNDPROC OldThreadComboProc;
-			OldThreadComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC);
-			SetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC,(long)ThreadComboProc);
-
-			extern WNDPROC OldProcComboProc;
-			OldProcComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC);
-			SetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC,(long)ProcComboProc);
-
-
-			///////////////////////////
-			// タブコントロールを生成
-			///////////////////////////
-
-			static HWND hTab;
-			HFONT hFont;
-			hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
-			hTab=CreateWindow(WC_TABCONTROL,NULL,
-				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
-				0,0,0,0,hwnd,0,hInst,0);
-			SendMessage(hTab,WM_SETFONT,(long)hFont,0);
-			OldTabProc=(WNDPROC)GetWindowLong(hTab,GWL_WNDPROC);
-			SetWindowLong(hTab,GWL_WNDPROC,(long)TabProc);
-
-			//タブを設定
-			TC_ITEM tcItem;
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="グローバル";
-			SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="ローカル";
-			SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="This";
-			SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
-
-			//グローバル変数リストのツリーを作成
-			hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			//ローカル変数リストのツリーを作成
-			hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			//This変数リストのツリーを作成
-			hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			ShowWindow(hVarTree_Global,SW_SHOW);
-
-
-			//イメージリスト読み込み、設定
-			static HIMAGELIST hVariOrderImageList;
-			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
-			TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
-			TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
-			TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
-
-
-			/////////////////////////
-			// ウォッチリスト
-			/////////////////////////
-
-			//コラムの設定
-			static HWND hListView;
-			LV_COLUMN ListView_Column;
-			DWORD dwStyle;
-
-			hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
-			GetClientRect(hListView,&rect);
-			dwStyle=ListView_GetExtendedListViewStyle(hListView);
-			dwStyle|=LVS_EX_FULLROWSELECT;
-			ListView_SetExtendedListViewStyle(hListView,dwStyle);
-
-			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
-			ListView_Column.fmt=LVCFMT_LEFT;
-
-			extern int width_WatchColumn_Expression;
-			ListView_Column.cx=width_WatchColumn_Expression;
-			ListView_Column.pszText="ウォッチ式";
-			ListView_Column.iSubItem=0;
-			ListView_InsertColumn(hListView,0,&ListView_Column);
-
-			extern int width_WatchColumn_Value;
-			ListView_Column.cx=width_WatchColumn_Value;
-			ListView_Column.pszText="値";
-			ListView_Column.iSubItem=1;
-			ListView_InsertColumn(hListView,1,&ListView_Column);
-
-			//アイテムの設定
-			ListView_Item.mask=LVIF_TEXT;
-			ListView_Item.iSubItem=0;
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				ListView_Item.pszText=pobj_nv->ppWatchStr[i];
-				ListView_Item.iItem=i;
-				ListView_InsertItem(hListView,&ListView_Item);
-			}
-			ListView_Item.pszText="...";
-			ListView_Item.iItem=i;
-			ListView_InsertItem(hListView,&ListView_Item);
-
-
-			///////////////////////
-			// 変数リストの初期化
-			///////////////////////
-			InitVarList((DWORD)lParam);
-
-			break;
-		case WM_NOTIFY:
-			NMHDR *hdr;
-			hdr=(NMHDR *)lParam;
-			if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
-				i=TabCtrl_GetCurSel(hTab);
-
-				if(i==0){
-					//グローバル変数を表示
-					ShowWindow(hVarTree_Global,SW_SHOW);
-					ShowWindow(hVarTree_Local,SW_HIDE);
-					ShowWindow(hVarTree_This,SW_HIDE);
-				}
-				else if(i==1){
-					//ローカル変数を表示
-					ShowWindow(hVarTree_Global,SW_HIDE);
-					ShowWindow(hVarTree_Local,SW_SHOW);
-					ShowWindow(hVarTree_This,SW_HIDE);
-				}
-				else if(i==2){
-					//This変数を表示
-					ShowWindow(hVarTree_Global,SW_HIDE);
-					ShowWindow(hVarTree_Local,SW_HIDE);
-					ShowWindow(hVarTree_This,SW_SHOW);
-				}
-			}
-
-			if(hdr->hwndFrom==hListView){
-				lvinfo=(LV_DISPINFO *)hdr;
-				if(hdr->code==NM_DBLCLK){
-					i2=ListView_GetItemCount(hListView);
-					for(i=0;i<i2;i++){
-						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
-					}
-					if(i==i2) break;
-
-					ListView_EditLabel(hListView,i);
-				}
-
-				static HWND hEdit;
-				if(hdr->code==LVN_BEGINLABELEDIT){
-					hEdit=ListView_GetEditControl(hListView);
-
-					GetWindowText(hEdit,temporary,VN_SIZE);
-					if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
-				}
-				if(hdr->code==LVN_ENDLABELEDIT){
-					GetWindowText(hEdit,temporary,VN_SIZE);
-					if(temporary[0]=='\0'){
-						if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
-
-						//空白入力の場合はそのアイテムを削除する
-						ListView_DeleteItem(hListView,lvinfo->item.iItem);
-						break;
-					}
-					ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
-
-					//演算結果を表示
-					SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
-
-					if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
-						//リストアイテムを追加
-						ListView_Item.mask=LVIF_TEXT;
-						ListView_Item.pszText="...";
-						ListView_Item.iItem=lvinfo->item.iItem+1;
-						ListView_Item.iSubItem=0;
-						ListView_InsertItem(hListView,&ListView_Item);
-					}
-				}
-
-				if(hdr->code==LVN_KEYDOWN){
-					LV_KEYDOWN *plvKeydown;
-					plvKeydown=(LV_KEYDOWN *)hdr;
-					if(plvKeydown->wVKey==VK_DELETE){
-						i2=ListView_GetItemCount(hListView);
-						for(i=i2-2;i>=0;i--){
-							if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
-								ListView_DeleteItem(hListView,i);
-								i3=i;
-							}
-						}
-
-						ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
-					}
-				}
-			}
-			break;
-
-		case WM_SIZE:
-			//変数リストの位置
-			int width_VarList;
-			width_VarList=
-				(int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
-
-			MoveWindow(hTab,
-				pos_VarList.x,
-				pos_VarList.y,
-				width_VarList,
-				HIWORD(lParam)-pos_VarList.y,
-				1);
-
-			GetClientRect(hTab,&rect);
-			TabCtrl_AdjustRect(hTab,FALSE,&rect);
-			rect.left-=2;
-			rect.right++;
-			rect.bottom++;
-
-			MoveWindow(hVarTree_Global,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-			MoveWindow(hVarTree_Local,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-			MoveWindow(hVarTree_This,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-
-			pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
-			pos_WatchList.y=0;
-
-			//ウォッチリストの位置
-			MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
-				pos_WatchList.x,
-				pos_WatchList.y,
-				LOWORD(lParam)-pos_WatchList.x,
-				HIWORD(lParam)-pos_WatchList.y,
-				1);
-
-			return 1;
-
-		case WM_VARLIST_CLOSE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_DESTROY:
-			ImageList_Destroy(hVariOrderImageList);
-
-
-			//////////////////////////////////////////////////////////////
-			// ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
-			//////////////////////////////////////////////////////////////
-
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				HeapDefaultFree(pobj_nv->ppWatchStr[i]);
-			}
-			HeapDefaultFree(pobj_nv->ppWatchStr);
-
-			pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
-			pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
-				pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-				lstrcpy(pobj_nv->ppWatchStr[i],temporary);
-			}
-
-
-			//////////////////////////////
-			// デバッグダイアログを破棄
-			//////////////////////////////
-
-			hDebugWnd=0;
-
-			extern BOOL bClipCompileView;
-			if(bClipCompileView){
-				extern HWND hOwnerEditor;
-				SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
-			}
-
-			return 1;
-
-
-
-		///////////////////////
-		// デバッグコマンド
-		///////////////////////
-
-		case WM_DEBUG_CONTINUE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_STEP_IN:
-			Debugger_StepIn();
-			return 1;
-		case WM_STEP_OVER:
-			Debugger_StepOver();
-			return 1;
-		case WM_STEP_CURSOR:
-			Debugger_StepCursor();
-			return 1;
-	}
-	return 0;
-}
-
-
-
-
-//////////////////////////////////
-// ポップアップ表示の変数リスト
-//////////////////////////////////
-
-BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HANDLE hHeap;
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-	RECT rect;
-	POINT pos;
-	SIZE size;
-
-	switch(message){
-		case WM_INITDIALOG:
-			extern HWND hDebugWnd;
-			hDebugWnd=hwnd;
-
-			pos.x=pobj_nv->VarDlgRect.left;
-			pos.y=pobj_nv->VarDlgRect.top;
-			size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
-			size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
-			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
-
-			extern WNDPROC OldThreadComboProc;
-			OldThreadComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC);
-			SetWindowLong(GetDlgItem(hwnd,IDC_THREADCOMBO),GWL_WNDPROC,(long)ThreadComboProc);
-
-			extern WNDPROC OldProcComboProc;
-			OldProcComboProc=(WNDPROC)GetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC);
-			SetWindowLong(GetDlgItem(hwnd,IDC_PROCCOMBO),GWL_WNDPROC,(long)ProcComboProc);
-
-			//イメージリスト読み込み、設定
-			static HIMAGELIST hVariOrderImageList;
-			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
-			TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
-
-			InitVarList((DWORD)lParam);
-			break;
-		case WM_COMMAND:
-			switch(LOWORD(wParam)){
-				case IDCANCEL:
-					DestroyWindow(hwnd);
-					return 1;
-				case IDC_STEPIN:
-					Debugger_StepIn();
-					return 1;
-				case IDC_STEPOVER:
-					Debugger_StepOver();
-					return 1;
-			}
-			break;
-		case WM_SIZE:
-			GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
-			pos.x=rect.left;
-			pos.y=rect.top;
-			ScreenToClient(hwnd,&pos);
-			MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
-			SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
-			return 1;
-		case WM_VARLIST_CLOSE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_DESTROY:
-			ImageList_Destroy(hVariOrderImageList);
-
-			GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
-
-			hDebugWnd=0;
-
-			return 1;
-	}
-	return 0;
-}
Index: sicCompiler32/WatchList.cpp
===================================================================
--- /BasicCompiler32/WatchList.cpp	(revision 75)
+++ 	(revision )
@@ -1,550 +1,0 @@
-#include "../BasicCompiler_Common/common.h"
-#include "opcode.h"
-
-//デバッグ用
-#include "../BasicCompiler_Common/debug.h"
-
-int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset);
-
-ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
-	extern DWORD ImageBase;
-	extern int MemPos_RWSection;
-	int i2;
-
-	if(pRelativeVar->dwKind==VAR_GLOBAL){
-		return ImageBase+MemPos_RWSection+pRelativeVar->offset;
-	}
-	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
-		extern HANDLE hDebugProcess;
-		ULONG_PTR lpData;
-		ULONG_PTR lpAccBytes;
-		ReadProcessMemory(hDebugProcess,
-			(void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
-			&lpData,
-			sizeof(ULONG_PTR),
-			&lpAccBytes);
-
-		return lpData;
-	}
-	else if(pRelativeVar->dwKind==VAR_LOCAL){
-		extern HWND hDebugWnd;
-		i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-		i2=pobj_dti->iProcLevel-i2;
-
-		if(pobj_dti->lplpSpBase[i2]==0) return 0;
-
-		return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
-	}
-	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
-		extern HWND hDebugWnd;
-		i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-		i2=pobj_dti->iProcLevel-i2;
-
-		if(pobj_dti->lplpSpBase[i2]==0) return 0;
-
-		extern HANDLE hDebugProcess;
-		ULONG_PTR lpData;
-		ULONG_PTR lpAccBytes;
-		ReadProcessMemory(hDebugProcess,
-			(void *)(pobj_dti->lplpSpBase[i2]+pRelativeVar->offset),
-			&lpData,
-			sizeof(ULONG_PTR),
-			&lpAccBytes);
-
-		return lpData;
-	}
-	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
-		return pRelativeVar->offset;
-	}
-
-	return 0;
-}
-
-BOOL Debugging_SetRelativeOffset(int *pType,LONG_PTR lpIndex,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
-	int array_num;
-
-	_int64 i64data;
-	int type;
-	type=StaticCalculation(true, lpPtrOffset,0,&i64data,0,1);
-	if(!type) return 0;
-	if(IsRealNumberType(type)){
-		double dbl;
-		memcpy(&dbl,&i64data,sizeof(double));
-		i64data=(_int64)dbl;
-	}
-
-	array_num=(int)i64data;
-
-	if(PTR_LEVEL(*pType)){
-		*pType=MAKE_PTR_TYPE(NATURAL_TYPE(*pType),PTR_LEVEL(*pType)-1);
-		array_num *= GetTypeSize(*pType,-1);
-	}
-	else{
-		//エラー
-		return 0;
-	}
-
-	extern HANDLE hDebugProcess;
-	ULONG_PTR lpData;
-	ULONG_PTR lpAccBytes;
-	lpData=Debugging_GetVarPtr(pRelativeVar);
-	if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&lpAccBytes)) return 0;
-	pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-	pRelativeVar->offset+=array_num;
-	return 1;
-}
-
-BOOL Debugging_GetMember(CClass *pobj_c,char *member,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpNestIndex,BOOL bPrivateAccess){
-	int i,i2;
-
-	//直接参照に切り替え
-	pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
-	pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-	//クラス、配列の構成要素を解析する
-	char VarName[VN_SIZE];		//変数名
-	char array[VN_SIZE];		//第1次配列
-	char lpPtrOffset[VN_SIZE];	//第2次配列
-	char NestMember[VN_SIZE];	//入れ子メンバ
-	CClass::RefType refType;
-	lstrcpy(VarName,member);
-	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return 0;
-
-
-	////////////////////////////
-	// メンバオフセットを取得
-	////////////////////////////
-
-	int offset = pobj_c->GetMemberOffset( VarName, &i );
-	if(i==pobj_c->iMemberNum) return 0;
-
-
-	//アクセシビリティをチェック
-	if((bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
-		pobj_c->ppobj_Member[i]->dwAccess==ACCESS_NON){
-		return 0;
-	}
-	else if(bPrivateAccess==0&&pobj_c->ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
-		return 0;
-
-	*pType=pobj_c->ppobj_Member[i]->TypeInfo.type;
-	*plpNestIndex=pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex;
-
-	//ポインタ変数の場合
-	if(IsPtrType(*pType)){
-		if(pobj_c->ppobj_Member[i]->SubScripts[0]==-1){
-			lstrcpy(lpPtrOffset,array);
-			array[0]=0;
-		}
-	}
-	else{
-		if(lpPtrOffset[0]) return 0;
-	}
-
-	pRelativeVar->offset+=offset;
-
-	if(array[0]){
-		//配列オフセット
-		i2=Debugging_GetArray(
-			pobj_c->ppobj_Member[i]->SubScripts,
-			array,
-			*pType,
-			pobj_c->ppobj_Member[i]->TypeInfo.u.lpIndex,
-			&pRelativeVar->offset);
-		if(i2==0){
-			//式エラー
-			return 0;
-		}
-		if(i2==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-	else if(pobj_c->ppobj_Member[i]->SubScripts[0]!=-1){
-		*pType|=FLAG_PTR;
-	}
-
-	if(NestMember[0]){
-		//入れ子構造の場合
-
-		if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
-			if( refType != CClass::Dot ) return 0;
-
-			if( *pType==DEF_OBJECT ){
-				extern HANDLE hDebugProcess;
-				LONG_PTR lpData;
-				SIZE_T stAccBytes;
-				lpData=Debugging_GetVarPtr(pRelativeVar);
-				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-			}
-		}
-		else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
-			//構造体ポインタ型メンバ変数
-
-			if(lpPtrOffset[0]){
-				if( refType != CClass::Dot ) return 0;
-
-				//直接参照に切り替え
-				Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
-
-				lpPtrOffset[0]=0;
-			}
-			else{
-				if( refType != CClass::Pointer ) return 0;
-
-				extern HANDLE hDebugProcess;
-				ULONG_PTR lpData;
-				ULONG_PTR lpAccBytes;
-				lpData=Debugging_GetVarPtr(pRelativeVar);
-				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&lpAccBytes)) return -1;
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-			}
-		}
-
-		i2=Debugging_GetMember(pobj_c->ppobj_Member[i]->TypeInfo.u.pobj_Class,
-			NestMember,
-			pType,
-			pRelativeVar,
-			plpNestIndex,
-			0);
-		if(i2==0){
-			//式エラー
-			return 0;
-		}
-		if(i2==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-
-	if(lpPtrOffset[0]){
-		Debugging_SetRelativeOffset(pType,*plpNestIndex,pRelativeVar,lpPtrOffset);
-	}
-
-	return 1;
-}
-int Debugging_GetArray(int *SubScripts,char *array,int type,LONG_PTR lpIndex,LONG_PTR *plpOffset){
-	extern HANDLE hHeap;
-	int i,i2,i3,i4,i5,array_offset,TypeSize;
-	char temporary[VN_SIZE],*pParm[MAX_PARMS];
-
-	for(i=0,i2=0,i3=0;;i++,i2++){
-		if(array[i]=='('){
-			i4=GetStringInPare(temporary+i2,array+i);
-			i+=i4-1;
-			i2+=i4-1;
-			continue;
-		}
-		if(array[i]=='['){
-			i4=GetStringInBracket(temporary+i2,array+i);
-			i+=i4-1;
-			i2+=i4-1;
-			continue;
-		}
-		if(array[i]==','||array[i]=='\0'){
-			if(SubScripts[i3]==-1){
-				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
-				return 0;
-			}
-
-			temporary[i2]=0;
-
-			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(pParm[i3],temporary);
-
-			i3++;
-
-			if(array[i]=='\0'){
-				if(SubScripts[i3]!=-1){
-					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
-					return 0;
-				}
-				break;
-			}
-
-			i2=-1;
-			continue;
-		}
-		temporary[i2]=array[i];
-	}
-
-	array_offset=0;
-
-	for(i=i3-1;i>=0;i--){
-		_int64 i64data;
-		i2=StaticCalculation(true, pParm[i],0,&i64data,0,1);
-		if(i2==0){
-			//式エラー
-			return 0;
-		}
-		if(i2==-1){
-			//アクセスエラー
-			return -1;
-		}
-		if(IsRealNumberType(i2)){
-			double dbl;
-			memcpy(&dbl,&i64data,sizeof(double));
-			i64data=(_int64)dbl;
-		}
-		i5=(int)i64data;
-
-		for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
-
-		array_offset+=i5*i4;
-
-		HeapDefaultFree(pParm[i]);
-	}
-
-	TypeSize=GetTypeSize(type,lpIndex);
-
-	array_offset*=TypeSize;
-
-	*plpOffset+=array_offset;
-
-	return 1;
-}
-ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
-	int i;
-	UserProc *pUserProc;
-
-	//ripからプロシージャを取得
-	pUserProc=GetSubFromObp(obp_Rip);
-
-	for(i=0;i<pUserProc->VarNum;i++){
-		if(lstrcmp(pUserProc->pVar[i].name,"_System_LocalThis")==0) break;
-	}
-	if(i==pUserProc->VarNum) return 0;
-
-	return pUserProc->pVar[i].offset;
-}
-int Debugging_GetVarOffset(char *variable,int *pType,RELATIVE_VAR *pRelativeVar,LONG_PTR *plpIndex,int *pss){
-	extern HANDLE hDebugProcess;
-	int i,i2,i3;
-	char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
-	ULONG_PTR lpData;
-	ULONG_PTR lpAccBytes;
-
-	lstrcpy(VarName,variable);
-	CClass::RefType refType;
-	GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
-
-	LONG_PTR lpIndex;
-	int *pSubScripts;
-	BOOL bArray;
-
-
-	/////////////////
-	// ローカル変数
-	/////////////////
-	extern VARIABLE *LocalVar;
-	extern int MaxLocalVarNum;
-	for(i=0;i<MaxLocalVarNum;i++){
-		if(lstrcmp(VarName,LocalVar[i].name)==0) break;
-	}
-	if(i!=MaxLocalVarNum){
-		//ポインタ変数の場合
-		if(IsPtrType(LocalVar[i].type)){
-			if(!LocalVar[i].bArray){
-				lstrcpy(lpPtrOffset,array);
-				array[0]=0;
-			}
-		}
-		else{
-			if(lpPtrOffset[0]) return 0;
-		}
-
-		pRelativeVar->offset=LocalVar[i].offset;
-		if(LocalVar[i].fRef) pRelativeVar->dwKind=VAR_REFLOCAL;
-		else pRelativeVar->dwKind=VAR_LOCAL;
-		*pType=LocalVar[i].type;
-		lpIndex=LocalVar[i].u.index;
-		*plpIndex=lpIndex;
-		bArray=LocalVar[i].bArray;
-		pSubScripts=LocalVar[i].SubScripts;
-	}
-	else{
-		if(pobj_CompilingClass){
-			///////////////////////
-			// クラスメンバの参照
-			///////////////////////
-
-			if(_memicmp(variable,"This.",5)==0){
-				//Thisオブジェクトのメンバを参照するとき
-				SlideString(variable+5,-5);
-				lstrcpy(VarName,variable);
-			}
-			else{
-				//クラス内メンバを参照するとき（通常）
-
-				for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
-					if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
-				}
-				if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
-			}
-
-			/////////////////////////////
-			// thisポインタを取得
-
-			extern HWND hDebugWnd;
-			i2=SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-			i2=pobj_dti->iProcLevel-i2;
-
-			lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
-			lpData+=pobj_dti->lplpSpBase[i2];
-			if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(ULONG_PTR),&lpAccBytes)){
-				//メモリにアクセスできないとき
-				return -1;
-			}
-
-			pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-			LONG_PTR lp2;
-			i3=Debugging_GetMember(pobj_CompilingClass,variable,pType,pRelativeVar,&lp2,1);
-			if(i3==0){
-				//式エラー
-				return 0;
-			}
-			if(i3==-1){
-				//アクセスエラー
-				return -1;
-			}
-
-			*plpIndex=lp2;
-			return 1;
-		}
-
-NonClassMember:
-
-
-		///////////////////
-		// グローバル変数
-		///////////////////
-		extern VARIABLE *GlobalVar;
-		extern int MaxGlobalVarNum;
-
-		for(i=0;i<MaxGlobalVarNum;i++){
-			if(lstrcmp(VarName,GlobalVar[i].name)==0) break;
-		}
-		if(i==MaxGlobalVarNum){
-			//一致しないとき
-			return 0;
-		}
-
-		//ポインタ変数の場合
-		if(IsPtrType(GlobalVar[i].type)){
-			if(!GlobalVar[i].bArray){
-				lstrcpy(lpPtrOffset,array);
-				array[0]=0;
-			}
-		}
-		else{
-			if(lpPtrOffset[0]) return 0;
-		}
-
-		pRelativeVar->offset=GlobalVar[i].offset;
-		if(GlobalVar[i].fRef) pRelativeVar->dwKind=VAR_REFGLOBAL;
-		else pRelativeVar->dwKind=VAR_GLOBAL;
-		*pType=GlobalVar[i].type;
-		lpIndex=GlobalVar[i].u.index;
-		*plpIndex=lpIndex;
-		bArray=GlobalVar[i].bArray;
-		pSubScripts=GlobalVar[i].SubScripts;
-	}
-
-
-	if(array[0]==0&&bArray){
-		//配列の先頭ポインタを示す場合
-		*pType|=FLAG_PTR;
-		if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM);
-		return 1;
-	}
-
-	if(array[0]){
-		i3=Debugging_GetArray(pSubScripts,array,*pType,lpIndex,&pRelativeVar->offset);
-		if(i3==0){
-			//式エラー
-			return 0;
-		}
-		if(i3==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-	if(member[0]){
-		if(*pType==DEF_OBJECT || *pType==DEF_STRUCT){
-			//実態オブジェクトのメンバを参照（obj.member）
-			if( refType != CClass::Dot ){
-				return 0;
-			}
-
-			LONG_PTR lp2;
-			i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
-			if(i3==0){
-				//式エラー
-				return 0;
-			}
-			if(i3==-1){
-				//アクセスエラー
-				return -1;
-			}
-
-			*plpIndex=lp2;
-		}
-		else if(*pType==DEF_PTR_OBJECT || *pType==DEF_PTR_STRUCT){
-			//ポインタオブジェクトが示すメンバを参照
-			if(lpPtrOffset[0]){
-				//pObj[n].member
-				if( refType != CClass::Dot ) return 0;
-				Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset);
-
-				LONG_PTR lp2;
-				i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
-				if(i3==0){
-					//式エラー
-					return 0;
-				}
-				if(i3==-1){
-					//アクセスエラー
-					return -1;
-				}
-
-				*plpIndex=lp2;
-			}
-			else{
-				//pObj->member
-				if( refType != CClass::Pointer ) return 0;
-
-				pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-				if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(ULONG_PTR),&lpAccBytes)) return -1;
-				pRelativeVar->offset=lpData;
-
-				LONG_PTR lp2;
-				i3=Debugging_GetMember((CClass *)lpIndex,member,pType,pRelativeVar,&lp2,0);
-				if(i3==0){
-					//式エラー
-					return 0;
-				}
-				if(i3==-1){
-					//アクセスエラー
-					return -1;
-				}
-
-				*plpIndex=lp2;
-			}
-		}
-		else{
-			return 0;
-		}
-		return 1;
-	}
-
-	if(lpPtrOffset[0]){
-		if(!Debugging_SetRelativeOffset(pType,lpIndex,pRelativeVar,lpPtrOffset)) return 0;
-	}
-
-	return 1;
-}
Index: /BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler64/BasicCompiler.vcproj	(revision 75)
+++ /BasicCompiler64/BasicCompiler.vcproj	(revision 76)
@@ -1258,94 +1258,4 @@
 			</Filter>
 			<Filter
-				Name="Debug"
-				>
-				<File
-					RelativePath="VarList.cpp"
-					>
-					<FileConfiguration
-						Name="Debug|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="0"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="1"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="English_Rel|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_MBCS;ENG;$(NoInherit)"
-							UsePrecompiledHeader="0"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release2|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="0"
-						/>
-					</FileConfiguration>
-				</File>
-				<File
-					RelativePath="WatchList.cpp"
-					>
-					<FileConfiguration
-						Name="Debug|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="0"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="1"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="English_Rel|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_MBCS;ENG;$(NoInherit)"
-							UsePrecompiledHeader="0"
-						/>
-					</FileConfiguration>
-					<FileConfiguration
-						Name="Release2|Win32"
-						>
-						<Tool
-							Name="VCCLCompilerTool"
-							PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MBCS;JPN;$(NoInherit)"
-							UsePrecompiledHeader="0"
-							BrowseInformation="0"
-						/>
-					</FileConfiguration>
-				</File>
-			</Filter>
-			<Filter
 				Name="32及び64共通"
 				>
@@ -1384,4 +1294,8 @@
 				<File
 					RelativePath="..\BasicCompiler_Common\Object.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\OldStatement.cpp"
 					>
 				</File>
@@ -1472,4 +1386,48 @@
 						RelativePath="..\BasicCompiler_Common\DebugSection.h"
 						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VarList.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\WatchList.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="English_Rel|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release2|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
 					</File>
 				</Filter>
Index: /BasicCompiler64/Compile_Func.cpp
===================================================================
--- /BasicCompiler64/Compile_Func.cpp	(revision 75)
+++ /BasicCompiler64/Compile_Func.cpp	(revision 76)
@@ -62,13 +62,11 @@
 
 		int reg=REG_RAX;
-		NumOpe(&reg,temporary,Type(),Type(),NULL);
+		NumOpe(&reg,temporary,Type(),Type());
 		return;
 	}
-
 
 	int SubScripts[MAX_ARRAYDIM];
 	RELATIVE_VAR RelativeVar;
 	if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,SubScripts)) return;
-
 
 	if(type.GetBasicType()&FLAG_PTR){
Index: /BasicCompiler64/Compile_ProcOp.cpp
===================================================================
--- /BasicCompiler64/Compile_ProcOp.cpp	(revision 75)
+++ /BasicCompiler64/Compile_ProcOp.cpp	(revision 76)
@@ -201,10 +201,13 @@
 	extern UserProc **ppSubHash;
 	extern BOOL bDebugCompile;
-	int i3,i4,BufferSize;
+	int i3,i4;
 	char temporary[VN_SIZE];
 
-	BufferSize=128;
-
 	if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
+
+	if( pUserProc->localVars.size() ){
+		SetError();
+		return;
+	}
 
 	pUserProc->CompleteCompile();
@@ -217,5 +220,4 @@
 	if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
 		if(!bDebugCompile){
-			pUserProc->localVars.clear();
 			return;
 		}
@@ -231,7 +233,5 @@
 		////////////////////
 
-		extern int MaxLocalVarNum;
 		extern int AllLocalVarSize;
-		MaxLocalVarNum=0;
 		AllLocalVarSize=0;
 
@@ -247,5 +247,4 @@
 
 		pUserProc->endOpAddress=obp;
-		pUserProc->localVars.clear();
 		return;
 	}
@@ -294,5 +293,4 @@
 	extern int AllLocalVarSize;
 	AllLocalVarSize=0;
-	pUserProc->localVars.clear();
 
 	//ローカル変数アドレススケジュール
Index: /BasicCompiler64/Compile_Statement.cpp
===================================================================
--- /BasicCompiler64/Compile_Statement.cpp	(revision 75)
+++ /BasicCompiler64/Compile_Statement.cpp	(revision 76)
@@ -964,331 +964,4 @@
 }
 
-void Opcode_Input(const char *Parameter){
-	extern int cp;
-	int i2,i3,i4,i5;
-	BOOL bFile;
-	char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
-
-	if(Parameter[0]=='#'){
-		bFile=1;
-		for(i2=0,i3=1;;i2++,i3++){
-			buffer[i2]=Parameter[i3];
-			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
-		}
-		buffer[i2+1]=0;
-		i2=i3+1;
-	}
-	else{
-		bFile=0;
-		i2=0;
-		buffer[0]=0;
-
-		//表示用文字列パラメータをセット
-		if(Parameter[0]=='\"'){
-			buffer[0]='\"';
-			for(i2=1;;i2++){
-				if(Parameter[i2]=='\"'){
-					buffer[i2]=0;
-					break;
-				}
-				buffer[i2]=Parameter[i2];
-			}
-			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
-			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
-			else SetError(10,"Input",cp);
-			i2+=2;
-		}
-		else if((Parameter[0]=='e'||Parameter[0]=='E')&&
-			(Parameter[1]=='x'||Parameter[1]=='X')&&
-			Parameter[2]=='\"'){
-			memcpy(buffer,Parameter,3);
-			for(i2=3;;i2++){
-				if(Parameter[i2]=='\"'){
-					buffer[i2]=0;
-					break;
-				}
-				buffer[i2]=Parameter[i2];
-			}
-			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
-			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
-			else SetError(10,"Input",cp);
-			i2+=2;
-		}
-		else{
-			lstrcpy(buffer,"\"? \"");
-			i2=0;
-		}
-	}
-
-	//変数ポインタ、変数のタイプをセット
-	i4=0;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(Parameter[i2]=='('){
-				i5=GetStringInPare(temporary+i3,Parameter+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-			}
-			if(Parameter[i2]=='['){
-				i5=GetStringInBracket(temporary+i3,Parameter+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-			}
-			if(Parameter[i2]==','){
-				temporary[i3]=0;
-				i2++;
-				break;
-			}
-			temporary[i3]=Parameter[i2];
-			if(Parameter[i2]=='\0') break;
-		}
-		if(temporary[0]=='\0'){
-			SetError(10,"Input",cp);
-			return;
-		}
-
-		Type varType;
-		if( !GetVarType(temporary, varType, 1) ){
-			return;
-		}
-
-		sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
-		OpcodeCalc(temp2);
-
-		if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
-		else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
-		else if(varType.IsObject()){
-			varType.SetBasicType( DEF_OBJECT );
-			if( varType.IsStringObject() ){
-				varType.SetBasicType( DEF_STRING );
-			}
-		}
-		sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
-		OpcodeCalc(temp2);
-
-		i4++;
-		if(Parameter[i2]=='\0') break;
-	}
-	sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
-	OpcodeCalc(temp2);
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
-	else pUserProc=GetSubHash("INPUT_FromPrompt");
-	if(!pUserProc){
-		SetError(3,"Input",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
-	extern int cp;
-	int i2,i3,i4,i5;
-	char temporary[VN_SIZE],temp2[8192];
-	BOOL bReturnLine;
-
-	char parms[8192];
-	lstrcpy( parms, Parameter );
-
-	i2=lstrlen(parms);
-	if(parms[i2-1]==';'){
-		bReturnLine=0;
-		parms[i2-1]=0;
-	}
-	else bReturnLine=1;
-
-	i3=lstrlen(buffer);
-	for(i2=0;;i2++,i3++){
-		if(parms[i2]==';'){
-			buffer[i3]=0;
-			break;
-		}
-		buffer[i3]=parms[i2];
-		if(parms[i2]=='\0') break;
-	}
-	if(parms[i2]==';') i2++;
-
-	if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
-
-	//データポインタ、データのタイプをセット
-	i4=0;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(parms[i2]=='\"'){
-				temporary[i3]=parms[i2];
-				for(i2++,i3++;;i2++,i3++){
-					temporary[i3]=parms[i2];
-					if(parms[i2]=='\"') break;
-				}
-				continue;
-			}
-			if(parms[i2]=='('){
-				i5=GetStringInPare(temporary+i3,parms+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-				continue;
-			}
-			if(parms[i2]=='['){
-				i5=GetStringInBracket(temporary+i3,parms+i2);
-				i2+=i5-1;
-				i3+=i5-1;
-				continue;
-			}
-			if(parms[i2]==','){
-				temporary[i3]=0;
-				i2++;
-				break;
-			}
-			temporary[i3]=parms[i2];
-			if(parms[i2]=='\0') break;
-		}
-		if(temporary[0]=='\0'){
-			SetError(10,"Print",cp);
-			return;
-		}
-
-		int iResult;
-		iResult=IsStrCalculation(temporary);
-
-		if(iResult==1){
-			//文字列
-			sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
-			OpcodeCalc(temp2);
-
-			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
-			OpcodeCalc(temp2);
-		}
-		else if(iResult==0){
-			//数値
-			sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
-			OpcodeCalc(temp2);
-
-			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
-			OpcodeCalc(temp2);
-		}
-		//else if(iResult==-1) エラー
-
-		i4++;
-		if(parms[i2]=='\0') break;
-	}
-	sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
-	OpcodeCalc(temp2);
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
-	else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
-	if(!pUserProc){
-		SetError(3,"Print",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-void Opcode_Print(const char *Parameter,BOOL bWrite){
-	int i2,i3,i4,sw;
-	char temporary[VN_SIZE],buffer[VN_SIZE];
-	BOOL bFile;
-
-	if(Parameter[0]=='#'){
-		bFile=1;
-		for(i2=0,i3=1;;i2++,i3++){
-			buffer[i2]=Parameter[i3];
-			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
-		}
-		buffer[i2+1]=0;
-		if(Parameter[i3]==',') i3++;
-		i2=i3;
-	}
-	else{
-		bFile=0;
-		i2=0;
-		buffer[0]=0;
-	}
-	if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
-		Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
-		return;
-	}
-
-	lstrcat(buffer,"_System_DummyStr+");
-
-	sw=1;
-	while(1){
-		for(i3=0;;i2++,i3++){
-			if(Parameter[i2]=='\"'){
-				temporary[i3]=Parameter[i2];
-				for(i2++,i3++;;i2++,i3++){
-					temporary[i3]=Parameter[i2];
-					if(Parameter[i2]=='\"') break;
-				}
-				continue;
-			}
-			if(Parameter[i2]=='('){
-				i4=GetStringInPare(temporary+i3,Parameter+i2);
-				i2+=i4-1;
-				i3+=i4-1;
-				continue;
-			}
-			if(Parameter[i2]=='['){
-				i4=GetStringInBracket(temporary+i3,Parameter+i2);
-				i2+=i4-1;
-				i3+=i4-1;
-				continue;
-			}
-			if(Parameter[i2]==','||Parameter[i2]==';'){
-				temporary[i3]=0;
-				break;
-			}
-			temporary[i3]=Parameter[i2];
-			if(Parameter[i2]=='\0') break;
-		}
-
-		if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
-		else{
-			int iResult;
-			iResult=IsStrCalculation(temporary);
-			if(iResult==-1){
-				//エラー
-				lstrcat(buffer,"\"\"");
-			}
-			else if(iResult){
-				//文字列
-				lstrcat(buffer,temporary);
-			}
-			else{
-				//数値
-				sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
-			}
-		}
-
-		if(Parameter[i2]==','){
-			if(bWrite) lstrcat(buffer,"+\",\"+");
-			else lstrcat(buffer,"+\"\t\"+");
-		}
-		else if(Parameter[i2]==';'){
-			if(Parameter[i2+1]=='\0'){
-				sw=0;
-				break;
-			}
-			if(bWrite) lstrcat(buffer,"+\",\"+");
-			else lstrcat(buffer,"+\" \"+");
-		}
-		else if(Parameter[i2]=='\0') break;
-
-		i2++;
-	}
-
-	if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
-
-	UserProc *pUserProc;
-	if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
-	else pUserProc=GetSubHash("PRINT_ToPrompt");
-	if(!pUserProc){
-		SetError(3,"Print",cp);
-		return;
-	}
-	Opcode_CallProc(buffer,pUserProc,0,"",0);
-}
-
-
-
 
 ////////////
Index: /BasicCompiler64/Compile_Var.cpp
===================================================================
--- /BasicCompiler64/Compile_Var.cpp	(revision 75)
+++ /BasicCompiler64/Compile_Var.cpp	(revision 76)
@@ -4,9 +4,7 @@
 //変数
 Variables globalVars;
-int MaxGlobalVarNum;
 int AllGlobalVarSize;
 int AllInitGlobalVarSize;
 
-int MaxLocalVarNum;
 int AllLocalVarSize;
 
Index: /BasicCompiler64/MakePeHdr.cpp
===================================================================
--- /BasicCompiler64/MakePeHdr.cpp	(revision 75)
+++ /BasicCompiler64/MakePeHdr.cpp	(revision 76)
@@ -264,4 +264,15 @@
 	obj_LexScopes.Init(obp);
 
+
+	/////////////////////////////////////////////////////////////////
+	// デバッグコンパイル用のログを生成する
+	/////////////////////////////////////////////////////////////////
+#ifdef _DEBUG
+	{
+		ofstream ofs("middle_code.txt");
+		ofs << basbuf << endl;
+		ofs.close();
+	}
+#endif
 
 
@@ -1090,12 +1101,4 @@
 	delete pobj_GlobalVarSchedule;
 
-	//グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
-	//（デバッグ情報で利用される）
-	foreach( Variable *pVar, globalVars ){
-		if(pVar->offset&0x80000000){
-			pVar->offset=(pVar->offset&0x7FFFFFFF)+AllInitGlobalVarSize;
-		}
-	}
-
 
 	////////////////////////////////
Index: /BasicCompiler64/NumOpe.cpp
===================================================================
--- /BasicCompiler64/NumOpe.cpp	(revision 75)
+++ /BasicCompiler64/NumOpe.cpp	(revision 76)
@@ -2,5 +2,5 @@
 #include "Opcode.h"
 
-void NewStringObject(int reg,LPSTR lpszText){
+void NewStringObject(int reg, const char *str){
 	///////////////////////////////////////////////////////
 	// lpszTextを元にStringオブジェクトを生成し、
@@ -14,6 +14,6 @@
 	//////////////////////////////////////////////////////
 
-		char *parameter = (char *)malloc( lstrlen( lpszText ) + 32 );
-		sprintf( parameter, "\"%s\"%c%c*Char", lpszText, 1, ESC_AS );
+		char *parameter = (char *)malloc( lstrlen( str ) + 32 );
+		sprintf( parameter, "\"%s\"%c%c*Char", str, 1, ESC_AS );
 		SetStringQuotes( parameter );
 
@@ -226,5 +226,5 @@
 					i3=lstrlen(term);
 StrLiteral:
-					
+
 					if( baseType.IsObject() ){
 						if( baseType.IsStringObject() ){
@@ -290,7 +290,6 @@
 						i4=GetStringInPare_RemovePare(temp2,term+i2+1);
 
-						int idProc;
 						void *pInfo;
-						idProc=GetProc(temporary,(void **)&pInfo);
+						int idProc=GetProc(temporary,(void **)&pInfo);
 
 						Type resultType;
@@ -550,5 +549,4 @@
 						}
 					}
-
 
 
Index: /BasicCompiler64/Opcode.h
===================================================================
--- /BasicCompiler64/Opcode.h	(revision 75)
+++ /BasicCompiler64/Opcode.h	(revision 76)
@@ -416,7 +416,4 @@
 void OpcodeGosub(char *Parameter);
 void OpcodeReturn(char *Parameter);
-void Opcode_Input(const char *Parameter);
-void Opcode_Print(const char *Parameter,BOOL bWrite);
-void OpcodeCallPtr(char *Parameter);
 void OpcodeSetPtrData(char *Parameter,int type);
 
Index: /BasicCompiler64/OperatorProc.cpp
===================================================================
--- /BasicCompiler64/OperatorProc.cpp	(revision 75)
+++ /BasicCompiler64/OperatorProc.cpp	(revision 76)
@@ -42,7 +42,4 @@
 	BOOL bTwoTerm=1;
 	if(idCalc==CALC_AS) bTwoTerm=0;
-
-
-	int i;
 
 
@@ -79,5 +76,5 @@
 	}
 
-	for(i=0;i<(int)params.size();i++){
+	for(int i=0;i<(int)params.size();i++){
 		CheckDifferentType(
 			pUserProc->Params()[i]->GetBasicType(),
Index: sicCompiler64/WatchList.cpp
===================================================================
--- /BasicCompiler64/WatchList.cpp	(revision 75)
+++ 	(revision )
@@ -1,528 +1,0 @@
-#include "../BasicCompiler_Common/common.h"
-#include "opcode.h"
-
-//デバッグ用
-#include "../BasicCompiler_Common/debug.h"
-
-int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
-
-ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
-	extern DWORD ImageBase;
-	extern int MemPos_RWSection;
-	int i2;
-
-	if(pRelativeVar->dwKind==VAR_GLOBAL){
-		return ImageBase+MemPos_RWSection+pRelativeVar->offset;
-	}
-	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
-		extern HANDLE hDebugProcess;
-		LONG_PTR lpData;
-		SIZE_T stAccBytes;
-		ReadProcessMemory(hDebugProcess,
-			(void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
-			&lpData,
-			sizeof(LONG_PTR),
-			&stAccBytes);
-
-		return lpData;
-	}
-	else if(pRelativeVar->dwKind==VAR_LOCAL){
-		extern HWND hDebugWnd;
-		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-		i2=pobj_dti->iProcLevel-i2;
-
-		if(pobj_dti->lplpSpBase[i2]==0) return 0;
-
-		return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
-	}
-	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
-		extern HWND hDebugWnd;
-		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-		i2=pobj_dti->iProcLevel-i2;
-
-		if(pobj_dti->lplpSpBase[i2]==0) return 0;
-
-		extern HANDLE hDebugProcess;
-		LONG_PTR lpData;
-		SIZE_T stAccBytes;
-		ReadProcessMemory(hDebugProcess,
-			(void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
-			&lpData,
-			sizeof(LONG_PTR),
-			&stAccBytes);
-
-		return lpData;
-	}
-	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
-		return pRelativeVar->offset;
-	}
-
-	return 0;
-}
-
-bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
-	int array_num;
-
-	_int64 i64data;
-	if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
-		return false;
-	}
-	if( type.IsReal() ){
-		double dbl;
-		memcpy(&dbl,&i64data,sizeof(double));
-		i64data=(_int64)dbl;
-	}
-
-	array_num=(int)i64data;
-
-	if( type.PtrLevel() ){
-		type.PtrLevelDown();
-		array_num *= type.GetSize();
-	}
-	else{
-		//エラー
-		return false;
-	}
-
-	extern HANDLE hDebugProcess;
-	LONG_PTR lpData;
-	SIZE_T stAccBytes;
-	lpData=Debugging_GetVarPtr(pRelativeVar);
-	if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
-		return false;
-	}
-	pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-	pRelativeVar->offset+=array_num;
-	return true;
-}
-
-int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
-	int i,i2;
-
-	//直接参照に切り替え
-	pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
-	pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-	//クラス、配列の構成要素を解析する
-	char VarName[VN_SIZE];		//変数名
-	char array[VN_SIZE];		//第1次配列
-	char lpPtrOffset[VN_SIZE];	//第2次配列
-	char NestMember[VN_SIZE];	//入れ子メンバ
-	CClass::RefType refType;
-	lstrcpy(VarName,member);
-	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
-
-
-	////////////////////////////
-	// メンバオフセットを取得
-	////////////////////////////
-
-	int offset = objClass.GetMemberOffset( VarName, &i );
-	if(i==objClass.iMemberNum) return 0;
-
-
-	//アクセシビリティをチェック
-	if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
-		objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
-		return 0;
-	}
-	else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
-		return 0;
-
-	resultType = *objClass.ppobj_Member[i];
-
-	//ポインタ変数の場合
-	if( resultType.IsPointer() ){
-		if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
-			lstrcpy(lpPtrOffset,array);
-			array[0]=0;
-		}
-	}
-	else{
-		if(lpPtrOffset[0]) return 0;
-	}
-
-	pRelativeVar->offset+=offset;
-
-	if(array[0]){
-		//配列オフセット
-		i2=Debugging_GetArray(
-			objClass.ppobj_Member[i]->SubScripts,
-			array,
-			resultType,
-			&pRelativeVar->offset);
-		if(i2==0){
-			//式エラー
-			return 0;
-		}
-		if(i2==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-	else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
-		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
-	}
-
-	if(NestMember[0]){
-		//入れ子構造の場合
-
-		if( resultType.IsObject() || resultType.IsStruct() ){
-			if( refType != CClass::Dot ) return 0;
-
-			if( resultType.IsObject() ){
-				extern HANDLE hDebugProcess;
-				LONG_PTR lpData;
-				SIZE_T stAccBytes;
-				lpData=Debugging_GetVarPtr(pRelativeVar);
-				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-			}
-		}
-		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
-			//構造体ポインタ型メンバ変数
-
-			if(lpPtrOffset[0]){
-				if( refType != CClass::Dot ) return 0;
-
-				//直接参照に切り替え
-				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
-
-				lpPtrOffset[0]=0;
-			}
-			else{
-				if( refType != CClass::Pointer ) return 0;
-
-				extern HANDLE hDebugProcess;
-				LONG_PTR lpData;
-				SIZE_T stAccBytes;
-				lpData=Debugging_GetVarPtr(pRelativeVar);
-				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)) return -1;
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-			}
-		}
-
-		i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetClass(),
-			NestMember,
-			pRelativeVar,
-			resultType,
-			0);
-		if(i2==0){
-			//式エラー
-			return 0;
-		}
-		if(i2==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-
-	if(lpPtrOffset[0]){
-		Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
-	}
-
-	return 1;
-}
-int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
-	extern HANDLE hHeap;
-	int i,i2,i3,i4,i5,array_offset;
-	char temporary[VN_SIZE],*pParm[MAX_PARMS];
-
-	for(i=0,i2=0,i3=0;;i++,i2++){
-		if(array[i]=='('){
-			i4=GetStringInPare(temporary+i2,array+i);
-			i+=i4-1;
-			i2+=i4-1;
-			continue;
-		}
-		if(array[i]=='['){
-			i4=GetStringInBracket(temporary+i2,array+i);
-			i+=i4-1;
-			i2+=i4-1;
-			continue;
-		}
-		if(array[i]==','||array[i]=='\0'){
-			if(SubScripts[i3]==-1){
-				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
-				return 0;
-			}
-
-			temporary[i2]=0;
-
-			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-			lstrcpy(pParm[i3],temporary);
-
-			i3++;
-
-			if(array[i]=='\0'){
-				if(SubScripts[i3]!=-1){
-					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
-					return 0;
-				}
-				break;
-			}
-
-			i2=-1;
-			continue;
-		}
-		temporary[i2]=array[i];
-	}
-
-	array_offset=0;
-
-	for(i=i3-1;i>=0;i--){
-		_int64 i64data;
-		Type resultType;
-		bool isMemoryAccessError;
-		if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
-			//式エラー
-			return 0;
-		}
-		if(isMemoryAccessError){
-			//アクセスエラー
-			return -1;
-		}
-
-		if(resultType.IsReal()){
-			double dbl;
-			memcpy(&dbl,&i64data,sizeof(double));
-			i64data=(_int64)dbl;
-		}
-		i5=(int)i64data;
-
-		for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
-
-		array_offset+=i5*i4;
-
-		HeapDefaultFree(pParm[i]);
-	}
-
-	array_offset *= type.GetSize();
-
-	*plpOffset+=array_offset;
-
-	return 1;
-}
-ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
-	UserProc *pUserProc = GetSubFromObp(obp_Rip);
-
-	foreach( Variable *pVar, pUserProc->localVars ){
-		if( pVar->GetName() == "_System_LocalThis" ){
-			return pVar->offset;
-		}
-	}
-	return 0;
-}
-int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
-	extern HANDLE hDebugProcess;
-	int i,i2,i3;
-	char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
-	LONG_PTR lpData;
-	SIZE_T stAccBytes;
-
-	lstrcpy(VarName,variable);
-	CClass::RefType refType;
-	GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
-
-	const int *pSubScripts;
-	bool isArray;
-
-
-	/////////////////
-	// ローカル変数
-	/////////////////
-	const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
-	if( pVar ){
-		//ポインタ変数の場合
-		if( pVar->IsPointer() ){
-			if( !pVar->IsArray() ){
-				lstrcpy(lpPtrOffset,array);
-				array[0]=0;
-			}
-		}
-		else{
-			if(lpPtrOffset[0]) return 0;
-		}
-
-		pRelativeVar->offset = pVar->offset;
-		if( pVar->IsRef() ){
-			pRelativeVar->dwKind=VAR_REFLOCAL;
-		}
-		else{
-			pRelativeVar->dwKind=VAR_LOCAL;
-		}
-		resultType = *pVar;
-		isArray = pVar->IsArray();
-		pSubScripts = pVar->GetSubScriptsPtr();
-	}
-	else{
-		if(pobj_CompilingClass){
-			///////////////////////
-			// クラスメンバの参照
-			///////////////////////
-
-			if(memicmp(variable,"This.",5)==0){
-				//Thisオブジェクトのメンバを参照するとき
-				SlideString(variable+5,-5);
-				lstrcpy(VarName,variable);
-			}
-			else{
-				//クラス内メンバを参照するとき（通常）
-
-				for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
-					if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
-				}
-				if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
-			}
-
-			/////////////////////////////
-			// thisポインタを取得
-
-			extern HWND hDebugWnd;
-			i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-			i2=pobj_dti->iProcLevel-i2;
-
-			lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
-			if(!lpData){
-				//式エラー
-				return 0;
-			}
-			lpData+=pobj_dti->lplpSpBase[i2];
-			if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&stAccBytes)){
-				//メモリにアクセスできないとき
-				return -1;
-			}
-
-			pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-			i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
-			if(i3==0){
-				//式エラー
-				return 0;
-			}
-			if(i3==-1){
-				//アクセスエラー
-				return -1;
-			}
-
-			return 1;
-		}
-
-NonClassMember:
-
-		///////////////////
-		// グローバル変数
-		///////////////////
-
-		const Variable *pVar = globalVars.Find( VarName );
-		if( !pVar ){
-			//一致しないとき
-			return 0;
-		}
-
-		//ポインタ変数の場合
-		if( pVar->IsPointer() ){
-			if( !pVar->IsArray() ){
-				lstrcpy(lpPtrOffset,array);
-				array[0]=0;
-			}
-		}
-		else{
-			if(lpPtrOffset[0]) return 0;
-		}
-
-		pRelativeVar->offset=pVar->offset;
-		if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
-		else pRelativeVar->dwKind=VAR_GLOBAL;
-		resultType = *pVar;
-		isArray = pVar->IsArray();
-		pSubScripts=pVar->GetSubScriptsPtr();
-	}
-
-
-	if(array[0]==0&&isArray){
-		//配列の先頭ポインタを示す場合
-		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
-		if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
-		return 1;
-	}
-
-	if(array[0]){
-		i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
-		if(i3==0){
-			//式エラー
-			return 0;
-		}
-		if(i3==-1){
-			//アクセスエラー
-			return -1;
-		}
-	}
-	if(member[0]){
-		if( resultType.IsObject() || resultType.IsStruct() ){
-			//実態オブジェクトのメンバを参照（obj.member）
-			if( refType != CClass::Dot ){
-				return 0;
-			}
-
-			i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
-			if(i3==0){
-				//式エラー
-				return 0;
-			}
-			if(i3==-1){
-				//アクセスエラー
-				return -1;
-			}
-		}
-		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
-			//ポインタオブジェクトが示すメンバを参照
-			if(lpPtrOffset[0]){
-				//pObj[n].member
-				if( refType != CClass::Dot ) return 0;
-				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
-
-				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
-				if(i3==0){
-					//式エラー
-					return 0;
-				}
-				if(i3==-1){
-					//アクセスエラー
-					return -1;
-				}
-			}
-			else{
-				//pObj->member
-				if( refType != CClass::Pointer ) return 0;
-
-				pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
-				pRelativeVar->dwKind=VAR_DIRECTMEM;
-
-				if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&stAccBytes)) return -1;
-				pRelativeVar->offset=lpData;
-
-				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
-				if(i3==0){
-					//式エラー
-					return 0;
-				}
-				if(i3==-1){
-					//アクセスエラー
-					return -1;
-				}
-			}
-		}
-		else{
-			return 0;
-		}
-		return 1;
-	}
-
-	if(lpPtrOffset[0]){
-		if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
-	}
-
-	return 1;
-}
Index: sicCompiler64/varlist.cpp
===================================================================
--- /BasicCompiler64/varlist.cpp	(revision 75)
+++ 	(revision )
@@ -1,1313 +1,0 @@
-#include "../BasicCompiler_Common/common.h"
-
-//デバッグ用
-#include "../BasicCompiler_Common/debug.h"
-
-//変数リストのツリーハンドル
-HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
-
-int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts);
-void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
-void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
-	extern HANDLE hDebugProcess;
-	int i2;
-	char temporary[255],temp2[255];
-	LONG_PTR pData;
-	SIZE_T stAccBytes;
-	double dbl;
-	float flt;
-	WORD wData;
-	BYTE byteData;
-	HTREEITEM hParent;
-	_int64 i64data;
-
-	if( type.IsObject() || type.IsStruct() ){
-		if( type.IsObject() ){
-			// 参照型ということを考慮する
-			ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
-			offset = pData;
-		}
-
-		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset);
-		lptv->item.iImage=1;
-		lptv->item.iSelectedImage=1;
-		hParent=TreeView_InsertItem(hVarTree,lptv);
-
-		VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
-		return;
-	}
-	else if( type.IsObjectPtr() || type.IsStructPtr() ){
-		i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes);
-
-		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(DWORD64)pData);
-		lptv->item.iImage=4;
-		lptv->item.iSelectedImage=4;
-		hParent=TreeView_InsertItem(hVarTree,lptv);
-
-		if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
-		return;
-	}
-	else{
-		if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1)){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&stAccBytes)){
-				for(i2=0;;i2++){
-					if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&stAccBytes)){
-						i2=-1;
-						break;
-					}
-					if(temporary[i2]=='\0') break;
-					if(i2==64){
-						lstrcpy(temporary+i2,"...");
-						break;
-					}
-				}
-				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(DWORD64)pData,(DWORD64)pData);
-				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(DWORD64)pData,(DWORD64)pData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsDouble()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsSingle()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsInt64()){
-			_int64 i64data;
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
-				_i64toa(i64data,temporary,10);
-				_i64toa(i64data,temp2,16);
-				CharUpper(temp2);
-				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsQWord()||type.IsPointer()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
-				_ui64toa(i64data,temporary,10);
-				_ui64toa(i64data,temp2,16);
-				CharUpper(temp2);
-				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsLong()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,i64data,i64data);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsDWord()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,i64data,i64data);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsInteger()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsWord()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&stAccBytes)){
-				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsSByte()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
-				temporary[0]=byteData;
-				temporary[1]=0;
-				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsByte()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
-				temporary[0]=byteData;
-				temporary[1]=0;
-				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		else if(type.IsBoolean()){
-			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&stAccBytes)){
-				if( byteData ) lstrcpy( temporary, "True" );
-				else lstrcpy( temporary, "False" );
-
-				wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
-			}
-			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
-		}
-		lptv->item.iImage=2;
-		lptv->item.iSelectedImage=2;
-	}
-	TreeView_InsertItem(hVarTree,lptv);
-}
-void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
-	int i,i2;
-	char VarData[VN_SIZE],VarName[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=hParent;
-	tv.item.pszText=VarData;
-
-	for(i=0;i<objClass.iMemberNum;i++){
-		if(bPtr){
-			lstrcpy(VarName,"->");
-			lstrcat(VarName,objClass.ppobj_Member[i]->name);
-		}
-		else{
-			lstrcpy(VarName,".");
-			lstrcat(VarName,objClass.ppobj_Member[i]->name);
-		}
-
-		LONG_PTR offset;
-		offset=objClass.GetMemberOffset( objClass.ppobj_Member[i]->name, &i2 );
-
-		if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
-			//構造体内の配列
-			sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree,&tv);
-
-			i2=VarList_Array(hVarTree,hParent,
-				pTopOffset+offset,
-				*objClass.ppobj_Member[i],
-				objClass.ppobj_Member[i]->SubScripts);
-		}
-		else{
-			//メンバ変数
-			VarList_Insert(hVarTree,
-				&tv,
-				VarName,
-				*objClass.ppobj_Member[i],
-				pTopOffset+offset);
-		}
-	}
-}
-int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts ){
-	int i,i2,i3,ElementNum,MemCounter,UseCount[255];
-	char temporary[VN_SIZE],temp2[DIGIT_SIZE];
-
-	TV_INSERTSTRUCT tv;
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=hParent;
-	tv.item.pszText=temporary;
-
-	for(i=0;i<255;i++){
-		if(SubScripts[i]==-1) break;
-		UseCount[i]=0;
-	}
-	UseCount[i]=-2;
-	MemCounter=0;
-	while(1){
-		UseCount[i]++;
-		for(ElementNum=0;SubScripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
-			UseCount[i-ElementNum]=0;
-			if(i-ElementNum-1<0) return MemCounter;
-			UseCount[i-ElementNum-1]++;
-		}
-
-		if(MemCounter<50){
-			temporary[0]='[';
-			temporary[1]=0;
-			for(i2=0;i2<i;i2++){
-				sprintf(temp2,"%d",UseCount[i2]);
-				lstrcat(temporary,temp2);
-				lstrcat(temporary,",");
-			}
-			i3=lstrlen(temporary);
-			temporary[i3-1]=']';
-			temporary[i3]=0;
-
-			VarList_Insert(hVarTree,&tv,temporary,type,
-				offset+MemCounter*type.GetSize());
-		}
-
-		MemCounter++;
-		if(MemCounter==50){
-			lstrcpy(tv.item.pszText,"...");
-			TreeView_InsertItem(hVarTree,&tv);
-		}
-	}
-	return 0;
-}
-void RefreshGlobalVar(void){
-	extern DWORD ImageBase;
-	char temporary[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-	HTREEITEM hParent;
-
-	TreeView_DeleteAllItems(hVarTree_Global);
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=TVI_ROOT;
-	tv.item.pszText=temporary;
-
-	extern HANDLE hDebugProcess;
-	extern int MemPos_RWSection;
-
-	foreach( Variable *pVar, globalVars ){
-
-		//スコープ外の場合は無視
-		if(pVar->ScopeLevel!=0){
-			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0]  &&
-				pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
-				//範囲内
-			}
-			else{
-				//範囲外
-				continue;
-			}
-		}
-
-
-		if(!pobj_nv->bShow_DefaultSystem_Var){
-			if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
-				memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
-				memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
-		}
-		if(!pobj_nv->bShow_Rad_Var){
-			if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
-		}
-		if(!pobj_nv->bShow_GUID_Var){
-			if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
-				memcmp(pVar->GetName().c_str(),"IID_",4)==0||
-				memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
-		}
-
-		//静的メンバ
-		if(strstr(pVar->GetName().c_str(),".")) continue;
-
-		if(pVar->IsArray()){
-			sprintf(temporary,"%s %s(&H%X)",
-				pVar->GetName().c_str(),
-				STRING_ARRAY,
-				ImageBase+MemPos_RWSection+pVar->offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_Global,&tv);
-
-			VarList_Array(hVarTree_Global,hParent,
-				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
-				*pVar,
-				pVar->GetSubScriptsPtr());
-		}
-		else{
-			VarList_Insert(hVarTree_Global,
-				&tv,
-				pVar->GetName().c_str(),
-				*pVar,
-				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset));
-		}
-	}
-}
-void RefreshLocalVar(void){
-	int i,i2,i3,sw;
-	char temporary[VN_SIZE];
-	TV_INSERTSTRUCT tv;
-	HTREEITEM hParent;
-	LONG_PTR offset;
-	SIZE_T stAccBytes;
-	LONG_PTR lpData;
-
-	TreeView_DeleteAllItems(hVarTree_Local);
-
-	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
-	tv.hInsertAfter=TVI_LAST;
-	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
-	tv.hParent=TVI_ROOT;
-	tv.item.pszText=temporary;
-
-	extern HANDLE hDebugProcess;
-	extern HWND hDebugWnd;
-	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-	i2=pobj_dti->iProcLevel-i2;
-
-	if(pobj_dti->lplpSpBase[i2]==0) return;
-
-	extern UserProc **ppSubHash;
-	UserProc *pUserProc;
-	for(i3=0,sw=0;i3<MAX_HASH;i3++){
-		pUserProc=ppSubHash[i3];
-		while(pUserProc){
-			if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-				sw=1;
-				break;
-			}
-
-			pUserProc=pUserProc->pNextData;
-		}
-		if(sw) break;
-	}
-	if(!pUserProc) return;
-
-	foreach( Variable *pVar, UserProc::CompilingUserProc().localVars ){
-
-		//スコープ外の場合は無視
-		if(pVar->ScopeLevel!=0){
-			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
-				//範囲内
-			}
-			else{
-				//範囲外
-				continue;
-			}
-		}
-
-		if(pVar->IsArray()){
-			sprintf(temporary,"%s %s(&H%X)",
-				pVar->GetName().c_str(),
-				STRING_ARRAY,
-				pobj_dti->lplpSpBase[i2]+pVar->offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_Local,&tv);
-
-			VarList_Array(hVarTree_Local,hParent,
-				pobj_dti->lplpSpBase[i2]+pVar->offset,
-				*pVar,
-				pVar->GetSubScriptsPtr());
-		}
-		else{
-			offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
-			if(pVar->IsRef()){
-				ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&stAccBytes);
-				offset=lpData;
-			}
-			VarList_Insert(hVarTree_Local,&tv,
-				pVar->GetName().c_str(),
-				*pVar,
-				offset);
-		}
-	}
-
-
-
-	/////////////////////////////
-	// Thisオブジェクトのリスト
-	/////////////////////////////
-
-	TreeView_DeleteAllItems(hVarTree_This);
-	if(!pUserProc->GetParentClassPtr()) return;
-
-	//Thisポインタを取得
-	LONG_PTR pThis;
-	const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( "_System_LocalThis" );
-	if( !pVar ){
-		return;
-	}
-	lpData=pobj_dti->lplpSpBase[i2]+pVar->offset;
-	ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&stAccBytes);
-
-	for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){
-		offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,&i2);
-
-		if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){
-			//配列
-			sprintf(temporary,"%s %s(&H%X)",
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
-				STRING_ARRAY,
-				(DWORD64)offset);
-			tv.item.iImage=0;
-			tv.item.iSelectedImage=0;
-			hParent=TreeView_InsertItem(hVarTree_This,&tv);
-
-			VarList_Array(hVarTree_This,hParent,
-				pThis+offset,
-				*pUserProc->GetParentClassPtr()->ppobj_Member[i],
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts);
-		}
-		else{
-			VarList_Insert(hVarTree_This,&tv,
-				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
-				*pUserProc->GetParentClassPtr()->ppobj_Member[i],
-				pThis+offset);
-		}
-	}
-}
-void RefreshGlobalVar_with_WindowLock(void){
-	extern HWND hDebugWnd;
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
-
-	//リフレッシュ
-	RefreshGlobalVar();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
-}
-void RefreshLocalVar_with_WindowLock(void){
-	extern HWND hDebugWnd;
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
-
-	//リフレッシュ
-	RefreshLocalVar();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
-}
-
-void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
-	char temporary[255],temp2[255];
-
-	//エスケープシーケンスをセット
-	SetEscapeSequenceFormat(buffer);
-
-	KillStringSpaces(buffer);
-
-	//カッコを相互チェック
-	if(!CheckParenthesis2(buffer)){ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
-		return;
-	}
-
-	double dbl;
-	_int64 i64data;
-	Type resultType;
-	bool isMemoryAccessError;
-	if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
-		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
-	}
-	else if(isMemoryAccessError){
-		ListView_SetItemText(hListView,iItem,1,"アクセスできません");
-	}
-	else{
-		if(resultType.IsReal()){
-			memcpy(&dbl,&i64data,sizeof(double));
-			sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
-		}
-		else if(resultType.Is64()){
-			_i64toa(i64data,temporary,10);
-			_i64toa(i64data,temp2,16);
-			CharUpper(temp2);
-			sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
-		}
-		else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
-
-		ListView_SetItemText(hListView,iItem,1,temporary);
-	}
-}
-void RefreshWatchList(void){
-	extern HWND hDebugWnd;
-	HWND hListView;
-	int i,i2;
-	char temporary[VN_SIZE];
-
-	hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
-	i2=ListView_GetItemCount(hListView);
-	for(i=0;i<i2-1;i++){
-		ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
-
-		//演算結果を表示
-		SetCalcToWatchList(hListView,i,temporary);
-	}
-}
-
-BOOL SetDebugProcCombo(HWND hProcCombo){
-	int i2,i3;
-	char temporary[255];
-
-	extern DWORD ImageBase;
-	extern int MemPos_CodeSection;
-
-	//行番号情報
-	extern int MaxLineInfoNum;
-	extern LINEINFO *pLineInfo;
-	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
-		for(i2=0;i2<MaxLineInfoNum-1;i2++){
-			if((DWORD64)(pLineInfo[i2].TopObp+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
-				pobj_dti->lplpObp[i3]<=(DWORD64)(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
-		}
-		if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
-		else pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
-	}
-	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
-		if(pobj_dti->lpdwCp[i3]==-1){
-			pobj_dti->iProcLevel--;
-			for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
-				pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
-				pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
-				pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
-			}
-			i3--;
-			continue;
-		}
-	}
-
-	if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
-		extern HWND hMainDlg;
-		//"デバッグ情報の取得に失敗"
-		MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
-		return 0;
-	}
-	ShowErrorLine(i2,temporary);
-
-	//プロシージャ コンボボックス
-	extern UserProc **ppSubHash;
-	UserProc *pUserProc;
-	int sw;
-	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
-	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
-		for(i3=0,sw=0;i3<MAX_HASH;i3++){
-			pUserProc=ppSubHash[i3];
-			while(pUserProc){
-				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-						lstrcpy(temporary,pUserProc->GetName().c_str());
-						sw=1;
-						break;
-				}
-				pUserProc=pUserProc->pNextData;
-			}
-			if(sw) break;
-		}
-		if(!pUserProc){
-			if(i2==0){
-				lstrcpy(temporary,"Global");
-				pobj_dti->lplpSpBase[i2]=0;
-			}
-			else lstrcpy(temporary,"error");
-		}
-		SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
-	}
-	SendMessage(hProcCombo,CB_SETCURSEL,0,0);
-
-	return pobj_dti->iProcLevel;
-}
-
-//IDC_THREADCOMBOプロシージャ
-LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern WNDPROC OldThreadComboProc;
-	int i2;
-	DWORD dwThreadID;
-	char temporary[255];
-
-	switch(message){
-		case WM_COMMAND:
-			if(HIWORD(wParam)==CBN_SELCHANGE){
-				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
-				sscanf(temporary+2,"%X",&dwThreadID);
-
-				extern DWORD _DebugSys_dwThreadID[256];
-				i2=0;
-				while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
-
-				//次回のステップ実行対象を指定
-				extern int NextStepThreadNum;
-				NextStepThreadNum=i2;
-
-				//スレッド情報をリフレッシュ
-				pobj_dti->Reflesh(i2);
-
-				SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
-
-				SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
-			}
-			break;
-	}
-	return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
-}
-//IDC_PROCCOMBOプロシージャ
-LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern WNDPROC OldProcComboProc;
-	int i2,i3;
-	char temporary[MAX_PATH];
-
-	switch(message){
-		case WM_COMMAND:
-			if(HIWORD(wParam)==CBN_SELCHANGE){
-				i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
-				GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
-				ShowErrorLine(i3,temporary);
-
-				RefreshLocalVar_with_WindowLock();
-			}
-			break;
-	}
-	return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
-}
-void InitVarList(DWORD dwThreadId){
-	extern HWND hDebugWnd;
-	int i2,i3,i5;
-	char temporary[255];
-
-
-	//スレッド
-	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
-	extern DWORD _DebugSys_dwThreadID[256];
-	for(i2=0;i2<256;i2++){
-		if(_DebugSys_dwThreadID[i2]){
-			sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
-			SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
-			if(_DebugSys_dwThreadID[i2]==dwThreadId){
-				extern int NextStepThreadNum;
-				NextStepThreadNum=i2;
-			}
-		}
-	}
-	sprintf(temporary,"&H%08X",dwThreadId);
-	i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
-	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
-
-	i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
-
-
-	///////////////////////////////////////////////
-	// 実行中のプロシージャのローカル変数をセット
-	///////////////////////////////////////////////
-
-	int sw;
-
-	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
-	i2=pobj_dti->iProcLevel-i2;
-
-	if(pobj_dti->lplpSpBase[i2]){
-		extern UserProc **ppSubHash;
-		UserProc *pUserProc;
-		for(i3=0,sw=0;i3<MAX_HASH;i3++){
-			pUserProc=ppSubHash[i3];
-			while(pUserProc){
-				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
-					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
-					sw=1;
-					break;
-				}
-
-				pUserProc=pUserProc->pNextData;
-			}
-			if(sw) break;
-		}
-
-
-		if(pUserProc){
-			pobj_CompilingClass=pUserProc->GetParentClassPtr();
-			UserProc::CompileStartForUserProc( pUserProc );
-		}
-	}
-
-
-	////////////////////////
-	// 変数リストを再表示
-	////////////////////////
-
-	//処理時間を短くするため、一時的に非表示にする
-	LockWindowUpdate(hDebugWnd);
-	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
-	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
-
-	//リフレッシュ
-	RefreshLocalVar();
-	RefreshGlobalVar();
-	RefreshWatchList();
-
-	LockWindowUpdate(NULL);
-	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
-	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
-}
-
-
-
-
-//////////////////////////////////////
-// エディタに埋め込み表示のデバッガ
-//////////////////////////////////////
-
-BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-
-	//デバッガ用ツールバー
-#define BMPNUM_DEBUGGERTOOLBAR 3
-#define BTNNUM_DEBUGGERTOOLBAR 4
-	TBBUTTON DebuggerToolBar[]={
-		{0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-		{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
-		{1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-		{2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
-	};
-	TOOLTIPTEXT *pTipText;
-
-	static HIMAGELIST hImageList,hImageList_Disabled;
-
-	switch(message){
-		case WM_INITDIALOG:
-			//ツールバーを生成
-			extern HWND hDebuggerToolbar;
-			hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
-				NULL,
-				0,0,0,
-				DebuggerToolBar,
-				BTNNUM_DEBUGGERTOOLBAR,	/*アイテムの個数*/
-				0,0,16,15,sizeof(TBBUTTON));
-
-			hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
-				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
-			SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
-			hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
-				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
-			SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
-
-			break;
-		case WM_COMMAND:
-			switch(LOWORD(wParam)){
-				case IDC_DEBUG_START:
-					DestroyWindow(GetParent(hwnd));
-					return 1;
-				case IDC_DEBUG_STEPIN:
-					dwStepRun=1;
-					return 1;
-				case IDC_DEBUG_STEPOVER:
-					dwStepRun=2;
-					return 1;
-			}
-			break;
-		case WM_NOTIFY:
-			pTipText=(TOOLTIPTEXT *)lParam;
-			if(pTipText->hdr.code==TTN_NEEDTEXT){
-				//ツールチップを表示
-				switch(pTipText->hdr.idFrom){
-					case IDC_DEBUG_START:
-						pTipText->lpszText="実行";
-						break;
-					case IDC_DEBUG_STEPOVER:
-						pTipText->lpszText="ステップ アウト";
-						break;
-					case IDC_DEBUG_STEPIN:
-						pTipText->lpszText="ステップ イン";
-						break;
-				}
-			}
-			break;
-		case WM_SIZE:
-			MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
-			return 1;
-
-		case WM_DESTROY:
-			ImageList_Destroy(hImageList);
-			ImageList_Destroy(hImageList_Disabled);
-			return 1;
-	}
-	return 0;
-}
-
-WNDPROC OldTabProc;
-LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HINSTANCE hInst;
-
-	static HMENU hDummyMenu,hMenu=0;
-
-	switch(message){
-		case WM_CONTEXTMENU:
-			if(hMenu==0){
-				hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
-				hMenu=GetSubMenu(hDummyMenu,0);
-			}
-
-			MENUITEMINFO mi;
-			mi.cbSize=sizeof(MENUITEMINFO);
-			mi.fMask=MIIM_STATE;
-			mi.fState=MFS_CHECKED;
-
-			if(pobj_nv->bShow_DefaultSystem_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
-			if(pobj_nv->bShow_Rad_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
-			if(pobj_nv->bShow_GUID_Var)
-				SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
-
-			TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
-
-			break;
-		case WM_COMMAND:
-			mi.cbSize=sizeof(MENUITEMINFO);
-			mi.fMask=MIIM_STATE;
-			switch(LOWORD(wParam)){
-				case IDM_SHOW_DEFAULTSYSTEM_VAR:
-					if(pobj_nv->bShow_DefaultSystem_Var){
-						pobj_nv->bShow_DefaultSystem_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_DefaultSystem_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-				case IDM_SHOW_RAD_VAR:
-					if(pobj_nv->bShow_Rad_Var){
-						pobj_nv->bShow_Rad_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_Rad_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-				case IDM_SHOW_GUID_VAR:
-					if(pobj_nv->bShow_GUID_Var){
-						pobj_nv->bShow_GUID_Var=0;
-						mi.fState=MFS_UNCHECKED;
-					}
-					else{
-						pobj_nv->bShow_GUID_Var=1;
-						mi.fState=MFS_CHECKED;
-					}
-					SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
-					RefreshGlobalVar_with_WindowLock();
-					break;
-			}
-			break;
-		case WM_DESTROY:
-			DestroyMenu(hMenu);
-			hMenu=0;
-			break;
-	}
-	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
-}
-
-BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HANDLE hHeap;
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-	extern double width_ratio_VarList;
-	RECT rect;
-	int i,i2,i3;
-	char temporary[VN_SIZE];
-	LV_DISPINFO *lvinfo;
-	LVITEM ListView_Item;
-
-	static POINT pos_VarList;
-	static POINT pos_WatchList;
-
-	switch(message){
-		case WM_INITDIALOG:
-			extern HWND hDebugWnd;
-			hDebugWnd=hwnd;
-
-			//変数リストの初期位置を取得
-			GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
-			pos_VarList.x=rect.left;
-			pos_VarList.y=rect.top;
-			ScreenToClient(hwnd,&pos_VarList);
-
-			//ウォッチリストの初期位置を取得
-			pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
-			pos_WatchList.y=0;
-
-			//ツールバーのベースウィンドウを生成
-			static HWND hBase_ToolBar;
-			hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
-			MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
-
-			extern WNDPROC OldThreadComboProc;
-			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
-			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
-
-			extern WNDPROC OldProcComboProc;
-			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
-			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
-
-
-			///////////////////////////
-			// タブコントロールを生成
-			///////////////////////////
-
-			static HWND hTab;
-			HFONT hFont;
-			hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
-			hTab=CreateWindow(WC_TABCONTROL,NULL,
-				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
-				0,0,0,0,hwnd,0,hInst,0);
-			SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
-			OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
-			SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
-
-			//タブを設定
-			TC_ITEM tcItem;
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="グローバル";
-			SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="ローカル";
-			SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
-			tcItem.mask=TCIF_TEXT;
-			tcItem.pszText="This";
-			SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
-
-			//グローバル変数リストのツリーを作成
-			hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			//ローカル変数リストのツリーを作成
-			hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			//This変数リストのツリーを作成
-			hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
-				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
-				0,0,0,0,
-				hTab,0,hInst,0);
-
-			ShowWindow(hVarTree_Global,SW_SHOW);
-
-
-			//イメージリスト読み込み、設定
-			static HIMAGELIST hVariOrderImageList;
-			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
-			TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
-			TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
-			TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
-
-
-			/////////////////////////
-			// ウォッチリスト
-			/////////////////////////
-
-			//コラムの設定
-			static HWND hListView;
-			LV_COLUMN ListView_Column;
-			DWORD dwStyle;
-
-			hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
-			GetClientRect(hListView,&rect);
-			dwStyle=ListView_GetExtendedListViewStyle(hListView);
-			dwStyle|=LVS_EX_FULLROWSELECT;
-			ListView_SetExtendedListViewStyle(hListView,dwStyle);
-
-			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
-			ListView_Column.fmt=LVCFMT_LEFT;
-
-			extern int width_WatchColumn_Expression;
-			ListView_Column.cx=width_WatchColumn_Expression;
-			ListView_Column.pszText="ウォッチ式";
-			ListView_Column.iSubItem=0;
-			ListView_InsertColumn(hListView,0,&ListView_Column);
-
-			extern int width_WatchColumn_Value;
-			ListView_Column.cx=width_WatchColumn_Value;
-			ListView_Column.pszText="値";
-			ListView_Column.iSubItem=1;
-			ListView_InsertColumn(hListView,1,&ListView_Column);
-
-			//アイテムの設定
-			ListView_Item.mask=LVIF_TEXT;
-			ListView_Item.iSubItem=0;
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				ListView_Item.pszText=pobj_nv->ppWatchStr[i];
-				ListView_Item.iItem=i;
-				ListView_InsertItem(hListView,&ListView_Item);
-			}
-			ListView_Item.pszText="...";
-			ListView_Item.iItem=i;
-			ListView_InsertItem(hListView,&ListView_Item);
-
-
-			///////////////////////
-			// 変数リストの初期化
-			///////////////////////
-			InitVarList((DWORD)lParam);
-
-			break;
-		case WM_NOTIFY:
-			NMHDR *hdr;
-			hdr=(NMHDR *)lParam;
-			if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
-				i=TabCtrl_GetCurSel(hTab);
-
-				if(i==0){
-					//グローバル変数を表示
-					ShowWindow(hVarTree_Global,SW_SHOW);
-					ShowWindow(hVarTree_Local,SW_HIDE);
-					ShowWindow(hVarTree_This,SW_HIDE);
-				}
-				else if(i==1){
-					//ローカル変数を表示
-					ShowWindow(hVarTree_Global,SW_HIDE);
-					ShowWindow(hVarTree_Local,SW_SHOW);
-					ShowWindow(hVarTree_This,SW_HIDE);
-				}
-				else if(i==2){
-					//This変数を表示
-					ShowWindow(hVarTree_Global,SW_HIDE);
-					ShowWindow(hVarTree_Local,SW_HIDE);
-					ShowWindow(hVarTree_This,SW_SHOW);
-				}
-			}
-
-			if(hdr->hwndFrom==hListView){
-				lvinfo=(LV_DISPINFO *)hdr;
-				if(hdr->code==NM_DBLCLK){
-					i2=ListView_GetItemCount(hListView);
-					for(i=0;i<i2;i++){
-						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
-					}
-					if(i==i2) break;
-
-					ListView_EditLabel(hListView,i);
-				}
-
-				static HWND hEdit;
-				if(hdr->code==LVN_BEGINLABELEDIT){
-					hEdit=ListView_GetEditControl(hListView);
-
-					GetWindowText(hEdit,temporary,VN_SIZE);
-					if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
-				}
-				if(hdr->code==LVN_ENDLABELEDIT){
-					GetWindowText(hEdit,temporary,VN_SIZE);
-					if(temporary[0]=='\0'){
-						if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
-
-						//空白入力の場合はそのアイテムを削除する
-						ListView_DeleteItem(hListView,lvinfo->item.iItem);
-						break;
-					}
-					ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
-
-					//演算結果を表示
-					SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
-
-					if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
-						//リストアイテムを追加
-						ListView_Item.mask=LVIF_TEXT;
-						ListView_Item.pszText="...";
-						ListView_Item.iItem=lvinfo->item.iItem+1;
-						ListView_Item.iSubItem=0;
-						ListView_InsertItem(hListView,&ListView_Item);
-					}
-				}
-
-				if(hdr->code==LVN_KEYDOWN){
-					LV_KEYDOWN *plvKeydown;
-					plvKeydown=(LV_KEYDOWN *)hdr;
-					if(plvKeydown->wVKey==VK_DELETE){
-						i2=ListView_GetItemCount(hListView);
-						for(i=i2-2;i>=0;i--){
-							if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
-								ListView_DeleteItem(hListView,i);
-								i3=i;
-							}
-						}
-
-						ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
-					}
-				}
-			}
-			break;
-
-		case WM_SIZE:
-			//変数リストの位置
-			int width_VarList;
-			width_VarList=
-				(int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
-
-			MoveWindow(hTab,
-				pos_VarList.x,
-				pos_VarList.y,
-				width_VarList,
-				HIWORD(lParam)-pos_VarList.y,
-				1);
-
-			GetClientRect(hTab,&rect);
-			TabCtrl_AdjustRect(hTab,FALSE,&rect);
-			rect.left-=2;
-			rect.right++;
-			rect.bottom++;
-
-			MoveWindow(hVarTree_Global,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-			MoveWindow(hVarTree_Local,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-			MoveWindow(hVarTree_This,
-				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
-
-			pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
-			pos_WatchList.y=0;
-
-			//ウォッチリストの位置
-			MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
-				pos_WatchList.x,
-				pos_WatchList.y,
-				LOWORD(lParam)-pos_WatchList.x,
-				HIWORD(lParam)-pos_WatchList.y,
-				1);
-
-			return 1;
-
-		case WM_VARLIST_CLOSE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_DESTROY:
-			ImageList_Destroy(hVariOrderImageList);
-
-
-			//////////////////////////////////////////////////////////////
-			// ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
-			//////////////////////////////////////////////////////////////
-
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				HeapDefaultFree(pobj_nv->ppWatchStr[i]);
-			}
-			HeapDefaultFree(pobj_nv->ppWatchStr);
-
-			pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
-			pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
-			for(i=0;i<pobj_nv->WatchNum;i++){
-				ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
-				pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
-				lstrcpy(pobj_nv->ppWatchStr[i],temporary);
-			}
-
-
-			//////////////////////////////
-			// デバッグダイアログを破棄
-			//////////////////////////////
-
-			hDebugWnd=0;
-
-			extern BOOL bClipCompileView;
-			if(bClipCompileView){
-				extern HWND hOwnerEditor;
-				SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
-			}
-
-			return 1;
-
-
-
-		///////////////////////
-		// デバッグコマンド
-		///////////////////////
-
-		case WM_DEBUG_CONTINUE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_STEP_IN:
-			Debugger_StepIn();
-			return 1;
-		case WM_STEP_OVER:
-			Debugger_StepOver();
-			return 1;
-		case WM_STEP_CURSOR:
-			Debugger_StepCursor();
-			return 1;
-	}
-	return 0;
-}
-
-
-
-
-//////////////////////////////////
-// ポップアップ表示の変数リスト
-//////////////////////////////////
-
-BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
-	extern HANDLE hHeap;
-	extern HINSTANCE hInst;
-	extern DWORD dwStepRun;
-	RECT rect;
-	POINT pos;
-	SIZE size;
-
-	switch(message){
-		case WM_INITDIALOG:
-			extern HWND hDebugWnd;
-			hDebugWnd=hwnd;
-
-			pos.x=pobj_nv->VarDlgRect.left;
-			pos.y=pobj_nv->VarDlgRect.top;
-			size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
-			size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
-			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
-
-			extern WNDPROC OldThreadComboProc;
-			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
-			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
-
-			extern WNDPROC OldProcComboProc;
-			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
-			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
-
-			//イメージリスト読み込み、設定
-			static HIMAGELIST hVariOrderImageList;
-			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
-			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
-			TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
-
-			InitVarList((DWORD)lParam);
-			break;
-		case WM_COMMAND:
-			switch(LOWORD(wParam)){
-				case IDCANCEL:
-					DestroyWindow(hwnd);
-					return 1;
-				case IDC_STEPIN:
-					dwStepRun=1;
-					return 1;
-				case IDC_STEPOVER:
-					dwStepRun=2;
-					return 1;
-			}
-			break;
-		case WM_SIZE:
-			GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
-			pos.x=rect.left;
-			pos.y=rect.top;
-			ScreenToClient(hwnd,&pos);
-			MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
-			SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
-			return 1;
-		case WM_VARLIST_CLOSE:
-			DestroyWindow(hwnd);
-			return 1;
-		case WM_DESTROY:
-			ImageList_Destroy(hVariOrderImageList);
-
-			GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
-
-			hDebugWnd=0;
-
-			return 1;
-	}
-	return 0;
-}
Index: /BasicCompiler_Common/Class.cpp
===================================================================
--- /BasicCompiler_Common/Class.cpp	(revision 75)
+++ /BasicCompiler_Common/Class.cpp	(revision 76)
@@ -784,5 +784,5 @@
 				i+=2;
 				//アラインメント修飾子
-				if(_memicmp(basbuf+i,"Align(",6)==0){
+				if(memicmp(basbuf+i,"Align(",6)==0){
 					i+=6;
 					i=JumpStringInPare(basbuf,i)+1;
@@ -1130,5 +1130,5 @@
 			//アラインメント修飾子
 			int iAlign=0;
-			if(_memicmp(basbuf+i,"Align(",6)==0){
+			if(memicmp(basbuf+i,"Align(",6)==0){
 				i+=6;
 				i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
Index: /BasicCompiler_Common/DebugMiddleFile.cpp
===================================================================
--- /BasicCompiler_Common/DebugMiddleFile.cpp	(revision 75)
+++ /BasicCompiler_Common/DebugMiddleFile.cpp	(revision 76)
@@ -832,8 +832,8 @@
 	//プロセスメモリにコピー
 	extern HANDLE hDebugProcess;
-	SIZE_T stAccBytes;
+	SIZE_T accessBytes;
 	WriteProcessMemory(hDebugProcess,(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),
 		BreakStepCodeBuffer,
-		SizeOf_CodeSection,&stAccBytes);
+		SizeOf_CodeSection,&accessBytes);
 
 
@@ -849,7 +849,7 @@
 
 	extern HANDLE hDebugProcess;
-	SIZE_T stAccBytes;
+	SIZE_T accessBytes;
 	IMAGE_DOS_HEADER ImageDosHeader;
-	ReadProcessMemory(hDebugProcess,hModule,&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),&stAccBytes);
+	ReadProcessMemory(hDebugProcess,hModule,&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),&accessBytes);
 
 	int pe_size;
@@ -861,5 +861,5 @@
 	pe_size=sizeof(IMAGE_NT_HEADERS);
 #endif
-	ReadProcessMemory(hDebugProcess,(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew),&pe_hdr,pe_size,&stAccBytes);
+	ReadProcessMemory(hDebugProcess,(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew),&pe_hdr,pe_size,&accessBytes);
 
 	IMAGE_SECTION_HEADER *pSectionHdr;
@@ -869,5 +869,5 @@
 		pSectionHdr,
 		pe_hdr.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER),
-		&stAccBytes);
+		&accessBytes);
 
 	int i;
@@ -894,5 +894,5 @@
 				buffer,
 				length,
-				&stAccBytes);
+				&accessBytes);
 			buffer[length]=0;
 		}
@@ -913,5 +913,5 @@
 	ReadProcessMemory(hDebugProcess,
 		(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),OpBuffer,
-		SizeOf_CodeSection,&stAccBytes);
+		SizeOf_CodeSection,&accessBytes);
 
 
Index: /BasicCompiler_Common/MakeExe.cpp
===================================================================
--- /BasicCompiler_Common/MakeExe.cpp	(revision 75)
+++ /BasicCompiler_Common/MakeExe.cpp	(revision 76)
@@ -182,9 +182,7 @@
 
 	//グローバル変数に関する情報
-	extern int MaxGlobalVarNum;
 	extern int AllGlobalVarSize;
 	extern int AllInitGlobalVarSize;
 	globalVars.clear();
-	MaxGlobalVarNum=0;
 	AllGlobalVarSize=0;
 	AllInitGlobalVarSize=0;
Index: /BasicCompiler_Common/OldStatement.cpp
===================================================================
--- /BasicCompiler_Common/OldStatement.cpp	(revision 76)
+++ /BasicCompiler_Common/OldStatement.cpp	(revision 76)
@@ -0,0 +1,332 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+void Opcode_Input(const char *Parameter){
+	extern int cp;
+	int i2,i3,i4,i5;
+	BOOL bFile;
+	char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		i2=i3+1;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+
+		//表示用文字列パラメータをセット
+		if(Parameter[0]=='\"'){
+			buffer[0]='\"';
+			for(i2=1;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else SetError(10,"Input",cp);
+			i2+=2;
+		}
+		else if((Parameter[0]=='e'||Parameter[0]=='E')&&
+			(Parameter[1]=='x'||Parameter[1]=='X')&&
+			Parameter[2]=='\"'){
+			memcpy(buffer,Parameter,3);
+			for(i2=3;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else SetError(10,"Input",cp);
+			i2+=2;
+		}
+		else{
+			lstrcpy(buffer,"\"? \"");
+			i2=0;
+		}
+	}
+
+	//変数ポインタ、変数のタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='('){
+				i5=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			SetError(10,"Input",cp);
+			return;
+		}
+
+		Type varType;
+		if( !GetVarType(temporary, varType, 1) ){
+			return;
+		}
+
+		sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
+		OpcodeCalc(temp2);
+
+		if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
+		else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
+		else if(varType.IsObject()){
+			varType.SetBasicType( DEF_OBJECT );
+			if( varType.IsStringObject() ){
+				varType.SetBasicType( DEF_STRING );
+			}
+		}
+		sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
+		OpcodeCalc(temp2);
+
+		i4++;
+		if(Parameter[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
+	OpcodeCalc(temp2);
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
+	else pUserProc=GetSubHash("INPUT_FromPrompt");
+	if(!pUserProc){
+		SetError(3,"Input",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
+void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
+	extern int cp;
+	int i2,i3,i4,i5;
+	char temporary[VN_SIZE],temp2[8192];
+	BOOL bReturnLine;
+
+	char parms[8192];
+	lstrcpy( parms, Parameter );
+
+	i2=lstrlen(parms);
+	if(parms[i2-1]==';'){
+		bReturnLine=0;
+		parms[i2-1]=0;
+	}
+	else bReturnLine=1;
+
+	i3=lstrlen(buffer);
+	for(i2=0;;i2++,i3++){
+		if(parms[i2]==';'){
+			buffer[i3]=0;
+			break;
+		}
+		buffer[i3]=parms[i2];
+		if(parms[i2]=='\0') break;
+	}
+	if(parms[i2]==';') i2++;
+
+	if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	//データポインタ、データのタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(parms[i2]=='\"'){
+				temporary[i3]=parms[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=parms[i2];
+					if(parms[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(parms[i2]=='('){
+				i5=GetStringInPare(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=parms[i2];
+			if(parms[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			SetError(10,"Print",cp);
+			return;
+		}
+
+		int iResult;
+		iResult=IsStrCalculation(temporary);
+
+		if(iResult==1){
+			//文字列
+			sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
+			OpcodeCalc(temp2);
+		}
+		else if(iResult==0){
+			//数値
+			sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
+			OpcodeCalc(temp2);
+		}
+		//else if(iResult==-1) エラー
+
+		i4++;
+		if(parms[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
+	OpcodeCalc(temp2);
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
+	else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
+	if(!pUserProc){
+		SetError(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
+void Opcode_Print(const char *Parameter,BOOL bWrite){
+	int i2,i3,i4,sw;
+	char temporary[VN_SIZE],buffer[VN_SIZE];
+	BOOL bFile;
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		if(Parameter[i3]==',') i3++;
+		i2=i3;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+	}
+	if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
+		Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
+		return;
+	}
+
+	lstrcat(buffer,"_System_DummyStr+");
+
+	sw=1;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='\"'){
+				temporary[i3]=Parameter[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=Parameter[i2];
+					if(Parameter[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(Parameter[i2]=='('){
+				i4=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]=='['){
+				i4=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]==','||Parameter[i2]==';'){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+
+		if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
+		else{
+			int iResult;
+			iResult=IsStrCalculation(temporary);
+			if(iResult==-1){
+				//エラー
+				lstrcat(buffer,"\"\"");
+			}
+			else if(iResult){
+				//文字列
+				lstrcat(buffer,temporary);
+			}
+			else{
+				//数値
+				sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
+			}
+		}
+
+		if(Parameter[i2]==','){
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\"\t\"+");
+		}
+		else if(Parameter[i2]==';'){
+			if(Parameter[i2+1]=='\0'){
+				sw=0;
+				break;
+			}
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\" \"+");
+		}
+		else if(Parameter[i2]=='\0') break;
+
+		i2++;
+	}
+
+	if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
+	else pUserProc=GetSubHash("PRINT_ToPrompt");
+	if(!pUserProc){
+		SetError(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"",0);
+}
Index: /BasicCompiler_Common/Procedure.h
===================================================================
--- /BasicCompiler_Common/Procedure.h	(revision 75)
+++ /BasicCompiler_Common/Procedure.h	(revision 76)
@@ -1,4 +1,2 @@
-
-struct VARIABLE;
 
 class Procedure{
Index: /BasicCompiler_Common/Type.cpp
===================================================================
--- /BasicCompiler_Common/Type.cpp	(revision 75)
+++ /BasicCompiler_Common/Type.cpp	(revision 76)
@@ -173,6 +173,5 @@
 int Type::GetBasicSize() const
 {
-	GetBasicSize( basicType );
-	return 0;
+	return GetBasicSize( basicType );
 }
 int Type::GetSize() const
Index: /BasicCompiler_Common/VarList.cpp
===================================================================
--- /BasicCompiler_Common/VarList.cpp	(revision 76)
+++ /BasicCompiler_Common/VarList.cpp	(revision 76)
@@ -0,0 +1,1333 @@
+#include "../BasicCompiler_Common/common.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+//変数リストのツリーハンドル
+HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
+
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts);
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
+void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
+	extern HANDLE hDebugProcess;
+	int i2;
+	char temporary[255],temp2[255];
+	LONG_PTR pData;
+	SIZE_T accessBytes;
+	double dbl;
+	float flt;
+	WORD wData;
+	BYTE byteData;
+	HTREEITEM hParent;
+	_int64 i64data;
+
+	if( type.IsObject() || type.IsStruct() ){
+		if( type.IsObject() ){
+			// 参照型ということを考慮する
+			ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+			offset = pData;
+		}
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(DWORD64)offset);
+		lptv->item.iImage=1;
+		lptv->item.iSelectedImage=1;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
+		return;
+	}
+	else if( type.IsObjectPtr() || type.IsStructPtr() ){
+		i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(DWORD64)pData);
+		lptv->item.iImage=4;
+		lptv->item.iSelectedImage=4;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
+		return;
+	}
+	else{
+		if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1)){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes)){
+				for(i2=0;;i2++){
+					if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],1,&accessBytes)){
+						i2=-1;
+						break;
+					}
+					if(temporary[i2]=='\0') break;
+					if(i2==64){
+						lstrcpy(temporary+i2,"...");
+						break;
+					}
+				}
+				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(DWORD64)pData,(DWORD64)pData);
+				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(DWORD64)pData,(DWORD64)pData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDouble()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSingle()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInt64()){
+			_int64 i64data;
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_i64toa(i64data,temporary,10);
+				_i64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsQWord()||type.IsPointer()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_ui64toa(i64data,temporary,10);
+				_ui64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsLong()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,i64data,i64data);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDWord()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,i64data,i64data);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInteger()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsWord()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsBoolean()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				if( byteData ) lstrcpy( temporary, "True" );
+				else lstrcpy( temporary, "False" );
+
+				wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		lptv->item.iImage=2;
+		lptv->item.iSelectedImage=2;
+	}
+	TreeView_InsertItem(hVarTree,lptv);
+}
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr){
+	int i;
+	char VarData[VN_SIZE],VarName[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=VarData;
+
+	for(i=0;i<objClass.iMemberNum;i++){
+		if(bPtr){
+			lstrcpy(VarName,"->");
+			lstrcat(VarName,objClass.ppobj_Member[i]->name);
+		}
+		else{
+			lstrcpy(VarName,".");
+			lstrcat(VarName,objClass.ppobj_Member[i]->name);
+		}
+
+		LONG_PTR offset;
+		int i2;
+		offset=objClass.GetMemberOffset( objClass.ppobj_Member[i]->name, &i2 );
+
+		if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
+			//構造体内の配列
+			sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree,&tv);
+
+			VarList_Array(hVarTree,hParent,
+				pTopOffset+offset,
+				*objClass.ppobj_Member[i],
+				objClass.ppobj_Member[i]->SubScripts);
+		}
+		else{
+			//メンバ変数
+			VarList_Insert(hVarTree,
+				&tv,
+				VarName,
+				*objClass.ppobj_Member[i],
+				pTopOffset+offset);
+		}
+	}
+}
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const int *SubScripts ){
+	int i,i2,i3,ElementNum,MemCounter,UseCount[255];
+	char temporary[VN_SIZE],temp2[DIGIT_SIZE];
+
+	TV_INSERTSTRUCT tv;
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=temporary;
+
+	for(i=0;i<255;i++){
+		if(SubScripts[i]==-1) break;
+		UseCount[i]=0;
+	}
+	UseCount[i]=-2;
+	MemCounter=0;
+	while(1){
+		UseCount[i]++;
+		for(ElementNum=0;SubScripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
+			UseCount[i-ElementNum]=0;
+			if(i-ElementNum-1<0) return MemCounter;
+			UseCount[i-ElementNum-1]++;
+		}
+
+		if(MemCounter<50){
+			temporary[0]='[';
+			temporary[1]=0;
+			for(i2=0;i2<i;i2++){
+				sprintf(temp2,"%d",UseCount[i2]);
+				lstrcat(temporary,temp2);
+				lstrcat(temporary,",");
+			}
+			i3=lstrlen(temporary);
+			temporary[i3-1]=']';
+			temporary[i3]=0;
+
+			VarList_Insert(hVarTree,&tv,temporary,type,
+				offset+MemCounter*type.GetSize());
+		}
+
+		MemCounter++;
+		if(MemCounter==50){
+			lstrcpy(tv.item.pszText,"...");
+			TreeView_InsertItem(hVarTree,&tv);
+		}
+	}
+	return 0;
+}
+void RefreshGlobalVar(void){
+	extern DWORD ImageBase;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+
+	TreeView_DeleteAllItems(hVarTree_Global);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern int MemPos_RWSection;
+
+	foreach( Variable *pVar, globalVars ){
+
+		//スコープ外の場合は無視
+		if(pVar->ScopeLevel!=0){
+			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[0]  &&
+				pobj_dti->lplpObp[0] < rva_to_real(pVar->ScopeEndAddress)){
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+
+		if(!pobj_nv->bShow_DefaultSystem_Var){
+			if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
+				memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
+				memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
+		}
+		if(!pobj_nv->bShow_Rad_Var){
+			if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
+		}
+		if(!pobj_nv->bShow_GUID_Var){
+			if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
+				memcmp(pVar->GetName().c_str(),"IID_",4)==0||
+				memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
+		}
+
+		//静的メンバ
+		if(strstr(pVar->GetName().c_str(),".")) continue;
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				ImageBase+MemPos_RWSection+pVar->offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Global,&tv);
+
+			VarList_Array(hVarTree_Global,hParent,
+				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset),
+				*pVar,
+				pVar->GetSubScriptsPtr());
+		}
+		else{
+			VarList_Insert(hVarTree_Global,
+				&tv,
+				pVar->GetName().c_str(),
+				*pVar,
+				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->offset));
+		}
+	}
+}
+void RefreshLocalVar(void){
+	int i,i2,i3,sw;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+	LONG_PTR offset;
+	SIZE_T accessBytes;
+	LONG_PTR lpData;
+
+	TreeView_DeleteAllItems(hVarTree_Local);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern HWND hDebugWnd;
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]==0) return;
+
+	extern UserProc **ppSubHash;
+	UserProc *pUserProc;
+	for(i3=0,sw=0;i3<MAX_HASH;i3++){
+		pUserProc=ppSubHash[i3];
+		while(pUserProc){
+			if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+				sw=1;
+				break;
+			}
+
+			pUserProc=pUserProc->pNextData;
+		}
+		if(sw) break;
+	}
+	if(!pUserProc) return;
+
+	foreach( Variable *pVar, UserProc::CompilingUserProc().localVars ){
+
+		//スコープ外の場合は無視
+		if(pVar->ScopeLevel!=0){
+			if(rva_to_real(pVar->ScopeStartAddress) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pVar->ScopeEndAddress)){
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				pobj_dti->lplpSpBase[i2]+pVar->offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Local,&tv);
+
+			VarList_Array(hVarTree_Local,hParent,
+				pobj_dti->lplpSpBase[i2]+pVar->offset,
+				*pVar,
+				pVar->GetSubScriptsPtr());
+		}
+		else{
+			offset=pobj_dti->lplpSpBase[i2]+pVar->offset;
+			if(pVar->IsRef()){
+				ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&accessBytes);
+				offset=lpData;
+			}
+			VarList_Insert(hVarTree_Local,&tv,
+				pVar->GetName().c_str(),
+				*pVar,
+				offset);
+		}
+	}
+
+
+
+	/////////////////////////////
+	// Thisオブジェクトのリスト
+	/////////////////////////////
+
+	TreeView_DeleteAllItems(hVarTree_This);
+	if(!pUserProc->GetParentClassPtr()) return;
+
+	//Thisポインタを取得
+	LONG_PTR pThis;
+	const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( "_System_LocalThis" );
+	if( !pVar ){
+		return;
+	}
+	lpData=pobj_dti->lplpSpBase[i2]+pVar->offset;
+	ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&accessBytes);
+
+	for(i=0;i<pUserProc->GetParentClassPtr()->iMemberNum;i++){
+		offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,&i2);
+
+		if(pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts[0]!=-1){
+			//配列
+			sprintf(temporary,"%s %s(&H%X)",
+				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
+				STRING_ARRAY,
+				(DWORD64)offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+			VarList_Array(hVarTree_This,hParent,
+				pThis+offset,
+				*pUserProc->GetParentClassPtr()->ppobj_Member[i],
+				pUserProc->GetParentClassPtr()->ppobj_Member[i]->SubScripts);
+		}
+		else{
+			VarList_Insert(hVarTree_This,&tv,
+				pUserProc->GetParentClassPtr()->ppobj_Member[i]->name,
+				*pUserProc->GetParentClassPtr()->ppobj_Member[i],
+				pThis+offset);
+		}
+	}
+}
+void RefreshGlobalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+
+	//リフレッシュ
+	RefreshGlobalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+}
+void RefreshLocalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
+}
+
+void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
+	char temporary[255],temp2[255];
+
+	//エスケープシーケンスをセット
+	SetEscapeSequenceFormat(buffer);
+
+	KillStringSpaces(buffer);
+
+	//カッコを相互チェック
+	if(!CheckParenthesis2(buffer)){
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+		return;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type resultType;
+	bool isMemoryAccessError;
+	if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+	}
+	else if(isMemoryAccessError){
+		ListView_SetItemText(hListView,iItem,1,"アクセスできません");
+	}
+	else{
+		if(resultType.IsReal()){
+			memcpy(&dbl,&i64data,sizeof(double));
+			sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
+		}
+		else if(resultType.Is64()){
+			_i64toa(i64data,temporary,10);
+			_i64toa(i64data,temp2,16);
+			CharUpper(temp2);
+			sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
+		}
+		else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
+
+		ListView_SetItemText(hListView,iItem,1,temporary);
+	}
+}
+void RefreshWatchList(void){
+	extern HWND hDebugWnd;
+	HWND hListView;
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
+	i2=ListView_GetItemCount(hListView);
+	for(i=0;i<i2-1;i++){
+		ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+
+		//演算結果を表示
+		SetCalcToWatchList(hListView,i,temporary);
+	}
+}
+
+BOOL SetDebugProcCombo(HWND hProcCombo){
+	int i2,i3;
+	char temporary[255];
+
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+
+	//行番号情報
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+		for(i2=0;i2<MaxLineInfoNum-1;i2++){
+			if((DWORD64)(pLineInfo[i2].TopObp+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
+				pobj_dti->lplpObp[i3]<=(DWORD64)(pLineInfo[i2+1].TopObp+ImageBase+MemPos_CodeSection)) break;
+		}
+		if(i2==MaxLineInfoNum) pobj_dti->lpdwCp[i3]=-1;
+		else pobj_dti->lpdwCp[i3]=pLineInfo[i2].TopCp;
+	}
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+		if(pobj_dti->lpdwCp[i3]==-1){
+			pobj_dti->iProcLevel--;
+			for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
+				pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
+				pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
+				pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
+			}
+			i3--;
+			continue;
+		}
+	}
+
+	if(!GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel],&i2,temporary)){
+		extern HWND hMainDlg;
+		//"デバッグ情報の取得に失敗"
+		MessageBox(hMainDlg,STRING_DEBUG_FAILED,"ActiveBasic error",MB_OK);
+		return 0;
+	}
+	ShowErrorLine(i2,temporary);
+
+	//プロシージャ コンボボックス
+	extern UserProc **ppSubHash;
+	UserProc *pUserProc;
+	int sw;
+	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
+	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
+		for(i3=0,sw=0;i3<MAX_HASH;i3++){
+			pUserProc=ppSubHash[i3];
+			while(pUserProc){
+				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+						lstrcpy(temporary,pUserProc->GetName().c_str());
+						sw=1;
+						break;
+				}
+				pUserProc=pUserProc->pNextData;
+			}
+			if(sw) break;
+		}
+		if(!pUserProc){
+			if(i2==0){
+				lstrcpy(temporary,"Global");
+				pobj_dti->lplpSpBase[i2]=0;
+			}
+			else lstrcpy(temporary,"error");
+		}
+		SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
+	}
+	SendMessage(hProcCombo,CB_SETCURSEL,0,0);
+
+	return pobj_dti->iProcLevel;
+}
+
+//IDC_THREADCOMBOプロシージャ
+LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldThreadComboProc;
+	int i2;
+	DWORD dwThreadID;
+	char temporary[255];
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
+				sscanf(temporary+2,"%X",&dwThreadID);
+
+				extern DWORD _DebugSys_dwThreadID[256];
+				i2=0;
+				while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
+
+				//次回のステップ実行対象を指定
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+
+				//スレッド情報をリフレッシュ
+				pobj_dti->Reflesh(i2);
+
+				SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
+
+				SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+			}
+			break;
+	}
+	return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
+}
+//IDC_PROCCOMBOプロシージャ
+LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldProcComboProc;
+	int i2,i3;
+	char temporary[MAX_PATH];
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
+				GetLineNum(pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2],&i3,temporary);
+				ShowErrorLine(i3,temporary);
+
+				RefreshLocalVar_with_WindowLock();
+			}
+			break;
+	}
+	return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
+}
+void InitVarList(DWORD dwThreadId){
+	extern HWND hDebugWnd;
+	int i2,i3,i5;
+	char temporary[255];
+
+
+	//スレッド
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
+	extern DWORD _DebugSys_dwThreadID[256];
+	for(i2=0;i2<256;i2++){
+		if(_DebugSys_dwThreadID[i2]){
+			sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
+			SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
+			if(_DebugSys_dwThreadID[i2]==dwThreadId){
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+			}
+		}
+	}
+	sprintf(temporary,"&H%08X",dwThreadId);
+	i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
+
+	i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
+
+
+	///////////////////////////////////////////////
+	// 実行中のプロシージャのローカル変数をセット
+	///////////////////////////////////////////////
+
+	int sw;
+
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]){
+		extern UserProc **ppSubHash;
+		UserProc *pUserProc;
+		for(i3=0,sw=0;i3<MAX_HASH;i3++){
+			pUserProc=ppSubHash[i3];
+			while(pUserProc){
+				if(rva_to_real(pUserProc->beginOpAddress) <= pobj_dti->lplpObp[i2]  &&
+					pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->endOpAddress)){
+					sw=1;
+					break;
+				}
+
+				pUserProc=pUserProc->pNextData;
+			}
+			if(sw) break;
+		}
+
+
+		if(pUserProc){
+			pobj_CompilingClass=pUserProc->GetParentClassPtr();
+			UserProc::CompileStartForUserProc( pUserProc );
+		}
+	}
+
+
+	////////////////////////
+	// 変数リストを再表示
+	////////////////////////
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+	RefreshGlobalVar();
+	RefreshWatchList();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
+}
+
+
+
+
+//////////////////////////////////////
+// エディタに埋め込み表示のデバッガ
+//////////////////////////////////////
+
+BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+
+	//デバッガ用ツールバー
+#define BMPNUM_DEBUGGERTOOLBAR 3
+#define BTNNUM_DEBUGGERTOOLBAR 4
+	TBBUTTON DebuggerToolBar[]={
+		{0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
+		{1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+	};
+	TOOLTIPTEXT *pTipText;
+
+	static HIMAGELIST hImageList,hImageList_Disabled;
+
+	switch(message){
+		case WM_INITDIALOG:
+			//ツールバーを生成
+			extern HWND hDebuggerToolbar;
+			hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
+				NULL,
+				0,0,0,
+				DebuggerToolBar,
+				BTNNUM_DEBUGGERTOOLBAR,	/*アイテムの個数*/
+				0,0,16,15,sizeof(TBBUTTON));
+
+			hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
+			hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_DEBUG_START:
+					DestroyWindow(GetParent(hwnd));
+					return 1;
+				case IDC_DEBUG_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_DEBUG_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			pTipText=(TOOLTIPTEXT *)lParam;
+			if(pTipText->hdr.code==TTN_NEEDTEXT){
+				//ツールチップを表示
+				switch(pTipText->hdr.idFrom){
+					case IDC_DEBUG_START:
+						pTipText->lpszText="実行";
+						break;
+					case IDC_DEBUG_STEPOVER:
+						pTipText->lpszText="ステップ アウト";
+						break;
+					case IDC_DEBUG_STEPIN:
+						pTipText->lpszText="ステップ イン";
+						break;
+				}
+			}
+			break;
+		case WM_SIZE:
+			MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
+			return 1;
+
+		case WM_DESTROY:
+			ImageList_Destroy(hImageList);
+			ImageList_Destroy(hImageList_Disabled);
+			return 1;
+	}
+	return 0;
+}
+
+WNDPROC OldTabProc;
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+
+	static HMENU hDummyMenu,hMenu=0;
+
+	switch(message){
+		case WM_CONTEXTMENU:
+			if(hMenu==0){
+				hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
+				hMenu=GetSubMenu(hDummyMenu,0);
+			}
+
+			MENUITEMINFO mi;
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			mi.fState=MFS_CHECKED;
+
+			if(pobj_nv->bShow_DefaultSystem_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+			if(pobj_nv->bShow_Rad_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+			if(pobj_nv->bShow_GUID_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+
+			TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+
+			break;
+		case WM_COMMAND:
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			switch(LOWORD(wParam)){
+				case IDM_SHOW_DEFAULTSYSTEM_VAR:
+					if(pobj_nv->bShow_DefaultSystem_Var){
+						pobj_nv->bShow_DefaultSystem_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_DefaultSystem_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_RAD_VAR:
+					if(pobj_nv->bShow_Rad_Var){
+						pobj_nv->bShow_Rad_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_Rad_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_GUID_VAR:
+					if(pobj_nv->bShow_GUID_Var){
+						pobj_nv->bShow_GUID_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_GUID_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+			}
+			break;
+		case WM_DESTROY:
+			DestroyMenu(hMenu);
+			hMenu=0;
+			break;
+	}
+	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+
+BOOL CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	extern double width_ratio_VarList;
+	RECT rect;
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+	LV_DISPINFO *lvinfo;
+	LVITEM ListView_Item;
+
+	static POINT pos_VarList;
+	static POINT pos_WatchList;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			//変数リストの初期位置を取得
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
+			pos_VarList.x=rect.left;
+			pos_VarList.y=rect.top;
+			ScreenToClient(hwnd,&pos_VarList);
+
+			//ウォッチリストの初期位置を取得
+			pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ツールバーのベースウィンドウを生成
+			static HWND hBase_ToolBar;
+			hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
+			MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+
+			///////////////////////////
+			// タブコントロールを生成
+			///////////////////////////
+
+			static HWND hTab;
+			HFONT hFont;
+			hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+			hTab=CreateWindow(WC_TABCONTROL,NULL,
+				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+				0,0,0,0,hwnd,0,hInst,0);
+			SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
+			OldTabProc=(WNDPROC)GetWindowLongPtr(hTab,GWLP_WNDPROC);
+			SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
+
+			//タブを設定
+			TC_ITEM tcItem;
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="グローバル";
+			SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="ローカル";
+			SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="This";
+			SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
+
+			//グローバル変数リストのツリーを作成
+			hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//ローカル変数リストのツリーを作成
+			hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//This変数リストのツリーを作成
+			hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			ShowWindow(hVarTree_Global,SW_SHOW);
+
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
+
+
+			/////////////////////////
+			// ウォッチリスト
+			/////////////////////////
+
+			//コラムの設定
+			static HWND hListView;
+			LV_COLUMN ListView_Column;
+			DWORD dwStyle;
+
+			hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
+			GetClientRect(hListView,&rect);
+			dwStyle=ListView_GetExtendedListViewStyle(hListView);
+			dwStyle|=LVS_EX_FULLROWSELECT;
+			ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			extern int width_WatchColumn_Expression;
+			ListView_Column.cx=width_WatchColumn_Expression;
+			ListView_Column.pszText="ウォッチ式";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hListView,0,&ListView_Column);
+
+			extern int width_WatchColumn_Value;
+			ListView_Column.cx=width_WatchColumn_Value;
+			ListView_Column.pszText="値";
+			ListView_Column.iSubItem=1;
+			ListView_InsertColumn(hListView,1,&ListView_Column);
+
+			//アイテムの設定
+			ListView_Item.mask=LVIF_TEXT;
+			ListView_Item.iSubItem=0;
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_Item.pszText=pobj_nv->ppWatchStr[i];
+				ListView_Item.iItem=i;
+				ListView_InsertItem(hListView,&ListView_Item);
+			}
+			ListView_Item.pszText="...";
+			ListView_Item.iItem=i;
+			ListView_InsertItem(hListView,&ListView_Item);
+
+
+			///////////////////////
+			// 変数リストの初期化
+			///////////////////////
+			InitVarList((DWORD)lParam);
+
+			break;
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
+				i=TabCtrl_GetCurSel(hTab);
+
+				if(i==0){
+					//グローバル変数を表示
+					ShowWindow(hVarTree_Global,SW_SHOW);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==1){
+					//ローカル変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_SHOW);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==2){
+					//This変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_SHOW);
+				}
+			}
+
+			if(hdr->hwndFrom==hListView){
+				lvinfo=(LV_DISPINFO *)hdr;
+				if(hdr->code==NM_DBLCLK){
+					i2=ListView_GetItemCount(hListView);
+					for(i=0;i<i2;i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
+					}
+					if(i==i2) break;
+
+					ListView_EditLabel(hListView,i);
+				}
+
+				static HWND hEdit;
+				if(hdr->code==LVN_BEGINLABELEDIT){
+					hEdit=ListView_GetEditControl(hListView);
+
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
+				}
+				if(hdr->code==LVN_ENDLABELEDIT){
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(temporary[0]=='\0'){
+						if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
+
+						//空白入力の場合はそのアイテムを削除する
+						ListView_DeleteItem(hListView,lvinfo->item.iItem);
+						break;
+					}
+					ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
+
+					//演算結果を表示
+					SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
+
+					if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
+						//リストアイテムを追加
+						ListView_Item.mask=LVIF_TEXT;
+						ListView_Item.pszText="...";
+						ListView_Item.iItem=lvinfo->item.iItem+1;
+						ListView_Item.iSubItem=0;
+						ListView_InsertItem(hListView,&ListView_Item);
+					}
+				}
+
+				if(hdr->code==LVN_KEYDOWN){
+					LV_KEYDOWN *plvKeydown;
+					plvKeydown=(LV_KEYDOWN *)hdr;
+					if(plvKeydown->wVKey==VK_DELETE){
+						i2=ListView_GetItemCount(hListView);
+						for(i=i2-2;i>=0;i--){
+							if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+								ListView_DeleteItem(hListView,i);
+								i3=i;
+							}
+						}
+
+						ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
+					}
+				}
+			}
+			break;
+
+		case WM_SIZE:
+			//変数リストの位置
+			int width_VarList;
+			width_VarList=
+				(int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
+
+			MoveWindow(hTab,
+				pos_VarList.x,
+				pos_VarList.y,
+				width_VarList,
+				HIWORD(lParam)-pos_VarList.y,
+				1);
+
+			GetClientRect(hTab,&rect);
+			TabCtrl_AdjustRect(hTab,FALSE,&rect);
+			rect.left-=2;
+			rect.right++;
+			rect.bottom++;
+
+			MoveWindow(hVarTree_Global,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_Local,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_This,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+			pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ウォッチリストの位置
+			MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
+				pos_WatchList.x,
+				pos_WatchList.y,
+				LOWORD(lParam)-pos_WatchList.x,
+				HIWORD(lParam)-pos_WatchList.y,
+				1);
+
+			return 1;
+
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+
+			//////////////////////////////////////////////////////////////
+			// ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
+			//////////////////////////////////////////////////////////////
+
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				HeapDefaultFree(pobj_nv->ppWatchStr[i]);
+			}
+			HeapDefaultFree(pobj_nv->ppWatchStr);
+
+			pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
+			pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+				pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+				lstrcpy(pobj_nv->ppWatchStr[i],temporary);
+			}
+
+
+			//////////////////////////////
+			// デバッグダイアログを破棄
+			//////////////////////////////
+
+			hDebugWnd=0;
+
+			extern BOOL bClipCompileView;
+			if(bClipCompileView){
+				extern HWND hOwnerEditor;
+				SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
+			}
+
+			return 1;
+
+
+
+		///////////////////////
+		// デバッグコマンド
+		///////////////////////
+
+		case WM_DEBUG_CONTINUE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_STEP_IN:
+			Debugger_StepIn();
+			return 1;
+		case WM_STEP_OVER:
+			Debugger_StepOver();
+			return 1;
+		case WM_STEP_CURSOR:
+			Debugger_StepCursor();
+			return 1;
+	}
+	return 0;
+}
+
+
+
+
+//////////////////////////////////
+// ポップアップ表示の変数リスト
+//////////////////////////////////
+
+BOOL CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	RECT rect;
+	POINT pos;
+	SIZE size;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			pos.x=pobj_nv->VarDlgRect.left;
+			pos.y=pobj_nv->VarDlgRect.top;
+			size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
+			size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
+			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
+
+			InitVarList((DWORD)lParam);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDCANCEL:
+					DestroyWindow(hwnd);
+					return 1;
+				case IDC_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_SIZE:
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
+			pos.x=rect.left;
+			pos.y=rect.top;
+			ScreenToClient(hwnd,&pos);
+			MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
+			SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
+			return 1;
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+			GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
+
+			hDebugWnd=0;
+
+			return 1;
+	}
+	return 0;
+}
Index: /BasicCompiler_Common/VariableOpe.cpp
===================================================================
--- /BasicCompiler_Common/VariableOpe.cpp	(revision 75)
+++ /BasicCompiler_Common/VariableOpe.cpp	(revision 76)
@@ -770,5 +770,5 @@
 		}
 
-		if(_memicmp(variable,"This.",5)==0){
+		if(memicmp(variable,"This.",5)==0){
 			//Thisオブジェクトのメンバを参照するとき
 			SlideString(variable+5,-5);
@@ -1115,5 +1115,4 @@
 	// グローバル変数を追加
 	/////////////////////////
-	extern int MaxGlobalVarNum;
 	extern int AllInitGlobalVarSize;
 	extern int AllGlobalVarSize;
Index: /BasicCompiler_Common/WatchList.cpp
===================================================================
--- /BasicCompiler_Common/WatchList.cpp	(revision 76)
+++ /BasicCompiler_Common/WatchList.cpp	(revision 76)
@@ -0,0 +1,533 @@
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../BasicCompiler64/opcode.h"
+#else
+#include "../BasicCompiler32/opcode.h"
+#endif
+
+//デバッグ用
+#include "debug.h"
+
+int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset);
+
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+	int i2;
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		return ImageBase+MemPos_RWSection+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+		return pRelativeVar->offset;
+	}
+
+	return 0;
+}
+
+bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+	int array_num;
+
+	_int64 i64data;
+	if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
+		return false;
+	}
+	if( type.IsReal() ){
+		double dbl;
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+
+	array_num=(int)i64data;
+
+	if( type.PtrLevel() ){
+		type.PtrLevelDown();
+		array_num *= type.GetSize();
+	}
+	else{
+		//エラー
+		return false;
+	}
+
+	extern HANDLE hDebugProcess;
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+	lpData=Debugging_GetVarPtr(pRelativeVar);
+	if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+		return false;
+	}
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	pRelativeVar->offset+=array_num;
+	return true;
+}
+
+int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
+	int i,i2;
+
+	//直接参照に切り替え
+	pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	CClass::RefType refType;
+	lstrcpy(VarName,member);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
+
+
+	////////////////////////////
+	// メンバオフセットを取得
+	////////////////////////////
+
+	int offset = objClass.GetMemberOffset( VarName, &i );
+	if(i==objClass.iMemberNum) return 0;
+
+
+	//アクセシビリティをチェック
+	if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
+		objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
+		return 0;
+	}
+	else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED)
+		return 0;
+
+	resultType = *objClass.ppobj_Member[i];
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]) return 0;
+	}
+
+	pRelativeVar->offset+=offset;
+
+	if(array[0]){
+		//配列オフセット
+		i2=Debugging_GetArray(
+			objClass.ppobj_Member[i]->SubScripts,
+			array,
+			resultType,
+			&pRelativeVar->offset);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	else if(objClass.ppobj_Member[i]->SubScripts[0]!=-1){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(NestMember[0]){
+		//入れ子構造の場合
+
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			if( refType != CClass::Dot ) return 0;
+
+			if( resultType.IsObject() ){
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//構造体ポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				if( refType != CClass::Dot ) return 0;
+
+				//直接参照に切り替え
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				lpPtrOffset[0]=0;
+			}
+			else{
+				if( refType != CClass::Pointer ) return 0;
+
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+
+		i2=Debugging_GetMember(objClass.ppobj_Member[i]->GetClass(),
+			NestMember,
+			pRelativeVar,
+			resultType,
+			0);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+
+	if(lpPtrOffset[0]){
+		Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+	}
+
+	return 1;
+}
+int Debugging_GetArray( const int *SubScripts,char *array,const Type &type,LONG_PTR *plpOffset){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,array_offset;
+	char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+	for(i=0,i2=0,i3=0;;i++,i2++){
+		if(array[i]=='('){
+			i4=GetStringInPare(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]=='['){
+			i4=GetStringInBracket(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]==','||array[i]=='\0'){
+			if(SubScripts[i3]==-1){
+				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+				return 0;
+			}
+
+			temporary[i2]=0;
+
+			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(pParm[i3],temporary);
+
+			i3++;
+
+			if(array[i]=='\0'){
+				if(SubScripts[i3]!=-1){
+					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+					return 0;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=array[i];
+	}
+
+	array_offset=0;
+
+	for(i=i3-1;i>=0;i--){
+		_int64 i64data;
+		Type resultType;
+		bool isMemoryAccessError;
+		if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
+			//式エラー
+			return 0;
+		}
+		if(isMemoryAccessError){
+			//アクセスエラー
+			return -1;
+		}
+
+		if(resultType.IsReal()){
+			double dbl;
+			memcpy(&dbl,&i64data,sizeof(double));
+			i64data=(_int64)dbl;
+		}
+		i5=(int)i64data;
+
+		for(i2=i+1,i4=1;i2<i3;i2++) i4*=SubScripts[i2]+1;
+
+		array_offset+=i5*i4;
+
+		HeapDefaultFree(pParm[i]);
+	}
+
+	array_offset *= type.GetSize();
+
+	*plpOffset+=array_offset;
+
+	return 1;
+}
+ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
+	UserProc *pUserProc = GetSubFromObp(obp_Rip);
+
+	foreach( Variable *pVar, pUserProc->localVars ){
+		if( pVar->GetName() == "_System_LocalThis" ){
+			return pVar->offset;
+		}
+	}
+	return 0;
+}
+int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, int *pss){
+	extern HANDLE hDebugProcess;
+	int i,i2,i3;
+	char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+
+	lstrcpy(VarName,variable);
+	CClass::RefType refType;
+	GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
+
+	const int *pSubScripts;
+	bool isArray;
+
+
+	/////////////////
+	// ローカル変数
+	/////////////////
+	const Variable *pVar = UserProc::CompilingUserProc().localVars.Find( VarName );
+	if( pVar ){
+		//ポインタ変数の場合
+		if( pVar->IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]) return 0;
+		}
+
+		pRelativeVar->offset = pVar->offset;
+		if( pVar->IsRef() ){
+			pRelativeVar->dwKind=VAR_REFLOCAL;
+		}
+		else{
+			pRelativeVar->dwKind=VAR_LOCAL;
+		}
+		resultType = *pVar;
+		isArray = pVar->IsArray();
+		pSubScripts = pVar->GetSubScriptsPtr();
+	}
+	else{
+		if(pobj_CompilingClass){
+			///////////////////////
+			// クラスメンバの参照
+			///////////////////////
+
+			if(memicmp(variable,"This.",5)==0){
+				//Thisオブジェクトのメンバを参照するとき
+				SlideString(variable+5,-5);
+				lstrcpy(VarName,variable);
+			}
+			else{
+				//クラス内メンバを参照するとき（通常）
+
+				for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
+					if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
+				}
+				if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
+			}
+
+			/////////////////////////////
+			// thisポインタを取得
+
+			extern HWND hDebugWnd;
+			i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+			i2=pobj_dti->iProcLevel-i2;
+
+			lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
+			if(!lpData){
+				//式エラー
+				return 0;
+			}
+			lpData+=pobj_dti->lplpSpBase[i2];
+			if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+				//メモリにアクセスできないとき
+				return -1;
+			}
+
+			pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+			i3=Debugging_GetMember(*pobj_CompilingClass,variable,pRelativeVar,resultType,1);
+			if(i3==0){
+				//式エラー
+				return 0;
+			}
+			if(i3==-1){
+				//アクセスエラー
+				return -1;
+			}
+
+			return 1;
+		}
+
+NonClassMember:
+
+		///////////////////
+		// グローバル変数
+		///////////////////
+
+		const Variable *pVar = globalVars.Find( VarName );
+		if( !pVar ){
+			//一致しないとき
+			return 0;
+		}
+
+		//ポインタ変数の場合
+		if( pVar->IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]) return 0;
+		}
+
+		pRelativeVar->offset=pVar->offset;
+		if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
+		else pRelativeVar->dwKind=VAR_GLOBAL;
+		resultType = *pVar;
+		isArray = pVar->IsArray();
+		pSubScripts=pVar->GetSubScriptsPtr();
+	}
+
+
+	if(array[0]==0&&isArray){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+		if(pss) memcpy(pss,pSubScripts,MAX_ARRAYDIM*sizeof(int));
+		return 1;
+	}
+
+	if(array[0]){
+		i3=Debugging_GetArray(pSubScripts,array,resultType,&pRelativeVar->offset);
+		if(i3==0){
+			//式エラー
+			return 0;
+		}
+		if(i3==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	if(member[0]){
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			//実態オブジェクトのメンバを参照（obj.member）
+			if( refType != CClass::Dot ){
+				return 0;
+			}
+
+			i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+			if(i3==0){
+				//式エラー
+				return 0;
+			}
+			if(i3==-1){
+				//アクセスエラー
+				return -1;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( refType != CClass::Dot ) return 0;
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+			else{
+				//pObj->member
+				if( refType != CClass::Pointer ) return 0;
+
+				pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->offset=lpData;
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+		}
+		else{
+			return 0;
+		}
+		return 1;
+	}
+
+	if(lpPtrOffset[0]){
+		if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
+	}
+
+	return 1;
+}
Index: /BasicCompiler_Common/calculation.cpp
===================================================================
--- /BasicCompiler_Common/calculation.cpp	(revision 75)
+++ /BasicCompiler_Common/calculation.cpp	(revision 76)
@@ -555,5 +555,5 @@
 							void *offset;
 							DWORD dwData;
-							SIZE_T stAccBytes;
+							SIZE_T accessBytes;
 							float flt;
 
@@ -579,8 +579,8 @@
 
 								if(tempType.IsDouble()){
-									i3=ReadProcessMemory(hDebugProcess,offset,&nums[pnum],sizeof(double),&stAccBytes);
+									i3=ReadProcessMemory(hDebugProcess,offset,&nums[pnum],sizeof(double),&accessBytes);
 								}
 								else if(tempType.IsSingle()){
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&flt,sizeof(float),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&flt,sizeof(float),&accessBytes)){
 										nums[pnum]=(double)flt;
 									}
@@ -588,5 +588,5 @@
 								else if(tempType.IsPointer()){
 									LONG_PTR lpData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&lpData,sizeof(LONG_PTR),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lpData,sizeof(LONG_PTR),&accessBytes)){
 										i64nums[pnum]=(_int64)lpData;
 									}
@@ -595,15 +595,15 @@
 									type[pnum]=DEF_INT64;
 
-									i3=ReadProcessMemory(hDebugProcess,offset,&i64nums[pnum],sizeof(_int64),&stAccBytes);
+									i3=ReadProcessMemory(hDebugProcess,offset,&i64nums[pnum],sizeof(_int64),&accessBytes);
 								}
 
 								else if(tempType.IsLong()){
 									long lData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&lData,sizeof(long),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lData,sizeof(long),&accessBytes)){
 										i64nums[pnum]=(_int64)lData;
 									}
 								}
 								else if(tempType.IsDWord()){
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&dwData,sizeof(DWORD),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&dwData,sizeof(DWORD),&accessBytes)){
 										i64nums[pnum]=(_int64)dwData;
 									}
@@ -611,5 +611,5 @@
 								else if(tempType.IsInteger()){
 									short shortData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&shortData,sizeof(short),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&shortData,sizeof(short),&accessBytes)){
 										i64nums[pnum]=(_int64)shortData;
 									}
@@ -617,5 +617,5 @@
 								else if(tempType.IsWord()){
 									WORD wData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&wData,sizeof(WORD),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&wData,sizeof(WORD),&accessBytes)){
 										i64nums[pnum]=(_int64)wData;
 									}
@@ -623,5 +623,5 @@
 								else if(tempType.IsSByte()){
 									char charData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&charData,sizeof(char),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&charData,sizeof(char),&accessBytes)){
 										i64nums[pnum]=(_int64)charData;
 									}
@@ -629,5 +629,5 @@
 								else if(tempType.IsByte()){
 									BYTE byteData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
 										i64nums[pnum]=(_int64)byteData;
 									}
@@ -635,5 +635,5 @@
 								else if(tempType.IsBoolean()){
 									BYTE byteData;
-									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&stAccBytes)){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
 										i64nums[pnum]=(_int64)byteData;
 									}
Index: /BasicCompiler_Common/common.h
===================================================================
--- /BasicCompiler_Common/common.h	(revision 75)
+++ /BasicCompiler_Common/common.h	(revision 76)
@@ -12,4 +12,5 @@
 #include <vector>
 #include <string>
+#include <fstream>
 
 //boost libraries
@@ -172,43 +173,4 @@
 	int FilesNum;
 	int LineOfFile[MAX_LEN];
-};
-
-
-//変数
-struct VARIABLE{
-	char name[255];
-	int type;
-	union{
-		LONG_PTR index;
-		CClass *pobj_c;
-	}u;
-
-	DWORD fRef;
-
-	//定数変数かどうか
-	bool bConst;
-
-	BOOL bArray;
-	int SubScripts[MAX_ARRAYDIM];
-
-	//コンストラクタ用パラメータ
-	char *ConstractParameter;
-
-	/* --- オフセット ---
-
-		※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
-		初期バッファの有無が識別される。
-		（その後、スケジュール実行により、実際の配置に並び替えられる）*/
-	int offset;
-
-
-	//レキシカルスコープ用
-	int ScopeStartAddress;
-	int ScopeEndAddress;
-	int ScopeLevel;
-	BOOL bLiving;
-
-
-	int source_code_address;
 };
 
@@ -482,4 +444,8 @@
 void DeleteProcPtrInfo(void);
 
+//OldStatement.cpp
+void Opcode_Input(const char *Parameter);
+void Opcode_Print(const char *Parameter,BOOL bWrite);
+
 //LoopRefCheck.cpp
 class CLoopRefCheck{
Index: /BasicCompiler_Common/preprocessor.cpp
===================================================================
--- /BasicCompiler_Common/preprocessor.cpp	(revision 75)
+++ /BasicCompiler_Common/preprocessor.cpp	(revision 76)
@@ -171,10 +171,10 @@
 
 		if(buffer[i-1]=='\n'){
-			if(_memicmp(buffer+i,"#ifdef",6)==0||_memicmp(buffer+i,"#ifndef",7)==0){
+			if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
 				i=Search_endif(buffer,i+6, pLine);
 				if(buffer[i]=='\0') break;
 				continue;
 			}
-			else if(_memicmp(buffer+i,"#endif",6)==0){
+			else if(memicmp(buffer+i,"#endif",6)==0){
 				break;
 			}
@@ -222,15 +222,15 @@
 
 			if(i==0||buffer[i-1]=='\n'){
-				if(_memicmp(buffer+i,"#ifdef",6)==0||_memicmp(buffer+i,"#ifndef",7)==0){
+				if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
 					i=Search_endif(buffer,i+6);
 					if(buffer[i]=='\0') break;
 					continue;
 				}
-				else if(_memicmp(buffer+i,"#else",5)==0){
+				else if(memicmp(buffer+i,"#else",5)==0){
 					i2=5;
 					bElse=1;
 					break;
 				}
-				else if(_memicmp(buffer+i,"#endif",6)==0){
+				else if(memicmp(buffer+i,"#endif",6)==0){
 					i2=6;
 					bElse=0;
@@ -252,10 +252,10 @@
 
 				if(i2==0||buffer[i2-1]=='\n'){
-					if(_memicmp(buffer+i2,"#ifdef",6)==0||_memicmp(buffer+i2,"#ifndef",7)==0){
+					if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
 						i2=Search_endif(buffer,i2+6, &i3 );
 						if(buffer[i2]=='\0') break;
 						continue;
 					}
-					if(_memicmp(buffer+i2,"#endif",6)==0){
+					if(memicmp(buffer+i2,"#endif",6)==0){
 						i2+=6;
 						break;
@@ -279,15 +279,15 @@
 
 			if(i2==0||buffer[i2-1]=='\n'){
-				if(_memicmp(buffer+i2,"#ifdef",6)==0||_memicmp(buffer+i2,"#ifndef",7)==0){
+				if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
 					i2=Search_endif(buffer,i2+6, &i3 );
 					if(buffer[i2]=='\0') break;
 					continue;
 				}
-				else if(_memicmp(buffer+i2,"#else",5)==0){
+				else if(memicmp(buffer+i2,"#else",5)==0){
 					i2+=5;
 					bElse=1;
 					break;
 				}
-				else if(_memicmp(buffer+i2,"#endif",6)==0){
+				else if(memicmp(buffer+i2,"#endif",6)==0){
 					i2+=6;
 					bElse=0;
@@ -307,10 +307,10 @@
 
 				if(i==0||buffer[i-1]=='\n'){
-					if(_memicmp(buffer+i,"#ifdef",6)==0||_memicmp(buffer+i,"#ifndef",7)==0){
+					if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
 						i=Search_endif(buffer,i+6);
 						if(buffer[i]=='\0') break;
 						continue;
 					}
-					else if(_memicmp(buffer+i,"#endif",6)==0){
+					else if(memicmp(buffer+i,"#endif",6)==0){
 						i2=6;
 						bElse=0;
@@ -336,5 +336,5 @@
 		if(i==0||buffer[i-1]=='\n'){
 			sw=0;
-			if(_memicmp(buffer+i,"#define",7)==0){
+			if(memicmp(buffer+i,"#define",7)==0){
 				i2=i+7;
 				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
@@ -355,5 +355,5 @@
 				SlideString(buffer+i+i2,-i2);
 			}
-			if(_memicmp(buffer+i,"#undef",6)==0){
+			if(memicmp(buffer+i,"#undef",6)==0){
 				i2=i+7;
 				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
@@ -374,9 +374,9 @@
 				SlideString(buffer+i+i2,-i2);
 			}
-			else if(_memicmp(buffer+i,"#ifdef",6)==0){
+			else if(memicmp(buffer+i,"#ifdef",6)==0){
 				preprocessor_ifdef(buffer+i,false);
 				continue;
 			}
-			else if(_memicmp(buffer+i,"#ifndef",7)==0){
+			else if(memicmp(buffer+i,"#ifndef",7)==0){
 				preprocessor_ifdef(buffer+i,true);
 				continue;
